summary refs log tree commit diff
path: root/rust/src
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2022-09-07 16:20:32 +0100
committerErik Johnston <erik@matrix.org>2022-09-09 15:10:52 +0100
commitdf2473296225344b187e1993bc5457edd16329aa (patch)
tree54c7f9ed1089e324991f122f45608ff9a85f7b5b /rust/src
parentfix up (diff)
downloadsynapse-df2473296225344b187e1993bc5457edd16329aa.tar.xz
Experimental rules
Diffstat (limited to 'rust/src')
-rw-r--r--rust/src/push/mod.rs53
1 files changed, 42 insertions, 11 deletions
diff --git a/rust/src/push/mod.rs b/rust/src/push/mod.rs

index e56fac40a7..6a099a15fa 100644 --- a/rust/src/push/mod.rs +++ b/rust/src/push/mod.rs
@@ -293,15 +293,24 @@ impl PushRules { pub struct FilteredPushRules { push_rules: PushRules, enabled_map: BTreeMap<String, bool>, + msc3786_enabled: bool, + msc3772_enabled: bool, } #[pymethods] impl FilteredPushRules { #[new] - fn py_new(push_rules: PushRules, enabled_map: BTreeMap<String, bool>) -> Self { + fn py_new( + push_rules: PushRules, + enabled_map: BTreeMap<String, bool>, + msc3786_enabled: bool, + msc3772_enabled: bool, + ) -> Self { Self { push_rules, enabled_map, + msc3786_enabled, + msc3772_enabled, } } @@ -312,13 +321,31 @@ impl FilteredPushRules { impl FilteredPushRules { fn iter(&self) -> impl Iterator<Item = (&PushRule, bool)> { - self.push_rules.iter().map(|r| { - let enabled = *self - .enabled_map - .get(&*r.rule_id) - .unwrap_or(&r.default_enabled); - (r, enabled) - }) + self.push_rules + .iter() + .filter(|rule| { + // Ignore disabled experimental push rules + if !self.msc3786_enabled + && rule.rule_id == "global/override/.org.matrix.msc3786.rule.room.server_acl" + { + return false; + } + + if !self.msc3772_enabled + && rule.rule_id == "global/underride/.org.matrix.msc3772.thread_reply" + { + return false; + } + + true + }) + .map(|r| { + let enabled = *self + .enabled_map + .get(&*r.rule_id) + .unwrap_or(&r.default_enabled); + (r, enabled) + }) } } @@ -465,9 +492,13 @@ impl PushRuleEvaluator { return Ok(false); }; + let sender_compiled_pattern = glob_to_regex(sender_pattern, GlobMatchType::Whole)?; + let rel_type_compiled_pattern = glob_to_regex(rel_type, GlobMatchType::Whole)?; + for (relation_sender, event_type) in relations { - // TODO: glob - if relation_sender == sender_pattern && rel_type == event_type { + if sender_compiled_pattern.is_match(&relation_sender) + && rel_type_compiled_pattern.is_match(event_type) + { return Ok(true); } } @@ -494,7 +525,7 @@ impl PushRuleEvaluator { }; match &**pattern_type { "user_id" => user_id, - "user_localpart" => utils::get_localpart_from_id(user_id)?, // TODO + "user_localpart" => utils::get_localpart_from_id(user_id)?, _ => return Ok(false), } } else {