Password del capoturno forzabile: /authorise /pause /resume /close fuori dal limite di login #8

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

GRAVITÀ: alta
FILE: src/backend/api/routers/measurements.py:99 ; src/backend/api/routers/production.py:118,134,150 ; src/backend/api/middleware/rate_limit.py:25,101
COSA: il limite di login vale solo per il path esatto /api/auth/login (==). Le credenziali del supervisore passano da altri quattro endpoint, senza blocco account né log dedicato. Qualunque utente autenticato può provarle al ritmo del limite generale (e senza limite, con l'issue sul rate limit).
INPUT: ciclo di POST /api/production-runs/{id}/pause con password diverse.
VERIFICATO: script pytest → 40 tentativi consecutivi su /authorise, nessun 429.

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/measurements.py:99 ; src/backend/api/routers/production.py:118,134,150 ; src/backend/api/middleware/rate_limit.py:25,101 COSA: il limite di login vale solo per il path esatto `/api/auth/login` (`==`). Le credenziali del supervisore passano da altri quattro endpoint, senza blocco account né log dedicato. Qualunque utente autenticato può provarle al ritmo del limite generale (e senza limite, con l'issue sul rate limit). INPUT: ciclo di `POST /api/production-runs/{id}/pause` con password diverse. VERIFICATO: script pytest → 40 tentativi consecutivi su /authorise, nessun 429. 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:15 +00:00
Author
Owner

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

⚡ jeeg — **preso in carico** 2026-09-21T20:22:16Z 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/middleware/rate_limit.py — il secchio «login» vale per /api/auth/login E per i path che portano credenziali del supervisore: /api/measurements/*/authorise (verifica il path reale in src/backend/api/routers/measurements.py:99) e /api/production-runs/{id}/pause|resume|close. Usa un match per suffisso/regex, non ==. In più, in src/backend/services/auth_service.py (funzione che verifica le credenziali del supervisore, ~riga 43): logga a WARNING ogni credenziale di supervisore sbagliata con username e path.
TEST: 6 POST /pause con password sbagliata dallo stesso IP → il sesto 429.
NON TOCCARE: routers/production.py e routers/measurements.py (lotto A1/A3).

ANALISI (passo 1) — ramo `lavoro/jeeg`, worktree `~/lavoro/TieMeasureFlow` su jeeg, lotto A2 MODIFICHE: src/backend/api/middleware/rate_limit.py — il secchio «login» vale per `/api/auth/login` E per i path che portano credenziali del supervisore: `/api/measurements/*/authorise` (verifica il path reale in src/backend/api/routers/measurements.py:99) e `/api/production-runs/{id}/pause|resume|close`. Usa un match per suffisso/regex, non `==`. In più, in src/backend/services/auth_service.py (funzione che verifica le credenziali del supervisore, ~riga 43): logga a WARNING ogni credenziale di supervisore sbagliata con username e path. TEST: 6 POST /pause con password sbagliata dallo stesso IP → il sesto 429. NON TOCCARE: routers/production.py e routers/measurements.py (lotto A1/A3).
Author
Owner

Soluzione

ESITO: fatto
COSA: Il secchio «login» del rate limit copre anche /api/measurements/{id}/authorise, /api/production-runs/{id}/pause|resume|close e /api/setup/* (regex, non ==). Credenziali di supervisore sbagliate loggate a WARNING. Test: sesto POST /pause → 429.
COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): e91ef73
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: Il secchio «login» del rate limit copre anche `/api/measurements/{id}/authorise`, `/api/production-runs/{id}/pause|resume|close` e `/api/setup/*` (regex, non `==`). Credenziali di supervisore sbagliate loggate a WARNING. Test: sesto POST /pause → 429. COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): e91ef73 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:10 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#8