summary refs log tree commit diff
path: root/synapse
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2015-07-02 17:02:10 +0100
committerErik Johnston <erik@matrix.org>2015-07-02 17:12:35 +0100
commit41938afed884361451ad6e91eb44e805ebbdaeb0 (patch)
treefc145bbe217439f53655a640190d54c6635cdebf /synapse
parentAdd basic impl for room history ACL on GET /messages client API (diff)
downloadsynapse-41938afed884361451ad6e91eb44e805ebbdaeb0.tar.xz
Make v1 initial syncs respect room history ACL
Diffstat (limited to 'synapse')
-rw-r--r--synapse/handlers/message.py51
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])