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

Commit cdbb8e6

Browse files
authored
Implement new experimental push rules (#7997)
With an undocumented configuration setting to enable them for specific users.
2 parents 7f83795 + 5c43c43 commit cdbb8e6

File tree

5 files changed

+245
-14
lines changed

5 files changed

+245
-14
lines changed

changelog.d/7997.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Implement new experimental push rules for some users.

synapse/config/server.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,21 @@ class LimitRemoteRoomsConfig(object):
530530
"request_token_inhibit_3pid_errors", False,
531531
)
532532

533+
# List of users trialing the new experimental default push rules. This setting is
534+
# not included in the sample configuration file on purpose as it's a temporary
535+
# hack, so that some users can trial the new defaults without impacting every
536+
# user on the homeserver.
537+
users_new_default_push_rules = (
538+
config.get("users_new_default_push_rules") or []
539+
) # type: list
540+
if not isinstance(users_new_default_push_rules, list):
541+
raise ConfigError("'users_new_default_push_rules' must be a list")
542+
543+
# Turn the list into a set to improve lookup speed.
544+
self.users_new_default_push_rules = set(
545+
users_new_default_push_rules
546+
) # type: set
547+
533548
def has_tls_listener(self) -> bool:
534549
return any(listener.tls for listener in self.listeners)
535550

synapse/push/baserules.py

Lines changed: 208 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
from synapse.push.rulekinds import PRIORITY_CLASS_INVERSE_MAP, PRIORITY_CLASS_MAP
2020

2121

22-
def list_with_base_rules(rawrules):
22+
def list_with_base_rules(rawrules, use_new_defaults=False):
2323
"""Combine the list of rules set by the user with the default push rules
2424
2525
Args:
2626
rawrules(list): The rules the user has modified or set.
27+
use_new_defaults(bool): Whether to use the new experimental default rules when
28+
appending or prepending default rules.
2729
2830
Returns:
2931
A new list with the rules set by the user combined with the defaults.
@@ -43,7 +45,9 @@ def list_with_base_rules(rawrules):
4345

4446
ruleslist.extend(
4547
make_base_prepend_rules(
46-
PRIORITY_CLASS_INVERSE_MAP[current_prio_class], modified_base_rules
48+
PRIORITY_CLASS_INVERSE_MAP[current_prio_class],
49+
modified_base_rules,
50+
use_new_defaults,
4751
)
4852
)
4953

@@ -54,6 +58,7 @@ def list_with_base_rules(rawrules):
5458
make_base_append_rules(
5559
PRIORITY_CLASS_INVERSE_MAP[current_prio_class],
5660
modified_base_rules,
61+
use_new_defaults,
5762
)
5863
)
5964
current_prio_class -= 1
@@ -62,6 +67,7 @@ def list_with_base_rules(rawrules):
6267
make_base_prepend_rules(
6368
PRIORITY_CLASS_INVERSE_MAP[current_prio_class],
6469
modified_base_rules,
70+
use_new_defaults,
6571
)
6672
)
6773

@@ -70,27 +76,39 @@ def list_with_base_rules(rawrules):
7076
while current_prio_class > 0:
7177
ruleslist.extend(
7278
make_base_append_rules(
73-
PRIORITY_CLASS_INVERSE_MAP[current_prio_class], modified_base_rules
79+
PRIORITY_CLASS_INVERSE_MAP[current_prio_class],
80+
modified_base_rules,
81+
use_new_defaults,
7482
)
7583
)
7684
current_prio_class -= 1
7785
if current_prio_class > 0:
7886
ruleslist.extend(
7987
make_base_prepend_rules(
80-
PRIORITY_CLASS_INVERSE_MAP[current_prio_class], modified_base_rules
88+
PRIORITY_CLASS_INVERSE_MAP[current_prio_class],
89+
modified_base_rules,
90+
use_new_defaults,
8191
)
8292
)
8393

8494
return ruleslist
8595

8696

87-
def make_base_append_rules(kind, modified_base_rules):
97+
def make_base_append_rules(kind, modified_base_rules, use_new_defaults=False):
8898
rules = []
8999

90100
if kind == "override":
91-
rules = BASE_APPEND_OVERRIDE_RULES
101+
rules = (
102+
NEW_APPEND_OVERRIDE_RULES
103+
if use_new_defaults
104+
else BASE_APPEND_OVERRIDE_RULES
105+
)
92106
elif kind == "underride":
93-
rules = BASE_APPEND_UNDERRIDE_RULES
107+
rules = (
108+
NEW_APPEND_UNDERRIDE_RULES
109+
if use_new_defaults
110+
else BASE_APPEND_UNDERRIDE_RULES
111+
)
94112
elif kind == "content":
95113
rules = BASE_APPEND_CONTENT_RULES
96114

@@ -105,7 +123,7 @@ def make_base_append_rules(kind, modified_base_rules):
105123
return rules
106124

107125

108-
def make_base_prepend_rules(kind, modified_base_rules):
126+
def make_base_prepend_rules(kind, modified_base_rules, use_new_defaults=False):
109127
rules = []
110128

111129
if kind == "override":
@@ -270,6 +288,135 @@ def make_base_prepend_rules(kind, modified_base_rules):
270288
]
271289

272290

291+
NEW_APPEND_OVERRIDE_RULES = [
292+
{
293+
"rule_id": "global/override/.m.rule.encrypted",
294+
"conditions": [
295+
{
296+
"kind": "event_match",
297+
"key": "type",
298+
"pattern": "m.room.encrypted",
299+
"_id": "_encrypted",
300+
}
301+
],
302+
"actions": ["notify"],
303+
},
304+
{
305+
"rule_id": "global/override/.m.rule.suppress_notices",
306+
"conditions": [
307+
{
308+
"kind": "event_match",
309+
"key": "type",
310+
"pattern": "m.room.message",
311+
"_id": "_suppress_notices_type",
312+
},
313+
{
314+
"kind": "event_match",
315+
"key": "content.msgtype",
316+
"pattern": "m.notice",
317+
"_id": "_suppress_notices",
318+
},
319+
],
320+
"actions": [],
321+
},
322+
{
323+
"rule_id": "global/underride/.m.rule.suppress_edits",
324+
"conditions": [
325+
{
326+
"kind": "event_match",
327+
"key": "m.relates_to.m.rel_type",
328+
"pattern": "m.replace",
329+
"_id": "_suppress_edits",
330+
}
331+
],
332+
"actions": [],
333+
},
334+
{
335+
"rule_id": "global/override/.m.rule.invite_for_me",
336+
"conditions": [
337+
{
338+
"kind": "event_match",
339+
"key": "type",
340+
"pattern": "m.room.member",
341+
"_id": "_member",
342+
},
343+
{
344+
"kind": "event_match",
345+
"key": "content.membership",
346+
"pattern": "invite",
347+
"_id": "_invite_member",
348+
},
349+
{"kind": "event_match", "key": "state_key", "pattern_type": "user_id"},
350+
],
351+
"actions": ["notify", {"set_tweak": "sound", "value": "default"}],
352+
},
353+
{
354+
"rule_id": "global/override/.m.rule.contains_display_name",
355+
"conditions": [{"kind": "contains_display_name"}],
356+
"actions": [
357+
"notify",
358+
{"set_tweak": "sound", "value": "default"},
359+
{"set_tweak": "highlight"},
360+
],
361+
},
362+
{
363+
"rule_id": "global/override/.m.rule.tombstone",
364+
"conditions": [
365+
{
366+
"kind": "event_match",
367+
"key": "type",
368+
"pattern": "m.room.tombstone",
369+
"_id": "_tombstone",
370+
},
371+
{
372+
"kind": "event_match",
373+
"key": "state_key",
374+
"pattern": "",
375+
"_id": "_tombstone_statekey",
376+
},
377+
],
378+
"actions": [
379+
"notify",
380+
{"set_tweak": "sound", "value": "default"},
381+
{"set_tweak": "highlight"},
382+
],
383+
},
384+
{
385+
"rule_id": "global/override/.m.rule.roomnotif",
386+
"conditions": [
387+
{
388+
"kind": "event_match",
389+
"key": "content.body",
390+
"pattern": "@room",
391+
"_id": "_roomnotif_content",
392+
},
393+
{
394+
"kind": "sender_notification_permission",
395+
"key": "room",
396+
"_id": "_roomnotif_pl",
397+
},
398+
],
399+
"actions": [
400+
"notify",
401+
{"set_tweak": "highlight"},
402+
{"set_tweak": "sound", "value": "default"},
403+
],
404+
},
405+
{
406+
"rule_id": "global/override/.m.rule.call",
407+
"conditions": [
408+
{
409+
"kind": "event_match",
410+
"key": "type",
411+
"pattern": "m.call.invite",
412+
"_id": "_call",
413+
}
414+
],
415+
"actions": ["notify", {"set_tweak": "sound", "value": "ring"}],
416+
},
417+
]
418+
419+
273420
BASE_APPEND_UNDERRIDE_RULES = [
274421
{
275422
"rule_id": "global/underride/.m.rule.call",
@@ -354,6 +501,36 @@ def make_base_prepend_rules(kind, modified_base_rules):
354501
]
355502

356503

504+
NEW_APPEND_UNDERRIDE_RULES = [
505+
{
506+
"rule_id": "global/underride/.m.rule.room_one_to_one",
507+
"conditions": [
508+
{"kind": "room_member_count", "is": "2", "_id": "member_count"},
509+
{
510+
"kind": "event_match",
511+
"key": "content.body",
512+
"pattern": "*",
513+
"_id": "body",
514+
},
515+
],
516+
"actions": ["notify", {"set_tweak": "sound", "value": "default"}],
517+
},
518+
{
519+
"rule_id": "global/underride/.m.rule.message",
520+
"conditions": [
521+
{
522+
"kind": "event_match",
523+
"key": "content.body",
524+
"pattern": "*",
525+
"_id": "body",
526+
},
527+
],
528+
"actions": ["notify"],
529+
"enabled": False,
530+
},
531+
]
532+
533+
357534
BASE_RULE_IDS = set()
358535

359536
for r in BASE_APPEND_CONTENT_RULES:
@@ -375,3 +552,26 @@ def make_base_prepend_rules(kind, modified_base_rules):
375552
r["priority_class"] = PRIORITY_CLASS_MAP["underride"]
376553
r["default"] = True
377554
BASE_RULE_IDS.add(r["rule_id"])
555+
556+
557+
NEW_RULE_IDS = set()
558+
559+
for r in BASE_APPEND_CONTENT_RULES:
560+
r["priority_class"] = PRIORITY_CLASS_MAP["content"]
561+
r["default"] = True
562+
NEW_RULE_IDS.add(r["rule_id"])
563+
564+
for r in BASE_PREPEND_OVERRIDE_RULES:
565+
r["priority_class"] = PRIORITY_CLASS_MAP["override"]
566+
r["default"] = True
567+
NEW_RULE_IDS.add(r["rule_id"])
568+
569+
for r in NEW_APPEND_OVERRIDE_RULES:
570+
r["priority_class"] = PRIORITY_CLASS_MAP["override"]
571+
r["default"] = True
572+
NEW_RULE_IDS.add(r["rule_id"])
573+
574+
for r in NEW_APPEND_UNDERRIDE_RULES:
575+
r["priority_class"] = PRIORITY_CLASS_MAP["underride"]
576+
r["default"] = True
577+
NEW_RULE_IDS.add(r["rule_id"])

synapse/rest/client/v1/push_rule.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
parse_json_value_from_request,
2626
parse_string,
2727
)
28-
from synapse.push.baserules import BASE_RULE_IDS
28+
from synapse.push.baserules import BASE_RULE_IDS, NEW_RULE_IDS
2929
from synapse.push.clientformat import format_push_rules_for_user
3030
from synapse.push.rulekinds import PRIORITY_CLASS_MAP
3131
from synapse.rest.client.v2_alpha._base import client_patterns
@@ -45,6 +45,8 @@ def __init__(self, hs):
4545
self.notifier = hs.get_notifier()
4646
self._is_worker = hs.config.worker_app is not None
4747

48+
self._users_new_default_push_rules = hs.config.users_new_default_push_rules
49+
4850
async def on_PUT(self, request, path):
4951
if self._is_worker:
5052
raise Exception("Cannot handle PUT /push_rules on worker")
@@ -179,7 +181,12 @@ def set_rule_attr(self, user_id, spec, val):
179181
rule_id = spec["rule_id"]
180182
is_default_rule = rule_id.startswith(".")
181183
if is_default_rule:
182-
if namespaced_rule_id not in BASE_RULE_IDS:
184+
if user_id in self._users_new_default_push_rules:
185+
rule_ids = NEW_RULE_IDS
186+
else:
187+
rule_ids = BASE_RULE_IDS
188+
189+
if namespaced_rule_id not in rule_ids:
183190
raise SynapseError(404, "Unknown rule %r" % (namespaced_rule_id,))
184191
return self.store.set_push_rule_actions(
185192
user_id, namespaced_rule_id, actions, is_default_rule

0 commit comments

Comments
 (0)