Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit ff55300

Browse files
authored
Honour ratelimit flag for application services for invite ratelimiting (#9302)
1 parent eec9ab3 commit ff55300

File tree

4 files changed

+13
-51
lines changed

4 files changed

+13
-51
lines changed

changelog.d/9302.bugfix

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix new ratelimiting for invites to respect the `ratelimit` flag on application services. Introduced in v1.27.0rc1.

synapse/handlers/federation.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1619,7 +1619,9 @@ async def on_invite_request(
16191619

16201620
# We retrieve the room member handler here as to not cause a cyclic dependency
16211621
member_handler = self.hs.get_room_member_handler()
1622-
member_handler.ratelimit_invite(event.room_id, event.state_key)
1622+
# We don't rate limit based on room ID, as that should be done by
1623+
# sending server.
1624+
member_handler.ratelimit_invite(None, event.state_key)
16231625

16241626
# keep a record of the room version, if we don't yet know it.
16251627
# (this may get overwritten if we later get a different room version in a

synapse/handlers/room_member.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,14 @@ async def _user_left_room(self, target: UserID, room_id: str) -> None:
155155
"""
156156
raise NotImplementedError()
157157

158-
def ratelimit_invite(self, room_id: str, invitee_user_id: str):
158+
def ratelimit_invite(self, room_id: Optional[str], invitee_user_id: str):
159159
"""Ratelimit invites by room and by target user.
160+
161+
If room ID is missing then we just rate limit by target user.
160162
"""
161-
self._invites_per_room_limiter.ratelimit(room_id)
163+
if room_id:
164+
self._invites_per_room_limiter.ratelimit(room_id)
165+
162166
self._invites_per_user_limiter.ratelimit(invitee_user_id)
163167

164168
async def _local_membership_update(
@@ -406,7 +410,9 @@ async def update_membership_locked(
406410
if effective_membership_state == Membership.INVITE:
407411
target_id = target.to_string()
408412
if ratelimit:
409-
self.ratelimit_invite(room_id, target_id)
413+
# Don't ratelimit application services.
414+
if not requester.app_service or requester.app_service.is_rate_limited():
415+
self.ratelimit_invite(room_id, target_id)
410416

411417
# block any attempts to invite the server notices mxid
412418
if target_id == self._server_notices_mxid:

tests/handlers/test_federation.py

-47
Original file line numberDiff line numberDiff line change
@@ -191,53 +191,6 @@ def test_rejected_state_event_state(self):
191191

192192
self.assertEqual(sg, sg2)
193193

194-
@unittest.override_config(
195-
{"rc_invites": {"per_room": {"per_second": 0.5, "burst_count": 3}}}
196-
)
197-
def test_invite_by_room_ratelimit(self):
198-
"""Tests that invites from federation in a room are actually rate-limited.
199-
"""
200-
other_server = "otherserver"
201-
other_user = "@otheruser:" + other_server
202-
203-
# create the room
204-
user_id = self.register_user("kermit", "test")
205-
tok = self.login("kermit", "test")
206-
room_id = self.helper.create_room_as(room_creator=user_id, tok=tok)
207-
room_version = self.get_success(self.store.get_room_version(room_id))
208-
209-
def create_invite_for(local_user):
210-
return event_from_pdu_json(
211-
{
212-
"type": EventTypes.Member,
213-
"content": {"membership": "invite"},
214-
"room_id": room_id,
215-
"sender": other_user,
216-
"state_key": local_user,
217-
"depth": 32,
218-
"prev_events": [],
219-
"auth_events": [],
220-
"origin_server_ts": self.clock.time_msec(),
221-
},
222-
room_version,
223-
)
224-
225-
for i in range(3):
226-
self.get_success(
227-
self.handler.on_invite_request(
228-
other_server,
229-
create_invite_for("@user-%d:test" % (i,)),
230-
room_version,
231-
)
232-
)
233-
234-
self.get_failure(
235-
self.handler.on_invite_request(
236-
other_server, create_invite_for("@user-4:test"), room_version,
237-
),
238-
exc=LimitExceededError,
239-
)
240-
241194
@unittest.override_config(
242195
{"rc_invites": {"per_user": {"per_second": 0.5, "burst_count": 3}}}
243196
)

0 commit comments

Comments
 (0)