Merge branch 'client_v2_filter' into client_v2_sync
						commit
						8e571cbed8
					
				| 
						 | 
				
			
			@ -111,6 +111,7 @@ class NotFoundError(SynapseError):
 | 
			
		|||
            **kwargs
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AuthError(SynapseError):
 | 
			
		||||
    """An error raised when there was a problem authorising an event."""
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,10 +98,8 @@ class Filtering(object):
 | 
			
		|||
        # room checks
 | 
			
		||||
        if hasattr(event, "room_id"):
 | 
			
		||||
            room_id = event.room_id
 | 
			
		||||
            allow_rooms = definition["rooms"] if "rooms" in definition else None
 | 
			
		||||
            reject_rooms = (
 | 
			
		||||
                definition["not_rooms"] if "not_rooms" in definition else None
 | 
			
		||||
            )
 | 
			
		||||
            allow_rooms = definition.get("rooms", None)
 | 
			
		||||
            reject_rooms = definition.get("not_rooms", None)
 | 
			
		||||
            if reject_rooms and room_id in reject_rooms:
 | 
			
		||||
                return False
 | 
			
		||||
            if allow_rooms and room_id not in allow_rooms:
 | 
			
		||||
| 
						 | 
				
			
			@ -111,12 +109,8 @@ class Filtering(object):
 | 
			
		|||
        if hasattr(event, "sender"):
 | 
			
		||||
            # Should we be including event.state_key for some event types?
 | 
			
		||||
            sender = event.sender
 | 
			
		||||
            allow_senders = (
 | 
			
		||||
                definition["senders"] if "senders" in definition else None
 | 
			
		||||
            )
 | 
			
		||||
            reject_senders = (
 | 
			
		||||
                definition["not_senders"] if "not_senders" in definition else None
 | 
			
		||||
            )
 | 
			
		||||
            allow_senders = definition.get("senders", None)
 | 
			
		||||
            reject_senders = definition.get("not_senders", None)
 | 
			
		||||
            if reject_senders and sender in reject_senders:
 | 
			
		||||
                return False
 | 
			
		||||
            if allow_senders and sender not in allow_senders:
 | 
			
		||||
| 
						 | 
				
			
			@ -176,7 +170,6 @@ class Filtering(object):
 | 
			
		|||
                if key in user_filter["room"]:
 | 
			
		||||
                    self._check_definition(user_filter["room"][key])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def _check_definition(self, definition):
 | 
			
		||||
        """Check if the provided definition is valid.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,6 +56,7 @@ class Pusher(object):
 | 
			
		|||
 | 
			
		||||
        # The last value of last_active_time that we saw
 | 
			
		||||
        self.last_last_active_time = 0
 | 
			
		||||
        self.has_unread = True
 | 
			
		||||
 | 
			
		||||
    @defer.inlineCallbacks
 | 
			
		||||
    def _actions_for_event(self, ev):
 | 
			
		||||
| 
						 | 
				
			
			@ -180,6 +181,7 @@ class Pusher(object):
 | 
			
		|||
                processed = True
 | 
			
		||||
            else:
 | 
			
		||||
                rejected = yield self.dispatch_push(single_event, tweaks)
 | 
			
		||||
                self.has_unread = True
 | 
			
		||||
                if isinstance(rejected, list) or isinstance(rejected, tuple):
 | 
			
		||||
                    processed = True
 | 
			
		||||
                    for pk in rejected:
 | 
			
		||||
| 
						 | 
				
			
			@ -187,8 +189,8 @@ class Pusher(object):
 | 
			
		|||
                            # for sanity, we only remove the pushkey if it
 | 
			
		||||
                            # was the one we actually sent...
 | 
			
		||||
                            logger.warn(
 | 
			
		||||
                                ("Ignoring rejected pushkey %s because we "
 | 
			
		||||
                                "didn't send it"), pk
 | 
			
		||||
                                ("Ignoring rejected pushkey %s because we"
 | 
			
		||||
                                 " didn't send it"), pk
 | 
			
		||||
                            )
 | 
			
		||||
                        else:
 | 
			
		||||
                            logger.info(
 | 
			
		||||
| 
						 | 
				
			
			@ -234,8 +236,7 @@ class Pusher(object):
 | 
			
		|||
                    # of old notifications.
 | 
			
		||||
                    logger.warn("Giving up on a notification to user %s, "
 | 
			
		||||
                                "pushkey %s",
 | 
			
		||||
                                self.user_name, self.pushkey
 | 
			
		||||
                    )
 | 
			
		||||
                                self.user_name, self.pushkey)
 | 
			
		||||
                    self.backoff_delay = Pusher.INITIAL_BACKOFF
 | 
			
		||||
                    self.last_token = chunk['end']
 | 
			
		||||
                    self.store.update_pusher_last_token(
 | 
			
		||||
| 
						 | 
				
			
			@ -256,8 +257,7 @@ class Pusher(object):
 | 
			
		|||
                                "Trying again in %dms",
 | 
			
		||||
                                self.user_name,
 | 
			
		||||
                                self.clock.time_msec() - self.failing_since,
 | 
			
		||||
                                self.backoff_delay
 | 
			
		||||
                    )
 | 
			
		||||
                                self.backoff_delay)
 | 
			
		||||
                    yield synapse.util.async.sleep(self.backoff_delay / 1000.0)
 | 
			
		||||
                    self.backoff_delay *= 2
 | 
			
		||||
                    if self.backoff_delay > Pusher.MAX_BACKOFF:
 | 
			
		||||
| 
						 | 
				
			
			@ -290,9 +290,11 @@ class Pusher(object):
 | 
			
		|||
        if 'last_active' in state.state:
 | 
			
		||||
            last_active = state.state['last_active']
 | 
			
		||||
            if last_active > self.last_last_active_time:
 | 
			
		||||
                self.last_last_active_time = last_active
 | 
			
		||||
                if self.has_unread:
 | 
			
		||||
                    logger.info("Resetting badge count for %s", self.user_name)
 | 
			
		||||
                    self.reset_badge_count()
 | 
			
		||||
                self.last_last_active_time = last_active
 | 
			
		||||
                    self.has_unread = False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _value_for_dotted_key(dotted_key, event):
 | 
			
		||||
| 
						 | 
				
			
			@ -305,6 +307,7 @@ def _value_for_dotted_key(dotted_key, event):
 | 
			
		|||
        parts = parts[1:]
 | 
			
		||||
    return val
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _tweaks_for_actions(actions):
 | 
			
		||||
    tweaks = {}
 | 
			
		||||
    for a in actions:
 | 
			
		||||
| 
						 | 
				
			
			@ -314,6 +317,7 @@ def _tweaks_for_actions(actions):
 | 
			
		|||
            tweaks['sound'] = a['set_sound']
 | 
			
		||||
    return tweaks
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PusherConfigException(Exception):
 | 
			
		||||
    def __init__(self, msg):
 | 
			
		||||
        super(PusherConfigException, self).__init__(msg)
 | 
			
		||||
| 
						 | 
				
			
			@ -71,7 +71,7 @@ class HttpPusher(Pusher):
 | 
			
		|||
                # we may have to fetch this over federation and we
 | 
			
		||||
                # can't trust it anyway: is it worth it?
 | 
			
		||||
                #'from_display_name': 'Steve Stevington'
 | 
			
		||||
                'counts': { #-- we don't mark messages as read yet so
 | 
			
		||||
                'counts': {  # -- we don't mark messages as read yet so
 | 
			
		||||
                             # we have no way of knowing
 | 
			
		||||
                    # Just set the badge to 1 until we have read receipts
 | 
			
		||||
                    'unread': 1,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,9 +30,9 @@ class PushRuleRestServlet(ClientV1RestServlet):
 | 
			
		|||
        'sender': 1,
 | 
			
		||||
        'room': 2,
 | 
			
		||||
        'content': 3,
 | 
			
		||||
        'override': 4
 | 
			
		||||
        'override': 4,
 | 
			
		||||
    }
 | 
			
		||||
    PRIORITY_CLASS_INVERSE_MAP = {v: k for k,v in PRIORITY_CLASS_MAP.items()}
 | 
			
		||||
    PRIORITY_CLASS_INVERSE_MAP = {v: k for k, v in PRIORITY_CLASS_MAP.items()}
 | 
			
		||||
    SLIGHTLY_PEDANTIC_TRAILING_SLASH_ERROR = (
 | 
			
		||||
        "Unrecognised request: You probably wanted a trailing slash")
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -260,7 +260,9 @@ class PushRuleRestServlet(ClientV1RestServlet):
 | 
			
		|||
 | 
			
		||||
        if path == []:
 | 
			
		||||
            # we're a reference impl: pedantry is our job.
 | 
			
		||||
            raise UnrecognizedRequestError(PushRuleRestServlet.SLIGHTLY_PEDANTIC_TRAILING_SLASH_ERROR)
 | 
			
		||||
            raise UnrecognizedRequestError(
 | 
			
		||||
                PushRuleRestServlet.SLIGHTLY_PEDANTIC_TRAILING_SLASH_ERROR
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        if path[0] == '':
 | 
			
		||||
            defer.returnValue((200, rules))
 | 
			
		||||
| 
						 | 
				
			
			@ -271,7 +273,9 @@ class PushRuleRestServlet(ClientV1RestServlet):
 | 
			
		|||
        elif path[0] == 'device':
 | 
			
		||||
            path = path[1:]
 | 
			
		||||
            if path == []:
 | 
			
		||||
                raise UnrecognizedRequestError(PushRuleRestServlet.SLIGHTLY_PEDANTIC_TRAILING_SLASH_ERROR)
 | 
			
		||||
                raise UnrecognizedRequestError(
 | 
			
		||||
                    PushRuleRestServlet.SLIGHTLY_PEDANTIC_TRAILING_SLASH_ERROR
 | 
			
		||||
                )
 | 
			
		||||
            if path[0] == '':
 | 
			
		||||
                defer.returnValue((200, rules['device']))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -290,11 +294,13 @@ class PushRuleRestServlet(ClientV1RestServlet):
 | 
			
		|||
    def on_OPTIONS(self, _):
 | 
			
		||||
        return 200, {}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _add_empty_priority_class_arrays(d):
 | 
			
		||||
    for pc in PushRuleRestServlet.PRIORITY_CLASS_MAP.keys():
 | 
			
		||||
        d[pc] = []
 | 
			
		||||
    return d
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _instance_handle_from_conditions(conditions):
 | 
			
		||||
    """
 | 
			
		||||
    Given a list of conditions, return the instance handle of the
 | 
			
		||||
| 
						 | 
				
			
			@ -305,9 +311,12 @@ def _instance_handle_from_conditions(conditions):
 | 
			
		|||
            return c['instance_handle']
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _filter_ruleset_with_path(ruleset, path):
 | 
			
		||||
    if path == []:
 | 
			
		||||
        raise UnrecognizedRequestError(PushRuleRestServlet.SLIGHTLY_PEDANTIC_TRAILING_SLASH_ERROR)
 | 
			
		||||
        raise UnrecognizedRequestError(
 | 
			
		||||
            PushRuleRestServlet.SLIGHTLY_PEDANTIC_TRAILING_SLASH_ERROR
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    if path[0] == '':
 | 
			
		||||
        return ruleset
 | 
			
		||||
| 
						 | 
				
			
			@ -316,7 +325,9 @@ def _filter_ruleset_with_path(ruleset, path):
 | 
			
		|||
        raise UnrecognizedRequestError()
 | 
			
		||||
    path = path[1:]
 | 
			
		||||
    if path == []:
 | 
			
		||||
        raise UnrecognizedRequestError(PushRuleRestServlet.SLIGHTLY_PEDANTIC_TRAILING_SLASH_ERROR)
 | 
			
		||||
        raise UnrecognizedRequestError(
 | 
			
		||||
            PushRuleRestServlet.SLIGHTLY_PEDANTIC_TRAILING_SLASH_ERROR
 | 
			
		||||
        )
 | 
			
		||||
    if path[0] == '':
 | 
			
		||||
        return ruleset[template_kind]
 | 
			
		||||
    rule_id = path[0]
 | 
			
		||||
| 
						 | 
				
			
			@ -325,6 +336,7 @@ def _filter_ruleset_with_path(ruleset, path):
 | 
			
		|||
            return r
 | 
			
		||||
    raise NotFoundError
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _priority_class_from_spec(spec):
 | 
			
		||||
    if spec['template'] not in PushRuleRestServlet.PRIORITY_CLASS_MAP.keys():
 | 
			
		||||
        raise InvalidRuleException("Unknown template: %s" % (spec['kind']))
 | 
			
		||||
| 
						 | 
				
			
			@ -335,6 +347,7 @@ def _priority_class_from_spec(spec):
 | 
			
		|||
 | 
			
		||||
    return pc
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _priority_class_to_template_name(pc):
 | 
			
		||||
    if pc > PushRuleRestServlet.PRIORITY_CLASS_MAP['override']:
 | 
			
		||||
        # per-device
 | 
			
		||||
| 
						 | 
				
			
			@ -343,6 +356,7 @@ def _priority_class_to_template_name(pc):
 | 
			
		|||
    else:
 | 
			
		||||
        return PushRuleRestServlet.PRIORITY_CLASS_INVERSE_MAP[pc]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _rule_to_template(rule):
 | 
			
		||||
    template_name = _priority_class_to_template_name(rule['priority_class'])
 | 
			
		||||
    if template_name in ['override', 'underride']:
 | 
			
		||||
| 
						 | 
				
			
			@ -359,8 +373,9 @@ def _rule_to_template(rule):
 | 
			
		|||
        ret["pattern"] = thecond["pattern"]
 | 
			
		||||
        return ret
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _strip_device_condition(rule):
 | 
			
		||||
    for i,c in enumerate(rule['conditions']):
 | 
			
		||||
    for i, c in enumerate(rule['conditions']):
 | 
			
		||||
        if c['kind'] == 'device':
 | 
			
		||||
            del rule['conditions'][i]
 | 
			
		||||
    return rule
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -117,7 +117,7 @@ class PushRuleStore(SQLBaseStore):
 | 
			
		|||
        new_rule['priority'] = new_rule_priority
 | 
			
		||||
 | 
			
		||||
        sql = (
 | 
			
		||||
            "SELECT COUNT(*) FROM "+PushRuleTable.table_name+
 | 
			
		||||
            "SELECT COUNT(*) FROM " + PushRuleTable.table_name +
 | 
			
		||||
            " WHERE user_name = ? AND priority_class = ? AND priority = ?"
 | 
			
		||||
        )
 | 
			
		||||
        txn.execute(sql, (user_name, priority_class, new_rule_priority))
 | 
			
		||||
| 
						 | 
				
			
			@ -146,10 +146,11 @@ class PushRuleStore(SQLBaseStore):
 | 
			
		|||
 | 
			
		||||
        txn.execute(sql, new_rule.values())
 | 
			
		||||
 | 
			
		||||
    def _add_push_rule_highest_priority_txn(self, txn, user_name, priority_class, **kwargs):
 | 
			
		||||
    def _add_push_rule_highest_priority_txn(self, txn, user_name,
 | 
			
		||||
                                            priority_class, **kwargs):
 | 
			
		||||
        # find the highest priority rule in that class
 | 
			
		||||
        sql = (
 | 
			
		||||
            "SELECT COUNT(*), MAX(priority) FROM "+PushRuleTable.table_name+
 | 
			
		||||
            "SELECT COUNT(*), MAX(priority) FROM " + PushRuleTable.table_name +
 | 
			
		||||
            " WHERE user_name = ? and priority_class = ?"
 | 
			
		||||
        )
 | 
			
		||||
        txn.execute(sql, (user_name, priority_class))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue