Add top level filtering by room id

This commit is contained in:
Mark Haines 2015-12-21 21:10:41 +00:00
parent 2a2b2ef834
commit 489a4cd1cf

View File

@ -62,10 +62,24 @@ class Filtering(object):
self._check_definition(user_filter_json[key]) self._check_definition(user_filter_json[key])
if "room" in user_filter_json: if "room" in user_filter_json:
self._check_definition_room_lists(user_filter_json["room"])
for key in room_level_definitions: for key in room_level_definitions:
if key in user_filter_json["room"]: if key in user_filter_json["room"]:
self._check_definition(user_filter_json["room"][key]) self._check_definition(user_filter_json["room"][key])
def _check_definition_room_lists(self, definition):
"""Check that "rooms" and "not_rooms" are lists of room ids if they
are present
"""
# check rooms are valid room IDs
room_id_keys = ["rooms", "not_rooms"]
for key in room_id_keys:
if key in definition:
if type(definition[key]) != list:
raise SynapseError(400, "Expected %s to be a list." % key)
for room_id in definition[key]:
RoomID.from_string(room_id)
def _check_definition(self, definition): def _check_definition(self, definition):
"""Check if the provided definition is valid. """Check if the provided definition is valid.
@ -85,14 +99,7 @@ class Filtering(object):
400, "Expected JSON object, not %s" % (definition,) 400, "Expected JSON object, not %s" % (definition,)
) )
# check rooms are valid room IDs self._check_definition_room_lists(definition)
room_id_keys = ["rooms", "not_rooms"]
for key in room_id_keys:
if key in definition:
if type(definition[key]) != list:
raise SynapseError(400, "Expected %s to be a list." % key)
for room_id in definition[key]:
RoomID.from_string(room_id)
# check senders are valid user IDs # check senders are valid user IDs
user_id_keys = ["senders", "not_senders"] user_id_keys = ["senders", "not_senders"]
@ -119,29 +126,19 @@ class FilterCollection(object):
def __init__(self, filter_json): def __init__(self, filter_json):
self.filter_json = filter_json self.filter_json = filter_json
self.room_timeline_filter = Filter( room_filter_json = self.filter_json.get("room", {})
self.filter_json.get("room", {}).get("timeline", {})
)
self.room_state_filter = Filter( self.room_filter = Filter({
self.filter_json.get("room", {}).get("state", {}) k: v for k, v in room_filter_json.items()
) if k in ("rooms", "not_rooms")
})
self.room_ephemeral_filter = Filter( self.room_timeline_filter = Filter(room_filter_json.get("timeline", {}))
self.filter_json.get("room", {}).get("ephemeral", {}) self.room_state_filter = Filter(room_filter_json.get("state", {}))
) self.room_ephemeral_filter = Filter(room_filter_json.get("ephemeral", {}))
self.room_account_data = Filter(room_filter_json.get("account_data", {}))
self.room_account_data = Filter( self.presence_filter = Filter(self.filter_json.get("presence", {}))
self.filter_json.get("room", {}).get("account_data", {}) self.account_data = Filter(self.filter_json.get("account_data", {}))
)
self.presence_filter = Filter(
self.filter_json.get("presence", {})
)
self.account_data = Filter(
self.filter_json.get("account_data", {})
)
self.include_leave = self.filter_json.get("room", {}).get( self.include_leave = self.filter_json.get("room", {}).get(
"include_leave", False "include_leave", False
@ -163,16 +160,16 @@ class FilterCollection(object):
return self.account_data.filter(events) return self.account_data.filter(events)
def filter_room_state(self, events): def filter_room_state(self, events):
return self.room_state_filter.filter(events) return self.room_state_filter.filter(self.room_filter.filter(events))
def filter_room_timeline(self, events): def filter_room_timeline(self, events):
return self.room_timeline_filter.filter(events) return self.room_timeline_filter.filter(self.room_filter.filter(events))
def filter_room_ephemeral(self, events): def filter_room_ephemeral(self, events):
return self.room_ephemeral_filter.filter(events) return self.room_ephemeral_filter.filter(self.room_filter.filter(events))
def filter_room_account_data(self, events): def filter_room_account_data(self, events):
return self.room_account_data.filter(events) return self.room_account_data.filter(self.room_filter.filter(events))
class Filter(object): class Filter(object):