fix(auth): refusing a revoked session no longer deletes a newer sign-in's cookie

The refusal cleared the session, so a request in flight with the previous account's cookie
answered with a cookie deletion that could land after a sign-in as someone else. A revoked id is
refused on every request anyway. Also a test for the pruning of old revocations.
This commit is contained in:
2026-11-14 19:32:01 +01:00
parent be6bd586d7
commit f1d0845923
2 changed files with 30 additions and 3 deletions
+4 -2
View File
@@ -368,9 +368,11 @@ def _session_user(request: Request, db: Session, user_id: int | None) -> User:
if epoch is None or int(epoch) != (user.session_epoch or 0):
request.session.clear()
raise refused(401, "not_authenticated")
# A session signed out (or replaced by a sign-in as someone else) whose cookie landed late.
# A session signed out (or replaced by a sign-in as someone else) whose cookie landed late. Not
# cleared: this request may have left before a sign-in as someone else answered, and a cookie
# deletion landing after that sign-in's cookie would sign the browser out of it. A revoked id is
# refused on every request and never renewed, so leaving its cookie costs nothing.
if db.get(RevokedSession, _session_id(request)) is not None:
request.session.clear()
raise refused(401, "not_authenticated")
_renew_session(request)
# Attribute this request's log lines to the account. Here, not in the request middleware: