<?php
// Proteção contra roubo de sessão via JavaScript (XSS)
ini_set('session.cookie_httponly', 1);
ini_set('session.use_only_cookies', 1);

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// 1. CREDENCIAIS DO BANCO INTERNO (Fixo, onde o painel está instalado)
define('DB_INT_HOST', 'localhost');
define('DB_INT_NAME', 'officextream');
define('DB_INT_USER', 'user_officextream');
define('DB_INT_PASS', 'pass_officextream');

// 2. FUNÇÃO BASE: Conecta no banco da hospedagem
function getConexaoInterna() {
    try {
        $pdo = new PDO("mysql:host=" . DB_INT_HOST . ";dbname=" . DB_INT_NAME . ";charset=utf8mb4", DB_INT_USER, DB_INT_PASS);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        // Desativa a emulação para impedir injeção de múltiplas querys destrutivas (SQLi avançado)
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
        
        $pdo->exec("SET NAMES utf8mb4");
        $pdo->exec("SET CHARACTER SET utf8mb4");
        $pdo->exec("SET SESSION sql_mode = ''");
        return $pdo;
    } catch (PDOException $e) {
        error_log("Erro no banco interno: " . $e->getMessage());
        die("Erro fatal: Não foi possível conectar ao banco de dados do próprio painel.");
    }
}

// 3. A MÁGICA HÍBRIDA: Decide qual conexão usar (INTERNO, XTREAM OU XUI ONE)
function getConexaoAtiva() {
    $pdoInterno = getConexaoInterna();
    
    $stmt = $pdoInterno->query("SELECT * FROM configuracoes LIMIT 1");
    $config = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$config || $config['modo_ativo'] === 'interno' || empty($config['ext_host'])) {
        if (!defined('MODO_SISTEMA')) define('MODO_SISTEMA', 'interno');
        return $pdoInterno; 
    }

    try {
        if ($config['modo_ativo'] === 'xui' && !empty($config['xui_host'])) {
            $porta_externa = "3306"; 
            $dsn = "mysql:host=" . $config['xui_host'] . ";dbname=" . $config['xui_name'] . ";port=" . $porta_externa . ";charset=utf8mb4";
            $pdoExterno = new PDO($dsn, $config['xui_user'], $config['xui_pass']);
            if (!defined('MODO_SISTEMA')) define('MODO_SISTEMA', 'xui');
        } else {
            $porta_externa = "7999"; 
            $dsn = "mysql:host=" . $config['ext_host'] . ";dbname=" . $config['ext_name'] . ";port=" . $porta_externa . ";charset=utf8mb4";
            $pdoExterno = new PDO($dsn, $config['ext_user'], $config['ext_pass']);
            if (!defined('MODO_SISTEMA')) define('MODO_SISTEMA', 'externo');
        }
        
        $pdoExterno->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdoExterno->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // Trava contra injeção em massa no banco externo
        
        $pdoExterno->exec("SET NAMES utf8mb4");
        $pdoExterno->exec("SET CHARACTER SET utf8mb4");
        $pdoExterno->exec("SET SESSION sql_mode = ''");
        
        return $pdoExterno;
        
    } catch (PDOException $e) {
        $modoErro = ($config['modo_ativo'] === 'xui') ? 'XUI ONE' : 'Xtream UI';
        error_log("Erro de conexao externa ({$modoErro}): " . $e->getMessage());
        
        die("<div style='background:#dc3545; color:white; padding:20px; font-family:sans-serif; text-align:center; border-radius:10px; margin:20px;'>
            <h2>Erro de Conexão com o {$modoErro} Externo!</h2>
            <p>Ocorreu uma falha ao tentar conectar ao banco de dados remoto.</p>
            <p>Verifique se as configurações de rede e o acesso remoto ao MySQL estão liberados.</p>
            <hr>
            <a href='configuracoes.php' style='color:yellow; text-decoration:none; font-weight:bold;'>Voltar para Configurações</a>
            </div>");
    }
}

// ==============================================================================
// 4. FIREWALL GLOBAL E INTELIGENTE DO SISTEMA
// ==============================================================================
try {
    $pdoFirewall = getConexaoAtiva();
    
    // Proteção contra IP Spoofing (Força validação real do IP)
    $ip_cliente = filter_var($_SERVER['HTTP_CF_CONNECTING_IP'] ?? $_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP) ?: $_SERVER['REMOTE_ADDR'];
    
    // Proteção contra Stored XSS via User-Agent (limita tamanho e converte caracteres perigosos)
    $ua_cru = $_SERVER['HTTP_USER_AGENT'] ?? '';
    $ua_cliente = htmlspecialchars(substr($ua_cru, 0, 300), ENT_QUOTES, 'UTF-8');
    
    $script_atual = basename($_SERVER['SCRIPT_NAME']);
    $rotas_api = ['stream.php', 'streaming.php', 'xmltv.php'];
    $is_api = in_array($script_atual, $rotas_api);

    // --- BLOQUEIO A: ANTI-CURIOSOS DE NAVEGADOR ---
    if ($is_api) {
        $http_accept = strtolower($_SERVER['HTTP_ACCEPT'] ?? '');
        $apps_iptv = ['iptv', 'smarters', 'xciptv', '9xtream', 'vlc', 'exoplayer', 'libvlc', 'applecoremedia', 'stagefright', 'roku', 'tizen', 'kodi', 'smart-tv'];

        $is_app = false;
        foreach ($apps_iptv as $app) {
            if (stripos($ua_cliente, $app) !== false) {
                $is_app = true;
                break;
            }
        }

        if (!$is_app && strpos($http_accept, 'text/html') !== false && isset($_SERVER['HTTP_UPGRADE_INSECURE_REQUESTS'])) {
            header("HTTP/1.1 200 OK");
            header("Content-Type: text/html; charset=UTF-8");
            die("
            <!DOCTYPE html>
            <html>
            <head>
                <title>Acesso Restrito</title>
                <meta name='viewport' content='width=device-width, initial-scale=1.0'>
            </head>
            <body style='background-color: #121212; color: #ffffff; font-family: Arial, sans-serif; text-align: center; padding-top: 10%'>
                <h1 style='color: #e74c3c; font-size: 40px;'>ACESSO RESTRITO</h1>
                <p style='font-size: 18px; color: #aaaaaa;'>O acesso a este conteúdo via navegador web foi bloqueado por motivos de segurança.</p>
                <div style='margin-top: 30px; padding: 20px; background-color: #1e1e1e; display: inline-block; border-radius: 8px;'>
                    <p style='margin: 0; font-size: 16px;'>Por favor, insira seus dados diretamente no seu<br><b style='color: #3498db;'>Aplicativo de IPTV</b> ou <b style='color: #3498db;'>TV Box</b>.</p>
                </div>
            </body>
            </html>
            ");
        }
    }

    // --- BLOQUEIO B: LISTA NEGRA DE IP E USER AGENT ---
    $tabelas_seguranca = $pdoFirewall->query("SHOW TABLES LIKE 'blocked_ips'")->rowCount() > 0;
    
    if ($tabelas_seguranca) {
        // 1. Checa IP
        $stmtIp = $pdoFirewall->prepare("SELECT id FROM blocked_ips WHERE ip = ?");
        $stmtIp->execute([$ip_cliente]);
        if ($stmtIp->fetch()) {
            $pdoFirewall->prepare("UPDATE blocked_ips SET attempts_blocked = attempts_blocked + 1 WHERE ip = ?")->execute([$ip_cliente]);
            http_response_code(403); die("Acesso Bloqueado (IP Restrito).");
        }

        // 2. Checa User Agent
        $stmtUa = $pdoFirewall->prepare("SELECT id, user_agent, exact_match FROM blocked_user_agents");
        $stmtUa->execute();
        while ($rowUa = $stmtUa->fetch(PDO::FETCH_ASSOC)) {
            if ($rowUa['exact_match'] == 1) {
                if ($ua_cliente === $rowUa['user_agent']) {
                    $pdoFirewall->prepare("UPDATE blocked_user_agents SET attempts_blocked = attempts_blocked + 1 WHERE id = ?")->execute([$rowUa['id']]);
                    http_response_code(403); die("Acesso Bloqueado (App Restrito).");
                }
            } else {
                if (!empty($rowUa['user_agent']) && stripos($ua_cliente, $rowUa['user_agent']) !== false) {
                    $pdoFirewall->prepare("UPDATE blocked_user_agents SET attempts_blocked = attempts_blocked + 1 WHERE id = ?")->execute([$rowUa['id']]);
                    http_response_code(403); die("Acesso Bloqueado (App Restrito).");
                }
            }
        }
    }

} catch (Exception $e) {
    error_log("Erro no Firewall PHP: " . $e->getMessage());
}

// =========================================================================
// 5. SENSOR DO RADAR ANTI-SANGUESSUGA (ANTI-FRAUDE)
// =========================================================================
if (isset($_GET['username']) && isset($_GET['password']) && !isset($_SESSION['user_id'])) {
    try {
        $pdo_int = getConexaoInterna();
        $radar = $pdo_int->query("SELECT * FROM config_antifraude WHERE id = 1 LIMIT 1")->fetch(PDO::FETCH_ASSOC);
        
        if ($radar && $radar['status'] == 1) {
            $ip_atual = filter_var($_SERVER['HTTP_CF_CONNECTING_IP'] ?? $_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP) ?: $_SERVER['REMOTE_ADDR'];
            
            // FIM DO BYPASS: Usamos o REMOTE_ADDR para checar a conexão física real, impedindo spoofing de localhost
            $ip_conexao_fisica = $_SERVER['REMOTE_ADDR'];
            $ip_servidor = $_SERVER['SERVER_ADDR'] ?? '127.0.0.1';
            
            if ($ip_conexao_fisica !== $ip_servidor && $ip_conexao_fisica !== '127.0.0.1' && $ip_conexao_fisica !== '::1') {
                
                $pdo_sensor = getConexaoAtiva();
                
                $modo_ativo_sensor = defined('MODO_SISTEMA') ? MODO_SISTEMA : 'interno';
                $tabela_sensor = ($modo_ativo_sensor === 'xui') ? '`lines`' : '`users`';
                
                $user_req = trim($_GET['username']);
                $pass_req = trim($_GET['password']);
                $ua_atual = htmlspecialchars(substr($_SERVER['HTTP_USER_AGENT'] ?? 'Aparelho Desconhecido', 0, 255), ENT_QUOTES, 'UTF-8');
                $tempo_atual = time();
                
                $stmt_cli = $pdo_sensor->prepare("SELECT id, enabled, last_ip_connected, last_connect_time FROM $tabela_sensor WHERE username = ? AND password = ? LIMIT 1");
                $stmt_cli->execute([$user_req, $pass_req]);
                $cliente = $stmt_cli->fetch(PDO::FETCH_ASSOC);
                
                if ($cliente && $cliente['enabled'] == 1) {
                    $ip_antigo = $cliente['last_ip_connected'];
                    $tempo_antigo = $cliente['last_connect_time'];
                    $tolerancia = intval($radar['minutos_tolerancia']) * 60;
                    
                    if (!empty($ip_antigo) && $ip_antigo !== $ip_atual && ($tempo_atual - $tempo_antigo) < $tolerancia) {
                        $pdo_sensor->prepare("UPDATE $tabela_sensor SET enabled = 0 WHERE id = ?")->execute([$cliente['id']]);
                        $pdo_int->prepare("INSERT INTO logs_antifraude (cliente_id, cliente_user, ip_original, ip_invasor, aparelho) VALUES (?, ?, ?, ?, ?)")
                                ->execute([$cliente['id'], $user_req, $ip_antigo, $ip_atual, $ua_atual]);
                                
                        http_response_code(403);
                        die("Acesso Bloqueado. Sistema Anti-Fraude detectou compartilhamento de senha.");
                    } else {
                        if ($modo_ativo_sensor === 'xui') {
                            $pdo_sensor->prepare("UPDATE $tabela_sensor SET last_ip_connected = ?, last_connect_time = ? WHERE id = ?")
                                       ->execute([$ip_atual, $tempo_atual, $cliente['id']]);
                        } else {
                            $pdo_sensor->prepare("UPDATE $tabela_sensor SET last_ip_connected = ?, last_user_agent = ?, last_connect_time = ? WHERE id = ?")
                                       ->execute([$ip_atual, $ua_atual, $tempo_atual, $cliente['id']]);
                        }
                    }
                }
            }
        }
    } catch (Exception $e) {
        error_log("Erro no Sensor Anti-Fraude: " . $e->getMessage());
    }
}
?>
