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 2 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(purge, bool):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it a copy paste mistake?
purge vs. force_purge

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