aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMicah Lee <micah@micahflee.com>2024-03-07 19:07:22 -0800
committerMicah Lee <micah@micahflee.com>2024-03-07 19:07:22 -0800
commit1b0979e6ed2290532f25806da09fb2b96eeb7a5b (patch)
tree90957a72fc2864806060d9ef3f0c5ff5f047190a
parentfe7bd43f04275a17cb3ab0d31e9a2f5c1ae3e263 (diff)
downloadonionshare-1b0979e6ed2290532f25806da09fb2b96eeb7a5b.tar.gz
onionshare-1b0979e6ed2290532f25806da09fb2b96eeb7a5b.zip
Forcefully disconnect the user from socketio on disconnect event
-rw-r--r--cli/onionshare_cli/web/chat_mode.py48
1 files 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,
+ )