333 lines
14 KiB
PHP
333 lines
14 KiB
PHP
<?php
|
|
/**
|
|
* Herramienta de Diagnóstico de Login - WhatsApp Bot Manager
|
|
* Fecha: 4 de enero de 2026
|
|
*/
|
|
|
|
require_once 'config/config.php';
|
|
|
|
// Solo permitir acceso desde localhost por seguridad
|
|
$allowedIPs = ['127.0.0.1', '::1', 'localhost'];
|
|
$clientIP = $_SERVER['REMOTE_ADDR'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? 'unknown';
|
|
|
|
if (!in_array($clientIP, $allowedIPs) && $clientIP !== 'unknown') {
|
|
die("❌ Acceso denegado. Esta utilidad solo puede ejecutarse desde localhost por seguridad.");
|
|
}
|
|
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="es">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>🔧 Diagnóstico de Login - WhatsApp Bot Manager</title>
|
|
<style>
|
|
body {
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
background: linear-gradient(135deg, #25D366 0%, #128C7E 100%);
|
|
color: #333;
|
|
margin: 0;
|
|
padding: 20px;
|
|
min-height: 100vh;
|
|
}
|
|
.container {
|
|
max-width: 800px;
|
|
margin: 0 auto;
|
|
background: white;
|
|
padding: 40px;
|
|
border-radius: 15px;
|
|
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
|
|
}
|
|
h1 {
|
|
color: #25D366;
|
|
text-align: center;
|
|
margin-bottom: 30px;
|
|
}
|
|
.info-box {
|
|
background: #e8f5e8;
|
|
padding: 20px;
|
|
border-left: 5px solid #25D366;
|
|
margin: 20px 0;
|
|
border-radius: 5px;
|
|
}
|
|
.warning-box {
|
|
background: #fff3cd;
|
|
padding: 20px;
|
|
border-left: 5px solid #ffc107;
|
|
margin: 20px 0;
|
|
border-radius: 5px;
|
|
}
|
|
.error-box {
|
|
background: #f8d7da;
|
|
padding: 20px;
|
|
border-left: 5px solid #dc3545;
|
|
margin: 20px 0;
|
|
border-radius: 5px;
|
|
}
|
|
.form-group {
|
|
margin: 20px 0;
|
|
}
|
|
label {
|
|
display: block;
|
|
font-weight: bold;
|
|
margin-bottom: 8px;
|
|
color: #333;
|
|
}
|
|
input[type="password"], input[type="text"] {
|
|
width: 100%;
|
|
padding: 12px;
|
|
border: 2px solid #ddd;
|
|
border-radius: 8px;
|
|
font-size: 16px;
|
|
box-sizing: border-box;
|
|
}
|
|
input[type="password"]:focus, input[type="text"]:focus {
|
|
outline: none;
|
|
border-color: #25D366;
|
|
}
|
|
.btn {
|
|
background: #25D366;
|
|
color: white;
|
|
padding: 12px 30px;
|
|
border: none;
|
|
border-radius: 8px;
|
|
font-size: 16px;
|
|
cursor: pointer;
|
|
width: 100%;
|
|
margin: 10px 0;
|
|
}
|
|
.btn:hover {
|
|
background: #1aa347;
|
|
}
|
|
.btn-danger {
|
|
background: #dc3545;
|
|
}
|
|
.btn-danger:hover {
|
|
background: #c82333;
|
|
}
|
|
.current-info {
|
|
background: #f8f9fa;
|
|
padding: 15px;
|
|
border-radius: 8px;
|
|
margin: 20px 0;
|
|
}
|
|
code {
|
|
background: #f8f9fa;
|
|
padding: 2px 6px;
|
|
border-radius: 3px;
|
|
font-family: monospace;
|
|
}
|
|
.test-box {
|
|
background: #e7f3ff;
|
|
padding: 20px;
|
|
border: 2px solid #007bff;
|
|
border-radius: 8px;
|
|
margin: 20px 0;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<h1>🔧 Diagnóstico Completo de Login</h1>
|
|
|
|
<div class="warning-box">
|
|
<strong>⚠️ Herramienta de Emergencia:</strong>
|
|
<p>Esta utilidad diagnostica y soluciona problemas de login del sistema WhatsApp Bot Manager.</p>
|
|
</div>
|
|
|
|
<?php
|
|
// Información actual del sistema
|
|
echo '<div class="current-info">';
|
|
echo '<h3>📋 Estado Actual del Sistema:</h3>';
|
|
echo '<p><strong>Usuario administrador:</strong> <code>' . ADMIN_USERNAME . '</code></p>';
|
|
echo '<p><strong>Hash actual:</strong> <code>' . substr(ADMIN_PASSWORD, 0, 60) . '...</code></p>';
|
|
echo '<p><strong>Timeout de sesión:</strong> ' . (SESSION_TIMEOUT/60) . ' minutos</p>';
|
|
echo '<p><strong>Intentos máximos:</strong> ' . MAX_LOGIN_ATTEMPTS . ' intentos</p>';
|
|
echo '<p><strong>Tiempo de bloqueo:</strong> ' . (LOGIN_LOCKOUT_TIME/60) . ' minutos</p>';
|
|
echo '</div>';
|
|
|
|
// Verificar si hay bloqueos activos
|
|
$attemptsFile = '.login_attempts.json';
|
|
if (file_exists($attemptsFile)) {
|
|
$attempts = json_decode(file_get_contents($attemptsFile), true);
|
|
if (!empty($attempts)) {
|
|
echo '<div class="error-box">';
|
|
echo '<h4>🚫 Bloqueos Activos Detectados:</h4>';
|
|
foreach ($attempts as $ip => $data) {
|
|
echo '<p><strong>IP:</strong> ' . $ip . ' - <strong>Intentos:</strong> ' . $data['attempts'] . ' - <strong>Bloqueado hasta:</strong> ' . date('Y-m-d H:i:s', $data['locked_until']) . '</p>';
|
|
}
|
|
echo '</div>';
|
|
}
|
|
}
|
|
|
|
// Procesar acciones
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
if (isset($_POST['action'])) {
|
|
|
|
// Verificar contraseña
|
|
if ($_POST['action'] === 'test_password') {
|
|
$testPassword = $_POST['test_password'] ?? '';
|
|
echo '<div class="test-box">';
|
|
echo '<h4>🔍 Resultado de la Prueba:</h4>';
|
|
echo '<p><strong>Contraseña probada:</strong> ' . htmlspecialchars($testPassword) . '</p>';
|
|
echo '<p><strong>Hash almacenado:</strong> ' . ADMIN_PASSWORD . '</p>';
|
|
|
|
if (password_verify($testPassword, ADMIN_PASSWORD)) {
|
|
echo '<div class="info-box">✅ <strong>CORRECTO:</strong> La contraseña funciona perfectamente.</div>';
|
|
echo '<p><strong>Diagnóstico:</strong> El problema no es la contraseña. Revisa:</p>';
|
|
echo '<ul>';
|
|
echo '<li>¿Estás usando el usuario correcto? (' . ADMIN_USERNAME . ')</li>';
|
|
echo '<li>¿Tu IP está bloqueada por intentos fallidos?</li>';
|
|
echo '<li>¿Hay espacios extra en la contraseña?</li>';
|
|
echo '</ul>';
|
|
} else {
|
|
echo '<div class="error-box">❌ <strong>INCORRECTO:</strong> La contraseña no coincide con el hash.</div>';
|
|
echo '<p><strong>Diagnóstico:</strong> El hash en la base de datos no corresponde a la contraseña ingresada.</p>';
|
|
}
|
|
echo '</div>';
|
|
}
|
|
|
|
// Resetear contraseña a "admin123"
|
|
if ($_POST['action'] === 'reset_admin123') {
|
|
$defaultPassword = 'admin123';
|
|
$newHash = password_hash($defaultPassword, PASSWORD_DEFAULT);
|
|
|
|
// Leer el archivo config.php
|
|
$configFile = 'config/config.php';
|
|
$configContent = file_get_contents($configFile);
|
|
|
|
// Reemplazar la línea del password
|
|
$pattern = "/define\('ADMIN_PASSWORD', '[^']*'\);/";
|
|
$replacement = "define('ADMIN_PASSWORD', '" . $newHash . "');";
|
|
$newConfigContent = preg_replace($pattern, $replacement, $configContent);
|
|
|
|
if (file_put_contents($configFile, $newConfigContent)) {
|
|
echo '<div class="info-box">✅ <strong>Contraseña reseteada exitosamente!</strong></div>';
|
|
echo '<div class="warning-box"><strong>🔑 Credenciales de acceso:</strong><br>';
|
|
echo '<strong>Usuario:</strong> admin<br>';
|
|
echo '<strong>Contraseña:</strong> admin123<br>';
|
|
echo '<strong>URL de login:</strong> <a href="login.php" target="_blank">login.php</a></div>';
|
|
|
|
// Log del cambio
|
|
$logEntry = "[" . date('Y-m-d H:i:s') . "] Password reset to default from IP: " . $clientIP . PHP_EOL;
|
|
file_put_contents('logs/system.log', $logEntry, FILE_APPEND | LOCK_EX);
|
|
} else {
|
|
echo '<div class="error-box">❌ Error al actualizar el archivo de configuración.</div>';
|
|
}
|
|
}
|
|
|
|
// Limpiar bloqueos
|
|
if ($_POST['action'] === 'clear_blocks') {
|
|
if (file_exists($attemptsFile)) {
|
|
unlink($attemptsFile);
|
|
echo '<div class="info-box">✅ Todos los bloqueos de IP han sido eliminados.</div>';
|
|
} else {
|
|
echo '<div class="warning-box">⚠️ No hay bloqueos activos para eliminar.</div>';
|
|
}
|
|
}
|
|
|
|
// Contraseña personalizada
|
|
if ($_POST['action'] === 'set_custom_password') {
|
|
$newPassword = $_POST['new_password'] ?? '';
|
|
$confirmPassword = $_POST['confirm_password'] ?? '';
|
|
|
|
if (empty($newPassword) || empty($confirmPassword)) {
|
|
echo '<div class="error-box">❌ Todos los campos son requeridos.</div>';
|
|
} elseif ($newPassword !== $confirmPassword) {
|
|
echo '<div class="error-box">❌ Las contraseñas no coinciden.</div>';
|
|
} elseif (strlen($newPassword) < 4) {
|
|
echo '<div class="error-box">❌ La contraseña debe tener al menos 4 caracteres.</div>';
|
|
} else {
|
|
$newHash = password_hash($newPassword, PASSWORD_DEFAULT);
|
|
|
|
// Leer y actualizar config.php
|
|
$configFile = 'config/config.php';
|
|
$configContent = file_get_contents($configFile);
|
|
|
|
$pattern = "/define\('ADMIN_PASSWORD', '[^']*'\);/";
|
|
$replacement = "define('ADMIN_PASSWORD', '" . $newHash . "');";
|
|
$newConfigContent = preg_replace($pattern, $replacement, $configContent);
|
|
|
|
if (file_put_contents($configFile, $newConfigContent)) {
|
|
echo '<div class="info-box">✅ <strong>Contraseña personalizada establecida!</strong></div>';
|
|
echo '<div class="warning-box"><strong>🔑 Nueva contraseña:</strong> ' . htmlspecialchars($newPassword) . '</div>';
|
|
} else {
|
|
echo '<div class="error-box">❌ Error al actualizar el archivo de configuración.</div>';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
?>
|
|
|
|
<!-- Formulario para probar contraseña -->
|
|
<form method="post" style="margin-bottom: 30px;">
|
|
<h3>🔍 Probar Contraseña Actual</h3>
|
|
<div class="form-group">
|
|
<label for="test_password">Contraseña a probar:</label>
|
|
<input type="text" id="test_password" name="test_password" required>
|
|
<small>Escribe la contraseña que crees que debería funcionar</small>
|
|
</div>
|
|
<input type="hidden" name="action" value="test_password">
|
|
<button type="submit" class="btn">🔍 Probar Contraseña</button>
|
|
</form>
|
|
|
|
<hr>
|
|
|
|
<!-- Botón de reset rápido -->
|
|
<form method="post" style="margin-bottom: 30px;">
|
|
<h3>🚨 Reset de Emergencia</h3>
|
|
<p>Esto establecerá la contraseña por defecto: <strong>admin123</strong></p>
|
|
<input type="hidden" name="action" value="reset_admin123">
|
|
<button type="submit" class="btn btn-danger" onclick="return confirm('¿Estás seguro de resetear la contraseña a admin123?')">🔑 Resetear a admin123</button>
|
|
</form>
|
|
|
|
<hr>
|
|
|
|
<!-- Establecer contraseña personalizada -->
|
|
<form method="post" style="margin-bottom: 30px;">
|
|
<h3>🔧 Establecer Contraseña Personalizada</h3>
|
|
<div class="form-group">
|
|
<label for="new_password">Nueva contraseña:</label>
|
|
<input type="password" id="new_password" name="new_password" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="confirm_password">Confirmar contraseña:</label>
|
|
<input type="password" id="confirm_password" name="confirm_password" required>
|
|
</div>
|
|
<input type="hidden" name="action" value="set_custom_password">
|
|
<button type="submit" class="btn">🔧 Establecer Nueva Contraseña</button>
|
|
</form>
|
|
|
|
<hr>
|
|
|
|
<!-- Limpiar bloqueos -->
|
|
<form method="post">
|
|
<h3>🗑️ Limpiar Bloqueos de IP</h3>
|
|
<p>Elimina todos los bloqueos por intentos de login fallidos</p>
|
|
<input type="hidden" name="action" value="clear_blocks">
|
|
<button type="submit" class="btn btn-danger">🗑️ Limpiar Todos los Bloqueos</button>
|
|
</form>
|
|
|
|
<div class="info-box" style="margin-top: 30px;">
|
|
<h4>📋 Pasos Recomendados:</h4>
|
|
<ol>
|
|
<li><strong>Prueba</strong> la contraseña que crees que debería funcionar</li>
|
|
<li>Si no funciona, usa <strong>Reset de Emergencia</strong> (admin123)</li>
|
|
<li><strong>Limpia los bloqueos</strong> si tu IP está bloqueada</li>
|
|
<li><strong>Prueba el login</strong> en <a href="login.php" target="_blank">login.php</a></li>
|
|
<li><strong>Cambia</strong> la contraseña por una segura una vez dentro</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<div class="warning-box">
|
|
<h4>🔒 Recordatorios de Seguridad:</h4>
|
|
<ul>
|
|
<li>Elimina este archivo después de usarlo</li>
|
|
<li>Usa siempre contraseñas seguras en producción</li>
|
|
<li>No dejes archivos de diagnóstico en servidores públicos</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|