0) { echo "Ya tienes un correo adicional registrado."; return; } $correo = $_POST['email-extra'] ?? ''; if (!filter_var($correo, FILTER_VALIDATE_EMAIL)) { echo "Correo inválido."; return; } $query = "INSERT INTO correo_extra (id_usuario, correo) VALUES (?, ?)"; $stmt = sqlsrv_prepare($conn, $query, [$id_usuario, $correo]); if ($stmt && sqlsrv_execute($stmt)) { $_SESSION['config_success'] = 'Correo adicional registrado correctamente.'; header('Location: /IMPORTADORES/seguridad/index'); exit; } else { echo "Error al registrar el correo extra."; } } function modificarCorreoExtra() { if (!isset($_SESSION['usuario_id']) || ($_SESSION['pendiente_confirmacion'] ?? false)) { echo "Error: no se ha iniciado sesión o sesión incompleta."; exit; } $id_usuario = $_SESSION['usuario_id']; $conn = getConnection(); $correo = $_POST['email-extra'] ?? ''; if (!filter_var($correo, FILTER_VALIDATE_EMAIL)) { echo "Correo inválido."; return; } $query = "UPDATE correo_extra SET correo = ? WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$correo, $id_usuario]); if ($stmt && sqlsrv_execute($stmt)) { $_SESSION['config_success'] = 'Correo adicional actualizado correctamente.'; header('Location: /IMPORTADORES/seguridad/index'); exit; } else { echo "Error al actualizar el correo extra."; } } function eliminarCorreoExtra() { if (!isset($_SESSION['usuario_id']) || ($_SESSION['pendiente_confirmacion'] ?? false)) { echo "Error: no se ha iniciado sesión o sesión incompleta."; exit; } $id_usuario = $_SESSION['usuario_id']; $conn = getConnection(); $query = "DELETE FROM correo_extra WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$id_usuario]); if ($stmt && sqlsrv_execute($stmt)) { $_SESSION['config_success'] = 'Correo adicional eliminado correctamente.'; header('Location: /IMPORTADORES/seguridad/index'); exit; } else { echo "Error al eliminar el correo adicional."; } } function correoRespaldo() { // CORRIGIDO: Cambiar id_usuario por usuario_id y verificar confirmación if (!isset($_SESSION['usuario_id']) || ($_SESSION['pendiente_confirmacion'] ?? false)) { echo "Error: no se ha iniciado sesión o sesión incompleta."; exit; } $id_usuario = $_SESSION['usuario_id']; $conn = getConnection(); $sql_check = "SELECT COUNT(*) AS total FROM correo_respaldo WHERE id_usuario = ?"; $stmt_check = sqlsrv_query($conn, $sql_check, [$id_usuario]); $row = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); if ($row['total'] > 0) { echo "Ya tienes un correo de respaldo registrado."; return; } $correo = $_POST['email-respaldo'] ?? ''; if (!filter_var($correo, FILTER_VALIDATE_EMAIL)) { echo "Correo inválido."; return; } $query = "INSERT INTO correo_respaldo (id_usuario, correo) VALUES (?, ?)"; $stmt = sqlsrv_prepare($conn, $query, [$id_usuario, $correo]); if ($stmt && sqlsrv_execute($stmt)) { $_SESSION['config_success'] = 'Correo de respaldo registrado correctamente.'; header('Location: /IMPORTADORES/seguridad/index'); exit; } else { echo "Error al registrar el correo de respaldo."; } } function modificarCorreoRespaldo() { if (!isset($_SESSION['usuario_id']) || ($_SESSION['pendiente_confirmacion'] ?? false)) { echo "Error: no se ha iniciado sesión o sesión incompleta."; exit; } $id_usuario = $_SESSION['usuario_id']; $conn = getConnection(); $correo = $_POST['email-respaldo'] ?? ''; if (!filter_var($correo, FILTER_VALIDATE_EMAIL)) { echo "Correo inválido."; return; } $query = "UPDATE correo_respaldo SET correo = ? WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$correo, $id_usuario]); if ($stmt && sqlsrv_execute($stmt)) { $_SESSION['config_success'] = 'Correo de respaldo actualizado correctamente.'; header('Location: /IMPORTADORES/seguridad/index'); exit; } else { echo "Error al actualizar el correo de respaldo."; } } function eliminarCorreoRespaldo() { if (!isset($_SESSION['usuario_id']) || ($_SESSION['pendiente_confirmacion'] ?? false)) { echo "Error: no se ha iniciado sesión o sesión incompleta."; exit; } $id_usuario = $_SESSION['usuario_id']; $conn = getConnection(); $query = "DELETE FROM correo_respaldo WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$id_usuario]); if ($stmt && sqlsrv_execute($stmt)) { $_SESSION['config_success'] = 'Correo de respaldo eliminado correctamente.'; header('Location: /IMPORTADORES/seguridad/index'); exit; } else { echo "Error al eliminar el correo de respaldo."; } } function obtenerCorreos($conn, $id_usuario) { $correos = [ 'dos_factores' => 0, 'correo_extra' => '', 'correo_respaldo' => '' ]; // Obtener estado dos_factores $sql_dos_factores = "SELECT dos_factores FROM usuarios_sistema WHERE id_usuario = ?"; $params = [$id_usuario]; $stmt_dos_factores = sqlsrv_prepare($conn, $sql_dos_factores, $params); if ($stmt_dos_factores && sqlsrv_execute($stmt_dos_factores)) { if ($row = sqlsrv_fetch_array($stmt_dos_factores, SQLSRV_FETCH_ASSOC)) { $correos['dos_factores'] = (int)$row['dos_factores']; // MEJORADO: Cast a int } } // Obtener correo_extra $sql_extra = "SELECT correo FROM correo_extra WHERE id_usuario = ?"; $stmt_extra = sqlsrv_prepare($conn, $sql_extra, $params); if ($stmt_extra && sqlsrv_execute($stmt_extra)) { if ($row = sqlsrv_fetch_array($stmt_extra, SQLSRV_FETCH_ASSOC)) { $correos['correo_extra'] = $row['correo']; } } // Obtener correo_respaldo $sql_respaldo = "SELECT correo FROM correo_respaldo WHERE id_usuario = ?"; $stmt_respaldo = sqlsrv_prepare($conn, $sql_respaldo, $params); if ($stmt_respaldo && sqlsrv_execute($stmt_respaldo)) { if ($row = sqlsrv_fetch_array($stmt_respaldo, SQLSRV_FETCH_ASSOC)) { $correos['correo_respaldo'] = $row['correo']; } } return $correos; } function ventanillaUnica() { $conn = getConnection(); $id_usuario = $_SESSION['usuario_id'] ?? null; // Asegúrate de que el usuario está autenticado if (!$id_usuario || ($_SESSION['pendiente_confirmacion'] ?? false)) { die("Usuario no autenticado."); } // Obtener configuración actual de ventanilla única $configuracion_vu = obtenerConfiguracionVU($conn, $id_usuario); include __DIR__ . '/../../views/seguridad/ventanilla_unica.php'; } function guardarConfiguracionVU() { // Solo ejecutar si es una petición POST if ($_SERVER['REQUEST_METHOD'] !== 'POST') { header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } $conn = getConnection(); $id_usuario = $_SESSION['usuario_id'] ?? null; if (!$id_usuario || ($_SESSION['pendiente_confirmacion'] ?? false)) { die("No autorizado - Sesión inválida"); } // Obtener datos del formulario (sin ruta_ejecutable) $clave_fiel = trim($_POST['clave_fiel'] ?? ''); $rfc_usuario_vu = trim($_POST['rfc_usuario_vu'] ?? ''); $clave_webservice = trim($_POST['clave_webservice'] ?? ''); // Validar campos obligatorios (sin ruta_ejecutable) if (empty($clave_fiel) || empty($rfc_usuario_vu)) { $_SESSION['config_error'] = 'Los campos Clave FIEL y RFC Usuario VU son obligatorios.'; header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } // Obtener configuración actual para conservar archivos existentes $configuracion_actual = obtenerConfiguracionVU($conn, $id_usuario); $ruta_archivo_key = $configuracion_actual['ruta_archivo_key']; $ruta_archivo_cer = $configuracion_actual['ruta_archivo_cer']; // Directorio para archivos de certificados $upload_dir = __DIR__ . '/../../storage/certificados/'; if (!is_dir($upload_dir)) { mkdir($upload_dir, 0755, true); } // Procesar archivo KEY if (!empty($_FILES['archivo_key']['tmp_name']) && $_FILES['archivo_key']['error'] === UPLOAD_ERR_OK) { $key_extension = pathinfo($_FILES['archivo_key']['name'], PATHINFO_EXTENSION); if (strtolower($key_extension) !== 'key') { $_SESSION['config_error'] = 'El archivo KEY debe tener extensión .key'; header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } $key_filename = 'key_' . $id_usuario . '_' . time() . '.key'; $key_destination = $upload_dir . $key_filename; if (move_uploaded_file($_FILES['archivo_key']['tmp_name'], $key_destination)) { // Eliminar archivo anterior si existe if ($ruta_archivo_key && file_exists($ruta_archivo_key)) { unlink($ruta_archivo_key); } $ruta_archivo_key = $key_destination; } else { $_SESSION['config_error'] = 'Error al subir el archivo KEY.'; header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } } // Procesar archivo CER if (!empty($_FILES['archivo_cer']['tmp_name']) && $_FILES['archivo_cer']['error'] === UPLOAD_ERR_OK) { $cer_extension = pathinfo($_FILES['archivo_cer']['name'], PATHINFO_EXTENSION); if (strtolower($cer_extension) !== 'cer') { $_SESSION['config_error'] = 'El archivo CER debe tener extensión .cer'; header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } $cer_filename = 'cer_' . $id_usuario . '_' . time() . '.cer'; $cer_destination = $upload_dir . $cer_filename; if (move_uploaded_file($_FILES['archivo_cer']['tmp_name'], $cer_destination)) { // Eliminar archivo anterior si existe if ($ruta_archivo_cer && file_exists($ruta_archivo_cer)) { unlink($ruta_archivo_cer); } $ruta_archivo_cer = $cer_destination; } else { $_SESSION['config_error'] = 'Error al subir el archivo CER.'; header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } } // Validar que se hayan subido los certificados (obligatorios para nueva configuración) if (empty($ruta_archivo_key) || empty($ruta_archivo_cer)) { $_SESSION['config_error'] = 'Los archivos CER y KEY son obligatorios.'; header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } // Encriptar las contraseñas sensibles $clave_fiel_encrypted = encrypt($clave_fiel); $clave_webservice_encrypted = !empty($clave_webservice) ? encrypt($clave_webservice) : ''; // Verificar si ya existe configuración - CORREGIR ERROR SQL $sql_check = "SELECT COUNT(*) as total FROM configuracion_ventanilla_unica WHERE id_usuario = ?"; $stmt_check = sqlsrv_query($conn, $sql_check, [$id_usuario]); if ($stmt_check === false) { $_SESSION['config_error'] = 'Error en la consulta de configuración: ' . print_r(sqlsrv_errors(), true); header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } $row = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); if ($row['total'] > 0) { // Actualizar configuración existente (sin ruta_ejecutable) $sql = "UPDATE configuracion_ventanilla_unica SET ruta_archivo_key = ?, ruta_archivo_cer = ?, clave_fiel = ?, rfc_usuario_vu = ?, clave_webservice = ?, fecha_actualizacion = GETDATE() WHERE id_usuario = ?"; $params = [ $ruta_archivo_key, $ruta_archivo_cer, $clave_fiel_encrypted, $rfc_usuario_vu, $clave_webservice_encrypted, $id_usuario ]; } else { // Insertar nueva configuración (sin ruta_ejecutable) $sql = "INSERT INTO configuracion_ventanilla_unica (id_usuario, ruta_archivo_key, ruta_archivo_cer, clave_fiel, rfc_usuario_vu, clave_webservice, fecha_creacion) VALUES (?, ?, ?, ?, ?, ?, GETDATE())"; $params = [ $id_usuario, $ruta_archivo_key, $ruta_archivo_cer, $clave_fiel_encrypted, $rfc_usuario_vu, $clave_webservice_encrypted ]; } $stmt = sqlsrv_prepare($conn, $sql, $params); if (!$stmt) { $_SESSION['config_error'] = "Error en la preparación: " . print_r(sqlsrv_errors(), true); header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } $result = sqlsrv_execute($stmt); if ($result === false) { $_SESSION['config_error'] = "Error al guardar configuración: " . print_r(sqlsrv_errors(), true); header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } sqlsrv_free_stmt($stmt); sqlsrv_close($conn); $_SESSION['config_success'] = 'Configuración de Ventanilla Única guardada correctamente.'; header('Location: /IMPORTADORES/seguridad/ventanillaUnica'); exit; } function probarConexionVU() { header('Content-Type: application/json'); $id_usuario = $_SESSION['usuario_id'] ?? null; if (!$id_usuario || ($_SESSION['pendiente_confirmacion'] ?? false)) { echo json_encode(['success' => false, 'message' => 'Usuario no autenticado']); exit; } $conn = getConnection(); $configuracion = obtenerConfiguracionVU($conn, $id_usuario); // Verificar que todos los campos requeridos estén configurados (sin ruta_ejecutable) if (empty($configuracion['rfc_usuario_vu']) || empty($configuracion['clave_fiel'])) { echo json_encode([ 'success' => false, 'message' => 'Configuración incompleta. Verifica que RFC Usuario VU y Clave FIEL estén configurados.' ]); exit; } // Verificar archivos de certificados if (!empty($configuracion['ruta_archivo_cer']) && !file_exists($configuracion['ruta_archivo_cer'])) { echo json_encode([ 'success' => false, 'message' => 'El archivo CER no existe en la ruta especificada.' ]); exit; } if (!empty($configuracion['ruta_archivo_key']) && !file_exists($configuracion['ruta_archivo_key'])) { echo json_encode([ 'success' => false, 'message' => 'El archivo KEY no existe en la ruta especificada.' ]); exit; } // Verificar que existan ambos archivos de certificados if (empty($configuracion['ruta_archivo_cer']) || empty($configuracion['ruta_archivo_key'])) { echo json_encode([ 'success' => false, 'message' => 'Los archivos CER y KEY son obligatorios para la configuración.' ]); exit; } // Si llegamos aquí, la configuración es válida echo json_encode([ 'success' => true, 'message' => 'Configuración válida. Los archivos de certificados existen y todos los campos obligatorios están completos.' ]); exit; } function obtenerConfiguracionVU($conn, $id_usuario) { $configuracion = [ 'ruta_archivo_key' => '', 'ruta_archivo_cer' => '', 'clave_fiel' => '', 'rfc_usuario_vu' => '', 'clave_webservice' => '', 'fecha_creacion' => null, 'fecha_actualizacion' => null ]; $sql = "SELECT * FROM configuracion_ventanilla_unica WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $sql, [$id_usuario]); if ($stmt && sqlsrv_execute($stmt)) { if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $configuracion['ruta_archivo_key'] = $row['ruta_archivo_key'] ?? ''; $configuracion['ruta_archivo_cer'] = $row['ruta_archivo_cer'] ?? ''; $configuracion['rfc_usuario_vu'] = $row['rfc_usuario_vu'] ?? ''; // Desencriptar contraseñas $configuracion['clave_fiel'] = !empty($row['clave_fiel']) ? decrypt($row['clave_fiel']) : ''; $configuracion['clave_webservice'] = !empty($row['clave_webservice']) ? decrypt($row['clave_webservice']) : ''; $configuracion['fecha_creacion'] = $row['fecha_creacion']; $configuracion['fecha_actualizacion'] = $row['fecha_actualizacion']; } } return $configuracion; }