19
19
20
20
from twisted .python .failure import Failure
21
21
22
- from synapse .api .constants import EventTypes , Membership , RoomCreationPreset
22
+ from synapse .api .constants import EventTypes , Membership
23
23
from synapse .api .errors import SynapseError
24
24
from synapse .api .filtering import Filter
25
25
from synapse .logging .context import run_in_background
26
26
from synapse .metrics .background_process_metrics import run_as_background_process
27
27
from synapse .storage .state import StateFilter
28
28
from synapse .streams .config import PaginationConfig
29
- from synapse .types import JsonDict , Requester , create_requester
29
+ from synapse .types import JsonDict , Requester
30
30
from synapse .util .async_helpers import ReadWriteLock
31
31
from synapse .util .stringutils import random_string
32
32
from synapse .visibility import filter_events_for_client
@@ -82,12 +82,6 @@ class PaginationHandler:
82
82
paginating during a purge.
83
83
"""
84
84
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
-
91
85
def __init__ (self , hs : "HomeServer" ):
92
86
self .hs = hs
93
87
self .auth = hs .get_auth ()
@@ -96,11 +90,7 @@ def __init__(self, hs: "HomeServer"):
96
90
self .state_store = self .storage .state
97
91
self .clock = hs .get_clock ()
98
92
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 ()
104
94
105
95
self .pagination_lock = ReadWriteLock ()
106
96
self ._purges_in_progress_by_room : Set [str ] = set ()
@@ -562,151 +552,25 @@ async def _shutdown_and_purge_room(
562
552
new_room_id: A string representing the room ID of the new room.
563
553
"""
564
554
565
- if not new_room_name :
566
- new_room_name = self .DEFAULT_ROOM_NAME
567
- if not message :
568
- message = self .DEFAULT_MESSAGE
569
-
570
555
self ._purges_in_progress_by_room .add (room_id )
571
556
try :
572
557
with await self .pagination_lock .write (room_id ):
573
558
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
-
615
559
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
+ )
676
570
self ._purges_by_id [room_id ].status = PurgeStatus .STATUS_ACTIVE
677
571
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
-
706
572
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 )
710
574
self ._purges_by_id [room_id ].status = PurgeStatus .STATUS_ACTIVE
711
575
712
576
# first check that we have no users in this room
@@ -721,12 +585,12 @@ async def _shutdown_and_purge_room(
721
585
722
586
await self .storage .purge_events .purge_room (room_id )
723
587
724
- logger .info ("[shutdown_and_purge] complete" )
588
+ logger .info ("complete" )
725
589
self ._purges_by_id [room_id ].status = PurgeStatus .STATUS_COMPLETE
726
590
except Exception :
727
591
f = Failure ()
728
592
logger .error (
729
- "[shutdown_and_purge] failed" ,
593
+ "failed" ,
730
594
exc_info = (f .type , f .value , f .getTracebackObject ()), # type: ignore
731
595
)
732
596
self ._purges_by_id [room_id ].status = PurgeStatus .STATUS_FAILED
@@ -785,6 +649,9 @@ def start_shutdown_and_purge_room(
785
649
400 , "History purge already in progress for %s" % (room_id ,)
786
650
)
787
651
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
788
655
if new_room_user_id is not None :
789
656
if not self .hs .is_mine_id (new_room_user_id ):
790
657
raise SynapseError (
@@ -793,7 +660,7 @@ def start_shutdown_and_purge_room(
793
660
794
661
# we log the purge_id here so that it can be tied back to the
795
662
# 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 )
797
664
798
665
self ._purges_by_id [room_id ] = PurgeStatus ()
799
666
run_as_background_process (
0 commit comments