From dfaa8fa49907ed21cbbcd6e196a4edae8c03b3f3 Mon Sep 17 00:00:00 2001 From: Alexeer Date: Fri, 23 May 2025 13:27:22 -0600 Subject: [PATCH] =?UTF-8?q?Autenticaci=C3=B3n=20de=202=20factores?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/configuracion.php | 5 - app/controllers/importadores.php | 2 +- app/controllers/login.php | 113 ++++++++++- app/controllers/seguridad.php | 9 + emails_tables.txt | 9 + views/login/confirmacion.php | 177 ++++++++++++++++++ views/partials/sidebar_configuracion.php | 57 ++++-- .../dashboard_seguridad.php} | 37 +++- 8 files changed, 389 insertions(+), 20 deletions(-) create mode 100644 app/controllers/seguridad.php create mode 100644 emails_tables.txt create mode 100644 views/login/confirmacion.php rename views/{configuracion/seguridad.php => seguridad/dashboard_seguridad.php} (59%) diff --git a/app/controllers/configuracion.php b/app/controllers/configuracion.php index fd494e2..cc8e231 100644 --- a/app/controllers/configuracion.php +++ b/app/controllers/configuracion.php @@ -102,9 +102,4 @@ function automatizaciones() function preferencias() { include __DIR__ . '/../../views/configuracion/preferencias.php'; -} - -function seguridad() -{ - include __DIR__ . '/../../views/configuracion/seguridad.php'; } \ No newline at end of file diff --git a/app/controllers/importadores.php b/app/controllers/importadores.php index 3cf2f6c..b0d660c 100644 --- a/app/controllers/importadores.php +++ b/app/controllers/importadores.php @@ -13,4 +13,4 @@ function dashboard() $nombreImportador = $_SESSION['usuario_nombre']; include __DIR__ . '/../../views/importadores/dashboard_importador.php'; -} +} \ No newline at end of file diff --git a/app/controllers/login.php b/app/controllers/login.php index 224c024..adf7342 100644 --- a/app/controllers/login.php +++ b/app/controllers/login.php @@ -87,13 +87,27 @@ function validar() sqlsrv_query($conn, $sqlUpdate, $paramsUpdate); } + $codigo = rand(100000, 999999); + $expiracion = date('Y-m-d H:i:s', strtotime('+1 minutes')); + $usuarioId = $row['id_usuario']; + + $sql = "INSERT INTO verificaciones (id_usuario, codigo, expiracion) VALUES (?, ?, ?)"; + $params = [$usuarioId, $codigo, $expiracion]; + $stmt = sqlsrv_query($conn, $sql, $params); + + enviarConfirmacion($email, $codigo); + + if (!$stmt) { + die('Error al generar código de verificación.'); + } + // Redirección por rol if ($row['tipo_usuario'] === 'importador') { - header('Location: /IMPORTADORES/importadores/dashboard'); + header('Location: /IMPORTADORES/login/confirmar'); } elseif ($row['tipo_usuario'] === 'agente_aduanal') { header('Location: /IMPORTADORES/AGENTES/dashboard'); } else { - header('Location: /IMPORTADORES/importadores/dashboard'); + header('Location: /IMPORTADORES/login/confirmar'); } exit; } else { @@ -108,6 +122,101 @@ function validar() header('Location: /IMPORTADORES/login'); } +function enviarConfirmacion($email, $codigo) +{ + $mail = new PHPMailer(true); + + try { + $mail->isSMTP(); + $mail->Host = 'secure.emailsrvr.com'; + $mail->SMTPAuth = true; + $mail->Username = 'noreply@aduanasoft.com.mx'; + $mail->Password = $_ENV['SMTP_PASS']; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + $mail->Port = 587; + + $mail->setFrom('noreply@aduanasoft.com.mx', 'SIIH | AduanaSoft'); + $mail->addAddress($email); + $mail->CharSet = 'UTF-8'; + $mail->isHTML(true); + $mail->Subject = 'Código de verificación'; + + $mail->Body = " +
+
+
+

¿Solicitaste acceso a la plataforma?

+
+
+

Se ha intentado iniciar sesión con tu cuenta.

+
+

Tu código de verificación es:

+

$codigo

+
+

Este código expirará en 10 minutos.

+
+
+ © " . date('Y') . " SIIH · Desarrollado por AduanaSoft +
+
+
"; + + $mail->send(); + } catch (Exception $e) { + error_log("Error al enviar confirmación: {$mail->ErrorInfo}"); + } +} + +function confirmarAcceso() +{ + $conn = getConnection(); // Asegúrate que esta función retorne una conexión válida + + $codigoIngresado = trim($_POST['codigo'] ?? ''); + $usuarioId = $_SESSION['usuario_id'] ?? null; + $email = $_SESSION['usuario_email'] ?? ''; // Asegúrate de tenerlo en sesión + $ip = $_SERVER['REMOTE_ADDR']; + + if (!$usuarioId || !$codigoIngresado) { + registrarBitacora($conn, $usuarioId, $email, $ip, 0, 'Código no ingresado o datos incompletos'); + $_SESSION['codigo_error'] = '❌ Datos incompletos.'; + header('Location: /IMPORTADORES/login/confirmar'); + exit; + } + + $sql = "SELECT codigo, expiracion FROM verificaciones + WHERE id_usuario = ? AND codigo = ? + ORDER BY id DESC"; + $stmt = sqlsrv_query($conn, $sql, [$usuarioId, $codigoIngresado]); + + if (!$stmt || !($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))) { + registrarBitacora($conn, $usuarioId, $email, $ip, 0, 'Código incorrecto'); + $_SESSION['codigo_error'] = '❌ Código incorrecto.'; + header('Location: /IMPORTADORES/login/confirmar'); + exit; + } + + // Validar expiración + $expiracion = $row['expiracion']; + if ($expiracion instanceof DateTime && $expiracion->getTimestamp() < time()) { + registrarBitacora($conn, $usuarioId, $email, $ip, 0, 'Código vencido'); + $_SESSION['codigo_error'] = '❌ El código ha expirado.'; + header('Location: /IMPORTADORES/login/index'); + exit; + } + + // Código válido + registrarBitacora($conn, $usuarioId, $email, $ip, 1, 'Login exitoso'); + $_SESSION['pendiente_confirmacion'] = false; + $_SESSION['codigo_exito'] = '✅ Código verificado correctamente.'; + header('Location: /IMPORTADORES/importadores/dashboard'); + exit; +} + +function confirmar() +{ + include __DIR__ . '/../../views/login/confirmacion.php'; +} + function recuperar() { include __DIR__ . '/../../views/login/recuperar.php'; diff --git a/app/controllers/seguridad.php b/app/controllers/seguridad.php new file mode 100644 index 0000000..6bf4433 --- /dev/null +++ b/app/controllers/seguridad.php @@ -0,0 +1,9 @@ + + + + + + + <?= htmlspecialchars($siglas) ?> | Recuperación de Contraseña + + + + + + + + + + + + + + +
+ +
+ + + +
+ + +
+

Confirma el Acceso

+ + +
+
+ + +
+ +
+ +
+ +
+ + +
+ + +
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/views/partials/sidebar_configuracion.php b/views/partials/sidebar_configuracion.php index c210d1e..a38f504 100644 --- a/views/partials/sidebar_configuracion.php +++ b/views/partials/sidebar_configuracion.php @@ -74,17 +74,19 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador - + 🦺 Seguridad - @@ -108,6 +110,13 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador 📖 Bitácoras 1 + + + + 📖 Bitácoras + 1 + @@ -135,16 +144,42 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador - + 🦺 Seguridad - - 📖 Bitácoras - + + + + 📖 Bitácoras + 1 + + + + + + 📖 Bitácoras + 1 + + + + + 📖 Bitácoras + 1 + + \ No newline at end of file diff --git a/views/configuracion/seguridad.php b/views/seguridad/dashboard_seguridad.php similarity index 59% rename from views/configuracion/seguridad.php rename to views/seguridad/dashboard_seguridad.php index c41a05c..5da87e0 100644 --- a/views/configuracion/seguridad.php +++ b/views/seguridad/dashboard_seguridad.php @@ -78,9 +78,44 @@ include __DIR__ . '/../partials/sidebar_configuracion.php'; -
+

🦺 Seguridad

+
+ +
+
+

Recibe Notificaciones

+

Agrega un correo adicional para recibir notificaciones.

+
+
+ + +
+
+ +
+
+
+
+ +
+
+

Correo de Respaldo

+

Agrega un correo de respaldo para reuperación de tu cuenta.

+
+
+ + +
+
+ +
+
+
+
+
+
\ No newline at end of file