342 lines
14 KiB
PHP
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>
|