mirror of
https://git.anonymousland.org/anonymousland/synapse-product.git
synced 2025-08-03 16:24:11 -04:00
Add admin API to get a list of federated rooms (#11658)
This commit is contained in:
parent
0938f32e93
commit
6a72c910f1
6 changed files with 444 additions and 25 deletions
|
@ -20,7 +20,7 @@ from twisted.test.proto_helpers import MemoryReactor
|
|||
|
||||
import synapse.rest.admin
|
||||
from synapse.api.errors import Codes
|
||||
from synapse.rest.client import login
|
||||
from synapse.rest.client import login, room
|
||||
from synapse.server import HomeServer
|
||||
from synapse.types import JsonDict
|
||||
from synapse.util import Clock
|
||||
|
@ -52,9 +52,7 @@ class FederationTestCase(unittest.HomeserverTestCase):
|
|||
]
|
||||
)
|
||||
def test_requester_is_no_admin(self, method: str, url: str) -> None:
|
||||
"""
|
||||
If the user is not a server admin, an error 403 is returned.
|
||||
"""
|
||||
"""If the user is not a server admin, an error 403 is returned."""
|
||||
|
||||
self.register_user("user", "pass", admin=False)
|
||||
other_user_tok = self.login("user", "pass")
|
||||
|
@ -70,9 +68,7 @@ class FederationTestCase(unittest.HomeserverTestCase):
|
|||
self.assertEqual(Codes.FORBIDDEN, channel.json_body["errcode"])
|
||||
|
||||
def test_invalid_parameter(self) -> None:
|
||||
"""
|
||||
If parameters are invalid, an error is returned.
|
||||
"""
|
||||
"""If parameters are invalid, an error is returned."""
|
||||
|
||||
# negative limit
|
||||
channel = self.make_request(
|
||||
|
@ -135,9 +131,7 @@ class FederationTestCase(unittest.HomeserverTestCase):
|
|||
self.assertEqual(Codes.NOT_FOUND, channel.json_body["errcode"])
|
||||
|
||||
def test_limit(self) -> None:
|
||||
"""
|
||||
Testing list of destinations with limit
|
||||
"""
|
||||
"""Testing list of destinations with limit"""
|
||||
|
||||
number_destinations = 20
|
||||
self._create_destinations(number_destinations)
|
||||
|
@ -155,9 +149,7 @@ class FederationTestCase(unittest.HomeserverTestCase):
|
|||
self._check_fields(channel.json_body["destinations"])
|
||||
|
||||
def test_from(self) -> None:
|
||||
"""
|
||||
Testing list of destinations with a defined starting point (from)
|
||||
"""
|
||||
"""Testing list of destinations with a defined starting point (from)"""
|
||||
|
||||
number_destinations = 20
|
||||
self._create_destinations(number_destinations)
|
||||
|
@ -175,9 +167,7 @@ class FederationTestCase(unittest.HomeserverTestCase):
|
|||
self._check_fields(channel.json_body["destinations"])
|
||||
|
||||
def test_limit_and_from(self) -> None:
|
||||
"""
|
||||
Testing list of destinations with a defined starting point and limit
|
||||
"""
|
||||
"""Testing list of destinations with a defined starting point and limit"""
|
||||
|
||||
number_destinations = 20
|
||||
self._create_destinations(number_destinations)
|
||||
|
@ -195,9 +185,7 @@ class FederationTestCase(unittest.HomeserverTestCase):
|
|||
self._check_fields(channel.json_body["destinations"])
|
||||
|
||||
def test_next_token(self) -> None:
|
||||
"""
|
||||
Testing that `next_token` appears at the right place
|
||||
"""
|
||||
"""Testing that `next_token` appears at the right place"""
|
||||
|
||||
number_destinations = 20
|
||||
self._create_destinations(number_destinations)
|
||||
|
@ -256,9 +244,7 @@ class FederationTestCase(unittest.HomeserverTestCase):
|
|||
self.assertNotIn("next_token", channel.json_body)
|
||||
|
||||
def test_list_all_destinations(self) -> None:
|
||||
"""
|
||||
List all destinations.
|
||||
"""
|
||||
"""List all destinations."""
|
||||
number_destinations = 5
|
||||
self._create_destinations(number_destinations)
|
||||
|
||||
|
@ -277,9 +263,7 @@ class FederationTestCase(unittest.HomeserverTestCase):
|
|||
self._check_fields(channel.json_body["destinations"])
|
||||
|
||||
def test_order_by(self) -> None:
|
||||
"""
|
||||
Testing order list with parameter `order_by`
|
||||
"""
|
||||
"""Testing order list with parameter `order_by`"""
|
||||
|
||||
def _order_test(
|
||||
expected_destination_list: List[str],
|
||||
|
@ -543,3 +527,271 @@ class FederationTestCase(unittest.HomeserverTestCase):
|
|||
self.assertIn("retry_interval", c)
|
||||
self.assertIn("failure_ts", c)
|
||||
self.assertIn("last_successful_stream_ordering", c)
|
||||
|
||||
|
||||
class DestinationMembershipTestCase(unittest.HomeserverTestCase):
|
||||
servlets = [
|
||||
synapse.rest.admin.register_servlets,
|
||||
login.register_servlets,
|
||||
room.register_servlets,
|
||||
]
|
||||
|
||||
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
|
||||
self.store = hs.get_datastore()
|
||||
self.admin_user = self.register_user("admin", "pass", admin=True)
|
||||
self.admin_user_tok = self.login("admin", "pass")
|
||||
|
||||
self.dest = "sub0.example.com"
|
||||
self.url = f"/_synapse/admin/v1/federation/destinations/{self.dest}/rooms"
|
||||
|
||||
# Record that we successfully contacted a destination in the DB.
|
||||
self.get_success(
|
||||
self.store.set_destination_retry_timings(self.dest, None, 0, 0)
|
||||
)
|
||||
|
||||
def test_requester_is_no_admin(self) -> None:
|
||||
"""If the user is not a server admin, an error 403 is returned."""
|
||||
|
||||
self.register_user("user", "pass", admin=False)
|
||||
other_user_tok = self.login("user", "pass")
|
||||
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url,
|
||||
access_token=other_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.FORBIDDEN, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(Codes.FORBIDDEN, channel.json_body["errcode"])
|
||||
|
||||
def test_invalid_parameter(self) -> None:
|
||||
"""If parameters are invalid, an error is returned."""
|
||||
|
||||
# negative limit
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url + "?limit=-5",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.BAD_REQUEST, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(Codes.INVALID_PARAM, channel.json_body["errcode"])
|
||||
|
||||
# negative from
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url + "?from=-5",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.BAD_REQUEST, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(Codes.INVALID_PARAM, channel.json_body["errcode"])
|
||||
|
||||
# invalid search order
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url + "?dir=bar",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.BAD_REQUEST, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(Codes.INVALID_PARAM, channel.json_body["errcode"])
|
||||
|
||||
# invalid destination
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
"/_synapse/admin/v1/federation/destinations/%s/rooms" % ("invalid",),
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.NOT_FOUND, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(Codes.NOT_FOUND, channel.json_body["errcode"])
|
||||
|
||||
def test_limit(self) -> None:
|
||||
"""Testing list of destinations with limit"""
|
||||
|
||||
number_rooms = 5
|
||||
self._create_destination_rooms(number_rooms)
|
||||
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url + "?limit=3",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.OK, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(channel.json_body["total"], number_rooms)
|
||||
self.assertEqual(len(channel.json_body["rooms"]), 3)
|
||||
self.assertEqual(channel.json_body["next_token"], "3")
|
||||
self._check_fields(channel.json_body["rooms"])
|
||||
|
||||
def test_from(self) -> None:
|
||||
"""Testing list of rooms with a defined starting point (from)"""
|
||||
|
||||
number_rooms = 10
|
||||
self._create_destination_rooms(number_rooms)
|
||||
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url + "?from=5",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.OK, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(channel.json_body["total"], number_rooms)
|
||||
self.assertEqual(len(channel.json_body["rooms"]), 5)
|
||||
self.assertNotIn("next_token", channel.json_body)
|
||||
self._check_fields(channel.json_body["rooms"])
|
||||
|
||||
def test_limit_and_from(self) -> None:
|
||||
"""Testing list of rooms with a defined starting point and limit"""
|
||||
|
||||
number_rooms = 10
|
||||
self._create_destination_rooms(number_rooms)
|
||||
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url + "?from=3&limit=5",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.OK, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(channel.json_body["total"], number_rooms)
|
||||
self.assertEqual(channel.json_body["next_token"], "8")
|
||||
self.assertEqual(len(channel.json_body["rooms"]), 5)
|
||||
self._check_fields(channel.json_body["rooms"])
|
||||
|
||||
def test_order_direction(self) -> None:
|
||||
"""Testing order list with parameter `dir`"""
|
||||
number_rooms = 4
|
||||
self._create_destination_rooms(number_rooms)
|
||||
|
||||
# get list in forward direction
|
||||
channel_asc = self.make_request(
|
||||
"GET",
|
||||
self.url + "?dir=f",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.OK, channel_asc.code, msg=channel_asc.json_body)
|
||||
self.assertEqual(channel_asc.json_body["total"], number_rooms)
|
||||
self.assertEqual(number_rooms, len(channel_asc.json_body["rooms"]))
|
||||
self._check_fields(channel_asc.json_body["rooms"])
|
||||
|
||||
# get list in backward direction
|
||||
channel_desc = self.make_request(
|
||||
"GET",
|
||||
self.url + "?dir=b",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.OK, channel_desc.code, msg=channel_desc.json_body)
|
||||
self.assertEqual(channel_desc.json_body["total"], number_rooms)
|
||||
self.assertEqual(number_rooms, len(channel_desc.json_body["rooms"]))
|
||||
self._check_fields(channel_desc.json_body["rooms"])
|
||||
|
||||
# test that both lists have different directions
|
||||
for i in range(0, number_rooms):
|
||||
self.assertEqual(
|
||||
channel_asc.json_body["rooms"][i]["room_id"],
|
||||
channel_desc.json_body["rooms"][number_rooms - 1 - i]["room_id"],
|
||||
)
|
||||
|
||||
def test_next_token(self) -> None:
|
||||
"""Testing that `next_token` appears at the right place"""
|
||||
|
||||
number_rooms = 5
|
||||
self._create_destination_rooms(number_rooms)
|
||||
|
||||
# `next_token` does not appear
|
||||
# Number of results is the number of entries
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url + "?limit=5",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.OK, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(channel.json_body["total"], number_rooms)
|
||||
self.assertEqual(len(channel.json_body["rooms"]), number_rooms)
|
||||
self.assertNotIn("next_token", channel.json_body)
|
||||
|
||||
# `next_token` does not appear
|
||||
# Number of max results is larger than the number of entries
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url + "?limit=6",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.OK, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(channel.json_body["total"], number_rooms)
|
||||
self.assertEqual(len(channel.json_body["rooms"]), number_rooms)
|
||||
self.assertNotIn("next_token", channel.json_body)
|
||||
|
||||
# `next_token` does appear
|
||||
# Number of max results is smaller than the number of entries
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url + "?limit=4",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.OK, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(channel.json_body["total"], number_rooms)
|
||||
self.assertEqual(len(channel.json_body["rooms"]), 4)
|
||||
self.assertEqual(channel.json_body["next_token"], "4")
|
||||
|
||||
# Check
|
||||
# Set `from` to value of `next_token` for request remaining entries
|
||||
# `next_token` does not appear
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url + "?from=4",
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.OK, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(channel.json_body["total"], number_rooms)
|
||||
self.assertEqual(len(channel.json_body["rooms"]), 1)
|
||||
self.assertNotIn("next_token", channel.json_body)
|
||||
|
||||
def test_destination_rooms(self) -> None:
|
||||
"""Testing that request the list of rooms is successfully."""
|
||||
number_rooms = 3
|
||||
self._create_destination_rooms(number_rooms)
|
||||
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
self.url,
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(HTTPStatus.OK, channel.code, msg=channel.json_body)
|
||||
self.assertEqual(channel.json_body["total"], number_rooms)
|
||||
self.assertEqual(number_rooms, len(channel.json_body["rooms"]))
|
||||
self._check_fields(channel.json_body["rooms"])
|
||||
|
||||
def _create_destination_rooms(self, number_rooms: int) -> None:
|
||||
"""Create a number rooms for destination
|
||||
|
||||
Args:
|
||||
number_rooms: Number of rooms to be created
|
||||
"""
|
||||
for _ in range(0, number_rooms):
|
||||
room_id = self.helper.create_room_as(
|
||||
self.admin_user, tok=self.admin_user_tok
|
||||
)
|
||||
self.get_success(
|
||||
self.store.store_destination_rooms_entries((self.dest,), room_id, 1234)
|
||||
)
|
||||
|
||||
def _check_fields(self, content: List[JsonDict]) -> None:
|
||||
"""Checks that the expected room attributes are present in content
|
||||
|
||||
Args:
|
||||
content: List that is checked for content
|
||||
"""
|
||||
for c in content:
|
||||
self.assertIn("room_id", c)
|
||||
self.assertIn("stream_ordering", c)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue