diff options
author | Erik Johnston <erik@matrix.org> | 2015-07-02 17:02:10 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2015-07-02 17:12:35 +0100 |
commit | 41938afed884361451ad6e91eb44e805ebbdaeb0 (patch) | |
tree | fc145bbe217439f53655a640190d54c6635cdebf /synapse/handlers/message.py | |
parent | Add basic impl for room history ACL on GET /messages client API (diff) | |
download | synapse-41938afed884361451ad6e91eb44e805ebbdaeb0.tar.xz |
Make v1 initial syncs respect room history ACL
Diffstat (limited to 'synapse/handlers/message.py')
-rw-r--r-- | synapse/handlers/message.py | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py index 17c75f33c9..00c7dbec88 100644 --- a/synapse/handlers/message.py +++ b/synapse/handlers/message.py @@ -120,6 +120,23 @@ class MessageHandler(BaseHandler): "end": next_token.to_string(), }) + events = yield self._filter_events_for_client(user_id, room_id, events) + + time_now = self.clock.time_msec() + + chunk = { + "chunk": [ + serialize_event(e, time_now, as_client_event) + for e in events + ], + "start": pagin_config.from_token.to_string(), + "end": next_token.to_string(), + } + + defer.returnValue(chunk) + + @defer.inlineCallbacks + def _filter_events_for_client(self, user_id, room_id, events): states = yield self.store.get_state_for_events( room_id, [e.event_id for e in events], ) @@ -127,34 +144,26 @@ class MessageHandler(BaseHandler): events_and_states = zip(events, states) def allowed(event_and_state): - _, state = event_and_state + event, state = event_and_state + + if event.type == EventTypes.RoomHistoryVisibility: + return True membership = state.get((EventTypes.Member, user_id), None) if membership and membership.membership == Membership.JOIN: return True history = state.get((EventTypes.RoomHistoryVisibility, ''), None) - if history and history.content["visibility"] == "after_join": + if history and history.content.get("visibility", None) == "after_join": return False + return True + events_and_states = filter(allowed, events_and_states) - events = [ + defer.returnValue([ ev for ev, _ in events_and_states - ] - - time_now = self.clock.time_msec() - - chunk = { - "chunk": [ - serialize_event(e, time_now, as_client_event) - for e in events - ], - "start": pagin_config.from_token.to_string(), - "end": next_token.to_string(), - } - - defer.returnValue(chunk) + ]) @defer.inlineCallbacks def create_and_send_event(self, event_dict, ratelimit=True, @@ -347,6 +356,10 @@ class MessageHandler(BaseHandler): ] ).addErrback(unwrapFirstError) + messages = yield self._filter_events_for_client( + user_id, event.room_id, messages + ) + start_token = now_token.copy_and_replace("room_key", token[0]) end_token = now_token.copy_and_replace("room_key", token[1]) time_now = self.clock.time_msec() @@ -448,6 +461,10 @@ class MessageHandler(BaseHandler): consumeErrors=True, ).addErrback(unwrapFirstError) + messages = yield self._filter_events_for_client( + user_id, room_id, messages + ) + start_token = now_token.copy_and_replace("room_key", token[0]) end_token = now_token.copy_and_replace("room_key", token[1]) |