|
|
|
@ -28,7 +28,7 @@ from synapse.api.constants import EventContentFields, EventTypes, Membership |
|
|
|
|
from synapse.handlers.pagination import PurgeStatus |
|
|
|
|
from synapse.rest.client.v1 import directory, login, profile, room |
|
|
|
|
from synapse.rest.client.v2_alpha import account |
|
|
|
|
from synapse.types import JsonDict, RoomAlias |
|
|
|
|
from synapse.types import JsonDict, RoomAlias, UserID |
|
|
|
|
from synapse.util.stringutils import random_string |
|
|
|
|
|
|
|
|
|
from tests import unittest |
|
|
|
@ -675,6 +675,91 @@ class RoomMemberStateTestCase(RoomBase): |
|
|
|
|
self.assertEquals(json.loads(content), channel.json_body) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RoomJoinRatelimitTestCase(RoomBase): |
|
|
|
|
user_id = "@sid1:red" |
|
|
|
|
|
|
|
|
|
servlets = [ |
|
|
|
|
profile.register_servlets, |
|
|
|
|
room.register_servlets, |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
@unittest.override_config( |
|
|
|
|
{"rc_joins": {"local": {"per_second": 3, "burst_count": 3}}} |
|
|
|
|
) |
|
|
|
|
def test_join_local_ratelimit(self): |
|
|
|
|
"""Tests that local joins are actually rate-limited.""" |
|
|
|
|
for i in range(5): |
|
|
|
|
self.helper.create_room_as(self.user_id) |
|
|
|
|
|
|
|
|
|
self.helper.create_room_as(self.user_id, expect_code=429) |
|
|
|
|
|
|
|
|
|
@unittest.override_config( |
|
|
|
|
{"rc_joins": {"local": {"per_second": 3, "burst_count": 3}}} |
|
|
|
|
) |
|
|
|
|
def test_join_local_ratelimit_profile_change(self): |
|
|
|
|
"""Tests that sending a profile update into all of the user's joined rooms isn't |
|
|
|
|
rate-limited by the rate-limiter on joins.""" |
|
|
|
|
|
|
|
|
|
# Create and join more rooms than the rate-limiting config allows in a second. |
|
|
|
|
room_ids = [ |
|
|
|
|
self.helper.create_room_as(self.user_id), |
|
|
|
|
self.helper.create_room_as(self.user_id), |
|
|
|
|
self.helper.create_room_as(self.user_id), |
|
|
|
|
] |
|
|
|
|
self.reactor.advance(1) |
|
|
|
|
room_ids = room_ids + [ |
|
|
|
|
self.helper.create_room_as(self.user_id), |
|
|
|
|
self.helper.create_room_as(self.user_id), |
|
|
|
|
self.helper.create_room_as(self.user_id), |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
# Create a profile for the user, since it hasn't been done on registration. |
|
|
|
|
store = self.hs.get_datastore() |
|
|
|
|
store.create_profile(UserID.from_string(self.user_id).localpart) |
|
|
|
|
|
|
|
|
|
# Update the display name for the user. |
|
|
|
|
path = "/_matrix/client/r0/profile/%s/displayname" % self.user_id |
|
|
|
|
request, channel = self.make_request("PUT", path, {"displayname": "John Doe"}) |
|
|
|
|
self.render(request) |
|
|
|
|
self.assertEquals(channel.code, 200, channel.json_body) |
|
|
|
|
|
|
|
|
|
# Check that all the rooms have been sent a profile update into. |
|
|
|
|
for room_id in room_ids: |
|
|
|
|
path = "/_matrix/client/r0/rooms/%s/state/m.room.member/%s" % ( |
|
|
|
|
room_id, |
|
|
|
|
self.user_id, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
request, channel = self.make_request("GET", path) |
|
|
|
|
self.render(request) |
|
|
|
|
self.assertEquals(channel.code, 200) |
|
|
|
|
|
|
|
|
|
self.assertIn("displayname", channel.json_body) |
|
|
|
|
self.assertEquals(channel.json_body["displayname"], "John Doe") |
|
|
|
|
|
|
|
|
|
@unittest.override_config( |
|
|
|
|
{"rc_joins": {"local": {"per_second": 3, "burst_count": 3}}} |
|
|
|
|
) |
|
|
|
|
def test_join_local_ratelimit_idempotent(self): |
|
|
|
|
"""Tests that the room join endpoints remain idempotent despite rate-limiting |
|
|
|
|
on room joins.""" |
|
|
|
|
room_id = self.helper.create_room_as(self.user_id) |
|
|
|
|
|
|
|
|
|
# Let's test both paths to be sure. |
|
|
|
|
paths_to_test = [ |
|
|
|
|
"/_matrix/client/r0/rooms/%s/join", |
|
|
|
|
"/_matrix/client/r0/join/%s", |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
for path in paths_to_test: |
|
|
|
|
# Make sure we send more requests than the rate-limiting config would allow |
|
|
|
|
# if all of these requests ended up joining the user to a room. |
|
|
|
|
for i in range(6): |
|
|
|
|
request, channel = self.make_request("POST", path % room_id, {}) |
|
|
|
|
self.render(request) |
|
|
|
|
self.assertEquals(channel.code, 200) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RoomMessagesTestCase(RoomBase): |
|
|
|
|
""" Tests /rooms/$room_id/messages/$user_id/$msg_id REST events. """ |
|
|
|
|
|
|
|
|
|