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

Commit 66bdca3

Browse files
authored
Remove deprecated delete room admin API (#11213)
Remove deprecated delete room admin API, `POST /_synapse/admin/v1/rooms/<room_id>/delete`
1 parent 71f9966 commit 66bdca3

File tree

6 files changed

+79
-124
lines changed

6 files changed

+79
-124
lines changed

changelog.d/11213.removal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Remove deprecated admin API to delete rooms (`POST /_synapse/admin/v1/rooms/<room_id>/delete`).

docs/admin_api/rooms.md

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -520,16 +520,6 @@ With all that being said, if you still want to try and recover the room:
520520
4. If `new_room_user_id` was given, a 'Content Violation' will have been
521521
created. Consider whether you want to delete that roomm.
522522

523-
## Deprecated endpoint
524-
525-
The previous deprecated API will be removed in a future release, it was:
526-
527-
```
528-
POST /_synapse/admin/v1/rooms/<room_id>/delete
529-
```
530-
531-
It behaves the same way than the current endpoint except the path and the method.
532-
533523
# Make Room Admin API
534524

535525
Grants another user the highest power available to a local user who is in the room.

docs/upgrade.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,16 @@ process, for example:
8787

8888
# Upgrading to v1.47.0
8989

90+
## Removal of old Room Admin API
91+
92+
The following admin APIs were deprecated in [Synapse 1.34](https://github.com/matrix-org/synapse/blob/v1.34.0/CHANGES.md#deprecations-and-removals)
93+
(released on 2021-05-17) and have now been removed:
94+
95+
- `POST /_synapse/admin/v1/<room_id>/delete`
96+
97+
Any scripts still using the above APIs should be converted to use the
98+
[Delete Room API](https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#delete-room-api).
99+
90100
## Deprecation of the `user_may_create_room_with_invites` module callback
91101

92102
The `user_may_create_room_with_invites` is deprecated and will be removed in a future

synapse/rest/admin/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
RegistrationTokenRestServlet,
4343
)
4444
from synapse.rest.admin.rooms import (
45-
DeleteRoomRestServlet,
4645
ForwardExtremitiesRestServlet,
4746
JoinRoomAliasServlet,
4847
ListRoomRestServlet,
@@ -221,7 +220,6 @@ def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
221220
RoomStateRestServlet(hs).register(http_server)
222221
RoomRestServlet(hs).register(http_server)
223222
RoomMembersRestServlet(hs).register(http_server)
224-
DeleteRoomRestServlet(hs).register(http_server)
225223
JoinRoomAliasServlet(hs).register(http_server)
226224
VersionServlet(hs).register(http_server)
227225
UserAdminServlet(hs).register(http_server)

synapse/rest/admin/rooms.py

Lines changed: 53 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -46,41 +46,6 @@
4646
logger = logging.getLogger(__name__)
4747

4848

49-
class DeleteRoomRestServlet(RestServlet):
50-
"""Delete a room from server.
51-
52-
It is a combination and improvement of shutdown and purge room.
53-
54-
Shuts down a room by removing all local users from the room.
55-
Blocking all future invites and joins to the room is optional.
56-
57-
If desired any local aliases will be repointed to a new room
58-
created by `new_room_user_id` and kicked users will be auto-
59-
joined to the new room.
60-
61-
If 'purge' is true, it will remove all traces of a room from the database.
62-
"""
63-
64-
PATTERNS = admin_patterns("/rooms/(?P<room_id>[^/]+)/delete$")
65-
66-
def __init__(self, hs: "HomeServer"):
67-
self.hs = hs
68-
self.auth = hs.get_auth()
69-
self.room_shutdown_handler = hs.get_room_shutdown_handler()
70-
self.pagination_handler = hs.get_pagination_handler()
71-
72-
async def on_POST(
73-
self, request: SynapseRequest, room_id: str
74-
) -> Tuple[int, JsonDict]:
75-
return await _delete_room(
76-
request,
77-
room_id,
78-
self.auth,
79-
self.room_shutdown_handler,
80-
self.pagination_handler,
81-
)
82-
83-
8449
class ListRoomRestServlet(RestServlet):
8550
"""
8651
List all rooms that are known to the homeserver. Results are returned
@@ -218,14 +183,66 @@ async def on_GET(
218183
async def on_DELETE(
219184
self, request: SynapseRequest, room_id: str
220185
) -> Tuple[int, JsonDict]:
221-
return await _delete_room(
186+
return await self._delete_room(
222187
request,
223188
room_id,
224189
self.auth,
225190
self.room_shutdown_handler,
226191
self.pagination_handler,
227192
)
228193

194+
async def _delete_room(
195+
self,
196+
request: SynapseRequest,
197+
room_id: str,
198+
auth: "Auth",
199+
room_shutdown_handler: "RoomShutdownHandler",
200+
pagination_handler: "PaginationHandler",
201+
) -> Tuple[int, JsonDict]:
202+
requester = await auth.get_user_by_req(request)
203+
await assert_user_is_admin(auth, requester.user)
204+
205+
content = parse_json_object_from_request(request)
206+
207+
block = content.get("block", False)
208+
if not isinstance(block, bool):
209+
raise SynapseError(
210+
HTTPStatus.BAD_REQUEST,
211+
"Param 'block' must be a boolean, if given",
212+
Codes.BAD_JSON,
213+
)
214+
215+
purge = content.get("purge", True)
216+
if not isinstance(purge, bool):
217+
raise SynapseError(
218+
HTTPStatus.BAD_REQUEST,
219+
"Param 'purge' must be a boolean, if given",
220+
Codes.BAD_JSON,
221+
)
222+
223+
force_purge = content.get("force_purge", False)
224+
if not isinstance(force_purge, bool):
225+
raise SynapseError(
226+
HTTPStatus.BAD_REQUEST,
227+
"Param 'force_purge' must be a boolean, if given",
228+
Codes.BAD_JSON,
229+
)
230+
231+
ret = await room_shutdown_handler.shutdown_room(
232+
room_id=room_id,
233+
new_room_user_id=content.get("new_room_user_id"),
234+
new_room_name=content.get("room_name"),
235+
message=content.get("message"),
236+
requester_user_id=requester.user.to_string(),
237+
block=block,
238+
)
239+
240+
# Purge room
241+
if purge:
242+
await pagination_handler.purge_room(room_id, force=force_purge)
243+
244+
return 200, ret
245+
229246

230247
class RoomMembersRestServlet(RestServlet):
231248
"""
@@ -617,55 +634,3 @@ async def on_GET(
617634
)
618635

619636
return 200, results
620-
621-
622-
async def _delete_room(
623-
request: SynapseRequest,
624-
room_id: str,
625-
auth: "Auth",
626-
room_shutdown_handler: "RoomShutdownHandler",
627-
pagination_handler: "PaginationHandler",
628-
) -> Tuple[int, JsonDict]:
629-
requester = await auth.get_user_by_req(request)
630-
await assert_user_is_admin(auth, requester.user)
631-
632-
content = parse_json_object_from_request(request)
633-
634-
block = content.get("block", False)
635-
if not isinstance(block, bool):
636-
raise SynapseError(
637-
HTTPStatus.BAD_REQUEST,
638-
"Param 'block' must be a boolean, if given",
639-
Codes.BAD_JSON,
640-
)
641-
642-
purge = content.get("purge", True)
643-
if not isinstance(purge, bool):
644-
raise SynapseError(
645-
HTTPStatus.BAD_REQUEST,
646-
"Param 'purge' must be a boolean, if given",
647-
Codes.BAD_JSON,
648-
)
649-
650-
force_purge = content.get("force_purge", False)
651-
if not isinstance(force_purge, bool):
652-
raise SynapseError(
653-
HTTPStatus.BAD_REQUEST,
654-
"Param 'force_purge' must be a boolean, if given",
655-
Codes.BAD_JSON,
656-
)
657-
658-
ret = await room_shutdown_handler.shutdown_room(
659-
room_id=room_id,
660-
new_room_user_id=content.get("new_room_user_id"),
661-
new_room_name=content.get("room_name"),
662-
message=content.get("message"),
663-
requester_user_id=requester.user.to_string(),
664-
block=block,
665-
)
666-
667-
# Purge room
668-
if purge:
669-
await pagination_handler.purge_room(room_id, force=force_purge)
670-
671-
return 200, ret

tests/rest/admin/test_room.py

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
from typing import List, Optional
1818
from unittest.mock import Mock
1919

20-
from parameterized import parameterized_class
21-
2220
import synapse.rest.admin
2321
from synapse.api.constants import EventTypes, Membership
2422
from synapse.api.errors import Codes
@@ -29,13 +27,6 @@
2927
"""Tests admin REST events for /rooms paths."""
3028

3129

32-
@parameterized_class(
33-
("method", "url_template"),
34-
[
35-
("POST", "/_synapse/admin/v1/rooms/%s/delete"),
36-
("DELETE", "/_synapse/admin/v1/rooms/%s"),
37-
],
38-
)
3930
class DeleteRoomTestCase(unittest.HomeserverTestCase):
4031
servlets = [
4132
synapse.rest.admin.register_servlets,
@@ -67,15 +58,15 @@ def prepare(self, reactor, clock, hs):
6758
self.room_id = self.helper.create_room_as(
6859
self.other_user, tok=self.other_user_tok
6960
)
70-
self.url = self.url_template % self.room_id
61+
self.url = "/_synapse/admin/v1/rooms/%s" % self.room_id
7162

7263
def test_requester_is_no_admin(self):
7364
"""
7465
If the user is not a server admin, an error 403 is returned.
7566
"""
7667

7768
channel = self.make_request(
78-
self.method,
69+
"DELETE",
7970
self.url,
8071
json.dumps({}),
8172
access_token=self.other_user_tok,
@@ -88,10 +79,10 @@ def test_room_does_not_exist(self):
8879
"""
8980
Check that unknown rooms/server return error 404.
9081
"""
91-
url = self.url_template % "!unknown:test"
82+
url = "/_synapse/admin/v1/rooms/%s" % "!unknown:test"
9283

9384
channel = self.make_request(
94-
self.method,
85+
"DELETE",
9586
url,
9687
json.dumps({}),
9788
access_token=self.admin_user_tok,
@@ -104,10 +95,10 @@ def test_room_is_not_valid(self):
10495
"""
10596
Check that invalid room names, return an error 400.
10697
"""
107-
url = self.url_template % "invalidroom"
98+
url = "/_synapse/admin/v1/rooms/%s" % "invalidroom"
10899

109100
channel = self.make_request(
110-
self.method,
101+
"DELETE",
111102
url,
112103
json.dumps({}),
113104
access_token=self.admin_user_tok,
@@ -126,7 +117,7 @@ def test_new_room_user_does_not_exist(self):
126117
body = json.dumps({"new_room_user_id": "@unknown:test"})
127118

128119
channel = self.make_request(
129-
self.method,
120+
"DELETE",
130121
self.url,
131122
content=body.encode(encoding="utf_8"),
132123
access_token=self.admin_user_tok,
@@ -145,7 +136,7 @@ def test_new_room_user_is_not_local(self):
145136
body = json.dumps({"new_room_user_id": "@not:exist.bla"})
146137

147138
channel = self.make_request(
148-
self.method,
139+
"DELETE",
149140
self.url,
150141
content=body.encode(encoding="utf_8"),
151142
access_token=self.admin_user_tok,
@@ -164,7 +155,7 @@ def test_block_is_not_bool(self):
164155
body = json.dumps({"block": "NotBool"})
165156

166157
channel = self.make_request(
167-
self.method,
158+
"DELETE",
168159
self.url,
169160
content=body.encode(encoding="utf_8"),
170161
access_token=self.admin_user_tok,
@@ -180,7 +171,7 @@ def test_purge_is_not_bool(self):
180171
body = json.dumps({"purge": "NotBool"})
181172

182173
channel = self.make_request(
183-
self.method,
174+
"DELETE",
184175
self.url,
185176
content=body.encode(encoding="utf_8"),
186177
access_token=self.admin_user_tok,
@@ -206,7 +197,7 @@ def test_purge_room_and_block(self):
206197
body = json.dumps({"block": True, "purge": True})
207198

208199
channel = self.make_request(
209-
self.method,
200+
"DELETE",
210201
self.url.encode("ascii"),
211202
content=body.encode(encoding="utf_8"),
212203
access_token=self.admin_user_tok,
@@ -239,7 +230,7 @@ def test_purge_room_and_not_block(self):
239230
body = json.dumps({"block": False, "purge": True})
240231

241232
channel = self.make_request(
242-
self.method,
233+
"DELETE",
243234
self.url.encode("ascii"),
244235
content=body.encode(encoding="utf_8"),
245236
access_token=self.admin_user_tok,
@@ -273,7 +264,7 @@ def test_block_room_and_not_purge(self):
273264
body = json.dumps({"block": False, "purge": False})
274265

275266
channel = self.make_request(
276-
self.method,
267+
"DELETE",
277268
self.url.encode("ascii"),
278269
content=body.encode(encoding="utf_8"),
279270
access_token=self.admin_user_tok,
@@ -319,7 +310,7 @@ def test_shutdown_room_consent(self):
319310

320311
# Test that the admin can still send shutdown
321312
channel = self.make_request(
322-
self.method,
313+
"DELETE",
323314
self.url,
324315
json.dumps({"new_room_user_id": self.admin_user}),
325316
access_token=self.admin_user_tok,
@@ -365,7 +356,7 @@ def test_shutdown_room_block_peek(self):
365356

366357
# Test that the admin can still send shutdown
367358
channel = self.make_request(
368-
self.method,
359+
"DELETE",
369360
self.url,
370361
json.dumps({"new_room_user_id": self.admin_user}),
371362
access_token=self.admin_user_tok,

0 commit comments

Comments
 (0)