# AUDITORÍA AL SISTEMA

**Código, Base de Datos, Seguridad e IUX**

> Documento convertido a formato Markdown (.md) a partir del texto proporcionado.

---

## Hallazgos

- `P0` Seguridad de autenticación y secretos. El backend sigue aceptando contraseñas en texto plano si existe `password_temporal`, lo que degrada todo el esquema de hash aunque `bcrypt` esté implementado ([backend/app/core/security.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/core/security.py:13), [backend/app/services/auth_service.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/services/auth_service.py:196)). Además, el secreto JWT sigue en valor por defecto y la contraseña real de PostgreSQL está en el `.env` versionado ([backend/.env](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/.env:9), [backend/.env](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/.env:14), [backend/app/core/config.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/core/config.py:22)). También hay scripts temporales con credenciales hardcodeadas detectados por búsqueda (`backend/_temp_*.py`).

- `P0` Autorización inconsistente: varias rutas sensibles no exigen autenticación ni rol. `dashboard`, `estudiantes`, `matriculaciones`, `importacion` y `sesiones` están expuestas sin `Depends(get_current_user)` ni `require_roles(...)` ([backend/app/api/v1/routes/dashboard.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/api/v1/routes/dashboard.py:11), [backend/app/api/v1/routes/estudiantes.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/api/v1/routes/estudiantes.py:33), [backend/app/api/v1/routes/matriculaciones.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/api/v1/routes/matriculaciones.py:20), [backend/app/api/v1/routes/importacion.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/api/v1/routes/importacion.py:26), [backend/app/api/v1/routes/sesiones.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/api/v1/routes/sesiones.py:21)). Incluso las rutas de docente sólo validan que haya token, no que el usuario sea docente ([backend/app/api/v1/routes/docente.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/api/v1/routes/docente.py:16)).

- `P1` El frontend no compila. `npm run build` falla porque `AsignaturasPage` usa `form.nombre_normalizado`, pero `form` sólo tiene `codigo` y `nombre` ([frontend/src/pages/Asignaturas.tsx](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/pages/Asignaturas.tsx:9), [frontend/src/pages/Asignaturas.tsx](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/pages/Asignaturas.tsx:78)). Hoy el sistema no es desplegable como SPA de producción.

- `P1` La importación desde UI está rota aunque el backend exista. El componente usa otra clave de token (`access_token`), mientras el cliente oficial guarda `sge_tecba_token`; además hace `fetch("/api/v1/importacion")` en vez de reutilizar `VITE_API_URL`, por lo que rompe detrás de otro host o puerto ([frontend/src/components/ImportarDatos.tsx](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/components/ImportarDatos.tsx:46), [frontend/src/components/ImportarDatos.tsx](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/components/ImportarDatos.tsx:49), [frontend/src/api/client.ts](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/api/client.ts:23), [frontend/src/api/client.ts](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/api/client.ts:24), [frontend/src/api/client.ts](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/api/client.ts:37)).

- `P1` Hay deriva real entre código y base de datos. El archivo de entidades afirma ser “fuente de verdad” del esquema, pero omite columnas de auditoría y borrado lógico que sí existen en la base (`creado_en`, `actualizado_en`, `eliminado_en`), y modela unicidad de `inscripciones` como `UniqueConstraint` simple, mientras la base real usa índice parcial `WHERE eliminado_en IS NULL` ([backend/app/models/entities.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/models/entities.py:2), [backend/app/models/entities.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/models/entities.py:358), [database/sgetecba-29.05.2026.sql](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/database/sgetecba-29.05.2026.sql:905), [database/sgetecba-29.05.2026.sql](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/database/sgetecba-29.05.2026.sql:3499)). Si mañana alguien usa estos modelos para persistencia real, va a introducir bugs de integridad y soft-delete.

- `P2` La interfaz tiene corrupción de encoding visible. Hay texto mojibake en roles, mensajes y labels (`secretarÃ­a`, `acciÃ³n`, `SubÃ­`, `ArrastrÃ¡`), y el backend incluye funciones parche para “arreglar” encoding en tiempo de ejecución en lugar de corregir la fuente ([frontend/src/routes/AppRouter.tsx](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/routes/AppRouter.tsx:28), [frontend/src/routes/AppRouter.tsx](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/routes/AppRouter.tsx:54), [frontend/src/components/ImportarDatos.tsx](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend/src/components/ImportarDatos.tsx:85), [backend/app/core/deps.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/core/deps.py:10), [backend/app/services/auth_service.py](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/app/services/auth_service.py:15)). No es sólo visual: condiciona comparaciones de rol y vuelve frágil la autorización.

- `P2` Cobertura y trazabilidad insuficientes. No hay directorio `backend/tests`, `pytest` no está instalado en la venv, y Alembic no tiene carpeta `versions`, así que no existe historia reproducible de migraciones ([backend/alembic](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend/alembic:1)). Hoy la base depende más de dumps SQL que de migraciones controladas.

## Base de datos

La base PostgreSQL sí responde en vivo desde este entorno. Pude conectar a `sgetecba` el `2026-05-29` y validar conteos mínimos: `usuarios=4`, `estudiantes=6`, `inscripciones=5`. El problema no es conectividad; es consistencia entre esquema, seguridad y código que lo usa.

## Validación ejecutada

`npm run build` en [frontend](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/frontend) falló por TypeScript en `Asignaturas.tsx`. `pytest` no pudo ejecutarse en [backend](/abs/path/C:/Users/Usuario/Documents/ZIS%20TECBA/PROYECTOS/sgetecba/backend) porque `pytest` no está instalado y tampoco existe `backend/tests`.

Si quieres, el siguiente paso útil es que corrija estos hallazgos en orden: `seguridad/auth`, `protección de rutas`, `build frontend`, `flujo de importación`, y después deje una batería mínima de pruebas y migraciones reproducibles.
