diff --git a/rules/engine.go b/rules/engine.go index 2f0e2f4..a0e6c25 100644 --- a/rules/engine.go +++ b/rules/engine.go @@ -3,6 +3,7 @@ package rules import ( "fmt" "os" + "regexp" "strings" "time" @@ -166,10 +167,16 @@ func (e *v3Engine) SetWatcherWrapper(watcherWrapper WrapWatcher) { e.watcherWrapper = watcherWrapper } +// valid path patterns must be alphanumeric and may only contain select special characters (:/"'_.,*=-) +var validPath = regexp.MustCompile(`^[[:alnum:] \#\:\/\"\'\_\.\,\*\=\-]*$`) + func (e *v3Engine) AddRule(rule DynamicRule, lockPattern string, callback V3RuleTaskCallback, options ...RuleOption) { + if !validPath.MatchString(lockPattern) || !strings.Contains(lockPattern, "lock") { + e.logger.Fatal("Path contains an invalid character or does not contain \"lock\"") + } e.addRuleWithIface(rule, lockPattern, callback, options...) } diff --git a/v3enginetest/main.go b/v3enginetest/main.go index 2781800..b76da65 100644 --- a/v3enginetest/main.go +++ b/v3enginetest/main.go @@ -170,7 +170,7 @@ func main() { doneFalse := "false" doneRule, err := rules.NewEqualsLiteralRule(donePath, &doneFalse) check(err) - engine.AddRule(doneRule, "/rulesEngineDone/:id", func(task *rules.V3RuleTask) { + engine.AddRule(doneRule, "/rulesEngineDone/:id/lock", func(task *rules.V3RuleTask) { path := task.Attr.Format(donePath) doneTrue := "true" _, err := kv.Put(task.Context, path, doneTrue)