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

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

Merged
merged 3 commits into from
Nov 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions changelog.d/8843.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add `force_purge` option to delete-room admin api.
6 changes: 5 additions & 1 deletion docs/admin_api/rooms.md
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ the new room. Users on other servers will be unaffected.

The API is:

```json
```
POST /_synapse/admin/v1/rooms/<room_id>/delete
```

Expand Down Expand Up @@ -439,6 +439,10 @@ The following JSON body parameters are available:
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.
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 `{}`.

Expand Down
17 changes: 11 additions & 6 deletions synapse/handlers/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -299,17 +299,22 @@ def get_purge_status(self, purge_id: str) -> Optional[PurgeStatus]:
"""
return self._purges_by_id.get(purge_id)

async def purge_room(self, room_id: str) -> None:
"""Purge the given room from the database"""
async def purge_room(self, room_id: str, force: bool = False) -> None:
"""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):
# check we know about the room
await self.store.get_room_version_id(room_id)

# first check that we have no users in this room
joined = await self.store.is_host_joined(room_id, self._server_name)

if joined:
raise SynapseError(400, "Users are still joined to this room")
if not force:
joined = await self.store.is_host_joined(room_id, self._server_name)
if joined:
raise SynapseError(400, "Users are still joined to this room")

await self.storage.purge_events.purge_room(room_id)

Expand Down
22 changes: 17 additions & 5 deletions synapse/rest/admin/rooms.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,18 @@ async def on_POST(self, request, room_id):


class DeleteRoomRestServlet(RestServlet):
"""Delete a room from server. It is a combination and improvement of
shut down and purge room.
"""Delete a room from server.

It is a combination and improvement of shutdown and purge room.

Shuts down a room by removing all local users from the room.
Blocking all future invites and joins to the room is optional.

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.
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$")
Expand Down Expand Up @@ -110,6 +114,14 @@ async def on_POST(self, request, room_id):
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(
room_id=room_id,
new_room_user_id=content.get("new_room_user_id"),
Expand All @@ -121,7 +133,7 @@ async def on_POST(self, request, room_id):

# Purge room
if purge:
await self.pagination_handler.purge_room(room_id)
await self.pagination_handler.purge_room(room_id, force=force_purge)

return (200, ret)

Expand Down