Add basic impl for room history ACL on GET /messages client API

This commit is contained in:
Erik Johnston 2015-07-02 16:20:10 +01:00
parent 6825eef955
commit 1a60545626
3 changed files with 95 additions and 3 deletions

View file

@ -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(),