Пример #1
0
 /**
  * Spam settings.
  */
 private function _spamSettings()
 {
     global $txt;
     require_once SUBSDIR . '/VerificationControls.class.php';
     // Build up our options array
     $config_vars = array(array('check', 'reg_verification'), array('check', 'search_enable_captcha'), 'guest_verify' => array('check', 'guests_require_captcha', 'postinput' => $txt['setting_guests_require_captcha_desc']), array('int', 'posts_require_captcha', 'postinput' => $txt['posts_require_captcha_desc'], 'onchange' => 'if (this.value > 0){ document.getElementById(\'guests_require_captcha\').checked = true; document.getElementById(\'guests_require_captcha\').disabled = true;} else {document.getElementById(\'guests_require_captcha\').disabled = false;}'), array('check', 'guests_report_require_captcha'), array('title', 'antispam_PM'), 'pm1' => array('int', 'max_pm_recipients', 'postinput' => $txt['max_pm_recipients_note']), 'pm2' => array('int', 'pm_posts_verification', 'postinput' => $txt['pm_posts_verification_note']), 'pm3' => array('int', 'pm_posts_per_hour', 'postinput' => $txt['pm_posts_per_hour_note']));
     $known_verifications = loadVerificationControls();
     foreach ($known_verifications as $verification) {
         $class_name = 'Verification_Controls_' . ucfirst($verification);
         $current_instance = new $class_name();
         $new_settings = $current_instance->settings();
         if (!empty($new_settings) && is_array($new_settings)) {
             foreach ($new_settings as $new_setting) {
                 $config_vars[] = $new_setting;
             }
         }
     }
     // @todo: it may be removed, it may stay, the two hooks may have different functions
     call_integration_hook('integrate_spam_settings', array(&$config_vars));
     return $config_vars;
 }
Пример #2
0
/**
 * Create a anti-bot verification control?
 *
 * @param mixed[] $verificationOptions
 * @param bool $do_test = false
 */
function create_control_verification(&$verificationOptions, $do_test = false)
{
    global $context;
    // We need to remember this because when failing the page is realoaded and the
    // code must remain the same (unless it has to change)
    static $all_instances = array();
    // Always have an ID.
    assert(isset($verificationOptions['id']));
    $isNew = !isset($context['controls']['verification'][$verificationOptions['id']]);
    if ($isNew) {
        $context['controls']['verification'][$verificationOptions['id']] = array('id' => $verificationOptions['id'], 'max_errors' => isset($verificationOptions['max_errors']) ? $verificationOptions['max_errors'] : 3, 'render' => false);
    }
    $thisVerification =& $context['controls']['verification'][$verificationOptions['id']];
    if (!isset($_SESSION[$verificationOptions['id'] . '_vv'])) {
        $_SESSION[$verificationOptions['id'] . '_vv'] = array();
    }
    $force_refresh = (!empty($_SESSION[$verificationOptions['id'] . '_vv']['did_pass']) || empty($_SESSION[$verificationOptions['id'] . '_vv']['count']) || $_SESSION[$verificationOptions['id'] . '_vv']['count'] > 3) && empty($verificationOptions['dont_refresh']);
    if (!isset($all_instances[$verificationOptions['id']])) {
        $known_verifications = loadVerificationControls();
        $all_instances[$verificationOptions['id']] = array();
        foreach ($known_verifications as $verification) {
            $class_name = 'Verification_Controls_' . ucfirst($verification);
            $current_instance = new $class_name($verificationOptions);
            // If there is anything to show, otherwise forget it
            if ($current_instance->showVerification($isNew, $force_refresh)) {
                $all_instances[$verificationOptions['id']][$verification] = $current_instance;
            }
        }
    }
    $instances =& $all_instances[$verificationOptions['id']];
    // Is there actually going to be anything?
    if (empty($instances)) {
        return false;
    } elseif (!$isNew && !$do_test) {
        return true;
    }
    $verification_errors = Error_Context::context($verificationOptions['id']);
    $increase_error_count = false;
    // Start with any testing.
    if ($do_test) {
        // This cannot happen!
        if (!isset($_SESSION[$verificationOptions['id'] . '_vv']['count'])) {
            fatal_lang_error('no_access', false);
        }
        foreach ($instances as $instance) {
            $outcome = $instance->doTest();
            if ($outcome !== true) {
                $increase_error_count = true;
                $verification_errors->addError($outcome);
            }
        }
    }
    // Any errors means we refresh potentially.
    if ($increase_error_count) {
        if (empty($_SESSION[$verificationOptions['id'] . '_vv']['errors'])) {
            $_SESSION[$verificationOptions['id'] . '_vv']['errors'] = 0;
        } elseif ($_SESSION[$verificationOptions['id'] . '_vv']['errors'] > $thisVerification['max_errors']) {
            $force_refresh = true;
        }
        // Keep a track of these.
        $_SESSION[$verificationOptions['id'] . '_vv']['errors']++;
    }
    // Are we refreshing then?
    if ($force_refresh) {
        // Assume nothing went before.
        $_SESSION[$verificationOptions['id'] . '_vv']['count'] = 0;
        $_SESSION[$verificationOptions['id'] . '_vv']['errors'] = 0;
        $_SESSION[$verificationOptions['id'] . '_vv']['did_pass'] = false;
    }
    foreach ($instances as $test => $instance) {
        $instance->createTest($force_refresh);
        $thisVerification['test'][$test] = $instance->prepareContext();
        if ($instance->hasVisibleTemplate()) {
            $thisVerification['render'] = true;
        }
    }
    $_SESSION[$verificationOptions['id'] . '_vv']['count'] = empty($_SESSION[$verificationOptions['id'] . '_vv']['count']) ? 1 : $_SESSION[$verificationOptions['id'] . '_vv']['count'] + 1;
    // Return errors if we have them.
    if ($verification_errors->hasErrors()) {
        // @todo temporary until the error class is implemented in register
        $error_codes = array();
        foreach ($verification_errors->getErrors() as $errors) {
            foreach ($errors as $error) {
                $error_codes[] = $error;
            }
        }
        return $error_codes;
    } elseif ($do_test) {
        $_SESSION[$verificationOptions['id'] . '_vv']['did_pass'] = true;
    }
    // Say that everything went well chaps.
    return true;
}