refac
This commit is contained in:
@@ -508,6 +508,19 @@ async def channel_events(sid, data):
|
|||||||
Channels.update_member_last_read_at(data["channel_id"], user["id"])
|
Channels.update_member_last_read_at(data["channel_id"], user["id"])
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_document_id(document_id: str) -> str:
|
||||||
|
"""Canonicalize document IDs to prevent auth bypass via prefix variants.
|
||||||
|
|
||||||
|
YdocManager normalizes storage keys by replacing ":" with "_", so
|
||||||
|
"note_abc" and "note:abc" resolve to the same underlying document.
|
||||||
|
We must rewrite underscore-prefixed IDs back to the colon form so
|
||||||
|
that authorization checks (which key on "note:") always fire.
|
||||||
|
"""
|
||||||
|
if document_id.startswith("note_"):
|
||||||
|
document_id = "note:" + document_id[5:]
|
||||||
|
return document_id
|
||||||
|
|
||||||
|
|
||||||
@sio.on("ydoc:document:join")
|
@sio.on("ydoc:document:join")
|
||||||
async def ydoc_document_join(sid, data):
|
async def ydoc_document_join(sid, data):
|
||||||
"""Handle user joining a document"""
|
"""Handle user joining a document"""
|
||||||
@@ -516,7 +529,7 @@ async def ydoc_document_join(sid, data):
|
|||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
document_id = data["document_id"]
|
document_id = normalize_document_id(data["document_id"])
|
||||||
|
|
||||||
if document_id.startswith("note:"):
|
if document_id.startswith("note:"):
|
||||||
note_id = document_id.split(":")[1]
|
note_id = document_id.split(":")[1]
|
||||||
@@ -591,6 +604,8 @@ async def ydoc_document_join(sid, data):
|
|||||||
|
|
||||||
|
|
||||||
async def document_save_handler(document_id, data, user):
|
async def document_save_handler(document_id, data, user):
|
||||||
|
document_id = normalize_document_id(document_id)
|
||||||
|
|
||||||
if document_id.startswith("note:"):
|
if document_id.startswith("note:"):
|
||||||
note_id = document_id.split(":")[1]
|
note_id = document_id.split(":")[1]
|
||||||
note = Notes.get_note_by_id(note_id)
|
note = Notes.get_note_by_id(note_id)
|
||||||
@@ -619,6 +634,8 @@ async def yjs_document_state(sid, data):
|
|||||||
"""Send the current state of the Yjs document to the user"""
|
"""Send the current state of the Yjs document to the user"""
|
||||||
try:
|
try:
|
||||||
document_id = data["document_id"]
|
document_id = data["document_id"]
|
||||||
|
|
||||||
|
document_id = normalize_document_id(document_id)
|
||||||
room = f"doc_{document_id}"
|
room = f"doc_{document_id}"
|
||||||
|
|
||||||
active_session_ids = get_session_ids_from_room(room)
|
active_session_ids = get_session_ids_from_room(room)
|
||||||
@@ -659,6 +676,15 @@ async def yjs_document_update(sid, data):
|
|||||||
try:
|
try:
|
||||||
document_id = data["document_id"]
|
document_id = data["document_id"]
|
||||||
|
|
||||||
|
document_id = normalize_document_id(document_id)
|
||||||
|
|
||||||
|
# Verify the sender actually joined this document room
|
||||||
|
room = f"doc_{document_id}"
|
||||||
|
active_session_ids = get_session_ids_from_room(room)
|
||||||
|
if sid not in active_session_ids:
|
||||||
|
log.warning(f"Session {sid} not in room {room}. Rejecting update.")
|
||||||
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await stop_item_tasks(REDIS, document_id)
|
await stop_item_tasks(REDIS, document_id)
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|||||||
Reference in New Issue
Block a user