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])
|