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