🔄 Migración: Contraseñas a Base de Datos

⚡ Sistema de Migración:

Esta herramienta migrará el sistema de contraseñas desde archivos de configuración a la base de datos, creando un sistema unificado y más seguro.

🚀 Iniciando Migración...

'; try { // 1. Conectar a la base de datos echo '

✅ 1. Conectando a la base de datos...

'; $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, ] ); // 2. Crear tabla de administradores echo '

✅ 2. Creando tabla de administradores...

'; $createAdminTable = " CREATE TABLE IF NOT EXISTS admin_users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, email VARCHAR(100), full_name VARCHAR(100), is_active TINYINT(1) DEFAULT 1, last_login DATETIME NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_username (username), INDEX idx_active (is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; "; $pdo->exec($createAdminTable); // 3. Migrar contraseña actual del config echo '

✅ 3. Migrando contraseña actual...

'; $currentUsername = ADMIN_USERNAME; $currentPasswordHash = ADMIN_PASSWORD; // Verificar si ya existe el admin $checkAdmin = $pdo->prepare("SELECT id FROM admin_users WHERE username = ?"); $checkAdmin->execute([$currentUsername]); if (!$checkAdmin->fetch()) { $insertAdmin = $pdo->prepare(" INSERT INTO admin_users (username, password_hash, full_name, email) VALUES (?, ?, ?, ?) "); $insertAdmin->execute([ $currentUsername, $currentPasswordHash, 'Administrador Principal', 'admin@u-site.app' ]); echo '

✅ Usuario administrador migrado exitosamente

'; } else { echo '

⚠️ Usuario administrador ya existe en BD

'; } // 4. Crear tabla de configuración si no existe echo '

✅ 4. Verificando tabla de configuración...

'; $createConfigTable = " CREATE TABLE IF NOT EXISTS system_config ( id INT PRIMARY KEY AUTO_INCREMENT, config_key VARCHAR(100) UNIQUE NOT NULL, config_value TEXT, config_type VARCHAR(50) DEFAULT 'string', description TEXT, is_encrypted TINYINT(1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_config_key (config_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; "; $pdo->exec($createConfigTable); // 5. Actualizar configuraciones existentes echo '

✅ 5. Configurando sistema...

'; $systemConfigs = [ ['password_system_migrated', '1', 'boolean', 'Indica si el sistema de contraseñas fue migrado a BD'], ['login_attempts_max', MAX_LOGIN_ATTEMPTS, 'integer', 'Número máximo de intentos de login'], ['login_lockout_time', LOGIN_LOCKOUT_TIME, 'integer', 'Tiempo de bloqueo en segundos'], ['session_timeout', SESSION_TIMEOUT, 'integer', 'Timeout de sesión en segundos'], ['system_version', '2.0.0', 'string', 'Versión del sistema con BD'] ]; foreach ($systemConfigs as $config) { $stmt = $pdo->prepare(" INSERT INTO system_config (config_key, config_value, config_type, description) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE config_value = VALUES(config_value) "); $stmt->execute($config); } echo '

✅ 6. Creando funciones de autenticación...

'; echo '
'; echo '
'; echo '

🎉 ¡Migración Completada Exitosamente!

'; echo '

Cambios realizados:

'; echo ''; echo '

Próximo paso: Actualizar el código para usar la nueva estructura

'; echo '
'; } catch (Exception $e) { echo ''; echo '
Error en la migración: ' . $e->getMessage() . '
'; } } if ($_POST['action'] === 'update_system_files') { echo '

🔧 Actualizando archivos del sistema...

'; try { // Actualizar config.php para incluir funciones de BD echo '

✅ 1. Actualizando config.php...

'; $newConfigFunctions = ' // Funciones de autenticación con base de datos function getAdminByUsername($username) { 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] ); $stmt = $pdo->prepare("SELECT * FROM admin_users WHERE username = ? AND is_active = 1"); $stmt->execute([$username]); return $stmt->fetch(); } catch (Exception $e) { error_log("Error getting admin user: " . $e->getMessage()); return false; } } function verifyAdminPassword($username, $password) { $admin = getAdminByUsername($username); if ($admin && password_verify($password, $admin["password_hash"])) { // Actualizar último login updateAdminLastLogin($admin["id"]); return $admin; } return false; } function updateAdminLastLogin($adminId) { 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] ); $stmt = $pdo->prepare("UPDATE admin_users SET last_login = NOW() WHERE id = ?"); $stmt->execute([$adminId]); } catch (Exception $e) { error_log("Error updating last login: " . $e->getMessage()); } } function updateAdminPassword($username, $newPassword) { 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] ); $newHash = password_hash($newPassword, PASSWORD_DEFAULT); $stmt = $pdo->prepare("UPDATE admin_users SET password_hash = ?, updated_at = NOW() WHERE username = ?"); return $stmt->execute([$newHash, $username]); } catch (Exception $e) { error_log("Error updating password: " . $e->getMessage()); return false; } } function isPasswordSystemMigrated() { $config = getConfigFromDB("password_system_migrated"); return $config === "1"; } // Función de autenticación unificada (retrocompatible) function authenticateAdmin($username, $password) { if (isPasswordSystemMigrated()) { return verifyAdminPassword($username, $password); } else { // Fallback al sistema anterior if ($username === ADMIN_USERNAME && password_verify($password, ADMIN_PASSWORD)) { return ["id" => 1, "username" => $username, "full_name" => "Admin"]; } } return false; } '; // Leer config actual y agregar las nuevas funciones $configFile = 'config/config.php'; $configContent = file_get_contents($configFile); // Agregar las nuevas funciones antes del cierre de PHP $configContent = str_replace('?>', $newConfigFunctions . '?>', $configContent); file_put_contents($configFile, $configContent); echo '

✅ 2. config.php actualizado con funciones de BD

'; echo '
'; echo '
'; echo '

🔧 Archivos actualizados exitosamente!

'; echo '

El sistema ahora soporta contraseñas en base de datos.

'; echo '

Recarga esta página para usar las nuevas funciones.

'; echo '
'; } catch (Exception $e) { echo ''; echo '
Error actualizando archivos: ' . $e->getMessage() . '
'; } } } // Verificar estado actual 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] ); // Verificar si existe la tabla admin_users $checkTable = $pdo->query("SHOW TABLES LIKE 'admin_users'"); $tableExists = $checkTable->rowCount() > 0; $isMigrated = false; if ($tableExists) { $configCheck = getConfigFromDB('password_system_migrated'); $isMigrated = ($configCheck === '1'); } echo '
'; echo '

📊 Estado Actual del Sistema

'; echo '

Base de datos: ✅ Conectada (' . DB_NAME . ')

'; echo '

Tabla admin_users: ' . ($tableExists ? '✅ Existe' : '❌ No existe') . '

'; echo '

Sistema migrado: ' . ($isMigrated ? '✅ Sí' : '❌ No') . '

'; echo '

Usuario actual: ' . ADMIN_USERNAME . '

'; echo '
'; if (!$tableExists || !$isMigrated) { echo '
'; echo ''; echo ''; echo '
'; if ($tableExists && !$isMigrated) { echo '
'; echo ''; echo ''; echo '
'; } } else { echo '
'; echo '

✅ Sistema Ya Migrado

'; echo '

El sistema de contraseñas ya está funcionando con base de datos.

'; echo '

🛠️ Ir a Gestión de Administradores

'; echo '
'; } } catch (Exception $e) { echo '
Error conectando a BD: ' . $e->getMessage() . '
'; } ?>

📋 Lo que hace esta migración:

🔒 Beneficios del nuevo sistema: