Skip to content

Commit 9da4316

Browse files
committed
Configurable maximum number of events requested by /sync and /messages (matrix-org#2220)
Set the limit on the returned events in the timeline in the get and sync operations. The default value is -1, means no upper limit. For example, using `filter_timeline_limit: 5000`: POST /_matrix/client/r0/user/user:id/filter { room: { timeline: { limit: 1000000000000000000 } } } GET /_matrix/client/r0/user/user:id/filter/filter:id { room: { timeline: { limit: 5000 } } } The server cuts down the room.timeline.limit.
1 parent 29ded77 commit 9da4316

File tree

4 files changed

+21
-0
lines changed

4 files changed

+21
-0
lines changed

synapse/config/server.py

+6
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ def read_config(self, config):
3535
# "disable" federation
3636
self.send_federation = config.get("send_federation", True)
3737

38+
self.filter_timeline_limit = config.get("filter_timeline_limit", -1)
39+
3840
if self.public_baseurl is not None:
3941
if self.public_baseurl[-1] != '/':
4042
self.public_baseurl += '/'
@@ -161,6 +163,10 @@ def default_config(self, server_name, **kwargs):
161163
# The GC threshold parameters to pass to `gc.set_threshold`, if defined
162164
# gc_thresholds: [700, 10, 10]
163165
166+
# Set the limit on the returned events in the timeline in the get
167+
# and sync operations. The default value is -1, means no upper limit.
168+
# filter_timeline_limit: 5000
169+
164170
# List of ports that Synapse should listen on, their purpose and their
165171
# configuration.
166172
listeners:

synapse/rest/client/v2_alpha/_base.py

+8
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,11 @@ def client_v2_patterns(path_regex, releases=(0,),
4747
new_prefix = CLIENT_V2_ALPHA_PREFIX.replace("/v2_alpha", "/r%d" % release)
4848
patterns.append(re.compile("^" + new_prefix + path_regex))
4949
return patterns
50+
51+
52+
def set_timeline_upper_limit(filter_json, filter_timeline_limit):
53+
if filter_timeline_limit < 0:
54+
return # no upper limits
55+
if 'room' in filter_json and 'limit' in filter_json['room']:
56+
filter_json['room']["limit"] = min(filter_json['room']["limit"],
57+
filter_timeline_limit)

synapse/rest/client/v2_alpha/filter.py

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from synapse.types import UserID
2121

2222
from ._base import client_v2_patterns
23+
from ._base import set_timeline_upper_limit
2324

2425
import logging
2526

@@ -85,6 +86,9 @@ def on_POST(self, request, user_id):
8586
raise AuthError(403, "Can only create filters for local users")
8687

8788
content = parse_json_object_from_request(request)
89+
set_timeline_upper_limit(content,
90+
self.hs.config.filter_timeline_limit)
91+
8892
filter_id = yield self.filtering.add_user_filter(
8993
user_localpart=target_user.localpart,
9094
user_filter=content,

synapse/rest/client/v2_alpha/sync.py

+3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from synapse.api.errors import SynapseError
2929
from synapse.api.constants import PresenceState
3030
from ._base import client_v2_patterns
31+
from ._base import set_timeline_upper_limit
3132

3233
import itertools
3334
import logging
@@ -121,6 +122,8 @@ def on_GET(self, request):
121122
if filter_id.startswith('{'):
122123
try:
123124
filter_object = json.loads(filter_id)
125+
set_timeline_upper_limit(filter_object,
126+
self.hs.config.filter_timeline_limit)
124127
except:
125128
raise SynapseError(400, "Invalid filter JSON")
126129
self.filtering.check_valid_filter(filter_object)

0 commit comments

Comments
 (0)