Тема: PunBB - pun_stop_bots - убираем проверку при отправке сообщения
Так как данный форум построен на движке PunBB, то придется пилить и этот новый для меня движок.
А пилить пришлось прямо с первых минут использования
В данном посте расскажу о том, как рашить один неприятный момент, которые обнаружился буквально сегодня.
Дабы преградить различным ботам регистрацию на нашем форуме, я сразу установил расширение 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
Находим код, указанный в мануале выше, и удаляем
Сохраняем отредактированный файл
Загружаем папку с расширением в соответствии с инструкциями
Устанавливаем расширение
Добавляем вопросы и ответы в настройках расширения
Все готово - улыбаемся и машем!