From cf2962fd67375bfa67a08db9dd34173d1b2dd935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Thu, 23 Jul 2026 00:06:42 +0000 Subject: [PATCH] auth: distress-password lockdown + explicit token-revoke endpoint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a duress password (DISTRESS_PASSWORD env): entering it at login trips an in-memory full lockdown — all new logins (password + passkey) and every existing session are refused until the server is restarted, and the login itself returns a normal "invalid credentials" so it gives nothing away. Also add POST /api/auth/blacklist-token as a clearly-named alias for revoking the current JWT (same effect as signout). Co-Authored-By: Claude Opus 4.8 --- src/servers/_middlewares/user-middleware.ts | 4 ++++ src/servers/api/auth/auth.ts | 2 ++ src/servers/api/auth/distress.ts | 10 ++++++++++ src/servers/api/auth/passkey-router.ts | 2 ++ src/servers/api/auth/signin.ts | 11 +++++++++++ 5 files changed, 29 insertions(+) create mode 100644 src/servers/api/auth/distress.ts diff --git a/src/servers/_middlewares/user-middleware.ts b/src/servers/_middlewares/user-middleware.ts index fb05acc0..ff2bc0c9 100644 --- a/src/servers/_middlewares/user-middleware.ts +++ b/src/servers/_middlewares/user-middleware.ts @@ -2,6 +2,7 @@ import type { MiddlewareHandler } from 'hono'; import { verify } from '@@/jwt'; import * as errors from '@@/custom-errors'; import { isOriginAllowed } from './origin-validation'; +import { isLockdown } from '../api/auth/distress'; import { getUserById, isTokenBlacklisted } from 'officerdb'; // Role permissions: which HTTP methods each role can use @@ -21,6 +22,9 @@ function isMethodAllowed(role: string | null, method: string): boolean { } export const userMiddleware: MiddlewareHandler = async function (ctx, next) { + // Duress lockdown: reject every authenticated request, cutting off all existing sessions. + if (isLockdown()) throw errors.UNAUTHORIZED(); + const { authorization } = ctx.req.header(); // Support token in query param for media elements (