From 1020e39da92ef2c90d1f17945e346ec42c98f326 Mon Sep 17 00:00:00 2001 From: Alexeer Date: Tue, 13 May 2025 13:14:20 -0600 Subject: [PATCH] Reset Password --- app/controllers/login.php | 231 ++++++++++++++++++++++++++++++- script_table.txt | 6 + views/login/cambiar_password.php | 149 ++++++++++++++++++++ views/login/index.php | 56 ++++---- views/login/recuperar.php | 141 +++++++++++++++++++ views/login/verificar_codigo.php | 144 +++++++++++++++++++ 6 files changed, 699 insertions(+), 28 deletions(-) create mode 100644 script_table.txt create mode 100644 views/login/cambiar_password.php create mode 100644 views/login/recuperar.php create mode 100644 views/login/verificar_codigo.php diff --git a/app/controllers/login.php b/app/controllers/login.php index 98bff53..7c1e57e 100644 --- a/app/controllers/login.php +++ b/app/controllers/login.php @@ -4,6 +4,11 @@ require_once __DIR__ . '/../../config/database.php'; require_once __DIR__ . '/../helpers/crypto.php'; require_once __DIR__ . '/../helpers/bitacoras.php'; require_once __DIR__ . '/../helpers/env.php'; + +require_once __DIR__ . '/../../vendor/autoload.php'; +use PHPMailer\PHPMailer\PHPMailer; +use PHPMailer\PHPMailer\Exception; + loadEnv(); function index() @@ -11,10 +16,8 @@ function index() include __DIR__ . '/../../views/login/index.php'; } - function validar() { - $conn = getConnection(); $email = trim($_POST['email'] ?? ''); @@ -72,5 +75,229 @@ function validar() header('Location: /IMPORTADORES/login'); } +function recuperar() +{ + include __DIR__ . '/../../views/login/recuperar.php'; +} +function enviarCodigo() +{ + $conn = getConnection(); + // Obtener el correo proporcionado en el formulario + $email = trim($_POST['email'] ?? ''); + + // Verificar si el correo es válido + if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + die("❌ Correo inválido."); + } + + // Encriptar el correo ingresado para comparar con el de la base de datos + $emailEncrypted = encrypt($email); + + // Consultar si el correo encriptado existe en la base de datos + $sql = "SELECT id_usuario FROM usuarios_sistema WHERE email = ?"; + $stmt = sqlsrv_query($conn, $sql, [$emailEncrypted]); + + if (!$stmt || !($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))) { + die("❌ Correo no encontrado."); + } + + // Generar el código de recuperación y la expiración + $codigo = rand(100000, 999999); + $expira = date('Y-m-d H:i:s', strtotime('+10 minutes')); + + // Guardar el código y la expiración en la tabla de recuperación de contraseñas + $insert = "INSERT INTO recuperacion_password (email, codigo, expiracion) VALUES (?, ?, ?)"; + $result = sqlsrv_query($conn, $insert, [$emailEncrypted, $codigo, $expira]); + + if (!$result) { + die("❌ Error al guardar el código de recuperación."); + } + + // Enviar correo con el código utilizando PHPMailer + try { + $mail = new PHPMailer(true); + + // Configuración de servidor SMTP + $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; + + // Configuración del correo + $mail->setFrom('noreply@aduanasoft.com.mx', 'SIIH | AduanaSoft'); + $mail->addAddress($email); + $mail->CharSet = 'UTF-8'; + $mail->isHTML(true); + $mail->Subject = 'Código de recuperación de contraseña'; + + // Cuerpo del correo + $mail->Body = " +
+
+
+

Recupera tu contraseña

+
+
+

Hola,

+

Has solicitado recuperar tu contraseña. Aquí está tu código de recuperación:

+

$codigo

+

Este código expira en 10 minutos.

+

Si no solicitaste este código, por favor ignora este correo.

+
+
+ © " . date('Y') . " SIIH · Desarrollado por AduanaSoft +
+
+
"; + + // Enviar el correo + $mail->send(); + } catch (Exception $e) { + error_log("Error al enviar correo: {$mail->ErrorInfo}"); + die("❌ Hubo un error al enviar el correo. Intenta más tarde."); + } + + $_SESSION['email_recuperacion'] = $email; + header('Location: /IMPORTADORES/login/verificarCodigoVista'); + exit; +} + +function verificarCodigoVista() +{ + include __DIR__ . '/../../views/login/verificar_codigo.php'; +} + +function verificarCodigo() +{ + $conn = getConnection(); + $codigo = $_POST['codigo'] ?? ''; + $email = $_SESSION['email_recuperacion'] ?? ''; + + if (!$codigo || !$email) { + die("❌ Código o correo faltante."); + } + + // Encriptar el correo ingresado + $emailEncrypted = encrypt($email); + + // Consultar el código de recuperación y su expiración desde la base de datos + $sql = "SELECT codigo, expiracion FROM recuperacion_password WHERE email = ? ORDER BY id DESC"; + $stmt = sqlsrv_query($conn, $sql, [$emailEncrypted]); + + $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); + + if (!$row || $codigo != $row['codigo']) { + die("❌ Código incorrecto."); + } + + if (strtotime($row['expiracion']->format('Y-m-d H:i:s')) < time()) { + die("⏰ El código ha expirado."); + } + + $_SESSION['recuperacion_autorizada'] = true; + header('Location: /IMPORTADORES/login/cambiarPasswordVista'); + exit; +} + +function cambiarPasswordVista() +{ + if (session_status() === PHP_SESSION_NONE) { + session_start(); + } + if (!isset($_SESSION['recuperacion_autorizada'])) { + header('Location: /IMPORTADORES/login'); + exit; + } + include __DIR__ . '/../../views/login/cambiar_password.php'; +} + +function cambiarPassword() +{ + if (!isset($_SESSION['recuperacion_autorizada']) || !isset($_SESSION['email_recuperacion'])) { + die("⚠️ Acceso no autorizado."); + } + + $conn = getConnection(); + $password = $_POST['password'] ?? ''; + $confirmar = $_POST['confirmar'] ?? ''; + + // Validaciones + if (strlen($password) < 6) { + die("❌ La contraseña debe tener al menos 6 caracteres."); + } + + if ($password !== $confirmar) { + die("❌ Las contraseñas no coinciden."); + } + + $email = $_SESSION['email_recuperacion']; + + // 🔐 Usa encrypt() en vez de hash() para coincidir con lo que hay en la base de datos + $emailEncrypted = encrypt($email); + $hash = password_hash($password, PASSWORD_BCRYPT); + + // Actualizar contraseña + $sql = "UPDATE usuarios_sistema SET password_hash = ? WHERE email = ?"; + $stmt = sqlsrv_prepare($conn, $sql, [$hash, $emailEncrypted]); + + if (!$stmt || !sqlsrv_execute($stmt)) { + die("❌ Error al actualizar la contraseña. Intenta nuevamente."); + } + + // Enviar correo de confirmación + try { + $mail = new PHPMailer(true); + + // Configuración de servidor SMTP + $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; + + // Configuración del correo + $mail->setFrom('noreply@aduanasoft.com.mx', 'SIIH | AduanaSoft'); + $mail->addAddress($email); + $mail->CharSet = 'UTF-8'; + $mail->isHTML(true); + $mail->Subject = 'Confirmación de cambio de contraseña'; + + // Cuerpo del correo + $mail->Body = " +
+
+
+

Contraseña actualizada

+
+
+

Hola,

+

Te informamos que tu contraseña ha sido cambiada exitosamente.

+

Si tú no realizaste esta acción, te recomendamos restablecer tu contraseña inmediatamente o contactar al área de soporte.

+
+
+ © " . date('Y') . " SIIH · Desarrollado por AduanaSoft +
+
+
"; + + $mail->send(); + } catch (Exception $e) { + error_log("Error al enviar correo de confirmación: {$mail->ErrorInfo}"); + // No se detiene el proceso si falla el correo + } + + // Limpiar sesión + unset($_SESSION['recuperacion_autorizada']); + unset($_SESSION['email_recuperacion']); + + $_SESSION['login_success'] = 'Tu contraseña ha sido cambiada exitosamente. Inicia sesión.'; + header('Location: /IMPORTADORES/login'); + exit; +} diff --git a/script_table.txt b/script_table.txt new file mode 100644 index 0000000..5a7848e --- /dev/null +++ b/script_table.txt @@ -0,0 +1,6 @@ +CREATE TABLE recuperacion_password ( + id INT IDENTITY(1,1) PRIMARY KEY, + email NVARCHAR(255) NOT NULL, + codigo NVARCHAR(10) NOT NULL, + expiracion DATETIME NOT NULL +); \ No newline at end of file diff --git a/views/login/cambiar_password.php b/views/login/cambiar_password.php new file mode 100644 index 0000000..9ffd7c9 --- /dev/null +++ b/views/login/cambiar_password.php @@ -0,0 +1,149 @@ + + + + + + + <?= htmlspecialchars($siglas) ?> | Recuperación de Contraseña + + + + + + + + + + + + + + +
+ +
+ + + +
+ + +
+

Cambiar contraseña

+ +
+
+ + +
+ +
+ + +
+ + + + +
+ +
+
+ + + + + + \ No newline at end of file diff --git a/views/login/index.php b/views/login/index.php index 80208c9..3d937d8 100644 --- a/views/login/index.php +++ b/views/login/index.php @@ -76,8 +76,8 @@ $mensajeMantenimiento = $config['mensaje_mantenimiento'] ?? 'El sistema se encue - -