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

Allow modules to delete rooms. #15997

Merged
merged 5 commits into from
Sep 6, 2023
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/15997.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Allow modules to delete rooms.
12 changes: 10 additions & 2 deletions synapse/handlers/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,7 @@ async def _shutdown_and_purge_room(
self,
delete_id: str,
room_id: str,
requester_user_id: str,
requester_user_id: Optional[str],
new_room_user_id: Optional[str] = None,
new_room_name: Optional[str] = None,
message: Optional[str] = None,
Expand All @@ -732,6 +732,10 @@ async def _shutdown_and_purge_room(
requester_user_id:
User who requested the action. Will be recorded as putting the room on the
blocking list.
If None, the action was not manually requested but instead
triggered automatically, e.g. through a Synapse module
or some other policy.
MUST NOT be None if block=True.
new_room_user_id:
If set, a new room will be created with this user ID
as the creator and admin, and all users in the old room will be
Expand Down Expand Up @@ -818,7 +822,7 @@ def clear_delete() -> None:
def start_shutdown_and_purge_room(
self,
room_id: str,
requester_user_id: str,
requester_user_id: Optional[str],
new_room_user_id: Optional[str] = None,
new_room_name: Optional[str] = None,
message: Optional[str] = None,
Expand All @@ -833,6 +837,10 @@ def start_shutdown_and_purge_room(
requester_user_id:
User who requested the action and put the room on the
blocking list.
If None, the action was not manually requested but instead
triggered automatically, e.g. through a Synapse module
or some other policy.
MUST NOT be None if block=True.
new_room_user_id:
If set, a new room will be created with this user ID
as the creator and admin, and all users in the old room will be
Expand Down
10 changes: 9 additions & 1 deletion synapse/handlers/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -1787,7 +1787,7 @@ def __init__(self, hs: "HomeServer"):
async def shutdown_room(
self,
room_id: str,
requester_user_id: str,
requester_user_id: Optional[str],
MatMaul marked this conversation as resolved.
Show resolved Hide resolved
new_room_user_id: Optional[str] = None,
new_room_name: Optional[str] = None,
message: Optional[str] = None,
Expand All @@ -1811,6 +1811,10 @@ async def shutdown_room(
requester_user_id:
User who requested the action and put the room on the
blocking list.
If None, the action was not manually requested but instead
triggered automatically, e.g. through a Synapse module
or some other policy.
MUST NOT be None if block=True.
new_room_user_id:
If set, a new room will be created with this user ID
as the creator and admin, and all users in the old room will be
Expand Down Expand Up @@ -1863,6 +1867,10 @@ async def shutdown_room(

# Action the block first (even if the room doesn't exist yet)
if block:
if requester_user_id is None:
raise ValueError(
"shutdown_room: block=True not allowed when requester_user_id is None."
)
# This will work even if the room is already blocked, but that is
# desirable in case the first attempt at blocking the room failed below.
await self.store.block_room(room_id, requester_user_id)
Expand Down
13 changes: 13 additions & 0 deletions synapse/module_api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1730,6 +1730,19 @@ async def create_room(
room_alias_str = room_alias.to_string() if room_alias else None
return room_id, room_alias_str

async def delete_room(self, room_id: str) -> None:
"""
Schedules the deletion of a room from Synapse's database.

If the room is already being deleted, this method does nothing.
This method does not wait for the room to be deleted.

Added in Synapse v1.89.0.
"""
# Future extensions to this method might want to e.g. allow use of `force_purge`.
# TODO In the future we should make sure this is persistent.
self._hs.get_pagination_handler().start_shutdown_and_purge_room(room_id, None)

async def set_displayname(
self,
user_id: UserID,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
[str, StateMap[EventBase], str], Awaitable[bool]
]
ON_NEW_EVENT_CALLBACK = Callable[[EventBase, StateMap[EventBase]], Awaitable]
CHECK_CAN_SHUTDOWN_ROOM_CALLBACK = Callable[[str, str], Awaitable[bool]]
CHECK_CAN_SHUTDOWN_ROOM_CALLBACK = Callable[[Optional[str], str], Awaitable[bool]]
CHECK_CAN_DEACTIVATE_USER_CALLBACK = Callable[[str, bool], Awaitable[bool]]
ON_PROFILE_UPDATE_CALLBACK = Callable[[str, ProfileInfo, bool, bool], Awaitable]
ON_USER_DEACTIVATION_STATUS_CHANGED_CALLBACK = Callable[[str, bool, bool], Awaitable]
Expand Down Expand Up @@ -429,12 +429,17 @@ async def on_new_event(self, event_id: str) -> None:
"Failed to run module API callback %s: %s", callback, e
)

async def check_can_shutdown_room(self, user_id: str, room_id: str) -> bool:
async def check_can_shutdown_room(
self, user_id: Optional[str], room_id: str
) -> bool:
"""Intercept requests to shutdown a room. If `False` is returned, the
room must not be shut down.

Args:
requester: The ID of the user requesting the shutdown.
user_id: The ID of the user requesting the shutdown.
If no user ID is supplied, then the room is being shut down through
some mechanism other than a user's request, e.g. through a module's
request.
room_id: The ID of the room.
"""
for callback in self._check_can_shutdown_room_callbacks:
Expand Down
Loading