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.
✅ 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 'Cambios realizados:
'; echo 'admin_users creadaPróximo paso: Actualizar el código para usar la nueva estructura
'; 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 'El sistema ahora soporta contraseñas en base de datos.
'; echo 'Recarga esta página para usar las nuevas funciones.
'; 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 'El sistema de contraseñas ya está funcionando con base de datos.
'; echo ''; echo 'admin_users para gestionar administradores