@ -13,46 +13,67 @@
# limitations under the License.
from synapse . push . rulekinds import PRIORITY_CLASS_MAP , PRIORITY_CLASS_INVERSE_MAP
import copy
def list_with_base_rules ( rawrules ) :
""" Combine the list of rules set by the user with the default push rules
: param list rawrules : The rules the user has modified or set .
: returns : A new list with the rules set by the user combined with the
defaults .
"""
ruleslist = [ ]
# Grab the base rules that the user has modified.
# The modified base rules have a priority_class of -1.
modified_base_rules = {
r [ ' rule_id ' ] : r for r in rawrules if r [ ' priority_class ' ] < 0
}
# Remove the modified base rules from the list, They'll be added back
# in the default postions in the list.
rawrules = [ r for r in rawrules if r [ ' priority_class ' ] > = 0 ]
# shove the server default rules for each kind onto the end of each
current_prio_class = PRIORITY_CLASS_INVERSE_MAP . keys ( ) [ - 1 ]
ruleslist . extend ( make_base_prepend_rules (
PRIORITY_CLASS_INVERSE_MAP [ current_prio_class ]
PRIORITY_CLASS_INVERSE_MAP [ current_prio_class ] , modified_base_rules
) )
for r in rawrules :
if r [ ' priority_class ' ] < current_prio_class :
while r [ ' priority_class ' ] < current_prio_class :
ruleslist . extend ( make_base_append_rules (
PRIORITY_CLASS_INVERSE_MAP [ current_prio_class ]
PRIORITY_CLASS_INVERSE_MAP [ current_prio_class ] ,
modified_base_rules ,
) )
current_prio_class - = 1
if current_prio_class > 0 :
ruleslist . extend ( make_base_prepend_rules (
PRIORITY_CLASS_INVERSE_MAP [ current_prio_class ]
PRIORITY_CLASS_INVERSE_MAP [ current_prio_class ] ,
modified_base_rules ,
) )
ruleslist . append ( r )
while current_prio_class > 0 :
ruleslist . extend ( make_base_append_rules (
PRIORITY_CLASS_INVERSE_MAP [ current_prio_class ]
PRIORITY_CLASS_INVERSE_MAP [ current_prio_class ] ,
modified_base_rules ,
) )
current_prio_class - = 1
if current_prio_class > 0 :
ruleslist . extend ( make_base_prepend_rules (
PRIORITY_CLASS_INVERSE_MAP [ current_prio_class ]
PRIORITY_CLASS_INVERSE_MAP [ current_prio_class ] ,
modified_base_rules ,
) )
return ruleslist
def make_base_append_rules ( kind ) :
def make_base_append_rules ( kind , modified_base_rules ) :
rules = [ ]
if kind == ' override ' :
@ -62,15 +83,31 @@ def make_base_append_rules(kind):
elif kind == ' content ' :
rules = BASE_APPEND_CONTENT_RULES
# Copy the rules before modifying them
rules = copy . deepcopy ( rules )
for r in rules :
# Only modify the actions, keep the conditions the same.
modified = modified_base_rules . get ( r [ ' rule_id ' ] )
if modified :
r [ ' actions ' ] = modified [ ' actions ' ]
return rules
def make_base_prepend_rules ( kind ) :
def make_base_prepend_rules ( kind , modified_base_rules ) :
rules = [ ]
if kind == ' override ' :
rules = BASE_PREPEND_OVERRIDE_RULES
# Copy the rules before modifying them
rules = copy . deepcopy ( rules )
for r in rules :
# Only modify the actions, keep the conditions the same.
modified = modified_base_rules . get ( r [ ' rule_id ' ] )
if modified :
r [ ' actions ' ] = modified [ ' actions ' ]
return rules
@ -263,18 +300,24 @@ BASE_APPEND_UNDERRIDE_RULES = [
]
BASE_RULE_IDS = set ( )
for r in BASE_APPEND_CONTENT_RULES :
r [ ' priority_class ' ] = PRIORITY_CLASS_MAP [ ' content ' ]
r [ ' default ' ] = True
BASE_RULE_IDS . add ( r [ ' rule_id ' ] )
for r in BASE_PREPEND_OVERRIDE_RULES :
r [ ' priority_class ' ] = PRIORITY_CLASS_MAP [ ' override ' ]
r [ ' default ' ] = True
BASE_RULE_IDS . add ( r [ ' rule_id ' ] )
for r in BASE_APPEND_OVRRIDE_RULES :
r [ ' priority_class ' ] = PRIORITY_CLASS_MAP [ ' override ' ]
r [ ' default ' ] = True
BASE_RULE_IDS . add ( r [ ' rule_id ' ] )
for r in BASE_APPEND_UNDERRIDE_RULES :
r [ ' priority_class ' ] = PRIORITY_CLASS_MAP [ ' underride ' ]
r [ ' default ' ] = True
BASE_RULE_IDS . add ( r [ ' rule_id ' ] )