diff --git a/synapse/api/filtering.py b/synapse/api/filtering.py
index 6f16e4d406..fb291d7fb9 100644
--- a/synapse/api/filtering.py
+++ b/synapse/api/filtering.py
@@ -202,6 +202,26 @@ class FilterCollection(object):
def filter_room_account_data(self, events):
return self._room_account_data.filter(self._room_filter.filter(events))
+ def blocks_all_presence(self):
+ return (
+ self._presence_filter.filters_all_types() or
+ self._presence_filter.filters_all_senders()
+ )
+
+ def blocks_all_room_ephemeral(self):
+ return (
+ self._room_ephemeral_filter.filters_all_types() or
+ self._room_ephemeral_filter.filters_all_senders() or
+ self._room_ephemeral_filter.filters_all_rooms()
+ )
+
+ def blocks_all_room_timeline(self):
+ return (
+ self._room_timeline_filter.filters_all_types() or
+ self._room_timeline_filter.filters_all_senders() or
+ self._room_timeline_filter.filters_all_rooms()
+ )
+
class Filter(object):
def __init__(self, filter_json):
@@ -218,6 +238,15 @@ class Filter(object):
self.contains_url = self.filter_json.get("contains_url", None)
+ def filters_all_types(self):
+ return "*" in self.not_types
+
+ def filters_all_senders(self):
+ return "*" in self.not_senders
+
+ def filters_all_rooms(self):
+ return "*" in self.not_rooms
+
def check(self, event):
"""Checks whether the filter matches the given event.
diff --git a/synapse/handlers/sync.py b/synapse/handlers/sync.py
index 1f910ff814..a86996689c 100644
--- a/synapse/handlers/sync.py
+++ b/synapse/handlers/sync.py
@@ -277,6 +277,7 @@ class SyncHandler(object):
"""
with Measure(self.clock, "load_filtered_recents"):
timeline_limit = sync_config.filter_collection.timeline_limit()
+ block_all_timeline = sync_config.filter_collection.blocks_all_room_timeline()
if recents is None or newly_joined_room or timeline_limit < len(recents):
limited = True
@@ -293,7 +294,7 @@ class SyncHandler(object):
else:
recents = []
- if not limited:
+ if not limited or block_all_timeline:
defer.returnValue(TimelineBatch(
events=recents,
prev_batch=now_token,
@@ -531,9 +532,14 @@ class SyncHandler(object):
)
newly_joined_rooms, newly_joined_users = res
- yield self._generate_sync_entry_for_presence(
- sync_result_builder, newly_joined_rooms, newly_joined_users
+ block_all_presence_data = (
+ since_token is None and
+ sync_config.filter_collection.blocks_all_presence()
)
+ if not block_all_presence_data:
+ yield self._generate_sync_entry_for_presence(
+ sync_result_builder, newly_joined_rooms, newly_joined_users
+ )
yield self._generate_sync_entry_for_to_device(sync_result_builder)
@@ -709,13 +715,20 @@ class SyncHandler(object):
`(newly_joined_rooms, newly_joined_users)`
"""
user_id = sync_result_builder.sync_config.user.to_string()
-
- now_token, ephemeral_by_room = yield self.ephemeral_by_room(
- sync_result_builder.sync_config,
- now_token=sync_result_builder.now_token,
- since_token=sync_result_builder.since_token,
+ block_all_room_ephemeral = (
+ sync_result_builder.since_token is None and
+ sync_result_builder.sync_config.filter_collection.blocks_all_room_ephemeral()
)
- sync_result_builder.now_token = now_token
+
+ if block_all_room_ephemeral:
+ ephemeral_by_room = {}
+ else:
+ now_token, ephemeral_by_room = yield self.ephemeral_by_room(
+ sync_result_builder.sync_config,
+ now_token=sync_result_builder.now_token,
+ since_token=sync_result_builder.since_token,
+ )
+ sync_result_builder.now_token = now_token
ignored_account_data = yield self.store.get_global_account_data_by_type_for_user(
"m.ignored_user_list", user_id=user_id,
|