|
24 | 24 | import synapse.rest.admin
|
25 | 25 | from synapse.api.constants import EventTypes, Membership, RoomTypes
|
26 | 26 | from synapse.api.errors import Codes
|
27 |
| -from synapse.handlers.pagination import PaginationHandler, PurgeStatus |
| 27 | +from synapse.handlers.pagination import DeleteStatus, PaginationHandler, PurgeStatus |
28 | 28 | from synapse.rest.client import directory, events, login, room
|
29 | 29 | from synapse.server import HomeServer
|
| 30 | +from synapse.types import UserID |
30 | 31 | from synapse.util import Clock
|
31 | 32 | from synapse.util.stringutils import random_string
|
32 | 33 |
|
@@ -502,6 +503,9 @@ def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
|
502 | 503 | )
|
503 | 504 | self.url_status_by_delete_id = "/_synapse/admin/v2/rooms/delete_status/"
|
504 | 505 |
|
| 506 | + self.room_member_handler = hs.get_room_member_handler() |
| 507 | + self.pagination_handler = hs.get_pagination_handler() |
| 508 | + |
505 | 509 | @parameterized.expand(
|
506 | 510 | [
|
507 | 511 | ("DELETE", "/_synapse/admin/v2/rooms/%s"),
|
@@ -972,6 +976,114 @@ def test_shutdown_room_block_peek(self) -> None:
|
972 | 976 | # Assert we can no longer peek into the room
|
973 | 977 | self._assert_peek(self.room_id, expect_code=403)
|
974 | 978 |
|
| 979 | + @unittest.override_config({"purge_retention_period": "1d"}) |
| 980 | + def test_purge_forgotten_room(self) -> None: |
| 981 | + # Create a test room |
| 982 | + room_id = self.helper.create_room_as( |
| 983 | + self.admin_user, |
| 984 | + tok=self.admin_user_tok, |
| 985 | + ) |
| 986 | + |
| 987 | + self.helper.leave(room_id, user=self.admin_user, tok=self.admin_user_tok) |
| 988 | + self.get_success( |
| 989 | + self.room_member_handler.forget( |
| 990 | + UserID.from_string(self.admin_user), room_id |
| 991 | + ) |
| 992 | + ) |
| 993 | + |
| 994 | + # Test that room is not yet purged |
| 995 | + with self.assertRaises(AssertionError): |
| 996 | + self._is_purged(room_id) |
| 997 | + |
| 998 | + self.reactor.advance(3600 * 24) |
| 999 | + |
| 1000 | + self._is_purged(room_id) |
| 1001 | + |
| 1002 | + def test_resume_purge_room(self) -> None: |
| 1003 | + # Create a test room |
| 1004 | + room_id = self.helper.create_room_as( |
| 1005 | + self.admin_user, |
| 1006 | + tok=self.admin_user_tok, |
| 1007 | + ) |
| 1008 | + self.helper.leave(room_id, user=self.admin_user, tok=self.admin_user_tok) |
| 1009 | + |
| 1010 | + self.get_success( |
| 1011 | + self.store.upsert_room_to_purge( |
| 1012 | + room_id, |
| 1013 | + random_string(16), |
| 1014 | + DeleteStatus.STATUS_PURGING, |
| 1015 | + ) |
| 1016 | + ) |
| 1017 | + |
| 1018 | + # Test that room is not yet purged |
| 1019 | + with self.assertRaises(AssertionError): |
| 1020 | + self._is_purged(room_id) |
| 1021 | + |
| 1022 | + self.reactor.advance(3600 * 1) |
| 1023 | + |
| 1024 | + self._is_purged(room_id) |
| 1025 | + |
| 1026 | + def test_resume_shutdown_room(self) -> None: |
| 1027 | + # Create a test room |
| 1028 | + room_id = self.helper.create_room_as( |
| 1029 | + self.other_user, |
| 1030 | + tok=self.other_user_tok, |
| 1031 | + ) |
| 1032 | + |
| 1033 | + delete_id = random_string(16) |
| 1034 | + |
| 1035 | + self.get_success( |
| 1036 | + self.store.upsert_room_to_purge( |
| 1037 | + room_id, |
| 1038 | + delete_id, |
| 1039 | + DeleteStatus.STATUS_SHUTTING_DOWN, |
| 1040 | + shutdown_params=json.dumps( |
| 1041 | + { |
| 1042 | + "requester_user_id": self.admin_user, |
| 1043 | + "new_room_user_id": self.admin_user, |
| 1044 | + "new_room_name": None, |
| 1045 | + "message": None, |
| 1046 | + "block": False, |
| 1047 | + "purge": True, |
| 1048 | + "force_purge": True, |
| 1049 | + } |
| 1050 | + ), |
| 1051 | + ) |
| 1052 | + ) |
| 1053 | + |
| 1054 | + # Test that room is not yet shutdown |
| 1055 | + self._is_member(room_id, self.other_user) |
| 1056 | + |
| 1057 | + # Test that room is not yet purged |
| 1058 | + with self.assertRaises(AssertionError): |
| 1059 | + self._is_purged(room_id) |
| 1060 | + |
| 1061 | + self.reactor.advance(3600 * 1) |
| 1062 | + |
| 1063 | + # Test that all users has been kicked (room is shutdown) |
| 1064 | + self._has_no_members(room_id) |
| 1065 | + |
| 1066 | + self._is_purged(room_id) |
| 1067 | + |
| 1068 | + # Retrieve delete results |
| 1069 | + result = self.make_request( |
| 1070 | + "GET", |
| 1071 | + self.url_status_by_delete_id + delete_id, |
| 1072 | + access_token=self.admin_user_tok, |
| 1073 | + ) |
| 1074 | + self.assertEqual(200, result.code, msg=result.json_body) |
| 1075 | + |
| 1076 | + # Check that the user is in kicked_users |
| 1077 | + self.assertIn( |
| 1078 | + self.other_user, result.json_body["shutdown_room"]["kicked_users"] |
| 1079 | + ) |
| 1080 | + |
| 1081 | + new_room_id = result.json_body["shutdown_room"]["new_room_id"] |
| 1082 | + self.assertTrue(new_room_id) |
| 1083 | + |
| 1084 | + # Check that the user is actually in the new room |
| 1085 | + self._is_member(new_room_id, self.other_user) |
| 1086 | + |
975 | 1087 | def _is_blocked(self, room_id: str, expect: bool = True) -> None:
|
976 | 1088 | """Assert that the room is blocked or not"""
|
977 | 1089 | d = self.store.is_room_blocked(room_id)
|
|
0 commit comments