patch to work multiple upload
This commit is contained in:
24
app/app.py
24
app/app.py
@@ -493,9 +493,14 @@ async def api_upload(
|
|||||||
except Exception:
|
except Exception:
|
||||||
max_uses_int = -1
|
max_uses_int = -1
|
||||||
if max_uses_int == 1:
|
if max_uses_int == 1:
|
||||||
if claimed and claimed_by_session and claimed_by_session != session_id:
|
# Already claimed?
|
||||||
|
if claimed:
|
||||||
|
# Allow same session to continue; block different sessions
|
||||||
|
if claimed_by_session and claimed_by_session != session_id:
|
||||||
await send_progress(session_id, item_id, "error", 100, "Invite already used")
|
await send_progress(session_id, item_id, "error", 100, "Invite already used")
|
||||||
return JSONResponse({"error": "invite_claimed"}, status_code=403)
|
return JSONResponse({"error": "invite_claimed"}, status_code=403)
|
||||||
|
# claimed by same session (or unknown): allow
|
||||||
|
else:
|
||||||
# Atomically claim the one-time invite to prevent concurrent use
|
# Atomically claim the one-time invite to prevent concurrent use
|
||||||
try:
|
try:
|
||||||
connc = sqlite3.connect(SETTINGS.state_db)
|
connc = sqlite3.connect(SETTINGS.state_db)
|
||||||
@@ -507,12 +512,23 @@ async def api_upload(
|
|||||||
connc.commit()
|
connc.commit()
|
||||||
changed = connc.total_changes
|
changed = connc.total_changes
|
||||||
connc.close()
|
connc.close()
|
||||||
if changed == 0 and (claimed_by_session or claimed):
|
|
||||||
await send_progress(session_id, item_id, "error", 100, "Invite already used")
|
|
||||||
return JSONResponse({"error": "invite_claimed"}, status_code=403)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception("Invite claim failed: %s", e)
|
logger.exception("Invite claim failed: %s", e)
|
||||||
return JSONResponse({"error": "invite_claim_failed"}, status_code=500)
|
return JSONResponse({"error": "invite_claim_failed"}, status_code=500)
|
||||||
|
if changed == 0:
|
||||||
|
# Someone else just claimed; re-check owner
|
||||||
|
try:
|
||||||
|
conn2 = sqlite3.connect(SETTINGS.state_db)
|
||||||
|
cur2 = conn2.cursor()
|
||||||
|
cur2.execute("SELECT claimed_by_session FROM invites WHERE token = ?", (invite_token,))
|
||||||
|
owner_row = cur2.fetchone()
|
||||||
|
conn2.close()
|
||||||
|
owner = owner_row[0] if owner_row else None
|
||||||
|
except Exception:
|
||||||
|
owner = None
|
||||||
|
if not owner or owner != session_id:
|
||||||
|
await send_progress(session_id, item_id, "error", 100, "Invite already used")
|
||||||
|
return JSONResponse({"error": "invite_claimed"}, status_code=403)
|
||||||
else:
|
else:
|
||||||
# Usage check for multi-use (max_uses < 0 => indefinite)
|
# Usage check for multi-use (max_uses < 0 => indefinite)
|
||||||
if (used_count or 0) >= (max_uses_int if max_uses_int >= 0 else 10**9):
|
if (used_count or 0) >= (max_uses_int if max_uses_int >= 0 else 10**9):
|
||||||
|
|||||||
Reference in New Issue
Block a user