forked from ComputerTech/aprhodite
Fix #2: Validate PM room join authorization
- Track pending PM invitations per socket session - pm_accept now rejects room joins unless user has a valid invite - Clean up pending invites on disconnect - Prevents eavesdropping on other users' PM conversations
This commit is contained in:
parent
99859f009f
commit
8da91ebf70
13
app.py
13
app.py
|
|
@ -73,6 +73,7 @@ muted_users: set = set()
|
||||||
banned_usernames: set = set()
|
banned_usernames: set = set()
|
||||||
banned_ips: set = set()
|
banned_ips: set = set()
|
||||||
message_timestamps: dict = defaultdict(list)
|
message_timestamps: dict = defaultdict(list)
|
||||||
|
pending_pm_invites: dict = {} # sid → set of room names they were invited to
|
||||||
|
|
||||||
RATE_LIMIT = 6
|
RATE_LIMIT = 6
|
||||||
RATE_WINDOW = 5
|
RATE_WINDOW = 5
|
||||||
|
|
@ -360,6 +361,7 @@ def on_disconnect():
|
||||||
sid = request.sid
|
sid = request.sid
|
||||||
user = connected_users.pop(sid, None)
|
user = connected_users.pop(sid, None)
|
||||||
message_timestamps.pop(sid, None)
|
message_timestamps.pop(sid, None)
|
||||||
|
pending_pm_invites.pop(sid, None)
|
||||||
if user and user.get("username"):
|
if user and user.get("username"):
|
||||||
lower = user["username"].lower()
|
lower = user["username"].lower()
|
||||||
username_to_sid.pop(lower, None)
|
username_to_sid.pop(lower, None)
|
||||||
|
|
@ -526,6 +528,8 @@ def on_pm_open(data):
|
||||||
|
|
||||||
room = _pm_room(user["username"], target)
|
room = _pm_room(user["username"], target)
|
||||||
join_room(room)
|
join_room(room)
|
||||||
|
if target_sid:
|
||||||
|
pending_pm_invites.setdefault(target_sid, set()).add(room)
|
||||||
socketio.emit("pm_invite", {"from": user["username"], "room": room}, to=target_sid)
|
socketio.emit("pm_invite", {"from": user["username"], "room": room}, to=target_sid)
|
||||||
emit("pm_ready", {"with": target, "room": room})
|
emit("pm_ready", {"with": target, "room": room})
|
||||||
|
|
||||||
|
|
@ -533,7 +537,14 @@ def on_pm_open(data):
|
||||||
|
|
||||||
@socketio.on("pm_accept")
|
@socketio.on("pm_accept")
|
||||||
def on_pm_accept(data):
|
def on_pm_accept(data):
|
||||||
join_room(data.get("room"))
|
sid = request.sid
|
||||||
|
room = str(data.get("room", ""))
|
||||||
|
allowed = pending_pm_invites.get(sid, set())
|
||||||
|
if room not in allowed:
|
||||||
|
emit("error", {"msg": "Invalid or expired PM invitation."})
|
||||||
|
return
|
||||||
|
allowed.discard(room)
|
||||||
|
join_room(room)
|
||||||
|
|
||||||
|
|
||||||
@socketio.on("pm_message")
|
@socketio.on("pm_message")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue