[BETA] устранение проблем из-за ошибки ББ-кода hide/hide=

Здесь авторы могут постить бета-версии своих модификаций для phpBB 3.0.x. Внимание! Не устанавливайте бета-версии модов на работающие форумы!
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 9 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

[BETA] устранение проблем из-за ошибки ББ-кода hide/hide=

Сообщение c61 »

ВНИМАНИЕ !!!
Этот мод может понадобиться только если была допущена ошибка при работе с модом Adaptive Hide BBCode и установлен мод кэша для гостей и ботов.


Свежий пример:

1) есть конференция, на которой когда-то публиковались ссылки на файлы в файлообменниках

2) ссылки были скрыты от гостей и ботов ББ-кодом hide (есть такой мод адаптивного сокрытия), в котором была допущена ошибка при использовании - нет номера после "=", в результате чего получается текст:

Код: Выделить всё

[hide=]ссылка[/hide]
3) в связи с неплохой популярностью конференции установлен мод кэша для гостей и ботов

4) антивирусник на хостинге ругается на темы, где применён ошибочный ББ-код, поскольку кое-какие старые ссылки ведут на malware и т.п. радости

Если отключить кэш для гостей и ботов, антивирусник ничего плохого не говорит. Происходит это потому, что без мода кэша подстановочные данные - неверный hide= и ссылка - хранятся в других файлах и безобидны, а с кэшем они попадают в темплейт (что разумно сделано, ибо немного разгружает сервер). Вот получившийся темплейт вместе со вставкой ссылки и понимается антивирусной программой как некая зараза :-)

Итак, лечение простое - делаем хук-функцию:

Код: Выделить всё

<?php

//
// phpBB hook_antibadhide
// version 0.0.1 - 20131121
// copyright (c) 2013 c61 http://www.phpbbguru.net & http://c61.no-ip.org
// license http://opensource.org/licenses/gpl-license.php GNU Public License
//

if (!defined('IN_PHPBB'))
{
	exit;
}

function antibadhide()
{
	global $template;

	if(isset($template->_tpldata['postrow']))
	{
		// Применяем функцию do_antibadhide() к каждому члену массива postrow, содержащего тексты сообщений
		foreach($template->_tpldata['postrow'] as $key => $val)
		{
			do_antibadhide($template->_tpldata['postrow'][$key]['MESSAGE']);
		}
	} elseif (isset($template->_rootref))
	{
		// Применяем функцию do_antibadhide() к предпросмотру сообщения
		do_antibadhide($template->_rootref['PREVIEW_MESSAGE']);
	}
}

function do_antibadhide(&$item)
{
	global $user;

	if(!isset($item)) return;

	if(!($user->data['is_bot'] || ($user->data['user_id'] == ANONYMOUS))) return;

	// Разыскиваемые тэги
	// Будут исключены:
	// code   - это код и незачем...
	// script - скрипты тем более не трогаем
	$tags = array("code","script");
	$ent = array();
	foreach($tags as $tag)
	{
		// Поиск тэга
		if(preg_match_all("/(?=(<$tag.*?>(?>(?1)|.)*?<\/$tag>))/isu",$item,$matches,PREG_OFFSET_CAPTURE))
		{
			foreach($matches[1] as $match)
			{
				// Собираем вхождения тэгов в массив 'индекс' => 'длина'
				$ent[(int) $match[1]] = (int) strlen($match[0]);
			}
		}
	}
	// Добавляем пустышку - чтобы алгоритм обработал остатки текста за последним тэгом
	$ent[(int) strlen($item)] = (int) 0;

	// Сортируем по ключу, по возрастанию
	if(ksort($ent))
	{
		// Начальный индекс, новый текст
		$start = 0;
		$newtext = '';
		// Проход по всем вхождениям
		foreach($ent as $key => $val)
		{
			if($key > $start)	// Индекс больше стартового ?
			{
				// Да. Выделяем подстроку
				$substr = substr($item,$start,$key-$start);
				// Поиск [hide=]...[/hide]
				if(preg_match_all("/\[hide\=\].*?\[\/hide\]/isu",$substr,$matches,PREG_OFFSET_CAPTURE))
				{
					$search = array();
					$replace = array();
					foreach($matches[0] as $match)
					{
						// Коллекционируем поиски и замены
						$search[] = $match[0];
						$replace[] = ' ...hidden text... ';
					}
					// Проводим замены
					$substr = str_replace($search,$replace,$substr);
				}
				// Отправляем подстроку с заменами в результирующий текст
				$newtext .= $substr . ($val ? substr($item,$key,$val) : '');
				// Переопределяем начальный индекс
				$start = $key + $val;
			}
		}
		// Если всё нормально - переопределяем текст сообщения
		if($newtext != '')
		{
			$item = $newtext;
		}
	}
}

// Регистрируем хук
$phpbb_hook->register(array('template', 'display'), 'antibadhide');

?>
Теперь содержимое ошибочного hide= вместе с ББ-кодом заменяется на " ...hidden text... ", причём только для гостей и ботов, вошедшие на конференцию пользователи видят ошибку, это для того, чтобы администраторы и модераторы могли при желании исправить...

P.S. Так же лечится ошибка ghide= и любые подобные.
Аватара пользователя
Пчелкин
phpBB 3.3.0
Сообщения: 11361
Стаж: 16 лет 8 месяцев
Благодарил (а): 1832 раза
Поблагодарили: 1358 раз

Re: [BETA] устранение проблем из-за ошибки ББ-кода hide/hide

Сообщение Пчелкин »

Вот это весч!!! Феноменально!!! (извините, не сдержался, накипело)
NIKON-D90, AF-S 18-105, AF-S 14-24, AF-S 24-70
Аватара пользователя
BenDeen
phpBB 1.2.0
Сообщения: 16
Стаж: 12 лет 6 месяцев
Благодарил (а): 21 раз

Re: [BETA] устранение проблем из-за ошибки ББ-кода hide/hide

Сообщение BenDeen »

Прошу прощения, но куда это вставлять?
Аватара пользователя
xisp
phpBB 3.0.0 RC7
Сообщения: 1798
Стаж: 14 лет 4 месяца
Благодарил (а): 152 раза
Поблагодарили: 215 раз
Забанен: Бессрочно

Re: [BETA] устранение проблем из-за ошибки ББ-кода hide/hide

Сообщение xisp »

В файл с именем типа hook_hide.php, а этот файл положить в \includes\hooks\
phpBBex

Вернуться в «Бета-версии модов для phpBB 3.0.x»