Тема: PunBB - pun_stop_bots - убираем проверку при отправке сообщения

Так как данный форум построен на движке PunBB, то придется пилить и этот новый для меня движок.
А пилить пришлось прямо с первых минут использования smile

В данном посте расскажу о том, как рашить один неприятный момент, которые обнаружился буквально сегодня.
Дабы преградить различным ботам регистрацию на нашем форуме, я сразу установил расширение Stop spam from bots (pun_stop_bots). Суть расширения проста - при регистрации пользователя задается какой-то вопрос, на который надо ответить, короче, тупо система "вопрос-ответ".

Все бы ничего, если не одно НО - оказалось, что и после регистрации, при попытке ответить на форуме, пользователям приходится вводить ответ на вопрос. Что может быть тупее и как разработчики такое допустили - я не знаю, но факт есть факт!

Чтобы решить данную несправедливость проделаем несколько простейших шагов.


Если расширение уже установлено:

  • Удаляем расширение через админку (жмем кнопку "Удалить", а не "Отключить"). Внимание - все настройки и вопросы будут утеряны

  • Открываем файл /extensions/pun_stop_bots/manifest.xml

  • Находим следующий код (строка 173) и удаляем:

        <hook id="po_form_submitted"><![CDATA[
            if (!$forum_page['is_admmod'] && !isset($_POST['preview']))
            {
                include $ext_info['path'].'/functions.php';
                if (file_exists(FORUM_CACHE_DIR.'cache_pun_stop_bots.php'))
                    include FORUM_CACHE_DIR.'cache_pun_stop_bots.php';
                if (!defined('PUN_STOP_BOTS_CACHE_LOADED') || $pun_stop_bots_questions['cached'] < (time() - 43200))
                {
                    pun_stop_bots_generate_cache();
                    require FORUM_CACHE_DIR.'cache_pun_stop_bots.php';
                }
                if (file_exists($ext_info['path'].'/lang/'.$forum_user['language'].'/'.$ext_info['id'].'.php'))
                    include $ext_info['path'].'/lang/'.$forum_user['language'].'/'.$ext_info['id'].'.php';
                else
                    include $ext_info['path'].'/lang/English/'.$ext_info['id'].'.php';

                $pun_stop_bots_true_answer = FALSE;

                //Check up the cookie.
                if (isset($_COOKIE[PUN_STOP_BOTS_COOKIE_NAME]))
                    $pun_stop_bots_true_answer = pun_stop_bots_check_cookie();
                //Check up the entered question.
                else if (isset($_POST['pun_stop_bots_submit']))
                {
                    $query = array(
                        'SELECT'    => 'pun_stop_bots_question_id',
                        'FROM'        => $forum_user['is_guest'] ? 'online' : 'users',
                        'WHERE'        => $forum_user['is_guest'] ? 'ident = \''.$forum_user['ident'].'\'' : 'id = '.$forum_user['id']
                    );
                    $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
                    $row = $forum_db->fetch_assoc($result);

                    if ($row)
                        $question_id = $row['pun_stop_bots_question_id'];
                    else
                        message($lang_common['Bad request']);

                    $answer = isset($_POST['pun_stop_bots_answer']) ? forum_trim(strtolower($_POST['pun_stop_bots_answer'])) : null;
                    if (!empty($answer))
                        $pun_stop_bots_true_answer = pun_stop_bots_compare_answers($answer, $question_id);
                    else
                        $pun_stop_bots_true_answer = FALSE;
                    //Generate new question in case of incorrect answer.
                    if (!$pun_stop_bots_true_answer)
                        $new_question_id = $forum_user['is_guest'] ? pun_stop_bots_generate_guest_question_id() : pun_stop_bots_generate_user_question_id();
                }

                // If it is a user and answer is correct set new cookie.
                if (!$forum_user['is_guest'] && !isset($_COOKIE[PUN_STOP_BOTS_COOKIE_NAME]) && $pun_stop_bots_true_answer)
                {
                    $new_question_id = $forum_user['is_guest'] ? pun_stop_bots_generate_guest_question_id() : pun_stop_bots_generate_user_question_id();
                    pun_stop_bots_set_cookie($new_question_id);
                }
                else if ($forum_user['is_guest'] && $pun_stop_bots_true_answer)
                {
                    $query = array(
                        'UPDATE'    =>    'online',
                        'SET'        =>    'pun_stop_bots_question_id = NULL',
                        'WHERE'        =>    'ident = \''.$forum_user['ident'].'\''
                    );
                    $forum_db->query_build($query) or error(__FILE__, __LINE__);
                }
                else if (!$pun_stop_bots_true_answer)
                {
                    //If it is first request of the page, we need to generate new question.
                    if (!isset($new_question_id))
                        $new_question_id =  $forum_user['is_guest'] ? pun_stop_bots_generate_guest_question_id() : pun_stop_bots_generate_user_question_id();

                    $forum_page['crumbs'] = array(
                        array($forum_config['o_board_title'], forum_link($forum_url['index'])),
                        $lang_pun_stop_bots['Stop bots question legend']
                    );

                    $forum_page['form_handler'] = $_SERVER['REQUEST_URI'];
                    $forum_page['question'] = $pun_stop_bots_questions['questions'][$new_question_id]['question'];
                    $forum_page['hidden_fields'] = $_POST;

                    define('FORUM_PAGE', 'pun_stop_bots_page');
                    require FORUM_ROOT.'header.php';

                    // START SUBST - <!-- forum_main -->
                    ob_start();

                    include $ext_info['path'].'/views/question_page.php';

                    $tpl_temp = forum_trim(ob_get_contents());
                    $tpl_main = str_replace('<!-- forum_main -->', $tpl_temp, $tpl_main);
                    ob_end_clean();
                    // END SUBST - <!-- forum_main -->

                    require FORUM_ROOT.'footer.php';
                }
            }
        ]]></hook>
  • Сохраняем и загружаем отредактированный файл обратно на сервер

  • Заново устанавливаем расширение

  • Добавляем вопросы и ответы в настройках расширения


Если расширение еще не установлено:

  • Распаковываем архив с расширением на компьютер

  • Открываем файл manifest.xml

  • Находим код, указанный в мануале выше, и удаляем

  • Сохраняем отредактированный файл

  • Загружаем папку с расширением в соответствии с инструкциями

  • Устанавливаем расширение

  • Добавляем вопросы и ответы в настройках расширения


Все готово - улыбаемся и машем!

2 (25.01.2013 18:39 отредактировано OKyJIucT)

Re: PunBB - pun_stop_bots - убираем проверку при отправке сообщения

admin, подскажите пожалуйста, а где задается сам вопрос, на который придется отвечать при регистрации? В смысле, в каком файле его можно добавить?

Уже нашел) в БД оказывается.