feat: autorregistro con verificacion de correo + aprobacion, superadmin y SMTP
- POST /api/auth/register: primer usuario del sistema -> superadmin con sesion directa (bootstrap, sin correo ni aprobacion); los siguientes quedan pending_verification y reciben un correo con enlace de un solo uso (24h). - GET /api/auth/verify-email: pasa a pending_approval y notifica in-app a los admin/superadmin activos. - admin/superadmin aprueban (POST /api/users/:id/approve, eligen rol y departamento) o rechazan (POST /api/users/:id/reject, borra y audita el email) desde Organizacion -> Usuarios (nuevo badge de estado + acciones). - login() da mensaje especifico segun el status de la cuenta en vez del generico "credenciales invalidas". - Recuperacion de clave (forgot/reset-password): respuesta siempre generica, token de 1 hora de un solo uso. - Nuevo modulo settings: SMTP configurable SOLO por superadmin desde Configuracion -> Correo (SMTP); clave cifrada AES-256-GCM (ENCRYPTION_KEY) en la tabla system_settings, nunca expuesta por la API. sendMail() degrada a modo dev (loguea en vez de enviar) si no hay SMTP configurado, y nunca deja que un fallo de envio tumbe al que lo llama. - Migracion 002_registration_and_smtp.sql: rol superadmin, columnas de ciclo de vida en users (status, tokens), tabla system_settings, y promueve al usuario mas antiguo del sistema a superadmin. - Fix: React.StrictMode disparaba el efecto de VerifyEmailPage dos veces; la segunda llamada (token ya consumido) mostraba "enlace invalido" pese a que la verificacion ya habia funcionado. Se agrega una guarda por token. - Fix (deuda tecnica v1.0.0): se reordena el montaje de rutas en app.js — subtasksRoutes (mount generico en /api) va al final, para no interceptar con su requireAuth interno una request sin token dirigida a un router mas especifico registrado despues. - Documentacion actualizada: AGENTS.md, SPEC.md, API.md, BASE_DE_DATOS.md, CONFIGURACION.md, ESTADO.md, CHANGELOG.md. Version 1.1.0. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,46 @@ export const messages = {
|
||||
login_password: 'Clave',
|
||||
login_submit: 'Entrar',
|
||||
login_error: 'Credenciales invalidas',
|
||||
login_forgot_password: '¿Olvidaste tu contraseña?',
|
||||
login_create_account: 'Crear cuenta',
|
||||
logout: 'Cerrar sesion',
|
||||
|
||||
register_title: 'Crear cuenta',
|
||||
register_name: 'Nombre completo',
|
||||
register_password_confirm: 'Confirmar clave',
|
||||
register_password_mismatch: 'Las claves no coinciden',
|
||||
register_password_short: 'La clave debe tener al menos 8 caracteres',
|
||||
register_submit: 'Registrarme',
|
||||
register_success: 'Cuenta creada. Revisa tu correo para confirmarla; luego un administrador debe aprobarla antes de que puedas entrar.',
|
||||
register_back_to_login: 'Volver a iniciar sesion',
|
||||
verify_email_title: 'Verificar correo',
|
||||
verify_email_success: 'Correo confirmado. Tu cuenta esta pendiente de aprobacion por un administrador.',
|
||||
verify_email_missing_token: 'Enlace invalido: falta el token de verificacion.',
|
||||
forgot_password_title: 'Recuperar clave',
|
||||
forgot_password_submit: 'Enviar instrucciones',
|
||||
forgot_password_sent: 'Si el correo existe, te enviamos instrucciones para recuperar tu clave.',
|
||||
reset_password_title: 'Elegir nueva clave',
|
||||
reset_password_new: 'Clave nueva',
|
||||
reset_password_submit: 'Guardar clave',
|
||||
reset_password_success: 'Clave actualizada. Redirigiendo a iniciar sesion...',
|
||||
|
||||
user_status_pending_verification: 'Pendiente de verificar correo',
|
||||
user_status_pending_approval: 'Pendiente de aprobacion',
|
||||
user_status_active: 'Activo',
|
||||
user_approve: 'Aprobar',
|
||||
user_reject: 'Rechazar',
|
||||
user_approve_title: 'Aprobar usuario',
|
||||
user_reject_confirm_msg: '¿Seguro que deseas rechazar esta solicitud de registro? Se eliminara permanentemente.',
|
||||
|
||||
config_smtp: 'Correo (SMTP)',
|
||||
config_smtp_superadmin_only: 'Solo el superadministrador puede configurar el correo del sistema.',
|
||||
smtp_host: 'Servidor (host)',
|
||||
smtp_port: 'Puerto',
|
||||
smtp_user: 'Usuario',
|
||||
smtp_from: 'Remitente',
|
||||
smtp_pass: 'Clave',
|
||||
smtp_pass_configured_hint: 'Configurada — dejar en blanco para no cambiarla',
|
||||
smtp_not_configured: 'Sin configurar: los correos se registran en el log del servidor (modo dev), no se envian de verdad.',
|
||||
common_new: 'Nuevo',
|
||||
common_edit: 'Editar',
|
||||
common_save: 'Guardar',
|
||||
@@ -145,7 +184,46 @@ export const messages = {
|
||||
login_password: 'Password',
|
||||
login_submit: 'Sign in',
|
||||
login_error: 'Invalid credentials',
|
||||
login_forgot_password: 'Forgot your password?',
|
||||
login_create_account: 'Create account',
|
||||
logout: 'Sign out',
|
||||
|
||||
register_title: 'Create account',
|
||||
register_name: 'Full name',
|
||||
register_password_confirm: 'Confirm password',
|
||||
register_password_mismatch: 'Passwords do not match',
|
||||
register_password_short: 'Password must be at least 8 characters',
|
||||
register_submit: 'Sign up',
|
||||
register_success: 'Account created. Check your email to confirm it; an administrator must approve it before you can sign in.',
|
||||
register_back_to_login: 'Back to sign in',
|
||||
verify_email_title: 'Verify email',
|
||||
verify_email_success: 'Email confirmed. Your account is pending administrator approval.',
|
||||
verify_email_missing_token: 'Invalid link: missing verification token.',
|
||||
forgot_password_title: 'Recover password',
|
||||
forgot_password_submit: 'Send instructions',
|
||||
forgot_password_sent: 'If the email exists, we sent instructions to recover your password.',
|
||||
reset_password_title: 'Choose a new password',
|
||||
reset_password_new: 'New password',
|
||||
reset_password_submit: 'Save password',
|
||||
reset_password_success: 'Password updated. Redirecting to sign in...',
|
||||
|
||||
user_status_pending_verification: 'Pending email verification',
|
||||
user_status_pending_approval: 'Pending approval',
|
||||
user_status_active: 'Active',
|
||||
user_approve: 'Approve',
|
||||
user_reject: 'Reject',
|
||||
user_approve_title: 'Approve user',
|
||||
user_reject_confirm_msg: 'Are you sure you want to reject this registration request? It will be permanently deleted.',
|
||||
|
||||
config_smtp: 'Email (SMTP)',
|
||||
config_smtp_superadmin_only: 'Only the superadmin can configure the system email.',
|
||||
smtp_host: 'Host',
|
||||
smtp_port: 'Port',
|
||||
smtp_user: 'User',
|
||||
smtp_from: 'From',
|
||||
smtp_pass: 'Password',
|
||||
smtp_pass_configured_hint: 'Configured — leave blank to keep it unchanged',
|
||||
smtp_not_configured: 'Not configured: emails are logged on the server (dev mode), not actually sent.',
|
||||
common_new: 'New',
|
||||
common_edit: 'Edit',
|
||||
common_save: 'Save',
|
||||
|
||||
Reference in New Issue
Block a user