summary refs log tree commit diff
path: root/synapse/rest
diff options
context:
space:
mode:
Diffstat (limited to 'synapse/rest')
-rw-r--r--synapse/rest/client/v1/push_rule.py16
1 files changed, 12 insertions, 4 deletions
diff --git a/synapse/rest/client/v1/push_rule.py b/synapse/rest/client/v1/push_rule.py
index 61e3bc8236..faa7919fbb 100644
--- a/synapse/rest/client/v1/push_rule.py
+++ b/synapse/rest/client/v1/push_rule.py
@@ -19,6 +19,7 @@ from synapse.api.errors import SynapseError, Codes, UnrecognizedRequestError, No
     StoreError
 from .base import ClientV1RestServlet, client_path_pattern
 from synapse.storage.push_rule import InconsistentRuleException, RuleNotFoundException
+import synapse.push.baserules as baserules
 
 import json
 
@@ -26,6 +27,7 @@ import json
 class PushRuleRestServlet(ClientV1RestServlet):
     PATTERN = client_path_pattern("/pushrules/.*$")
     PRIORITY_CLASS_MAP = {
+        'default': 0,
         'underride': 1,
         'sender': 2,
         'room': 3,
@@ -137,6 +139,9 @@ class PushRuleRestServlet(ClientV1RestServlet):
 
         user, _ = yield self.auth.get_user_by_req(request)
 
+        if spec['template'] == 'default':
+            raise SynapseError(403, "The default rules are immutable.")
+
         content = _parse_json(request)
 
         try:
@@ -218,6 +223,10 @@ class PushRuleRestServlet(ClientV1RestServlet):
         # to send which means doing unnecessary work sometimes but is
         # is probably not going to make a whole lot of difference
         rawrules = yield self.hs.get_datastore().get_push_rules_for_user_name(user.to_string())
+        for r in rawrules:
+            r["conditions"] = json.loads(r["conditions"])
+            r["actions"] = json.loads(r["actions"])
+        rawrules.extend(baserules.make_base_rules(user.to_string()))
 
         rules = {'global': {}, 'device': {}}
 
@@ -226,9 +235,6 @@ class PushRuleRestServlet(ClientV1RestServlet):
         for r in rawrules:
             rulearray = None
 
-            r["conditions"] = json.loads(r["conditions"])
-            r["actions"] = json.loads(r["actions"])
-
             template_name = _priority_class_to_template_name(r['priority_class'])
 
             if r['priority_class'] > PushRuleRestServlet.PRIORITY_CLASS_MAP['override']:
@@ -356,7 +362,9 @@ def _priority_class_to_template_name(pc):
 
 def _rule_to_template(rule):
     template_name = _priority_class_to_template_name(rule['priority_class'])
-    if template_name in ['override', 'underride']:
+    if template_name in ['default']:
+        return {k: rule[k] for k in ["conditions", "actions"]}
+    elif template_name in ['override', 'underride']:
         return {k: rule[k] for k in ["rule_id", "conditions", "actions"]}
     elif template_name in ["sender", "room"]:
         return {k: rule[k] for k in ["rule_id", "actions"]}