mirror of
https://github.com/matrix-org/dendrite
synced 2024-11-18 15:50:52 +01:00
f47515e38b
This should fix https://github.com/matrix-org/dendrite/issues/2882 (Tested with FluffyChat 1.7.1) Also adds tests that the predefined push rules (as per the spec) is what we have in Dendrite.
88 lines
2.1 KiB
Go
88 lines
2.1 KiB
Go
package pushrules
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
)
|
|
|
|
// ValidateRule checks the rule for errors. These follow from Sytests
|
|
// and the specification.
|
|
func ValidateRule(kind Kind, rule *Rule) []error {
|
|
var errs []error
|
|
|
|
if !validRuleIDRE.MatchString(rule.RuleID) {
|
|
errs = append(errs, fmt.Errorf("invalid rule ID: %s", rule.RuleID))
|
|
}
|
|
|
|
if len(rule.Actions) == 0 {
|
|
errs = append(errs, fmt.Errorf("missing actions"))
|
|
}
|
|
for _, action := range rule.Actions {
|
|
errs = append(errs, validateAction(action)...)
|
|
}
|
|
|
|
for _, cond := range rule.Conditions {
|
|
errs = append(errs, validateCondition(cond)...)
|
|
}
|
|
|
|
switch kind {
|
|
case OverrideKind, UnderrideKind:
|
|
// The empty list is allowed, but for JSON-encoding reasons,
|
|
// it must not be nil.
|
|
if rule.Conditions == nil {
|
|
errs = append(errs, fmt.Errorf("missing rule conditions"))
|
|
}
|
|
|
|
case ContentKind:
|
|
if rule.Pattern == nil {
|
|
errs = append(errs, fmt.Errorf("missing content rule pattern"))
|
|
}
|
|
if rule.Pattern != nil && *rule.Pattern == "" {
|
|
errs = append(errs, fmt.Errorf("missing content rule pattern"))
|
|
}
|
|
|
|
case RoomKind, SenderKind:
|
|
// Do nothing.
|
|
|
|
default:
|
|
errs = append(errs, fmt.Errorf("invalid rule kind: %s", kind))
|
|
}
|
|
|
|
return errs
|
|
}
|
|
|
|
// validRuleIDRE is a regexp for valid IDs.
|
|
//
|
|
// TODO: the specification doesn't seem to say what the rule ID syntax
|
|
// is. A Sytest fails if it contains a backslash.
|
|
var validRuleIDRE = regexp.MustCompile(`^([^\\]+)$`)
|
|
|
|
// validateAction returns issues with an Action.
|
|
func validateAction(action *Action) []error {
|
|
var errs []error
|
|
|
|
switch action.Kind {
|
|
case NotifyAction, DontNotifyAction, CoalesceAction, SetTweakAction:
|
|
// Do nothing.
|
|
|
|
default:
|
|
errs = append(errs, fmt.Errorf("invalid rule action kind: %s", action.Kind))
|
|
}
|
|
|
|
return errs
|
|
}
|
|
|
|
// validateCondition returns issues with a Condition.
|
|
func validateCondition(cond *Condition) []error {
|
|
var errs []error
|
|
|
|
switch cond.Kind {
|
|
case EventMatchCondition, ContainsDisplayNameCondition, RoomMemberCountCondition, SenderNotificationPermissionCondition:
|
|
// Do nothing.
|
|
|
|
default:
|
|
errs = append(errs, fmt.Errorf("invalid rule condition kind: %s", cond.Kind))
|
|
}
|
|
|
|
return errs
|
|
}
|