global $pdo; $magic_token = preg_replace('/[^a-f0-9]/', '', (string)($_GET['magic'] ?? '')); $magic_error = null; if (isset($_GET['caducada'])) { $magic_error = "Tu sesión temporal de auditoría (10 minutos máximo) ha expirado y se ha cerrado por seguridad."; } if (!empty($magic_token)) { try { $stmt_tok = $pdo->prepare("SELECT * FROM usuarios_tokens_impersonate WHERE token = ? AND usado = 0 AND expira_en >= NOW() LIMIT 1"); $stmt_tok->execute([$magic_token]); $tok = $stmt_tok->fetch(PDO::FETCH_ASSOC); if ($tok) { // Marcar inmediatamente como usado (estricto un solo uso) $pdo->prepare("UPDATE usuarios_tokens_impersonate SET usado = 1, usado_en = NOW(), ip_origen = ? WHERE id = ?") ->execute([$_SERVER['REMOTE_ADDR'] ?? '0.0.0.0', $tok['id']]); // Iniciar sesión temporal sin cookie remember persistente $ok = login_adm_por_id($tok['usuario_id'], false); if ($ok) { $_SESSION['impersonated_audit'] = true; $_SESSION['impersonated_by_id'] = $tok['creado_por_id']; $_SESSION['impersonated_by_name'] = $tok['creado_por_nombre']; $_SESSION['impersonated_expires_at'] = time() + 600; // 10 minutos exactos if (function_exists('auditar')) { auditar([ 'evento' => 'impersonacion', 'modulo' => 'acceso', 'entidad' => 'usuarios', 'entidad_id' => $tok['usuario_id'], 'descripcion' => 'Acceso como usuario (Auditoría en Incógnito) iniciado por ' . $tok['creado_por_nombre'], 'resultado' => 'ok', 'severidad' => 'alerta', 'usuario_id' => $tok['creado_por_id'], 'usuario_nombre' => $tok['creado_por_nombre'], 'datos' => [ 'usuario_auditado_id' => $tok['usuario_id'], 'token' => $tok['token'], 'expira_en' => date('Y-m-d H:i:s', time() + 600) ] ]); } redirect('/inicio'); exit; } else { $magic_error = "La cuenta del usuario a auditar no está activa o se encuentra bloqueada."; } } else { $magic_error = "El enlace de acceso seguro no es válido o ya caducó (los enlaces caducan en 1 minuto). Genera uno nuevo."; } } catch (\Exception $e) { $magic_error = "Error al procesar el enlace de acceso: " . $e->getMessage(); } } if (is_admin() && empty($magic_error)) { redirect('/'); } $error = $magic_error ?: get("error"); $html = new html("Acceso al Sistema"); $html->bodyTag = 'class="auth-body"'; $html->start(); ?>
Sistema Integral de Administración