<?php

/**
 * @return bool
 */
function protector_prepare()
{
    // check the access is from install/index.php
    if (defined('_INSTALL_CHARSET') && !is_writable(XOOPS_ROOT_PATH . '/mainfile.php')) {
        die('To use installer, remove protector\'s lines from mainfile.php first.');
    }

    // Protector class
    require_once dirname(__DIR__) . '/class/protector.php';

    // Protector object
    $protector = Protector::getInstance();
    $conf      = $protector->getConf();

    // bandwidth limitation
    if (@$conf['bwlimit_count'] >= 10) {
        $bwexpire = $protector->get_bwlimit();
        if ($bwexpire > time()) {
            header('HTTP/1.0 503 Service unavailable');
            $protector->call_filter('precommon_bwlimit', 'This website is very busy now. Please try later.');
        }
    }

    // bad_ips
    $bad_ips      = $protector->get_bad_ips(true);
    $bad_ip_match = $protector->ip_match($bad_ips);
    if ($bad_ip_match) {
        $protector->call_filter('precommon_badip', 'You are registered as BAD_IP by Protector.');
    }

    // global enabled or disabled
    if (!empty($conf['global_disabled'])) {
        return true;
    }

    // reliable ips
    $reliable_ips = @unserialize(@$conf['reliable_ips']);
    if (!is_array($reliable_ips)) {
        // for the environment of (buggy core version && magic_quotes_gpc)
        $reliable_ips = @unserialize(stripslashes(@$conf['reliable_ips']));
        if (!is_array($reliable_ips)) {
            $reliable_ips = array();
        }
    }
    $is_reliable = false;
    foreach ($reliable_ips as $reliable_ip) {
        if (!empty($reliable_ip) && preg_match('/' . $reliable_ip . '/', $_SERVER['REMOTE_ADDR'])) {
            $is_reliable = true;
        }
    }

    // "DB Layer Trapper"
    $force_override = strstr(@$_SERVER['REQUEST_URI'], 'protector/admin/index.php?page=advisory') ? true : false;
    // $force_override = true ;
    if ($force_override || !empty($conf['enable_dblayertrap'])) {
        @define('PROTECTOR_ENABLED_ANTI_SQL_INJECTION', 1);
        $protector->dblayertrap_init($force_override);
    }

    // "Big Umbrella" subset version
    if (!empty($conf['enable_bigumbrella'])) {
        @define('PROTECTOR_ENABLED_ANTI_XSS', 1);
        $protector->bigumbrella_init();
    }

    // force intval variables whose name is *id
    if (!empty($conf['id_forceintval'])) {
        $protector->intval_allrequestsendid();
    }

    // eliminate '..' from requests looks like file specifications
    if (!$is_reliable && !empty($conf['file_dotdot'])) {
        $protector->eliminate_dotdot();
    }

    // Check uploaded files
    if (!$is_reliable && !empty($_FILES) && !empty($conf['die_badext']) && !defined('PROTECTOR_SKIP_FILESCHECKER') && !$protector->check_uploaded_files()) {
        $protector->output_log($protector->last_error_type);
        $protector->purge();
    }

    // Variables contamination
    if (!$protector->check_contami_systemglobals()) {
        if (@$conf['contami_action'] & 4) {
            if (@$conf['contami_action'] & 8) {
                $protector->_should_be_banned = true;
            } else {
                $protector->_should_be_banned_time0 = true;
            }
            $_GET = $_POST = array();
        }

        $protector->output_log($protector->last_error_type);
        if (@$conf['contami_action'] & 2) {
            $protector->purge();
        }
    }

    // prepare for DoS
    //if ( ! $protector->check_dos_attack_prepare() ) {
    //    $protector->output_log( $protector->last_error_type , 0 , true ) ;
    //}

    if (!empty($conf['disable_features'])) {
        $protector->disable_features();
    }
    return null;
}
