From 1b0979e6ed2290532f25806da09fb2b96eeb7a5b Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Thu, 7 Mar 2024 19:07:22 -0800 Subject: [PATCH] Forcefully disconnect the user from socketio on disconnect event --- cli/onionshare_cli/web/chat_mode.py | 48 +++++++++++++++++++---------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/cli/onionshare_cli/web/chat_mode.py b/cli/onionshare_cli/web/chat_mode.py index 5a11eedd..2de9ba61 100644 --- a/cli/onionshare_cli/web/chat_mode.py +++ b/cli/onionshare_cli/web/chat_mode.py @@ -77,13 +77,17 @@ class ChatModeWeb: self.web.add_request(self.web.REQUEST_LOAD, request.path) return render_template( - "chat.html", - static_url_path=self.web.static_url_path, - username=session.get("name"), - title=self.web.settings.get("general", "title"), + "chat.html", + static_url_path=self.web.static_url_path, + username=session.get("name"), + title=self.web.settings.get("general", "title"), ) - @self.web.app.route("/update-session-username", methods=["POST"], provide_automatic_options=False) + @self.web.app.route( + "/update-session-username", + methods=["POST"], + provide_automatic_options=False, + ) def update_session_username(): history_id = self.cur_history_id data = request.get_json() @@ -122,6 +126,8 @@ class ChatModeWeb: A status message is broadcast to all people in the room.""" if self.validate_username(session.get("name")): self.connected_users.append(session.get("name")) + # Store the session id for the user + session["socketio_session_id"] = request.sid emit( "status", { @@ -133,7 +139,7 @@ class ChatModeWeb: broadcast=True, ) else: - raise ConnectionRefusedError('You are active from another session!') + raise ConnectionRefusedError("You are active from another session!") @self.web.socketio.on("text", namespace="/chat") def text(message): @@ -153,9 +159,9 @@ class ChatModeWeb: new_name = message.get("username", "").strip() if self.validate_username(new_name): session["name"] = new_name - self.connected_users[ - self.connected_users.index(current_name) - ] = session.get("name") + self.connected_users[self.connected_users.index(current_name)] = ( + session.get("name") + ) emit( "status", { @@ -178,13 +184,23 @@ class ChatModeWeb: def disconnect(): """Sent by clients when they disconnect. A status message is broadcast to all people in the server.""" + user_already_disconnected = False if session.get("name") in self.connected_users: self.connected_users.remove(session.get("name")) - emit( - "status", - { - "msg": "{} has left the room.".format(session.get("name")), - "connected_users": self.connected_users, - }, - broadcast=True, + else: + user_already_disconnected = True + + # Forcefully disconnect the user + self.web.socketio.server.disconnect( + sid=session.get("socketio_session_id"), namespace="/chat" ) + + if not user_already_disconnected: + emit( + "status", + { + "msg": "{} has left the room.".format(session.get("name")), + "connected_users": self.connected_users, + }, + broadcast=True, + )