summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Baker <dave@matrix.org>2015-01-23 13:23:10 +0000
committerDavid Baker <dave@matrix.org>2015-01-23 13:23:10 +0000
commit6188c4f69c2f902410b43bc50c0ae8d488b4d93c (patch)
treeb426e91b237b4b45f582a3365e12a1a18e6abcb4
parentAdd slightly pedantic trailing slash error. (diff)
downloadsynapse-6188c4f69c2f902410b43bc50c0ae8d488b4d93c.tar.xz
make per-device rules work
-rw-r--r--synapse/rest/client/v1/push_rule.py20
1 files changed, 15 insertions, 5 deletions
diff --git a/synapse/rest/client/v1/push_rule.py b/synapse/rest/client/v1/push_rule.py
index 6f108431b2..417fd368d7 100644
--- a/synapse/rest/client/v1/push_rule.py
+++ b/synapse/rest/client/v1/push_rule.py
@@ -73,7 +73,7 @@ class PushRuleRestServlet(RestServlet):
             spec['device'] = device
         return spec
 
-    def rule_tuple_from_request_object(self, rule_template, rule_id, req_obj):
+    def rule_tuple_from_request_object(self, rule_template, rule_id, req_obj, device=None):
         if rule_template in ['override', 'underride']:
             if 'conditions' not in req_obj:
                 raise InvalidRuleException("Missing 'conditions'")
@@ -104,6 +104,12 @@ class PushRuleRestServlet(RestServlet):
         else:
             raise InvalidRuleException("Unknown rule template: %s" % (rule_template))
 
+        if device:
+            conditions.append({
+                'kind': 'device',
+                'instance_handle': device
+            })
+
         if 'actions' not in req_obj:
             raise InvalidRuleException("No actions found")
         actions = req_obj['actions']
@@ -144,7 +150,8 @@ class PushRuleRestServlet(RestServlet):
             (conditions, actions) = self.rule_tuple_from_request_object(
                 spec['template'],
                 spec['rule_id'],
-                content
+                content,
+                device=spec['device'] if 'device' in spec else None
             )
         except InvalidRuleException as e:
             raise SynapseError(400, e.message)
@@ -200,11 +207,11 @@ class PushRuleRestServlet(RestServlet):
                 if not instance_handle:
                     continue
                 if instance_handle not in rules['device']:
-                    rules['device'][instance_handle] = []
+                    rules['device'][instance_handle] = {}
                     rules['device'][instance_handle] = \
                         _add_empty_priority_class_arrays(rules['device'][instance_handle])
 
-                rulearray = rules['device'][instance_handle]
+                rulearray = rules['device'][instance_handle][template_name]
             else:
                 rulearray = rules['global'][template_name]
 
@@ -227,7 +234,10 @@ class PushRuleRestServlet(RestServlet):
         elif path[0] == 'device':
             path = path[1:]
             if path == []:
-                raise UnrecognizedRequestError
+                raise UnrecognizedRequestError(PushRuleRestServlet.SLIGHTLY_PEDANTIC_TRAILING_SLASH_ERROR)
+            if path[0] == '':
+                defer.returnValue((200, rules['device']))
+
             instance_handle = path[0]
             if instance_handle not in rules['device']:
                 ret = {}