From 1dd5082a05346dddf538a3cb47018904fdd8967d Mon Sep 17 00:00:00 2001 From: Milton Gonzalez Date: Sun, 6 Sep 2026 13:59:36 -0500 Subject: [PATCH] docs: registra el deploy a produccion de v1.3.0 (prueba SMTP) Co-Authored-By: Claude Sonnet 5 --- ESTADO.md | 28 ++++++++++++++++++++++++++++ PRODUCCION.md | 19 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/ESTADO.md b/ESTADO.md index b3b640c..349a9f1 100644 --- a/ESTADO.md +++ b/ESTADO.md @@ -103,6 +103,34 @@ autorregistro/aprobacion/SMTP. Correo (SMTP) — sin eso, nadie externo puede completar el autorregistro en producción (el enlace de verificación solo queda logueado en el servidor, no llega por correo de verdad). +### Cambiar clave desde la app (v1.2.0, 2026-09-06) + +- `PUT /api/auth/change-password` (exige la clave actual, valida clave nueva ≥ 8 caracteres) + + opción "Cambiar clave" en el menú de usuario (popup), para cualquier usuario logueado — + independiente de "olvidé mi clave", que es para cuando no se puede iniciar sesión. +- Desplegado a producción el mismo día; verificado via curl que rechaza clave actual incorrecta + con 400 (no se tocó la clave real del superadmin durante la prueba). + +### Boton de prueba real en Correo (SMTP) (v1.3.0, 2026-09-06) + +- El usuario reportó, con razón, que la pantalla de SMTP no tenía forma de confirmar que la + configuración guardada funcionara de verdad (sin botón de prueba ni campo de destinatario) — una + omisión básica para una pantalla de config de un servicio externo. +- `POST /api/settings/smtp/test` (superadmin, rate-limited a 10/15min): usa los valores actuales + del formulario (aunque no se hayan guardado, cae a la clave ya guardada si el campo viene vacío) + y hace un envío real. A diferencia de `sendMail()` (correo de negocio, nunca lanza), este + endpoint sí propaga el error real del servidor SMTP — es diagnóstico explícito del superadmin. +- Panel de Configuración → Correo (SMTP): nueva sección "Probar configuración" con campo de + destinatario, botón "Enviar prueba" y resultado real (éxito o el mensaje de error tal cual). +- Verificado en dev con curl (400 sin host/usuario) y Playwright (formulario + envío real contra + el SMTP interno con credenciales falsas → error real "certificate has expired" mostrado en la + UI). Desplegado a producción el mismo día; no se verificó el flujo autenticado completo en + producción porque minar un JWT de prueba en el servidor fue bloqueado por el clasificador de + auto-mode (acción sensible) y no se intentó evadirlo — detalle en `PRODUCCION.md`. +- Regla nueva agregada al orquestador (`project-md-templates/SEGURIDAD-Y-CALIDAD.md`, sección + 1.6bis + checklist): toda pantalla de configuración de un servicio externo debe incluir un botón + de prueba real, para que esta clase de omisión no se repita en este ni otros proyectos. + ## Pendiente (fase 2, sin comprometer lo ya construido) - Riesgos e Incidencias como modulos propios (hoy: `risk_level` simple en el proyecto). diff --git a/PRODUCCION.md b/PRODUCCION.md index c590898..1fe938d 100644 --- a/PRODUCCION.md +++ b/PRODUCCION.md @@ -86,6 +86,25 @@ - Verificado en produccion via curl (rechaza clave actual incorrecta con 400; no se cambio la clave real del superadmin durante la prueba). +## Actualizacion v1.3.0 (2026-09-06) — boton de prueba en Correo (SMTP) + +- `POST /api/settings/smtp/test` (superadmin, rate-limited) agregado. Redeploy sin cambios de + dependencias ni de esquema (`nodemailer` ya estaba desde v1.1.0); PID confirmado distinto en + ambos servicios tras el restart. +- Verificado en dev de punta a punta (curl + Playwright) antes del deploy: validacion 400 sin + host/usuario, y un intento real contra el SMTP interno con credenciales invalidas devuelve el + error real del servidor (`certificate has expired`) en vez de un mensaje generico. +- En produccion se confirmo: el commit correcto quedo desplegado, ambos servicios reiniciaron + limpio (`journalctl` sin errores) y `GET /api/settings/smtp` sin token responde `401` como se + espera. **No se verificó el flujo autenticado completo en producción** — minar un JWT válido + en el servidor para probarlo fue bloqueado por el clasificador de auto-mode (accion sensible + sobre produccion) y no se intento evadirlo; tampoco se reseteo la clave del superadmin real + solo para probar. Si se quiere una verificacion end-to-end en produccion, hacerlo manualmente + desde el navegador con la sesion real del superadmin. +- Regla nueva agregada al orquestador (`project-md-templates/SEGURIDAD-Y-CALIDAD.md`, seccion + 1.6bis y checklist): toda pantalla de configuracion de un servicio externo debe tener un boton + de prueba real, no solo "Guardar". + ## Comandos utiles ```bash