async def on_PUT(self, request, path): if self._is_worker: raise Exception("Cannot handle PUT /push_rules on worker") spec = _rule_spec_from_path(path.split("/")) try: priority_class = _priority_class_from_spec(spec) except InvalidRuleException as e: raise SynapseError(400, str(e)) requester = await self.auth.get_user_by_req(request) if "/" in spec["rule_id"] or "\\" in spec["rule_id"]: raise SynapseError(400, "rule_id may not contain slashes") content = parse_json_value_from_request(request) user_id = requester.user.to_string() if "attr" in spec: await self.set_rule_attr(user_id, spec, content) self.notify_user(user_id) return 200, {} if spec["rule_id"].startswith("."): # Rule ids starting with '.' are reserved for server default rules. raise SynapseError(400, "cannot add new rule_ids that start with '.'") try: (conditions, actions) = _rule_tuple_from_request_object( spec["template"], spec["rule_id"], content) except InvalidRuleException as e: raise SynapseError(400, str(e)) before = parse_string(request, "before") if before: before = _namespaced_rule_id(spec, before) after = parse_string(request, "after") if after: after = _namespaced_rule_id(spec, after) try: await self.store.add_push_rule( user_id=user_id, rule_id=_namespaced_rule_id_from_spec(spec), priority_class=priority_class, conditions=conditions, actions=actions, before=before, after=after, ) self.notify_user(user_id) except InconsistentRuleException as e: raise SynapseError(400, str(e)) except RuleNotFoundException as e: raise SynapseError(400, str(e)) return 200, {}
def on_PUT(self, request): spec = _rule_spec_from_path(request.postpath) try: priority_class = _priority_class_from_spec(spec) except InvalidRuleException as e: raise SynapseError(400, e.message) requester = yield self.auth.get_user_by_req(request) if '/' in spec['rule_id'] or '\\' in spec['rule_id']: raise SynapseError(400, "rule_id may not contain slashes") content = parse_json_value_from_request(request) user_id = requester.user.to_string() if 'attr' in spec: yield self.set_rule_attr(user_id, spec, content) self.notify_user(user_id) defer.returnValue((200, {})) if spec['rule_id'].startswith('.'): # Rule ids starting with '.' are reserved for server default rules. raise SynapseError(400, "cannot add new rule_ids that start with '.'") try: (conditions, actions) = _rule_tuple_from_request_object( spec['template'], spec['rule_id'], content, ) except InvalidRuleException as e: raise SynapseError(400, e.message) before = parse_string(request, "before") if before: before = _namespaced_rule_id(spec, before) after = parse_string(request, "after") if after: after = _namespaced_rule_id(spec, after) try: yield self.store.add_push_rule( user_id=user_id, rule_id=_namespaced_rule_id_from_spec(spec), priority_class=priority_class, conditions=conditions, actions=actions, before=before, after=after) self.notify_user(user_id) except InconsistentRuleException as e: raise SynapseError(400, e.message) except RuleNotFoundException as e: raise SynapseError(400, e.message) defer.returnValue((200, {}))
def on_PUT(self, request): spec = _rule_spec_from_path(request.postpath) try: priority_class = _priority_class_from_spec(spec) except InvalidRuleException as e: raise SynapseError(400, e.message) requester = yield self.auth.get_user_by_req(request) if '/' in spec['rule_id'] or '\\' in spec['rule_id']: raise SynapseError(400, "rule_id may not contain slashes") content = parse_json_value_from_request(request) user_id = requester.user.to_string() if 'attr' in spec: yield self.set_rule_attr(user_id, spec, content) self.notify_user(user_id) defer.returnValue((200, {})) if spec['rule_id'].startswith('.'): # Rule ids starting with '.' are reserved for server default rules. raise SynapseError(400, "cannot add new rule_ids that start with '.'") try: (conditions, actions) = _rule_tuple_from_request_object( spec['template'], spec['rule_id'], content, ) except InvalidRuleException as e: raise SynapseError(400, e.message) before = request.args.get("before", None) if before: before = _namespaced_rule_id(spec, before[0]) after = request.args.get("after", None) if after: after = _namespaced_rule_id(spec, after[0]) try: yield self.store.add_push_rule( user_id=user_id, rule_id=_namespaced_rule_id_from_spec(spec), priority_class=priority_class, conditions=conditions, actions=actions, before=before, after=after ) self.notify_user(user_id) except InconsistentRuleException as e: raise SynapseError(400, e.message) except RuleNotFoundException as e: raise SynapseError(400, e.message) defer.returnValue((200, {}))
def test_parse_json_value(self): """Basic tests for parse_json_value_from_request.""" # Test round-tripping. obj = {"foo": 1} result = parse_json_value_from_request(make_request(obj)) self.assertEqual(result, obj) # Results don't have to be objects. result = parse_json_value_from_request(make_request(b'["foo"]')) self.assertEqual(result, ["foo"]) # Test empty. with self.assertRaises(SynapseError): parse_json_value_from_request(make_request(b"")) result = parse_json_value_from_request(make_request(b""), allow_empty_body=True) self.assertIsNone(result) # Invalid UTF-8. with self.assertRaises(SynapseError): parse_json_value_from_request(make_request(b"\xFF\x00")) # Invalid JSON. with self.assertRaises(SynapseError): parse_json_value_from_request(make_request(b"foo")) with self.assertRaises(SynapseError): parse_json_value_from_request(make_request(b'{"foo": Infinity}'))
async def on_PUT(self, request: SynapseRequest, path: str) -> Tuple[int, JsonDict]: if self._is_worker: raise Exception("Cannot handle PUT /push_rules on worker") spec = _rule_spec_from_path(path.split("/")) try: priority_class = _priority_class_from_spec(spec) except InvalidRuleException as e: raise SynapseError(400, str(e)) requester = await self.auth.get_user_by_req(request) if "/" in spec.rule_id or "\\" in spec.rule_id: raise SynapseError(400, "rule_id may not contain slashes") content = parse_json_value_from_request(request) user_id = requester.user.to_string() if spec.attr: try: await self._push_rules_handler.set_rule_attr(user_id, spec, content) except InvalidRuleException as e: raise SynapseError(400, "Invalid actions: %s" % e) except RuleNotFoundException: raise NotFoundError("Unknown rule") return 200, {} if spec.rule_id.startswith("."): # Rule ids starting with '.' are reserved for server default rules. raise SynapseError(400, "cannot add new rule_ids that start with '.'") try: (conditions, actions) = _rule_tuple_from_request_object( spec.template, spec.rule_id, content ) except InvalidRuleException as e: raise SynapseError(400, str(e)) before = parse_string(request, "before") if before: before = f"global/{spec.template}/{before}" after = parse_string(request, "after") if after: after = f"global/{spec.template}/{after}" try: await self.store.add_push_rule( user_id=user_id, rule_id=f"global/{spec.template}/{spec.rule_id}", priority_class=priority_class, conditions=conditions, actions=actions, before=before, after=after, ) self._push_rules_handler.notify_user(user_id) except InconsistentRuleException as e: raise SynapseError(400, str(e)) except RuleNotFoundException as e: raise SynapseError(400, str(e)) return 200, {}