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

Don't ratelimit autojoining of rooms #8921

Merged
merged 3 commits into from
Dec 11, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion synapse/handlers/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,7 @@ async def clone_existing_room(
invite_list=[],
initial_state=initial_state,
creation_content=creation_content,
ratelimit=False,
)

# Transfer membership events
Expand Down Expand Up @@ -735,6 +736,7 @@ async def create_room(
room_alias=room_alias,
power_level_content_override=power_level_content_override,
creator_join_profile=creator_join_profile,
ratelimit=ratelimit,
)

if "name" in config:
Expand Down Expand Up @@ -838,6 +840,7 @@ async def _send_events_for_new_room(
room_alias: Optional[RoomAlias] = None,
power_level_content_override: Optional[JsonDict] = None,
creator_join_profile: Optional[JsonDict] = None,
ratelimit: bool = True,
) -> int:
"""Sends the initial events into a new room.

Expand Down Expand Up @@ -884,7 +887,7 @@ async def send(etype: str, content: JsonDict, **kwargs) -> int:
creator.user,
room_id,
"join",
ratelimit=False,
ratelimit=ratelimit,
Copy link
Member Author

@erikjohnston erikjohnston Dec 10, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do want the join ratelimiter to apply to room creations, which is what we're doing currently

content=creator_join_profile,
)

Expand Down
23 changes: 13 additions & 10 deletions synapse/handlers/room_member.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ async def _local_membership_update(

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

if not is_host_in_room:
time_now_s = self.clock.time()
(
allowed,
time_allowed,
) = self._join_rate_limiter_remote.can_requester_do_action(requester,)

if not allowed:
raise LimitExceededError(
retry_after_ms=int(1000 * (time_allowed - time_now_s))
if ratelimit:
time_now_s = self.clock.time()
(
allowed,
time_allowed,
) = self._join_rate_limiter_remote.can_requester_do_action(
requester,
)

if not allowed:
raise LimitExceededError(
retry_after_ms=int(1000 * (time_allowed - time_now_s))
)

inviter = await self._get_inviter(target.to_string(), room_id)
if inviter and not self.hs.is_mine(inviter):
remote_room_hosts.append(inviter.domain)
Expand Down
16 changes: 16 additions & 0 deletions tests/rest/client/v1/test_rooms.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import synapse.rest.admin
from synapse.api.constants import EventContentFields, EventTypes, Membership
from synapse.handlers.pagination import PurgeStatus
from synapse.rest import admin
from synapse.rest.client.v1 import directory, login, profile, room
from synapse.rest.client.v2_alpha import account
from synapse.types import JsonDict, RoomAlias, UserID
Expand Down Expand Up @@ -625,6 +626,7 @@ class RoomJoinRatelimitTestCase(RoomBase):
user_id = "@sid1:red"

servlets = [
admin.register_servlets,
profile.register_servlets,
room.register_servlets,
]
Expand Down Expand Up @@ -703,6 +705,20 @@ def test_join_local_ratelimit_idempotent(self):
request, channel = self.make_request("POST", path % room_id, {})
self.assertEquals(channel.code, 200)

@unittest.override_config(
{
"rc_joins": {"local": {"per_second": 0.5, "burst_count": 3}},
"auto_join_rooms": ["#room:red", "#room2:red", "#room3:red", "#room4:red"],
"autocreate_auto_join_rooms": True,
},
)
def test_autojoin_rooms(self):
user_id = self.register_user("testuser", "password")

# Check that the new user successfully joined hte four rooms
rooms = self.get_success(self.hs.get_datastore().get_rooms_for_user(user_id))
self.assertEqual(len(rooms), 4)


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