@ -12,8 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
""" Contains functions for performing events on rooms. """
""" Contains functions for performing actions on rooms. """
import itertools
import logging
import math
@ -31,6 +30,8 @@ from typing import (
Tuple ,
)
from typing_extensions import TypedDict
from synapse . api . constants import (
EventContentFields ,
EventTypes ,
@ -1277,6 +1278,13 @@ class RoomEventSource(EventSource[RoomStreamToken, EventBase]):
return self . store . get_room_events_max_id ( room_id )
class ShutdownRoomResponse ( TypedDict ) :
kicked_users : List [ str ]
failed_to_kick_users : List [ str ]
local_aliases : List [ str ]
new_room_id : Optional [ str ]
class RoomShutdownHandler :
DEFAULT_MESSAGE = (
@ -1302,7 +1310,7 @@ class RoomShutdownHandler:
new_room_name : Optional [ str ] = None ,
message : Optional [ str ] = None ,
block : bool = False ,
) - > dict :
) - > ShutdownRoomResponse :
"""
Shuts down a room . Moves all local users and room aliases automatically
to a new room if ` new_room_user_id ` is set . Otherwise local users only
@ -1336,8 +1344,13 @@ class RoomShutdownHandler:
Defaults to ` Sharing illegal content on this server is not
permitted and rooms in violation will be blocked . `
block :
If set to ` true ` , this room will be added to a blocking list ,
preventing future attempts to join the room . Defaults to ` false ` .
If set to ` True ` , users will be prevented from joining the old
room . This option can also be used to pre - emptively block a room ,
even if it ' s unknown to this homeserver. In this case, the room
will be blocked , and no further action will be taken . If ` False ` ,
attempting to delete an unknown room is invalid .
Defaults to ` False ` .
Returns : a dict containing the following keys :
kicked_users : An array of users ( ` user_id ` ) that were kicked .
@ -1346,7 +1359,9 @@ class RoomShutdownHandler:
local_aliases :
An array of strings representing the local aliases that were
migrated from the old room to the new .
new_room_id : A string representing the room ID of the new room .
new_room_id :
A string representing the room ID of the new room , or None if
no such room was created .
"""
if not new_room_name :
@ -1357,14 +1372,28 @@ class RoomShutdownHandler:
if not RoomID . is_valid ( room_id ) :
raise SynapseError ( 400 , " %s is not a legal room ID " % ( room_id , ) )
if not await self . store . get_room ( room_id ) :
raise NotFoundError ( " Unknown room id %s " % ( room_id , ) )
# 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.
# Action the block first (even if the room doesn't exist yet)
if block :
# 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 )
if not await self . store . get_room ( room_id ) :
if block :
# We allow you to block an unknown room.
return {
" kicked_users " : [ ] ,
" failed_to_kick_users " : [ ] ,
" local_aliases " : [ ] ,
" new_room_id " : None ,
}
else :
# But if you don't want to preventatively block another room,
# this function can't do anything useful.
raise NotFoundError (
" Cannot shut down room: unknown room id %s " % ( room_id , )
)
if new_room_user_id is not None :
if not self . hs . is_mine_id ( new_room_user_id ) :
raise SynapseError (