Setup riusabile dopo il primo setup: reset-db, manage-user e seed senza API key #9

Closed
opened 2026-09-21 20:14:39 +00:00 by Adriano · 3 comments
Owner

GRAVITÀ: alta
FILE: src/backend/api/routers/setup.py:81-94, :144 (reset-db), :273 (seed)
COSA: finché SETUP_PASSWORD è in .env restano attivi reset-db (drop_all), manage-user (crea admin), change-user-password, seed (utenti con password note). Nessun controllo "setup già completato". Confronto password con !=, non a tempo costante. /api/setup/status elenca le tabelle senza password.
INPUT: POST /api/setup/reset-db {"password":...,"confirm":true} su installazione in produzione.
VERIFICATO: lettura di setup.py:81-94: l'unica guardia è settings.setup_password non vuota.

ORIGINE: revisione fable del 21/09/2026 su ramo V3.0.0, commit 8cc5e82. Documento completo: _output/2026-09-21-TieMeasureFlow-revisione.md su Wasabi.

GRAVITÀ: alta FILE: src/backend/api/routers/setup.py:81-94, :144 (reset-db), :273 (seed) COSA: finché `SETUP_PASSWORD` è in `.env` restano attivi `reset-db` (drop_all), `manage-user` (crea admin), `change-user-password`, `seed` (utenti con password note). Nessun controllo "setup già completato". Confronto password con `!=`, non a tempo costante. `/api/setup/status` elenca le tabelle senza password. INPUT: `POST /api/setup/reset-db {"password":...,"confirm":true}` su installazione in produzione. VERIFICATO: lettura di setup.py:81-94: l'unica guardia è `settings.setup_password` non vuota. ORIGINE: revisione fable del 21/09/2026 su ramo `V3.0.0`, commit 8cc5e82. Documento completo: `_output/2026-09-21-TieMeasureFlow-revisione.md` su Wasabi.
Adriano added the bug label 2026-09-21 20:14:39 +00:00
Adriano added the assegnata:jeeg label 2026-09-21 20:22:18 +00:00
Author
Owner

⚡ jeeg — preso in carico 2026-09-21T20:22:18Z
ramo: lavoro/jeeg · capacità: docker, gpu, systemd

⚡ jeeg — **preso in carico** 2026-09-21T20:22:18Z ramo: `lavoro/jeeg` · capacità: docker, gpu, systemd
Author
Owner

ANALISI (passo 1) — ramo lavoro/jeeg, worktree ~/lavoro/TieMeasureFlow su jeeg, lotto A2

MODIFICHE: src/backend/api/routers/setup.py — (a) _check_password con hmac.compare_digest; (b) nuova guardia _require_not_initialised(db): se esiste almeno un utente admin, gli endpoint distruttivi o privilegiati (reset-db, seed, manage-user, change-user-password, init-db) rispondono 403 «setup already completed» a meno che settings.setup_allow_after_init (nuovo, env SETUP_ALLOW_AFTER_INIT, default False) sia True; (c) /api/setup/status senza password restituisce solo {initialised: bool}, l'elenco tabelle solo con password valida; (d) i path /api/setup/ con password entrano nel secchio «login» del rate limit (coordina con l'analisi di #8, stesso file rate_limit.py, stesso lotto).
TEST: con un admin presente reset-db/seed/manage-user → 403; con SETUP_ALLOW_AFTER_INIT=true → come prima; status senza password non elenca tabelle. Adegua i test esistenti del setup.
NON TOCCARE: src/backend/templates/setup/setup.html salvo ciò che serve a mostrare il 403.

ANALISI (passo 1) — ramo `lavoro/jeeg`, worktree `~/lavoro/TieMeasureFlow` su jeeg, lotto A2 MODIFICHE: src/backend/api/routers/setup.py — (a) `_check_password` con `hmac.compare_digest`; (b) nuova guardia `_require_not_initialised(db)`: se esiste almeno un utente admin, gli endpoint distruttivi o privilegiati (`reset-db`, `seed`, `manage-user`, `change-user-password`, `init-db`) rispondono 403 «setup already completed» a meno che `settings.setup_allow_after_init` (nuovo, env SETUP_ALLOW_AFTER_INIT, default False) sia True; (c) `/api/setup/status` senza password restituisce solo `{initialised: bool}`, l'elenco tabelle solo con password valida; (d) i path `/api/setup/` con password entrano nel secchio «login» del rate limit (coordina con l'analisi di #8, stesso file rate_limit.py, stesso lotto). TEST: con un admin presente reset-db/seed/manage-user → 403; con SETUP_ALLOW_AFTER_INIT=true → come prima; status senza password non elenca tabelle. Adegua i test esistenti del setup. NON TOCCARE: src/backend/templates/setup/setup.html salvo ciò che serve a mostrare il 403.
Author
Owner

Soluzione

ESITO: fatto
COSA: Con un admin presente reset-db, seed, manage-user, change-user-password, init-db rispondono 403 salvo SETUP_ALLOW_AFTER_INIT=true. Password confrontata con hmac.compare_digest. /api/setup/status senza password dà solo initialised.
COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): 4384c48; 78970c6
PROVA: uv run --extra server --extra client --extra dev pytest -q → 622 passed, 4 skipped (erano 391); visione su Python 3.13 → 16 passed (erano 8).

**Soluzione** ESITO: fatto COSA: Con un admin presente `reset-db`, `seed`, `manage-user`, `change-user-password`, `init-db` rispondono 403 salvo `SETUP_ALLOW_AFTER_INIT=true`. Password confrontata con `hmac.compare_digest`. `/api/setup/status` senza password dà solo `initialised`. COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): 4384c48; 78970c6 PROVA: `uv run --extra server --extra client --extra dev pytest -q` → 622 passed, 4 skipped (erano 391); visione su Python 3.13 → 16 passed (erano 8).
Adriano removed the assegnata:jeeg label 2026-09-21 21:56:11 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#9