Token CSRF scade dopo 1 ora: la pagina di misura non salva più e dice «Errore di rete» #12

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

GRAVITÀ: alta
FILE: src/frontend/flask_app/config.py:23 (WTF_CSRF_TIME_LIMIT=3600) ; src/frontend/flask_app/templates/measure/task_execute.html:1206-1228, 1281-1284
COSA: la pagina di misura vive ore senza ricaricare. Dopo 1 ora ogni POST riceve 400 in HTML, response.json() lancia, l'operatore vede «Errore di rete. Riprovare.». Nessun handler per CSRFError.
INPUT: postazione ferma sullo stesso task oltre 60 minuti, poi lettura dal calibro: misura non salvata.
VERIFICATO: test client con TIME_LIMIT=1 s → 400 text/html ... The CSRF token has expired.

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/frontend/flask_app/config.py:23 (WTF_CSRF_TIME_LIMIT=3600) ; src/frontend/flask_app/templates/measure/task_execute.html:1206-1228, 1281-1284 COSA: la pagina di misura vive ore senza ricaricare. Dopo 1 ora ogni POST riceve 400 in HTML, `response.json()` lancia, l'operatore vede «Errore di rete. Riprovare.». Nessun handler per `CSRFError`. INPUT: postazione ferma sullo stesso task oltre 60 minuti, poi lettura dal calibro: misura non salvata. VERIFICATO: test client con TIME_LIMIT=1 s → `400 text/html ... The CSRF token has expired.` 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:41 +00:00
Adriano added the assegnata:jeeg label 2026-09-21 20:22:24 +00:00
Author
Owner

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

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

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

MODIFICHE lato server (B2): src/frontend/flask_app/config.py — WTF_CSRF_TIME_LIMIT = None (il token vale quanto la sessione). src/frontend/flask_app/app.py — @app.errorhandler(CSRFError): per richieste JSON/fetch (Accept o Content-Type application/json, o X-Requested-With) risponde 400 JSON {"error": true, "csrf_expired": true, "detail": ...}; per le altre, flash + redirect alla pagina corrente/login.
MODIFICHE lato pagina (B1): src/frontend/flask_app/templates/measure/task_execute.html — nei punti in cui si fa response.json() dopo una fetch (salvataggio misura ~1206-1228, postProduction ~1281): se la risposta non è JSON o porta csrf_expired/session_expired mostra «Sessione scaduta: ricaricare la pagina» (stringa i18n _()), NON «Errore di rete»; la lettura non salvata resta sul display.
TEST (B2): token CSRF scaduto/assente su POST JSON → 400 con csrf_expired.

ANALISI (passo 1) — ramo `lavoro/jeeg`, worktree `~/lavoro/TieMeasureFlow` su jeeg, lotto B1+B2 MODIFICHE lato server (B2): src/frontend/flask_app/config.py — `WTF_CSRF_TIME_LIMIT = None` (il token vale quanto la sessione). src/frontend/flask_app/app.py — `@app.errorhandler(CSRFError)`: per richieste JSON/fetch (Accept o Content-Type application/json, o X-Requested-With) risponde 400 JSON `{"error": true, "csrf_expired": true, "detail": ...}`; per le altre, flash + redirect alla pagina corrente/login. MODIFICHE lato pagina (B1): src/frontend/flask_app/templates/measure/task_execute.html — nei punti in cui si fa `response.json()` dopo una fetch (salvataggio misura ~1206-1228, postProduction ~1281): se la risposta non è JSON o porta `csrf_expired`/`session_expired` mostra «Sessione scaduta: ricaricare la pagina» (stringa i18n `_()`), NON «Errore di rete»; la lettura non salvata resta sul display. TEST (B2): token CSRF scaduto/assente su POST JSON → 400 con `csrf_expired`.
Author
Owner

Soluzione

ESITO: fatto
COSA: WTF_CSRF_TIME_LIMIT=None (token valido quanto la sessione); errorhandler(CSRFError) risponde 400 JSON csrf_expired alle fetch; task_execute.html mostra «Sessione scaduta: ricaricare la pagina» invece di «Errore di rete» e lascia la lettura sul display.
COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): 31fa78b; 925ed19
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: `WTF_CSRF_TIME_LIMIT=None` (token valido quanto la sessione); `errorhandler(CSRFError)` risponde 400 JSON `csrf_expired` alle fetch; task_execute.html mostra «Sessione scaduta: ricaricare la pagina» invece di «Errore di rete» e lascia la lettura sul display. COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): 31fa78b; 925ed19 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:15 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#12