This removes the configuration flag & updates the identifiers to use the stable version.tags/v1.79.0rc1
@@ -0,0 +1 @@ | |||
Stabilise support for [MSC3758](https://github.com/matrix-org/matrix-spec-proposals/pull/3758): `event_property_is` push condition. |
@@ -53,7 +53,6 @@ fn bench_match_exact(b: &mut Bencher) { | |||
vec![], | |||
false, | |||
false, | |||
false, | |||
) | |||
.unwrap(); | |||
@@ -100,7 +99,6 @@ fn bench_match_word(b: &mut Bencher) { | |||
vec![], | |||
false, | |||
false, | |||
false, | |||
) | |||
.unwrap(); | |||
@@ -147,7 +145,6 @@ fn bench_match_word_miss(b: &mut Bencher) { | |||
vec![], | |||
false, | |||
false, | |||
false, | |||
) | |||
.unwrap(); | |||
@@ -194,7 +191,6 @@ fn bench_eval_message(b: &mut Bencher) { | |||
vec![], | |||
false, | |||
false, | |||
false, | |||
) | |||
.unwrap(); | |||
@@ -24,10 +24,10 @@ use super::KnownCondition; | |||
use crate::push::RelatedEventMatchTypeCondition; | |||
use crate::push::SetTweak; | |||
use crate::push::TweakValue; | |||
use crate::push::{Action, ExactEventMatchCondition, SimpleJsonValue}; | |||
use crate::push::{Action, EventPropertyIsCondition, SimpleJsonValue}; | |||
use crate::push::{Condition, EventMatchTypeCondition}; | |||
use crate::push::{EventMatchCondition, EventMatchPatternType}; | |||
use crate::push::{ExactEventMatchTypeCondition, PushRule}; | |||
use crate::push::{EventPropertyIsTypeCondition, PushRule}; | |||
const HIGHLIGHT_ACTION: Action = Action::SetTweak(SetTweak { | |||
set_tweak: Cow::Borrowed("highlight"), | |||
@@ -145,7 +145,7 @@ pub const BASE_APPEND_OVERRIDE_RULES: &[PushRule] = &[ | |||
rule_id: Cow::Borrowed(".org.matrix.msc3952.is_user_mention"), | |||
priority_class: 5, | |||
conditions: Cow::Borrowed(&[Condition::Known( | |||
KnownCondition::ExactEventPropertyContainsType(ExactEventMatchTypeCondition { | |||
KnownCondition::ExactEventPropertyContainsType(EventPropertyIsTypeCondition { | |||
key: Cow::Borrowed("content.org.matrix.msc3952.mentions.user_ids"), | |||
value_type: Cow::Borrowed(&EventMatchPatternType::UserId), | |||
}), | |||
@@ -166,7 +166,7 @@ pub const BASE_APPEND_OVERRIDE_RULES: &[PushRule] = &[ | |||
rule_id: Cow::Borrowed(".org.matrix.msc3952.is_room_mention"), | |||
priority_class: 5, | |||
conditions: Cow::Borrowed(&[ | |||
Condition::Known(KnownCondition::ExactEventMatch(ExactEventMatchCondition { | |||
Condition::Known(KnownCondition::EventPropertyIs(EventPropertyIsCondition { | |||
key: Cow::Borrowed("content.org.matrix.msc3952.mentions.room"), | |||
value: Cow::Borrowed(&SimpleJsonValue::Bool(true)), | |||
})), | |||
@@ -23,7 +23,7 @@ use regex::Regex; | |||
use super::{ | |||
utils::{get_glob_matcher, get_localpart_from_id, GlobMatchType}, | |||
Action, Condition, ExactEventMatchCondition, FilteredPushRules, KnownCondition, | |||
Action, Condition, EventPropertyIsCondition, FilteredPushRules, KnownCondition, | |||
SimpleJsonValue, | |||
}; | |||
use crate::push::{EventMatchPatternType, JsonValue}; | |||
@@ -97,9 +97,6 @@ pub struct PushRuleEvaluator { | |||
/// flag as MSC1767 (extensible events core). | |||
msc3931_enabled: bool, | |||
/// If MSC3758 (exact_event_match push rule condition) is enabled. | |||
msc3758_exact_event_match: bool, | |||
/// If MSC3966 (exact_event_property_contains push rule condition) is enabled. | |||
msc3966_exact_event_property_contains: bool, | |||
} | |||
@@ -119,7 +116,6 @@ impl PushRuleEvaluator { | |||
related_event_match_enabled: bool, | |||
room_version_feature_flags: Vec<String>, | |||
msc3931_enabled: bool, | |||
msc3758_exact_event_match: bool, | |||
msc3966_exact_event_property_contains: bool, | |||
) -> Result<Self, Error> { | |||
let body = match flattened_keys.get("content.body") { | |||
@@ -138,7 +134,6 @@ impl PushRuleEvaluator { | |||
related_event_match_enabled, | |||
room_version_feature_flags, | |||
msc3931_enabled, | |||
msc3758_exact_event_match, | |||
msc3966_exact_event_property_contains, | |||
}) | |||
} | |||
@@ -275,8 +270,8 @@ impl PushRuleEvaluator { | |||
self.match_event_match(&self.flattened_keys, &event_match.key, pattern)? | |||
} | |||
KnownCondition::ExactEventMatch(exact_event_match) => { | |||
self.match_exact_event_match(exact_event_match)? | |||
KnownCondition::EventPropertyIs(event_property_is) => { | |||
self.match_event_property_is(event_property_is)? | |||
} | |||
KnownCondition::RelatedEventMatch(event_match) => self.match_related_event_match( | |||
&event_match.rel_type.clone(), | |||
@@ -306,10 +301,10 @@ impl PushRuleEvaluator { | |||
Some(Cow::Borrowed(pattern)), | |||
)? | |||
} | |||
KnownCondition::ExactEventPropertyContains(exact_event_match) => self | |||
KnownCondition::ExactEventPropertyContains(event_property_is) => self | |||
.match_exact_event_property_contains( | |||
exact_event_match.key.clone(), | |||
exact_event_match.value.clone(), | |||
event_property_is.key.clone(), | |||
event_property_is.value.clone(), | |||
)?, | |||
KnownCondition::ExactEventPropertyContainsType(exact_event_match) => { | |||
// The `pattern_type` can either be "user_id" or "user_localpart", | |||
@@ -405,20 +400,15 @@ impl PushRuleEvaluator { | |||
compiled_pattern.is_match(haystack) | |||
} | |||
/// Evaluates a `exact_event_match` condition. (MSC3758) | |||
fn match_exact_event_match( | |||
/// Evaluates a `event_property_is` condition. | |||
fn match_event_property_is( | |||
&self, | |||
exact_event_match: &ExactEventMatchCondition, | |||
event_property_is: &EventPropertyIsCondition, | |||
) -> Result<bool, Error> { | |||
// First check if the feature is enabled. | |||
if !self.msc3758_exact_event_match { | |||
return Ok(false); | |||
} | |||
let value = &exact_event_match.value; | |||
let value = &event_property_is.value; | |||
let haystack = if let Some(JsonValue::Value(haystack)) = | |||
self.flattened_keys.get(&*exact_event_match.key) | |||
self.flattened_keys.get(&*event_property_is.key) | |||
{ | |||
haystack | |||
} else { | |||
@@ -464,7 +454,7 @@ impl PushRuleEvaluator { | |||
} | |||
} | |||
/// Evaluates a `exact_event_property_contains` condition. (MSC3758) | |||
/// Evaluates a `exact_event_property_contains` condition. (MSC3966) | |||
fn match_exact_event_property_contains( | |||
&self, | |||
key: Cow<str>, | |||
@@ -526,7 +516,6 @@ fn push_rule_evaluator() { | |||
vec![], | |||
true, | |||
true, | |||
true, | |||
) | |||
.unwrap(); | |||
@@ -557,7 +546,6 @@ fn test_requires_room_version_supports_condition() { | |||
flags, | |||
true, | |||
true, | |||
true, | |||
) | |||
.unwrap(); | |||
@@ -331,21 +331,20 @@ pub enum KnownCondition { | |||
// Identical to event_match but gives predefined patterns. Cannot be added by users. | |||
#[serde(skip_deserializing, rename = "event_match")] | |||
EventMatchType(EventMatchTypeCondition), | |||
#[serde(rename = "com.beeper.msc3758.exact_event_match")] | |||
ExactEventMatch(ExactEventMatchCondition), | |||
EventPropertyIs(EventPropertyIsCondition), | |||
#[serde(rename = "im.nheko.msc3664.related_event_match")] | |||
RelatedEventMatch(RelatedEventMatchCondition), | |||
// Identical to related_event_match but gives predefined patterns. Cannot be added by users. | |||
#[serde(skip_deserializing, rename = "im.nheko.msc3664.related_event_match")] | |||
RelatedEventMatchType(RelatedEventMatchTypeCondition), | |||
#[serde(rename = "org.matrix.msc3966.exact_event_property_contains")] | |||
ExactEventPropertyContains(ExactEventMatchCondition), | |||
ExactEventPropertyContains(EventPropertyIsCondition), | |||
// Identical to exact_event_property_contains but gives predefined patterns. Cannot be added by users. | |||
#[serde( | |||
skip_deserializing, | |||
rename = "org.matrix.msc3966.exact_event_property_contains" | |||
)] | |||
ExactEventPropertyContainsType(ExactEventMatchTypeCondition), | |||
ExactEventPropertyContainsType(EventPropertyIsTypeCondition), | |||
ContainsDisplayName, | |||
RoomMemberCount { | |||
#[serde(skip_serializing_if = "Option::is_none")] | |||
@@ -395,16 +394,16 @@ pub struct EventMatchTypeCondition { | |||
pub pattern_type: Cow<'static, EventMatchPatternType>, | |||
} | |||
/// The body of a [`Condition::ExactEventMatch`] | |||
/// The body of a [`Condition::EventPropertyIs`] | |||
#[derive(Serialize, Deserialize, Debug, Clone)] | |||
pub struct ExactEventMatchCondition { | |||
pub struct EventPropertyIsCondition { | |||
pub key: Cow<'static, str>, | |||
pub value: Cow<'static, SimpleJsonValue>, | |||
} | |||
/// The body of a [`Condition::ExactEventMatch`] that uses user_id or user_localpart as a pattern. | |||
/// The body of a [`Condition::EventPropertyIs`] that uses user_id or user_localpart as a pattern. | |||
#[derive(Serialize, Debug, Clone)] | |||
pub struct ExactEventMatchTypeCondition { | |||
pub struct EventPropertyIsTypeCondition { | |||
pub key: Cow<'static, str>, | |||
// During serialization, the pattern_type property gets replaced with a | |||
// pattern property of the correct value in synapse.push.clientformat.format_push_rules_for_user. | |||
@@ -711,44 +710,41 @@ fn test_deserialize_unstable_msc3931_condition() { | |||
} | |||
#[test] | |||
fn test_deserialize_unstable_msc3758_condition() { | |||
fn test_deserialize_event_property_is_condition() { | |||
// A string condition should work. | |||
let json = | |||
r#"{"kind":"com.beeper.msc3758.exact_event_match","key":"content.value","value":"foo"}"#; | |||
let json = r#"{"kind":"event_property_is","key":"content.value","value":"foo"}"#; | |||
let condition: Condition = serde_json::from_str(json).unwrap(); | |||
assert!(matches!( | |||
condition, | |||
Condition::Known(KnownCondition::ExactEventMatch(_)) | |||
Condition::Known(KnownCondition::EventPropertyIs(_)) | |||
)); | |||
// A boolean condition should work. | |||
let json = | |||
r#"{"kind":"com.beeper.msc3758.exact_event_match","key":"content.value","value":true}"#; | |||
let json = r#"{"kind":"event_property_is","key":"content.value","value":true}"#; | |||
let condition: Condition = serde_json::from_str(json).unwrap(); | |||
assert!(matches!( | |||
condition, | |||
Condition::Known(KnownCondition::ExactEventMatch(_)) | |||
Condition::Known(KnownCondition::EventPropertyIs(_)) | |||
)); | |||
// An integer condition should work. | |||
let json = r#"{"kind":"com.beeper.msc3758.exact_event_match","key":"content.value","value":1}"#; | |||
let json = r#"{"kind":"event_property_is","key":"content.value","value":1}"#; | |||
let condition: Condition = serde_json::from_str(json).unwrap(); | |||
assert!(matches!( | |||
condition, | |||
Condition::Known(KnownCondition::ExactEventMatch(_)) | |||
Condition::Known(KnownCondition::EventPropertyIs(_)) | |||
)); | |||
// A null condition should work | |||
let json = | |||
r#"{"kind":"com.beeper.msc3758.exact_event_match","key":"content.value","value":null}"#; | |||
let json = r#"{"kind":"event_property_is","key":"content.value","value":null}"#; | |||
let condition: Condition = serde_json::from_str(json).unwrap(); | |||
assert!(matches!( | |||
condition, | |||
Condition::Known(KnownCondition::ExactEventMatch(_)) | |||
Condition::Known(KnownCondition::EventPropertyIs(_)) | |||
)); | |||
} | |||
@@ -65,7 +65,6 @@ class PushRuleEvaluator: | |||
related_event_match_enabled: bool, | |||
room_version_feature_flags: Tuple[str, ...], | |||
msc3931_enabled: bool, | |||
msc3758_exact_event_match: bool, | |||
msc3966_exact_event_property_contains: bool, | |||
): ... | |||
def run( | |||
@@ -169,11 +169,6 @@ class ExperimentalConfig(Config): | |||
# MSC3925: do not replace events with their edits | |||
self.msc3925_inhibit_edit = experimental.get("msc3925_inhibit_edit", False) | |||
# MSC3758: exact_event_match push rule condition | |||
self.msc3758_exact_event_match = experimental.get( | |||
"msc3758_exact_event_match", False | |||
) | |||
# MSC3873: Disambiguate event_match keys. | |||
self.msc3873_escape_event_match_key = experimental.get( | |||
"msc3873_escape_event_match_key", False | |||
@@ -184,10 +179,9 @@ class ExperimentalConfig(Config): | |||
"msc3966_exact_event_property_contains", False | |||
) | |||
# MSC3952: Intentional mentions, this depends on MSC3758 and MSC3966. | |||
# MSC3952: Intentional mentions, this depends on MSC3966. | |||
self.msc3952_intentional_mentions = ( | |||
experimental.get("msc3952_intentional_mentions", False) | |||
and self.msc3758_exact_event_match | |||
and self.msc3966_exact_event_property_contains | |||
) | |||
@@ -413,7 +413,6 @@ class BulkPushRuleEvaluator: | |||
self._related_event_match_enabled, | |||
event.room_version.msc3931_push_features, | |||
self.hs.config.experimental.msc1767_enabled, # MSC3931 flag | |||
self.hs.config.experimental.msc3758_exact_event_match, | |||
self.hs.config.experimental.msc3966_exact_event_property_contains, | |||
) | |||
@@ -231,7 +231,6 @@ class TestBulkPushRuleEvaluator(HomeserverTestCase): | |||
@override_config( | |||
{ | |||
"experimental_features": { | |||
"msc3758_exact_event_match": True, | |||
"msc3952_intentional_mentions": True, | |||
"msc3966_exact_event_property_contains": True, | |||
} | |||
@@ -335,7 +334,6 @@ class TestBulkPushRuleEvaluator(HomeserverTestCase): | |||
@override_config( | |||
{ | |||
"experimental_features": { | |||
"msc3758_exact_event_match": True, | |||
"msc3952_intentional_mentions": True, | |||
"msc3966_exact_event_property_contains": True, | |||
} | |||
@@ -173,7 +173,6 @@ class PushRuleEvaluatorTestCase(unittest.TestCase): | |||
related_event_match_enabled=True, | |||
room_version_feature_flags=event.room_version.msc3931_push_features, | |||
msc3931_enabled=True, | |||
msc3758_exact_event_match=True, | |||
msc3966_exact_event_property_contains=True, | |||
) | |||
@@ -404,7 +403,7 @@ class PushRuleEvaluatorTestCase(unittest.TestCase): | |||
# Test against a string value. | |||
condition = { | |||
"kind": "com.beeper.msc3758.exact_event_match", | |||
"kind": "event_property_is", | |||
"key": "content.value", | |||
"value": "foobaz", | |||
} | |||
@@ -442,11 +441,7 @@ class PushRuleEvaluatorTestCase(unittest.TestCase): | |||
"""Check that exact_event_match conditions work as expected for booleans.""" | |||
# Test against a True boolean value. | |||
condition = { | |||
"kind": "com.beeper.msc3758.exact_event_match", | |||
"key": "content.value", | |||
"value": True, | |||
} | |||
condition = {"kind": "event_property_is", "key": "content.value", "value": True} | |||
self._assert_matches( | |||
condition, | |||
{"value": True}, | |||
@@ -466,7 +461,7 @@ class PushRuleEvaluatorTestCase(unittest.TestCase): | |||
# Test against a False boolean value. | |||
condition = { | |||
"kind": "com.beeper.msc3758.exact_event_match", | |||
"kind": "event_property_is", | |||
"key": "content.value", | |||
"value": False, | |||
} | |||
@@ -491,11 +486,7 @@ class PushRuleEvaluatorTestCase(unittest.TestCase): | |||
def test_exact_event_match_null(self) -> None: | |||
"""Check that exact_event_match conditions work as expected for null.""" | |||
condition = { | |||
"kind": "com.beeper.msc3758.exact_event_match", | |||
"key": "content.value", | |||
"value": None, | |||
} | |||
condition = {"kind": "event_property_is", "key": "content.value", "value": None} | |||
self._assert_matches( | |||
condition, | |||
{"value": None}, | |||
@@ -511,11 +502,7 @@ class PushRuleEvaluatorTestCase(unittest.TestCase): | |||
def test_exact_event_match_integer(self) -> None: | |||
"""Check that exact_event_match conditions work as expected for integers.""" | |||
condition = { | |||
"kind": "com.beeper.msc3758.exact_event_match", | |||
"key": "content.value", | |||
"value": 1, | |||
} | |||
condition = {"kind": "event_property_is", "key": "content.value", "value": 1} | |||
self._assert_matches( | |||
condition, | |||
{"value": 1}, | |||