summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndrew Morgan <andrewm@element.io>2022-08-10 19:20:31 +0100
committerAndrew Morgan <andrewm@element.io>2022-08-10 19:33:36 +0100
commit36a6a93df7c905259299eeb37725639da89f63f5 (patch)
treea42191128497fda4feef1460fa8c27121e4ed1e2
parentAdd some miscellaneous comments around sync (#13474) (diff)
downloadsynapse-36a6a93df7c905259299eeb37725639da89f63f5.tar.xz
Leave the room if the client calls /forget
-rw-r--r--synapse/handlers/room.py2
-rw-r--r--synapse/handlers/room_member.py16
-rw-r--r--synapse/handlers/room_member_worker.py2
-rw-r--r--synapse/rest/client/room.py3
4 files changed, 15 insertions, 8 deletions
diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index 55395457c3..8118da2cfe 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -1812,7 +1812,7 @@ class RoomShutdownHandler:
                     stream_id,
                 )
 
-                await self.room_member_handler.forget(target_requester.user, room_id)
+                await self.room_member_handler.forget(target_requester, room_id)
 
                 # Join users to new room
                 if new_room_user_id:
diff --git a/synapse/handlers/room_member.py b/synapse/handlers/room_member.py
index 70dc69c809..a02b5e973e 100644
--- a/synapse/handlers/room_member.py
+++ b/synapse/handlers/room_member.py
@@ -261,7 +261,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
         raise NotImplementedError()
 
     @abc.abstractmethod
-    async def forget(self, user: UserID, room_id: str) -> None:
+    async def forget(self, requester: Requester, room_id: str) -> None:
         raise NotImplementedError()
 
     async def ratelimit_multiple_invites(
@@ -1909,19 +1909,25 @@ class RoomMemberMasterHandler(RoomMemberHandler):
         """Implements RoomMemberHandler._user_left_room"""
         user_left_room(self.distributor, target, room_id)
 
-    async def forget(self, user: UserID, room_id: str) -> None:
-        user_id = user.to_string()
+    async def forget(self, requester: Requester, room_id: str) -> None:
+        user_id = requester.user.to_string()
 
         member = await self._storage_controllers.state.get_current_state_event(
             room_id=room_id, event_type=EventTypes.Member, state_key=user_id
         )
         membership = member.membership if member else None
 
-        if membership is not None and membership not in [
+        if membership and membership not in [
             Membership.LEAVE,
             Membership.BAN,
         ]:
-            raise SynapseError(400, "User %s in room %s" % (user_id, room_id))
+            # Have the user leave the room.
+            await self.update_membership(
+                requester=requester,
+                target=requester.user,
+                room_id=room_id,
+                action=Membership.LEAVE,
+            )
 
         if membership:
             await self.store.forget(user_id, room_id)
diff --git a/synapse/handlers/room_member_worker.py b/synapse/handlers/room_member_worker.py
index 221552a2a6..e65a17edb8 100644
--- a/synapse/handlers/room_member_worker.py
+++ b/synapse/handlers/room_member_worker.py
@@ -137,5 +137,5 @@ class RoomMemberWorkerHandler(RoomMemberHandler):
             user_id=target.to_string(), room_id=room_id, change="left"
         )
 
-    async def forget(self, target: UserID, room_id: str) -> None:
+    async def forget(self, target: Requester, room_id: str) -> None:
         raise RuntimeError("Cannot forget rooms on workers.")
diff --git a/synapse/rest/client/room.py b/synapse/rest/client/room.py
index 2f513164cb..93068aacd1 100644
--- a/synapse/rest/client/room.py
+++ b/synapse/rest/client/room.py
@@ -799,6 +799,7 @@ class RoomForgetRestServlet(TransactionRestServlet):
         super().__init__(hs)
         self.room_member_handler = hs.get_room_member_handler()
         self.auth = hs.get_auth()
+        self.store = hs.get_datastores().main
 
     def register(self, http_server: HttpServer) -> None:
         PATTERNS = "/rooms/(?P<room_id>[^/]*)/forget"
@@ -809,7 +810,7 @@ class RoomForgetRestServlet(TransactionRestServlet):
     ) -> Tuple[int, JsonDict]:
         requester = await self.auth.get_user_by_req(request, allow_guest=False)
 
-        await self.room_member_handler.forget(user=requester.user, room_id=room_id)
+        await self.room_member_handler.forget(requester=requester, room_id=room_id)
 
         return 200, {}