$ipData['locked_until']) { unset($attempts[$ip]); file_put_contents($attemptsFile, json_encode($attempts)); return true; } return $ipData['attempts'] < MAX_LOGIN_ATTEMPTS; } // Función para registrar intento de login fallido function recordFailedLogin($ip) { $attemptsFile = dirname(__DIR__) . '/.login_attempts.json'; $attempts = []; if (file_exists($attemptsFile)) { $attempts = json_decode(file_get_contents($attemptsFile), true); } if (!isset($attempts[$ip])) { $attempts[$ip] = ['attempts' => 0, 'locked_until' => 0]; } $attempts[$ip]['attempts']++; if ($attempts[$ip]['attempts'] >= MAX_LOGIN_ATTEMPTS) { $attempts[$ip]['locked_until'] = time() + LOGIN_LOCKOUT_TIME; } file_put_contents($attemptsFile, json_encode($attempts)); } // Función para limpiar intentos de login exitoso function clearLoginAttempts($ip) { $attemptsFile = dirname(__DIR__) . '/.login_attempts.json'; if (file_exists($attemptsFile)) { $attempts = json_decode(file_get_contents($attemptsFile), true); unset($attempts[$ip]); file_put_contents($attemptsFile, json_encode($attempts)); } } // Autoloader spl_autoload_register(function ($class) { $directories = [ dirname(__DIR__) . '/classes/', dirname(__DIR__) . '/services/', dirname(__DIR__) . '/controllers/' ]; foreach ($directories as $directory) { $file = $directory . $class . '.php'; if (file_exists($file)) { require_once $file; return; } } }); // Función para obtener configuración desde base de datos function getConfigFromDB($key, $default = null) { static $configs = null; if ($configs === null && isInstallationCompleted()) { 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, PDO::ATTR_EMULATE_PREPARES => false, ] ); $stmt = $pdo->query("SELECT config_key, config_value FROM system_config"); $configs = []; while ($row = $stmt->fetch()) { $configs[$row['config_key']] = $row['config_value']; } } catch (PDOException $e) { error_log("Error loading config: " . $e->getMessage()); $configs = []; } } return $configs[$key] ?? $default; } // Inicializar sesión si no está activa if (session_status() == PHP_SESSION_NONE) { session_start(); } // Verificar timeout de sesión if (isUserLoggedIn() && isset($_SESSION['last_activity'])) { if (time() - $_SESSION['last_activity'] > SESSION_TIMEOUT) { session_destroy(); session_start(); } } // Actualizar última actividad if (isUserLoggedIn()) { $_SESSION['last_activity'] = time(); } ?>