diff options
author | Erik Johnston <erik@matrix.org> | 2015-07-02 16:20:10 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2015-07-02 16:20:10 +0100 |
commit | 1a605456260bfb46d8bb9cff2d40d19aec03daa4 (patch) | |
tree | bfd0aaa9d683c55d7b550d66371eab1052098018 /synapse/handlers/message.py | |
parent | Oops: underride rule had an identifier with override in it. (diff) | |
download | synapse-1a605456260bfb46d8bb9cff2d40d19aec03daa4.tar.xz |
Add basic impl for room history ACL on GET /messages client API
Diffstat (limited to 'synapse/handlers/message.py')
-rw-r--r-- | synapse/handlers/message.py | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py index e324662f18..17c75f33c9 100644 --- a/synapse/handlers/message.py +++ b/synapse/handlers/message.py @@ -113,11 +113,42 @@ class MessageHandler(BaseHandler): "room_key", next_key ) + if not events: + defer.returnValue({ + "chunk": [], + "start": pagin_config.from_token.to_string(), + "end": next_token.to_string(), + }) + + states = yield self.store.get_state_for_events( + room_id, [e.event_id for e in events], + ) + + events_and_states = zip(events, states) + + def allowed(event_and_state): + _, state = event_and_state + + 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": + return False + + events_and_states = filter(allowed, events_and_states) + events = [ + 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 + serialize_event(e, time_now, as_client_event) + for e in events ], "start": pagin_config.from_token.to_string(), "end": next_token.to_string(), |