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

Commit 3f9a4f4

Browse files
committed
Reuse RoomShutdownHandler.shutdown_room
1 parent 5b24839 commit 3f9a4f4

File tree

2 files changed

+23
-154
lines changed

2 files changed

+23
-154
lines changed

synapse/handlers/pagination.py

+20-153
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919

2020
from twisted.python.failure import Failure
2121

22-
from synapse.api.constants import EventTypes, Membership, RoomCreationPreset
22+
from synapse.api.constants import EventTypes, Membership
2323
from synapse.api.errors import SynapseError
2424
from synapse.api.filtering import Filter
2525
from synapse.logging.context import run_in_background
2626
from synapse.metrics.background_process_metrics import run_as_background_process
2727
from synapse.storage.state import StateFilter
2828
from synapse.streams.config import PaginationConfig
29-
from synapse.types import JsonDict, Requester, create_requester
29+
from synapse.types import JsonDict, Requester
3030
from synapse.util.async_helpers import ReadWriteLock
3131
from synapse.util.stringutils import random_string
3232
from synapse.visibility import filter_events_for_client
@@ -82,12 +82,6 @@ class PaginationHandler:
8282
paginating during a purge.
8383
"""
8484

85-
DEFAULT_MESSAGE = (
86-
"Sharing illegal content on this server is not permitted and rooms in"
87-
" violation will be blocked."
88-
)
89-
DEFAULT_ROOM_NAME = "Content Violation Notification"
90-
9185
def __init__(self, hs: "HomeServer"):
9286
self.hs = hs
9387
self.auth = hs.get_auth()
@@ -96,11 +90,7 @@ def __init__(self, hs: "HomeServer"):
9690
self.state_store = self.storage.state
9791
self.clock = hs.get_clock()
9892
self._server_name = hs.hostname
99-
100-
self._room_member_handler = hs.get_room_member_handler()
101-
self._room_creation_handler = hs.get_room_creation_handler()
102-
self._replication = hs.get_replication_data_handler()
103-
self._event_creation_handler = hs.get_event_creation_handler()
93+
self._room_shutdown_handler = hs.get_room_shutdown_handler()
10494

10595
self.pagination_lock = ReadWriteLock()
10696
self._purges_in_progress_by_room: Set[str] = set()
@@ -562,151 +552,25 @@ async def _shutdown_and_purge_room(
562552
new_room_id: A string representing the room ID of the new room.
563553
"""
564554

565-
if not new_room_name:
566-
new_room_name = self.DEFAULT_ROOM_NAME
567-
if not message:
568-
message = self.DEFAULT_MESSAGE
569-
570555
self._purges_in_progress_by_room.add(room_id)
571556
try:
572557
with await self.pagination_lock.write(room_id):
573558

574-
# This will work even if the room is already blocked, but that is
575-
# desirable in case the first attempt at blocking the room failed below.
576-
if block:
577-
await self.store.block_room(room_id, requester_user_id)
578-
579-
if new_room_user_id is not None:
580-
room_creator_requester = create_requester(
581-
new_room_user_id, authenticated_entity=requester_user_id
582-
)
583-
584-
info, stream_id = await self._room_creation_handler.create_room(
585-
room_creator_requester,
586-
config={
587-
"preset": RoomCreationPreset.PUBLIC_CHAT,
588-
"name": new_room_name,
589-
"power_level_content_override": {"users_default": -10},
590-
},
591-
ratelimit=False,
592-
)
593-
new_room_id = info["room_id"]
594-
595-
logger.info(
596-
"[shutdown_and_purge] Shutting down room %r, joining to new room: %r",
597-
room_id,
598-
new_room_id,
599-
)
600-
601-
# We now wait for the create room to come back in via replication so
602-
# that we can assume that all the joins/invites have propagated before
603-
# we try and auto join below.
604-
await self._replication.wait_for_stream_position(
605-
self.hs.config.worker.events_shard_config.get_instance(
606-
new_room_id
607-
),
608-
"events",
609-
stream_id,
610-
)
611-
else:
612-
new_room_id = None
613-
logger.info("[shutdown_and_purge] Shutting down room %r", room_id)
614-
615559
self._purges_by_id[room_id].status = PurgeStatus.STATUS_REMOVE_MEMBERS
616-
617-
users = await self.store.get_users_in_room(room_id)
618-
kicked_users = []
619-
failed_to_kick_users = []
620-
for user_id in users:
621-
if not self.hs.is_mine_id(user_id):
622-
continue
623-
624-
logger.info(
625-
"[shutdown_and_purge] Kicking %r from %r...", user_id, room_id
626-
)
627-
628-
try:
629-
# Kick users from room
630-
target_requester = create_requester(
631-
user_id, authenticated_entity=requester_user_id
632-
)
633-
_, stream_id = await self._room_member_handler.update_membership(
634-
requester=target_requester,
635-
target=target_requester.user,
636-
room_id=room_id,
637-
action=Membership.LEAVE,
638-
content={},
639-
ratelimit=False,
640-
require_consent=False,
641-
)
642-
643-
# Wait for leave to come in over replication before trying to forget.
644-
await self._replication.wait_for_stream_position(
645-
self.hs.config.worker.events_shard_config.get_instance(
646-
room_id
647-
),
648-
"events",
649-
stream_id,
650-
)
651-
652-
await self._room_member_handler.forget(
653-
target_requester.user, room_id
654-
)
655-
656-
# Join users to new room
657-
if new_room_user_id:
658-
await self._room_member_handler.update_membership(
659-
requester=target_requester,
660-
target=target_requester.user,
661-
room_id=new_room_id,
662-
action=Membership.JOIN,
663-
content={},
664-
ratelimit=False,
665-
require_consent=False,
666-
)
667-
668-
kicked_users.append(user_id)
669-
except Exception:
670-
logger.exception(
671-
"[shutdown_and_purge] Failed to leave old room and join new room for %r",
672-
user_id,
673-
)
674-
failed_to_kick_users.append(user_id)
675-
560+
self._purges_by_id[
561+
room_id
562+
].result = await self._room_shutdown_handler.shutdown_room(
563+
room_id=room_id,
564+
requester_user_id=requester_user_id,
565+
new_room_user_id=new_room_user_id,
566+
new_room_name=new_room_name,
567+
message=message,
568+
block=block,
569+
)
676570
self._purges_by_id[room_id].status = PurgeStatus.STATUS_ACTIVE
677571

678-
# Send message in new room and move aliases
679-
if new_room_user_id:
680-
await self._event_creation_handler.create_and_send_nonmember_event(
681-
room_creator_requester,
682-
{
683-
"type": "m.room.message",
684-
"content": {"body": message, "msgtype": "m.text"},
685-
"room_id": new_room_id,
686-
"sender": new_room_user_id,
687-
},
688-
ratelimit=False,
689-
)
690-
691-
aliases_for_room = await self.store.get_aliases_for_room(room_id)
692-
693-
await self.store.update_aliases_for_room(
694-
room_id, new_room_id, requester_user_id
695-
)
696-
else:
697-
aliases_for_room = []
698-
699-
self._purges_by_id[room_id].result = {
700-
"kicked_users": kicked_users,
701-
"failed_to_kick_users": failed_to_kick_users,
702-
"local_aliases": aliases_for_room,
703-
"new_room_id": new_room_id,
704-
}
705-
706572
if purge:
707-
logger.info(
708-
"[shutdown_and_purge] starting purge room_id %s", room_id
709-
)
573+
logger.info("starting purge room_id %s", room_id)
710574
self._purges_by_id[room_id].status = PurgeStatus.STATUS_ACTIVE
711575

712576
# first check that we have no users in this room
@@ -721,12 +585,12 @@ async def _shutdown_and_purge_room(
721585

722586
await self.storage.purge_events.purge_room(room_id)
723587

724-
logger.info("[shutdown_and_purge] complete")
588+
logger.info("complete")
725589
self._purges_by_id[room_id].status = PurgeStatus.STATUS_COMPLETE
726590
except Exception:
727591
f = Failure()
728592
logger.error(
729-
"[shutdown_and_purge] failed",
593+
"failed",
730594
exc_info=(f.type, f.value, f.getTracebackObject()), # type: ignore
731595
)
732596
self._purges_by_id[room_id].status = PurgeStatus.STATUS_FAILED
@@ -785,6 +649,9 @@ def start_shutdown_and_purge_room(
785649
400, "History purge already in progress for %s" % (room_id,)
786650
)
787651

652+
# This check is double to `RoomShutdownHandler.shutdown_room`
653+
# But here the requester get a direct response / error with HTTP request
654+
# and do not have to check the purge status
788655
if new_room_user_id is not None:
789656
if not self.hs.is_mine_id(new_room_user_id):
790657
raise SynapseError(
@@ -793,7 +660,7 @@ def start_shutdown_and_purge_room(
793660

794661
# we log the purge_id here so that it can be tied back to the
795662
# request id in the log lines.
796-
logger.info("[shutdown_and_purge] starting shutdown room_id %s", room_id)
663+
logger.info("[_shutdown_and_purge_room] starting shutdown room_id %s", room_id)
797664

798665
self._purges_by_id[room_id] = PurgeStatus()
799666
run_as_background_process(

synapse/handlers/room.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1278,7 +1278,9 @@ def get_current_key_for_room(self, room_id: str) -> Awaitable[str]:
12781278
class RoomShutdownHandler:
12791279
"""This handles synchronous room shutdowns and is part of the delete room v1 API.
12801280
It will become deprecated in the future.
1281-
The handler for asynchronous shudowns is part of the PaginationHandler.
1281+
1282+
The handler for asynchronous shudowns is part of the `PaginationHandler`.
1283+
If this handler is removed, `shutdown_room` must to be migrated to `PaginationHandler`
12821284
"""
12831285

12841286
DEFAULT_MESSAGE = (

0 commit comments

Comments
 (0)