Spaces:
Sleeping
Sleeping
Commit History
-
Sesiones revocables: logout real y cierre en todos los dispositivos
Jose Salazar +1: Claude Opus 5ARCHITECTURE_REVIEW §2.3. Las sesiones son cookies firmadas sin estado y el logout se limitaba a borrar la cookie del navegador: el token seguía siendo VÁLIDO allá donde se hubiera copiado, hasta `session_max_age_s` (8h). No había forma de invalidar una sesión filtrada ni de echar a nadie tras un incidente, salvo rotar MORPHOS_SESSION_SECRET, que tira a todos los usuarios a la vez. Dos mecanismos, porque resuelven cosas distintas (migración 4): - `sesiones_revocadas`: una sesión concreta, por `jti`. Se recuerda sólo hasta que su firma caduca por sí sola; a partir de ahí la fila sobra y se poda. - `usuarios.sesiones_validas_desde`: TODAS las de una cuenta a la vez, con el nuevo POST /api/auth/logout-todas. Un sello temporal en vez de un contador de versión porque la pregunta es «¿se emitió antes del corte?». `jti` y `emitida_en` los añade `firmar_sesion`, no quien llama: si se generaran fuera, una ruta podría emitir por descuido una sesión irrevocable. TIMESTAMPS EN PYTHON, NO …2f5c422
-
No tragar errores de programación al leer la sesión
Jose Salazar +1: Claude Opus 5leer_sesion capturaba (BadSignature, Exception). El `Exception` hacía redundante el `BadSignature` y, sobre todo, convertía cualquier error interno en «no hay sesión»: un bug en la capa de sesión salía como un 401 silencioso en vez de propagarse, que es justo lo que no se quiere en el camino de autenticación. Se captura BadData, el padre común de: - BadSignature firma inválida o falsificada - SignatureExpired sesión caducada (subclase de BadSignature) - BadPayload token corrupto Las tres son «cookie no válida» → sin sesión. Un TypeError o un fallo de configuración ahora se propagan. Nota: (BadSignature, SignatureExpired) —la corrección que se propuso primero— habría repetido el mismo error en pequeño, porque SignatureExpired ya es subclase de BadSignature. Se añaden tests de sesión (no había ninguno), incluido el caso negativo que motiva el cambio: un error interno debe propagarse, no devolver None. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>5af9605 -
Añadir el stack nuevo: Vite/TypeScript + FastAPI
Jose Salazar +1: Claude Opus 5frontend/ Motor de patrones portado a TS (analisis.ts) con 27 tests dorados que fijan el comportamiento validado por veterinarios, más el resto de módulos (ui, pdf-parser, auth, papers, lab-import, ia). backend/ Servicio FastAPI: salida estructurada con Pydantic, clientes medGemma/Claude, recuperación RAG y toda la seguridad (sesión, CSRF, rate limit, CORS cerrado, BD fuera del webroot). bridge/ Puente local ASTM/HL7 para analizadores de laboratorio. evals/ Arnés de evaluación clínica + puerta de CI. index.html pasa a cargar el bundle TS en lugar de js/main.js. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>70e641d