Skip to content
Snippets Groups Projects
Unverified Commit a090b862 authored by Richard van der Hoff's avatar Richard van der Hoff Committed by GitHub
Browse files

Add `force_purge` option to delete-room admin api. (#8843)

parent 856eab60
Branches
Tags
No related merge requests found
Add `force_purge` option to delete-room admin api.
...@@ -382,7 +382,7 @@ the new room. Users on other servers will be unaffected. ...@@ -382,7 +382,7 @@ the new room. Users on other servers will be unaffected.
The API is: The API is:
```json ```
POST /_synapse/admin/v1/rooms/<room_id>/delete POST /_synapse/admin/v1/rooms/<room_id>/delete
``` ```
...@@ -439,6 +439,10 @@ The following JSON body parameters are available: ...@@ -439,6 +439,10 @@ The following JSON body parameters are available:
future attempts to join the room. Defaults to `false`. future attempts to join the room. Defaults to `false`.
* `purge` - Optional. If set to `true`, it will remove all traces of the room from your database. * `purge` - Optional. If set to `true`, it will remove all traces of the room from your database.
Defaults to `true`. Defaults to `true`.
* `force_purge` - Optional, and ignored unless `purge` is `true`. If set to `true`, it
will force a purge to go ahead even if there are local users still in the room. Do not
use this unless a regular `purge` operation fails, as it could leave those users'
clients in a confused state.
The JSON body must not be empty. The body must be at least `{}`. The JSON body must not be empty. The body must be at least `{}`.
......
...@@ -299,17 +299,22 @@ class PaginationHandler: ...@@ -299,17 +299,22 @@ class PaginationHandler:
""" """
return self._purges_by_id.get(purge_id) return self._purges_by_id.get(purge_id)
async def purge_room(self, room_id: str) -> None: async def purge_room(self, room_id: str, force: bool = False) -> None:
"""Purge the given room from the database""" """Purge the given room from the database.
Args:
room_id: room to be purged
force: set true to skip checking for joined users.
"""
with await self.pagination_lock.write(room_id): with await self.pagination_lock.write(room_id):
# check we know about the room # check we know about the room
await self.store.get_room_version_id(room_id) await self.store.get_room_version_id(room_id)
# first check that we have no users in this room # first check that we have no users in this room
joined = await self.store.is_host_joined(room_id, self._server_name) if not force:
joined = await self.store.is_host_joined(room_id, self._server_name)
if joined: if joined:
raise SynapseError(400, "Users are still joined to this room") raise SynapseError(400, "Users are still joined to this room")
await self.storage.purge_events.purge_room(room_id) await self.storage.purge_events.purge_room(room_id)
......
...@@ -70,14 +70,18 @@ class ShutdownRoomRestServlet(RestServlet): ...@@ -70,14 +70,18 @@ class ShutdownRoomRestServlet(RestServlet):
class DeleteRoomRestServlet(RestServlet): class DeleteRoomRestServlet(RestServlet):
"""Delete a room from server. It is a combination and improvement of """Delete a room from server.
shut down and purge room.
It is a combination and improvement of shutdown and purge room.
Shuts down a room by removing all local users from the room. Shuts down a room by removing all local users from the room.
Blocking all future invites and joins to the room is optional. Blocking all future invites and joins to the room is optional.
If desired any local aliases will be repointed to a new room If desired any local aliases will be repointed to a new room
created by `new_room_user_id` and kicked users will be auto created by `new_room_user_id` and kicked users will be auto-
joined to the new room. joined to the new room.
It will remove all trace of a room from the database.
If 'purge' is true, it will remove all traces of a room from the database.
""" """
PATTERNS = admin_patterns("/rooms/(?P<room_id>[^/]+)/delete$") PATTERNS = admin_patterns("/rooms/(?P<room_id>[^/]+)/delete$")
...@@ -110,6 +114,14 @@ class DeleteRoomRestServlet(RestServlet): ...@@ -110,6 +114,14 @@ class DeleteRoomRestServlet(RestServlet):
Codes.BAD_JSON, Codes.BAD_JSON,
) )
force_purge = content.get("force_purge", False)
if not isinstance(force_purge, bool):
raise SynapseError(
HTTPStatus.BAD_REQUEST,
"Param 'force_purge' must be a boolean, if given",
Codes.BAD_JSON,
)
ret = await self.room_shutdown_handler.shutdown_room( ret = await self.room_shutdown_handler.shutdown_room(
room_id=room_id, room_id=room_id,
new_room_user_id=content.get("new_room_user_id"), new_room_user_id=content.get("new_room_user_id"),
...@@ -121,7 +133,7 @@ class DeleteRoomRestServlet(RestServlet): ...@@ -121,7 +133,7 @@ class DeleteRoomRestServlet(RestServlet):
# Purge room # Purge room
if purge: if purge:
await self.pagination_handler.purge_room(room_id) await self.pagination_handler.purge_room(room_id, force=force_purge)
return (200, ret) return (200, ret)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment