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

Commit 1d55c7b

Browse files
authored
Don't ratelimit autojoining of rooms (#8921)
Fixes #8866
1 parent dc016c6 commit 1d55c7b

File tree

4 files changed

+34
-11
lines changed

4 files changed

+34
-11
lines changed

changelog.d/8921.bugfix

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix bug where we ratelimited auto joining of rooms on registration (using `auto_join_rooms` config).

synapse/handlers/room.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ async def clone_existing_room(
440440
invite_list=[],
441441
initial_state=initial_state,
442442
creation_content=creation_content,
443+
ratelimit=False,
443444
)
444445

445446
# Transfer membership events
@@ -735,6 +736,7 @@ async def create_room(
735736
room_alias=room_alias,
736737
power_level_content_override=power_level_content_override,
737738
creator_join_profile=creator_join_profile,
739+
ratelimit=ratelimit,
738740
)
739741

740742
if "name" in config:
@@ -838,6 +840,7 @@ async def _send_events_for_new_room(
838840
room_alias: Optional[RoomAlias] = None,
839841
power_level_content_override: Optional[JsonDict] = None,
840842
creator_join_profile: Optional[JsonDict] = None,
843+
ratelimit: bool = True,
841844
) -> int:
842845
"""Sends the initial events into a new room.
843846
@@ -884,7 +887,7 @@ async def send(etype: str, content: JsonDict, **kwargs) -> int:
884887
creator.user,
885888
room_id,
886889
"join",
887-
ratelimit=False,
890+
ratelimit=ratelimit,
888891
content=creator_join_profile,
889892
)
890893

synapse/handlers/room_member.py

+13-10
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ async def _local_membership_update(
203203

204204
# Only rate-limit if the user actually joined the room, otherwise we'll end
205205
# up blocking profile updates.
206-
if newly_joined:
206+
if newly_joined and ratelimit:
207207
time_now_s = self.clock.time()
208208
(
209209
allowed,
@@ -488,17 +488,20 @@ async def update_membership_locked(
488488
raise AuthError(403, "Guest access not allowed")
489489

490490
if not is_host_in_room:
491-
time_now_s = self.clock.time()
492-
(
493-
allowed,
494-
time_allowed,
495-
) = self._join_rate_limiter_remote.can_requester_do_action(requester,)
496-
497-
if not allowed:
498-
raise LimitExceededError(
499-
retry_after_ms=int(1000 * (time_allowed - time_now_s))
491+
if ratelimit:
492+
time_now_s = self.clock.time()
493+
(
494+
allowed,
495+
time_allowed,
496+
) = self._join_rate_limiter_remote.can_requester_do_action(
497+
requester,
500498
)
501499

500+
if not allowed:
501+
raise LimitExceededError(
502+
retry_after_ms=int(1000 * (time_allowed - time_now_s))
503+
)
504+
502505
inviter = await self._get_inviter(target.to_string(), room_id)
503506
if inviter and not self.hs.is_mine(inviter):
504507
remote_room_hosts.append(inviter.domain)

tests/rest/client/v1/test_rooms.py

+16
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import synapse.rest.admin
2727
from synapse.api.constants import EventContentFields, EventTypes, Membership
2828
from synapse.handlers.pagination import PurgeStatus
29+
from synapse.rest import admin
2930
from synapse.rest.client.v1 import directory, login, profile, room
3031
from synapse.rest.client.v2_alpha import account
3132
from synapse.types import JsonDict, RoomAlias, UserID
@@ -625,6 +626,7 @@ class RoomJoinRatelimitTestCase(RoomBase):
625626
user_id = "@sid1:red"
626627

627628
servlets = [
629+
admin.register_servlets,
628630
profile.register_servlets,
629631
room.register_servlets,
630632
]
@@ -703,6 +705,20 @@ def test_join_local_ratelimit_idempotent(self):
703705
request, channel = self.make_request("POST", path % room_id, {})
704706
self.assertEquals(channel.code, 200)
705707

708+
@unittest.override_config(
709+
{
710+
"rc_joins": {"local": {"per_second": 0.5, "burst_count": 3}},
711+
"auto_join_rooms": ["#room:red", "#room2:red", "#room3:red", "#room4:red"],
712+
"autocreate_auto_join_rooms": True,
713+
},
714+
)
715+
def test_autojoin_rooms(self):
716+
user_id = self.register_user("testuser", "password")
717+
718+
# Check that the new user successfully joined the four rooms
719+
rooms = self.get_success(self.hs.get_datastore().get_rooms_for_user(user_id))
720+
self.assertEqual(len(rooms), 4)
721+
706722

707723
class RoomMessagesTestCase(RoomBase):
708724
""" Tests /rooms/$room_id/messages/$user_id/$msg_id REST events. """

0 commit comments

Comments
 (0)