Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 0618bf9

Browse files
author
Mathieu Velten
authored
push rules: fix internal conversion from _type to value (#15781)
Also fix wrong rule names for `is_user_mention` and `is_room_mention`.
1 parent f63d4a3 commit 0618bf9

File tree

4 files changed

+81
-17
lines changed

4 files changed

+81
-17
lines changed

changelog.d/15781.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix a bug in push rules handling leading to an invalid (per spec) `is_user_mention` rule sent to clients. Also fix wrong rule names for `is_user_mention` and `is_room_mention`.

rust/src/push/base_rules.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ pub const BASE_APPEND_OVERRIDE_RULES: &[PushRule] = &[
142142
default_enabled: true,
143143
},
144144
PushRule {
145-
rule_id: Cow::Borrowed("global/override/.m.is_user_mention"),
145+
rule_id: Cow::Borrowed("global/override/.m.rule.is_user_mention"),
146146
priority_class: 5,
147147
conditions: Cow::Borrowed(&[Condition::Known(
148148
KnownCondition::ExactEventPropertyContainsType(EventPropertyIsTypeCondition {
@@ -163,7 +163,7 @@ pub const BASE_APPEND_OVERRIDE_RULES: &[PushRule] = &[
163163
default_enabled: true,
164164
},
165165
PushRule {
166-
rule_id: Cow::Borrowed("global/override/.m.is_room_mention"),
166+
rule_id: Cow::Borrowed("global/override/.m.rule.is_room_mention"),
167167
priority_class: 5,
168168
conditions: Cow::Borrowed(&[
169169
Condition::Known(KnownCondition::EventPropertyIs(EventPropertyIsCondition {

synapse/push/clientformat.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,7 @@ def format_push_rules_for_user(
4141

4242
rulearray.append(template_rule)
4343

44-
for type_key in ("pattern", "value"):
45-
type_value = template_rule.pop(f"{type_key}_type", None)
46-
if type_value == "user_id":
47-
template_rule[type_key] = user.to_string()
48-
elif type_value == "user_localpart":
49-
template_rule[type_key] = user.localpart
44+
_convert_type_to_value(template_rule, user)
5045

5146
template_rule["enabled"] = enabled
5247

@@ -63,19 +58,20 @@ def format_push_rules_for_user(
6358
for c in template_rule["conditions"]:
6459
c.pop("_cache_key", None)
6560

66-
pattern_type = c.pop("pattern_type", None)
67-
if pattern_type == "user_id":
68-
c["pattern"] = user.to_string()
69-
elif pattern_type == "user_localpart":
70-
c["pattern"] = user.localpart
71-
72-
sender_type = c.pop("sender_type", None)
73-
if sender_type == "user_id":
74-
c["sender"] = user.to_string()
61+
_convert_type_to_value(c, user)
7562

7663
return rules
7764

7865

66+
def _convert_type_to_value(rule_or_cond: Dict[str, Any], user: UserID) -> None:
67+
for type_key in ("pattern", "value"):
68+
type_value = rule_or_cond.pop(f"{type_key}_type", None)
69+
if type_value == "user_id":
70+
rule_or_cond[type_key] = user.to_string()
71+
elif type_value == "user_localpart":
72+
rule_or_cond[type_key] = user.localpart
73+
74+
7975
def _add_empty_priority_class_arrays(d: Dict[str, list]) -> Dict[str, list]:
8076
for pc in PRIORITY_CLASS_MAP.keys():
8177
d[pc] = []

tests/rest/client/test_push_rule_attrs.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,3 +412,70 @@ def test_actions_404_when_put_non_existent_server_rule(self) -> None:
412412
)
413413
self.assertEqual(channel.code, 404)
414414
self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
415+
416+
def test_contains_user_name(self) -> None:
417+
"""
418+
Tests that `contains_user_name` rule is present and have proper value in `pattern`.
419+
"""
420+
username = "bob"
421+
self.register_user(username, "pass")
422+
token = self.login(username, "pass")
423+
424+
channel = self.make_request(
425+
"GET",
426+
"/pushrules/global/content/.m.rule.contains_user_name",
427+
access_token=token,
428+
)
429+
430+
self.assertEqual(channel.code, 200)
431+
432+
self.assertEqual(
433+
{
434+
"rule_id": ".m.rule.contains_user_name",
435+
"default": True,
436+
"enabled": True,
437+
"pattern": username,
438+
"actions": [
439+
"notify",
440+
{"set_tweak": "highlight"},
441+
{"set_tweak": "sound", "value": "default"},
442+
],
443+
},
444+
channel.json_body,
445+
)
446+
447+
def test_is_user_mention(self) -> None:
448+
"""
449+
Tests that `is_user_mention` rule is present and have proper value in `value`.
450+
"""
451+
user = self.register_user("bob", "pass")
452+
token = self.login("bob", "pass")
453+
454+
channel = self.make_request(
455+
"GET",
456+
"/pushrules/global/override/.m.rule.is_user_mention",
457+
access_token=token,
458+
)
459+
460+
self.assertEqual(channel.code, 200)
461+
462+
self.assertEqual(
463+
{
464+
"rule_id": ".m.rule.is_user_mention",
465+
"default": True,
466+
"enabled": True,
467+
"conditions": [
468+
{
469+
"kind": "event_property_contains",
470+
"key": "content.m\\.mentions.user_ids",
471+
"value": user,
472+
}
473+
],
474+
"actions": [
475+
"notify",
476+
{"set_tweak": "highlight"},
477+
{"set_tweak": "sound", "value": "default"},
478+
],
479+
},
480+
channel.json_body,
481+
)

0 commit comments

Comments
 (0)