Files
whatsapp/migrate_to_database_auth.php
T
2026-01-12 11:06:43 -05:00

342 lines
14 KiB
PHP

<?php
/**
* Migrador de Sistema de Contraseñas a Base de Datos
* WhatsApp Bot Manager - Migración Automática
* 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>🔄 Migración a Sistema de BD - 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;
}
.progress-box {
background: #f8f9fa;
padding: 20px;
border-radius: 10px;
margin: 20px 0;
border: 2px solid #dee2e6;
}
.success-box {
background: #d4edda;
padding: 20px;
border-left: 5px solid #28a745;
margin: 20px 0;
border-radius: 5px;
}
.error-box {
background: #f8d7da;
padding: 20px;
border-left: 5px solid #dc3545;
margin: 20px 0;
border-radius: 5px;
}
.warning-box {
background: #fff3cd;
padding: 20px;
border-left: 5px solid #ffc107;
margin: 20px 0;
border-radius: 5px;
}
.btn {
background: #25D366;
color: white;
padding: 15px 30px;
border: none;
border-radius: 8px;
font-size: 16px;
cursor: pointer;
text-decoration: none;
display: inline-block;
margin: 10px 0;
}
.btn:hover {
background: #1aa347;
}
.code-block {
background: #f8f9fa;
padding: 15px;
border-radius: 5px;
font-family: monospace;
border: 1px solid #dee2e6;
margin: 10px 0;
overflow-x: auto;
}
.step {
margin: 20px 0;
padding: 15px;
border-radius: 8px;
}
.step-pending {
background: #e9ecef;
border-left: 4px solid #6c757d;
}
.step-running {
background: #fff3cd;
border-left: 4px solid #ffc107;
}
.step-completed {
background: #d4edda;
border-left: 4px solid #28a745;
}
.step-error {
background: #f8d7da;
border-left: 4px solid #dc3545;
}
</style>
</head>
<body>
<div class="container">
<h1>🔄 Migración a Sistema de Base de Datos</h1>
<?php
try {
$pdo = new PDO(
"mysql:host=" . DB_HOST . ";port=" . DB_PORT . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET,
DB_USER,
DB_PASS,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
);
echo '<div class="success-box">✅ <strong>Conexión a base de datos exitosa</strong></div>';
// Verificar si ya está migrado
$checkTable = $pdo->query("SHOW TABLES LIKE 'admin_users'");
$alreadyMigrated = $checkTable->rowCount() > 0;
if ($alreadyMigrated && !isset($_GET['force'])) {
echo '<div class="warning-box">';
echo '<h3>⚠️ Sistema Ya Migrado</h3>';
echo '<p>El sistema de autenticación ya ha sido migrado a la base de datos.</p>';
echo '<p><a href="gestion_admin_unificada.php" class="btn">🛠️ Ir a Gestión de Administradores</a></p>';
echo '<p><a href="?force=1" class="btn" style="background: #dc3545;">⚠️ Forzar Re-migración</a></p>';
echo '</div>';
exit;
}
// Ejecutar migración
if (isset($_GET['migrate']) || isset($_GET['force'])) {
echo '<div class="progress-box">';
echo '<h3>🚀 Ejecutando Migración...</h3>';
$steps = [
'create_table' => 'Crear tabla admin_users',
'migrate_admin' => 'Migrar usuario administrador existente',
'verify_data' => 'Verificar datos migrados',
'update_config' => 'Actualizar configuración del sistema'
];
$results = [];
// Paso 1: Crear tabla
echo '<div class="step step-running" id="step-create-table">';
echo '<h4>📋 Paso 1: Creando tabla admin_users...</h4>';
try {
if ($alreadyMigrated) {
$pdo->exec("DROP TABLE IF EXISTS admin_users");
echo '<p>- Tabla existente eliminada (re-migración)</p>';
}
$createTableSQL = "
CREATE TABLE admin_users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
full_name VARCHAR(100),
email VARCHAR(100),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
last_login TIMESTAMP NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
$pdo->exec($createTableSQL);
echo '<p>✅ Tabla admin_users creada exitosamente</p>';
$results['create_table'] = true;
} catch (Exception $e) {
echo '<p>❌ Error creando tabla: ' . $e->getMessage() . '</p>';
$results['create_table'] = false;
}
echo '</div>';
// Paso 2: Migrar usuario admin
echo '<div class="step step-running" id="step-migrate-admin">';
echo '<h4>👤 Paso 2: Migrando usuario administrador...</h4>';
try {
if (defined('ADMIN_PASSWORD')) {
$stmt = $pdo->prepare("
INSERT INTO admin_users (username, password_hash, full_name, email, is_active)
VALUES (?, ?, ?, ?, ?)
");
$stmt->execute([
'admin',
ADMIN_PASSWORD, // Ya está hasheado
'Administrador Principal',
'admin@' . ($_SERVER['HTTP_HOST'] ?? 'localhost'),
1
]);
echo '<p>✅ Usuario admin migrado con contraseña existente</p>';
echo '<p>- Usuario: <strong>admin</strong></p>';
echo '<p>- Contraseña: <em>La misma que usabas antes</em></p>';
$results['migrate_admin'] = true;
} else {
echo '<p>❌ No se encontró ADMIN_PASSWORD en config.php</p>';
$results['migrate_admin'] = false;
}
} catch (Exception $e) {
echo '<p>❌ Error migrando admin: ' . $e->getMessage() . '</p>';
$results['migrate_admin'] = false;
}
echo '</div>';
// Paso 3: Verificar datos
echo '<div class="step step-running" id="step-verify-data">';
echo '<h4>🔍 Paso 3: Verificando datos migrados...</h4>';
try {
$stmt = $pdo->query("SELECT * FROM admin_users");
$admins = $stmt->fetchAll();
if (empty($admins)) {
echo '<p>❌ No se encontraron administradores en la tabla</p>';
$results['verify_data'] = false;
} else {
echo '<p>✅ Verificación exitosa. Administradores encontrados:</p>';
foreach ($admins as $admin) {
echo '<div class="code-block">';
echo 'ID: ' . $admin['id'] . ' | Usuario: ' . $admin['username'] . ' | Activo: ' . ($admin['is_active'] ? 'Sí' : 'No');
echo '</div>';
}
$results['verify_data'] = true;
}
} catch (Exception $e) {
echo '<p>❌ Error verificando datos: ' . $e->getMessage() . '</p>';
$results['verify_data'] = false;
}
echo '</div>';
// Paso 4: Actualizar configuración
echo '<div class="step step-running" id="step-update-config">';
echo '<h4>⚙️ Paso 4: Actualizando configuración del sistema...</h4>';
// Marcar migración completada
$migrationFlag = dirname(__FILE__) . '/.auth_migrated';
if (file_put_contents($migrationFlag, date('Y-m-d H:i:s'))) {
echo '<p>✅ Flag de migración creado</p>';
} else {
echo '<p>⚠️ No se pudo crear flag de migración</p>';
}
echo '<p>✅ Sistema configurado para usar autenticación por BD</p>';
$results['update_config'] = true;
echo '</div>';
// Resumen final
$allSuccess = !in_array(false, $results);
if ($allSuccess) {
echo '<div class="success-box">';
echo '<h3>🎉 ¡Migración Completada Exitosamente!</h3>';
echo '<p>El sistema de autenticación ha sido migrado exitosamente a la base de datos.</p>';
echo '<h4>📋 Qué cambió:</h4>';
echo '<ul>';
echo '<li>✅ Las contraseñas se almacenan ahora en la tabla <code>admin_users</code></li>';
echo '<li>✅ Se mantiene retrocompatibilidad durante la transición</li>';
echo '<li>✅ El login ahora usa el nuevo sistema unificado</li>';
echo '<li>✅ Se pueden crear múltiples administradores</li>';
echo '</ul>';
echo '<p><a href="gestion_admin_unificada.php" class="btn">🛠️ Gestionar Administradores</a></p>';
echo '<p><a href="login.php" class="btn">🔐 Probar Login</a></p>';
echo '</div>';
} else {
echo '<div class="error-box">';
echo '<h3>❌ Migración Parcial o con Errores</h3>';
echo '<p>Algunos pasos fallaron. Revisa los errores arriba y contacta soporte si es necesario.</p>';
echo '</div>';
}
echo '</div>'; // Cierre progress-box
} else {
// Mostrar información pre-migración
echo '<div class="warning-box">';
echo '<h3>📋 Información de la Migración</h3>';
echo '<p>Este proceso migrará tu sistema de autenticación hardcodeado a un sistema basado en base de datos.</p>';
echo '<h4>🔄 Qué va a pasar:</h4>';
echo '<ul>';
echo '<li>Se creará una tabla <code>admin_users</code> en la base de datos</li>';
echo '<li>Se migrará tu contraseña actual de administrador</li>';
echo '<li>El sistema de login será actualizado automáticamente</li>';
echo '<li>Podrás gestionar múltiples administradores</li>';
echo '</ul>';
echo '<h4>⚡ Información actual:</h4>';
echo '<div class="code-block">';
echo 'Base de datos: ' . DB_NAME . '<br>';
echo 'Usuario BD: ' . DB_USER . '<br>';
echo 'Contraseña admin actual: ' . (defined('ADMIN_PASSWORD') ? 'Configurada' : 'NO CONFIGURADA') . '<br>';
echo '</div>';
echo '<p><a href="?migrate=1" class="btn">🚀 Iniciar Migración</a></p>';
echo '</div>';
}
} catch (Exception $e) {
echo '<div class="error-box">';
echo '<h3>❌ Error de Conexión</h3>';
echo '<p>No se pudo conectar a la base de datos:</p>';
echo '<div class="code-block">' . $e->getMessage() . '</div>';
echo '<p>Verifica tu configuración en <code>config/config.php</code></p>';
echo '</div>';
}
?>
<div class="warning-box" style="margin-top: 40px;">
<h4>⚠️ Notas Importantes:</h4>
<ul>
<li>Esta migración es <strong>automática y segura</strong></li>
<li>Tu contraseña actual se mantendrá igual</li>
<li>El usuario por defecto será <code>admin</code></li>
<li>Después de la migración, elimina este archivo por seguridad</li>
<li>Se mantiene retrocompatibilidad durante la transición</li>
</ul>
</div>
</div>
</body>
</html>