17
17
from typing import TYPE_CHECKING , Dict , List , Tuple , Union
18
18
19
19
from synapse .api .errors import StoreError
20
+ from synapse .config .homeserver import ExperimentalConfig
20
21
from synapse .push .baserules import list_with_base_rules
21
22
from synapse .replication .slave .storage ._slaved_id_tracker import SlavedIdTracker
22
23
from synapse .storage ._base import SQLBaseStore , db_to_json
42
43
logger = logging .getLogger (__name__ )
43
44
44
45
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 ):
46
61
ruleslist = []
47
62
for rawrule in rawrules :
48
63
rule = dict (rawrule )
@@ -51,17 +66,26 @@ def _load_rules(rawrules, enabled_map):
51
66
rule ["default" ] = False
52
67
ruleslist .append (rule )
53
68
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
+ ]
56
76
57
77
for i , rule in enumerate (rules ):
58
78
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
65
89
66
90
return rules
67
91
@@ -141,7 +165,7 @@ async def get_push_rules_for_user(self, user_id):
141
165
142
166
enabled_map = await self .get_push_rules_enabled_for_user (user_id )
143
167
144
- return _load_rules (rows , enabled_map )
168
+ return _load_rules (rows , enabled_map , self . hs . config . experimental )
145
169
146
170
@cached (max_entries = 5000 )
147
171
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):
200
224
enabled_map_by_user = await self .bulk_get_push_rules_enabled (user_ids )
201
225
202
226
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
+ )
204
230
205
231
return results
206
232
0 commit comments