<?php
$nonce = bin2hex(random_bytes(16));
header("Content-Security-Policy: base-uri 'self'; default-src 'self'; style-src 'self' https://fonts.googleapis.com https://code.ionicframework.com https://printjs-4de6.kxcdn.com; script-src 'self' https://printjs-4de6.kxcdn.com https://*.paystack.co https://cdn.jsdelivr.net; img-src 'self' data: ; media-src 'self'; font-src 'self' https://fonts.gstatic.com https://code.ionicframework.com; connect-src 'self' https://cdn.jsdelivr.net; worker-src 'self'; frame-src 'self' https://*.paystack.com; form-action 'self'; report-uri /includes/common/csp-report.php; report-to csp-report-group;");

define('INCLUDE_DIR', dirname(__FILE__) . '/includes/');
include(INCLUDE_DIR . 'common/route.inc.php');
include(INCLUDE_DIR . 'common/functions.php');
require_once INCLUDE_DIR . 'security/IncidentDetector.php';
require_once INCLUDE_DIR . 'security/RateLimiter.php';

try {
    if (!is_dir(INCLUDE_DIR . '259573')) {
        mkdir(INCLUDE_DIR . '259573', 0755, true);
    }
    $logFile = INCLUDE_DIR . '259573/' . date('d_m_Y') . '_incidents.log';
    $storageFile = INCLUDE_DIR . '259573/' . date('d_m_Y') . '_rate_limit_store.json';

    $logger = new IncidentLogger($logFile, $mysqliug);
    $detector = new IncidentDetector($logger);

    // Run all detectors
    if ($detector->detectSuspiciousInput()) {
        http_response_code(429);
        die("Malicious operation detected");
    }
    if ($detector->detectForbiddenPaths()) {
        http_response_code(429);
        die("Malicious operation detected");
    }
    if ($detector->detectInvalidHttpMethods()) {
        http_response_code(429);
        die("Malicious operation detected");
    }
    if ($detector->detectDangerousUploads()) {
        http_response_code(429);
        die("Malicious operation detected");
    }

    $rateLimiter = new RateLimiter(100, 60, $logger, $storageFile);

    if (!$rateLimiter->allow($rateLimiter->makeKey())) {
        http_response_code(429);
        die("Too Many Requests");
    }

    $rateLimiter = new RateLimiter(10, 300, $logger, $storageFile);

    $key = $rateLimiter->makeKey("login");

    if (!$rateLimiter->allow($key)) {
        http_response_code(429);
        die("Too Many Login Attempts. Try again later.");
    }

    if ($detector->detectBruteForce()) {
        http_response_code(429);
        die("Too Many Login Attempts. Try again later.");
    }

    $mode = Functions::getMode();
    $rules = routing();

    $uri = rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/');
    $uri = '/' . trim(str_replace($uri, '', $_SERVER['REQUEST_URI']), '/');
    $uri = urldecode($uri);
    //die($uri);
    if ($mode == 'PRODUCTION') {
        foreach ($rules as $action => $rule) {
            if (preg_match('~^' . $rule . '$~i', $uri, $params)) {
                $_POST['verification'] = $params['verification'];
                $_GET['name'] = $params['name'];
                if (file_exists(INCLUDE_DIR . $action . '.php')) {
                    include(INCLUDE_DIR . $action . '.php');
                    exit();
                }
            }
        }
    } else {
        include(INCLUDE_DIR . '598408/index.php');
        exit();
    }
    include(INCLUDE_DIR . '578764/index.php');
} catch (\Throwable $e) {
    $message = $e->getMessage() . " at " . $e->getFile() . ":" . $e->getLine() . "\n";
    error_log($message, 3, INCLUDE_DIR . "283644/system-level.log");
    http_response_code(500);
    die("System unavailable at the moment. Try again later.");
}
