Spaces:
Sleeping
Sleeping
session token test
Browse files
relay.py
CHANGED
|
@@ -26,10 +26,14 @@ active_connections = {}
|
|
| 26 |
# Dictionary to store undelivered messages
|
| 27 |
message_store = {}
|
| 28 |
|
| 29 |
-
|
| 30 |
-
|
|
|
|
|
|
|
|
|
|
| 31 |
active_connections[username] = websocket
|
| 32 |
-
|
|
|
|
| 33 |
|
| 34 |
# Deliver undelivered messages if any
|
| 35 |
if username in message_store:
|
|
@@ -40,15 +44,17 @@ async def register_client(websocket: WebSocket, username: str):
|
|
| 40 |
print(f"DEBUG: Cleared stored messages for {username}")
|
| 41 |
|
| 42 |
async def unregister_client(username: str):
|
| 43 |
-
"""Unregister a client."""
|
| 44 |
if username in active_connections:
|
| 45 |
del active_connections[username]
|
|
|
|
| 46 |
print(f"DEBUG: {username} disconnected.")
|
| 47 |
|
| 48 |
@app.websocket("/ws")
|
| 49 |
async def relay_server(websocket: WebSocket):
|
| 50 |
"""Relay server handling WebSocket connections."""
|
| 51 |
username = None
|
|
|
|
| 52 |
try:
|
| 53 |
await websocket.accept()
|
| 54 |
print("DEBUG: WebSocket connection accepted.")
|
|
@@ -69,9 +75,17 @@ async def relay_server(websocket: WebSocket):
|
|
| 69 |
if response.status_code == 200:
|
| 70 |
print(f"DEBUG: Registration successful for {username}")
|
| 71 |
await websocket.send_text(json.dumps({"status": "success", "message": "Registration successful"}))
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
else:
|
| 76 |
error_message = response.json().get("detail", "Registration failed")
|
| 77 |
print(f"DEBUG: Registration failed for {username}: {error_message}")
|
|
@@ -85,8 +99,9 @@ async def relay_server(websocket: WebSocket):
|
|
| 85 |
response = await client.post(f"{SERVICES_URL}/login", json={"username": username, "password": password})
|
| 86 |
if response.status_code == 200:
|
| 87 |
print(f"DEBUG: Authentication successful for {username}")
|
| 88 |
-
|
| 89 |
-
await
|
|
|
|
| 90 |
else:
|
| 91 |
error_message = response.json().get("detail", "Invalid credentials")
|
| 92 |
print(f"DEBUG: Authentication failed for {username}: {error_message}")
|
|
@@ -106,6 +121,13 @@ async def relay_server(websocket: WebSocket):
|
|
| 106 |
msg_content = msg_data.get("message")
|
| 107 |
timestamp = datetime.now().isoformat()
|
| 108 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
# Create message object
|
| 110 |
message_obj = {
|
| 111 |
"from": username,
|
|
|
|
| 26 |
# Dictionary to store undelivered messages
|
| 27 |
message_store = {}
|
| 28 |
|
| 29 |
+
# Store session tokens (for simplicity, in-memory storage)
|
| 30 |
+
session_tokens = {}
|
| 31 |
+
|
| 32 |
+
async def register_client(websocket: WebSocket, username: str, token: str):
|
| 33 |
+
"""Register a new client with a session token."""
|
| 34 |
active_connections[username] = websocket
|
| 35 |
+
session_tokens[username] = token # Store the session token
|
| 36 |
+
print(f"DEBUG: {username} connected with token.")
|
| 37 |
|
| 38 |
# Deliver undelivered messages if any
|
| 39 |
if username in message_store:
|
|
|
|
| 44 |
print(f"DEBUG: Cleared stored messages for {username}")
|
| 45 |
|
| 46 |
async def unregister_client(username: str):
|
| 47 |
+
"""Unregister a client and delete their session token."""
|
| 48 |
if username in active_connections:
|
| 49 |
del active_connections[username]
|
| 50 |
+
del session_tokens[username] # Delete session token on disconnect
|
| 51 |
print(f"DEBUG: {username} disconnected.")
|
| 52 |
|
| 53 |
@app.websocket("/ws")
|
| 54 |
async def relay_server(websocket: WebSocket):
|
| 55 |
"""Relay server handling WebSocket connections."""
|
| 56 |
username = None
|
| 57 |
+
token = None
|
| 58 |
try:
|
| 59 |
await websocket.accept()
|
| 60 |
print("DEBUG: WebSocket connection accepted.")
|
|
|
|
| 75 |
if response.status_code == 200:
|
| 76 |
print(f"DEBUG: Registration successful for {username}")
|
| 77 |
await websocket.send_text(json.dumps({"status": "success", "message": "Registration successful"}))
|
| 78 |
+
|
| 79 |
+
# Create session token upon registration
|
| 80 |
+
token_response = await client.post(f"{SERVICES_URL}/login", json={"username": username, "password": password})
|
| 81 |
+
if token_response.status_code == 200:
|
| 82 |
+
token = token_response.json().get("token")
|
| 83 |
+
await websocket.send_text(json.dumps({"status": "success", "token": token}))
|
| 84 |
+
# Register the client after successful signup and token retrieval
|
| 85 |
+
await register_client(websocket, username, token)
|
| 86 |
+
return
|
| 87 |
+
else:
|
| 88 |
+
await websocket.send_text(json.dumps({"status": "error", "message": "Token retrieval failed"}))
|
| 89 |
else:
|
| 90 |
error_message = response.json().get("detail", "Registration failed")
|
| 91 |
print(f"DEBUG: Registration failed for {username}: {error_message}")
|
|
|
|
| 99 |
response = await client.post(f"{SERVICES_URL}/login", json={"username": username, "password": password})
|
| 100 |
if response.status_code == 200:
|
| 101 |
print(f"DEBUG: Authentication successful for {username}")
|
| 102 |
+
token = response.json().get("token")
|
| 103 |
+
await websocket.send_text(json.dumps({"status": "success", "message": "Authenticated", "token": token}))
|
| 104 |
+
await register_client(websocket, username, token)
|
| 105 |
else:
|
| 106 |
error_message = response.json().get("detail", "Invalid credentials")
|
| 107 |
print(f"DEBUG: Authentication failed for {username}: {error_message}")
|
|
|
|
| 121 |
msg_content = msg_data.get("message")
|
| 122 |
timestamp = datetime.now().isoformat()
|
| 123 |
|
| 124 |
+
# Check session token for message validation
|
| 125 |
+
if recipient in session_tokens:
|
| 126 |
+
received_token = msg_data.get("token")
|
| 127 |
+
if received_token != session_tokens[recipient]:
|
| 128 |
+
await websocket.send_text(json.dumps({"status": "error", "message": "Invalid session token"}))
|
| 129 |
+
continue
|
| 130 |
+
|
| 131 |
# Create message object
|
| 132 |
message_obj = {
|
| 133 |
"from": username,
|