/** * 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; }
/** * 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; }