1717from typing import TYPE_CHECKING , Dict , List , Tuple , Union
1818
1919from synapse .api .errors import StoreError
20+ from synapse .config .homeserver import ExperimentalConfig
2021from synapse .push .baserules import list_with_base_rules
2122from synapse .replication .slave .storage ._slaved_id_tracker import SlavedIdTracker
2223from synapse .storage ._base import SQLBaseStore , db_to_json
4243logger = 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