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

Commit ade3008

Browse files
Implement MSC3786: Add a default push rule to ignore m.room.server_acl events (#12601)
Fixes element-hq/element-web#20788 Implements matrix-org/matrix-spec-proposals#3786
1 parent d80a7ab commit ade3008

File tree

4 files changed

+56
-11
lines changed

4 files changed

+56
-11
lines changed

changelog.d/12601.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Implement MSC3786: Add a default push rule to ignore m.room.server_acl events.

synapse/config/experimental.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,6 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None:
8181

8282
# MSC2815 (allow room moderators to view redacted event content)
8383
self.msc2815_enabled: bool = experimental.get("msc2815_enabled", False)
84+
85+
# MSC3786 (Add a default push rule to ignore m.room.server_acl events)
86+
self.msc3786_enabled: bool = experimental.get("msc3786_enabled", False)

synapse/push/baserules.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,21 @@ def make_base_prepend_rules(
277277
],
278278
"actions": ["dont_notify"],
279279
},
280+
# XXX: This is an experimental rule that is only enabled if msc3786_enabled
281+
# is enabled, if it is not the rule gets filtered out in _load_rules() in
282+
# PushRulesWorkerStore
283+
{
284+
"rule_id": "global/override/.org.matrix.msc3786.rule.room.server_acl",
285+
"conditions": [
286+
{
287+
"kind": "event_match",
288+
"key": "type",
289+
"pattern": "m.room.server_acl",
290+
"_cache_key": "_room_server_acl",
291+
}
292+
],
293+
"actions": ["dont_notify"],
294+
},
280295
]
281296

282297

synapse/storage/databases/main/push_rule.py

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from typing import TYPE_CHECKING, Dict, List, Tuple, Union
1818

1919
from synapse.api.errors import StoreError
20+
from synapse.config.homeserver import ExperimentalConfig
2021
from synapse.push.baserules import list_with_base_rules
2122
from synapse.replication.slave.storage._slaved_id_tracker import SlavedIdTracker
2223
from synapse.storage._base import SQLBaseStore, db_to_json
@@ -42,7 +43,21 @@
4243
logger = logging.getLogger(__name__)
4344

4445

45-
def _load_rules(rawrules, enabled_map):
46+
def _is_experimental_rule_enabled(
47+
rule_id: str, experimental_config: ExperimentalConfig
48+
) -> bool:
49+
"""Used by `_load_rules` to filter out experimental rules when they
50+
have not been enabled.
51+
"""
52+
if (
53+
rule_id == "global/override/.org.matrix.msc3786.rule.room.server_acl"
54+
and not experimental_config.msc3786_enabled
55+
):
56+
return False
57+
return True
58+
59+
60+
def _load_rules(rawrules, enabled_map, experimental_config: ExperimentalConfig):
4661
ruleslist = []
4762
for rawrule in rawrules:
4863
rule = dict(rawrule)
@@ -51,17 +66,26 @@ def _load_rules(rawrules, enabled_map):
5166
rule["default"] = False
5267
ruleslist.append(rule)
5368

54-
# We're going to be mutating this a lot, so do a deep copy
55-
rules = list(list_with_base_rules(ruleslist))
69+
# We're going to be mutating this a lot, so copy it. We also filter out
70+
# any experimental default push rules that aren't enabled.
71+
rules = [
72+
rule
73+
for rule in list_with_base_rules(ruleslist)
74+
if _is_experimental_rule_enabled(rule["rule_id"], experimental_config)
75+
]
5676

5777
for i, rule in enumerate(rules):
5878
rule_id = rule["rule_id"]
59-
if rule_id in enabled_map:
60-
if rule.get("enabled", True) != bool(enabled_map[rule_id]):
61-
# Rules are cached across users.
62-
rule = dict(rule)
63-
rule["enabled"] = bool(enabled_map[rule_id])
64-
rules[i] = rule
79+
80+
if rule_id not in enabled_map:
81+
continue
82+
if rule.get("enabled", True) == bool(enabled_map[rule_id]):
83+
continue
84+
85+
# Rules are cached across users.
86+
rule = dict(rule)
87+
rule["enabled"] = bool(enabled_map[rule_id])
88+
rules[i] = rule
6589

6690
return rules
6791

@@ -141,7 +165,7 @@ async def get_push_rules_for_user(self, user_id):
141165

142166
enabled_map = await self.get_push_rules_enabled_for_user(user_id)
143167

144-
return _load_rules(rows, enabled_map)
168+
return _load_rules(rows, enabled_map, self.hs.config.experimental)
145169

146170
@cached(max_entries=5000)
147171
async def get_push_rules_enabled_for_user(self, user_id) -> Dict[str, bool]:
@@ -200,7 +224,9 @@ async def bulk_get_push_rules(self, user_ids):
200224
enabled_map_by_user = await self.bulk_get_push_rules_enabled(user_ids)
201225

202226
for user_id, rules in results.items():
203-
results[user_id] = _load_rules(rules, enabled_map_by_user.get(user_id, {}))
227+
results[user_id] = _load_rules(
228+
rules, enabled_map_by_user.get(user_id, {}), self.hs.config.experimental
229+
)
204230

205231
return results
206232

0 commit comments

Comments
 (0)