diff options
-rw-r--r-- | synapse/handlers/initial_sync.py | 6 | ||||
-rw-r--r-- | synapse/handlers/sync.py | 29 |
2 files changed, 33 insertions, 2 deletions
diff --git a/synapse/handlers/initial_sync.py b/synapse/handlers/initial_sync.py index f991efeee3..8fbb77c0ab 100644 --- a/synapse/handlers/initial_sync.py +++ b/synapse/handlers/initial_sync.py @@ -395,7 +395,11 @@ class InitialSyncHandler(BaseHandler): ) if not receipts: receipts = [] - return receipts + + return [ + r for r in receipts + if not r.data.get("hidden", False) or r.user_id == user_id + ] presence, receipts, (messages, token) = yield make_deferred_yieldable( defer.gatherResults( diff --git a/synapse/handlers/sync.py b/synapse/handlers/sync.py index 19bca6717f..e8859ee3d6 100644 --- a/synapse/handlers/sync.py +++ b/synapse/handlers/sync.py @@ -334,6 +334,7 @@ class SyncHandler(object): """ sync_config = sync_result_builder.sync_config + user_id = sync_result_builder.sync_config.user.to_string() with Measure(self.clock, "ephemeral_by_room"): typing_key = since_token.typing_key if since_token else "0" @@ -376,7 +377,33 @@ class SyncHandler(object): room_id = event["room_id"] # exclude room id, as above event_copy = {k: v for (k, v) in iteritems(event) if k != "room_id"} - ephemeral_by_room.setdefault(room_id, []).append(event_copy) + + # filter out receipts the user shouldn't see + content = event_copy.get('content', {}) + event_ids = content.keys() + reconstructed = event_copy.copy() + reconstructed['content'] = {} # clear old content + for event_id in event_ids: + m_read = content[event_id].get("m.read", None) + if m_read is None: + # clone it now - it's not something we can process + reconstructed["content"][event_id] = content[event_id] + continue + user_ids = m_read.keys() + for rr_user_id in user_ids: + data = m_read[rr_user_id] + hidden = data.get("hidden", False) + if rr_user_id == user_id or not hidden: + # append the key to the reconstructed receipt + new_content = reconstructed["content"] + if new_content.get(event_id, None) is None: + new_content[event_id] = {"m.read": {}} + ev_content = new_content[event_id]["m.read"] + if ev_content.get(rr_user_id, None) is None: + ev_content[rr_user_id] = {} + ev_content[rr_user_id] = data + if len(reconstructed["content"].keys()) > 0: + ephemeral_by_room.setdefault(room_id, []).append(reconstructed) return now_token, ephemeral_by_room |