Подтверждения при массовом удалении работают неправильно

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
VEG
phpBB 2.0.7a
Сообщения: 609
Стаж: 20 лет 5 месяцев
Откуда: Минск
Благодарил (а): 20 раз
Поблагодарили: 141 раз

Подтверждения при массовом удалении работают неправильно

Сообщение VEG »

Возле каждого сообщения есть кнопка «Удалить». Допустим, я хочу удалить 3 сообщения из темы. Открываю 3 ссылки «Удалить» средней кнопкой мыши (открывается 3 вкладки с адресами вида http://slutsk.net/forum/posting.php?mod ... 9&p=100039), потом прохожусь по трем этим вкладкам и нажимаю там «Да», чем подтверждаю что я хочу удалить эти сообщения. НО! Удаляется только то сообщение, окно удаления которого я вызвал последним, в остальных же мне говорит «Извините, но вы можете удалять только ваши собственные сообщения». Когда же я удаляю все эти сообщения по одному, то все ок.
Пробовал на чистом phpBB3.0.2 без модов — эффект тот же.
Неужели это фича?

Добавлено спустя 15 минут 33 секунды:
При подтверждении передаются такие параметры:
posting.php?mode=delete&f=55&p=98604&confirm_key=4VR5XAMNHZ
Здесь очень интересен параметр confirm_key. Как я понимаю, он генерируется для каждого удаления свой, а в базе хранится только последний сгенерированный код подтверждения удаления. Я так понимаю, это сделано для того, чтобы усложнить удаление сообщений ботом. Спорная фича. Из-за этого появляется сильное неудобство с удалением сообщений. Может кто-нибудь писал мод, чтобы хранилось много ключей подтверждения (неограниченно, удалять их по времени).
Последний раз редактировалось VEG 19.07.2008 15:08, всего редактировалось 1 раз.
phpBBex 1.7.1 — phpBB 3 с уникальными функциями, не существующими в модах
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
Аватара пользователя
FladeX
Former team member
Сообщения: 1935
Стаж: 19 лет 3 месяца
Откуда: Саранск
Благодарил (а): 7 раз
Поблагодарили: 59 раз

Re: Удаление нескольких сообщений кнопкой «Удалить» не работает

Сообщение FladeX »

То есть в каждой вкладке браузера отмечено одно сообщение? :?
//
// Okay, let's do the loop, yeah come on baby let's do the loop
// and it goes like this ...
| phpBB Adept ] | Каталог форумов | генератор sitemap для форумов | форум про форумы
Аватара пользователя
VEG
phpBB 2.0.7a
Сообщения: 609
Стаж: 20 лет 5 месяцев
Откуда: Минск
Благодарил (а): 20 раз
Поблагодарили: 141 раз

Re: Удаление нескольких сообщений кнопкой «Удалить» не работает

Сообщение VEG »

Нет. Разные сообщения. Пример. Открываются ссылки (в этом порядке):
http://slutsk.net/forum/posting.php?mod ... 55&p=98444
http://slutsk.net/forum/posting.php?mod ... 55&p=98446
http://slutsk.net/forum/posting.php?mod ... 55&p=98451
http://slutsk.net/forum/posting.php?mod ... 55&p=98455
Теперь в каком бы порядке я не нажимал в этих окнах кнопку «Да», удалится сообщение только по последней ссылке, а во всех остальных мне скажет, что я могу удалять только свои сообщения.
Попробуйте на своем форуме. Эффект должен быть тот же.
phpBBex 1.7.1 — phpBB 3 с уникальными функциями, не существующими в модах
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
Аватара пользователя
izstas
phpBB 1.4.4
Сообщения: 112
Стаж: 19 лет 6 месяцев
Откуда: Елец
Поблагодарили: 2 раза

Re: Удаление нескольких сообщений кнопкой «Удалить» не работает

Сообщение izstas »

Подтверждаю, у меня так же.
Аватара пользователя
VEG
phpBB 2.0.7a
Сообщения: 609
Стаж: 20 лет 5 месяцев
Откуда: Минск
Благодарил (а): 20 раз
Поблагодарили: 141 раз

Re: Подтверждения при массовом удалении работают неправильно

Сообщение VEG »

Похоже, это проблема всех скриптов форума, где есть удаление. Например, в панели администратора смайлики удаляются тоже с confirm_key, то есть если я открою удаление сразу 3 смайликов, удалится только последний.
Что за фигня? :x
Кто-нибудь в баг-репорты отправит?

Добавлено спустя 10 минут 42 секунды:
Похоже, что этот confirm_key один на пользователя. Открываю окно удаления сообщения, затем открываю окно удаления смайла. Кликаю подтверждение удаления сообщения — оно не удаляется.

Добавлено спустя 8 минут 13 секунд:
В таблице пользователей есть поле user_last_confirm_key — сюда записывается одно последнее значение confirm_key.
К счастью, за всю эту ерунду отвечает одна функция confirm_box в functions.php — ее и нужно править, чтобы решить проблему. Кто-нибудь занимался этим?
Сейчас я могу предложить простое решение:

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

OPEN includes/functions.php

FIND
if ($user_id != $user->data['user_id'] || $session_id != $user->session_id || !$confirm_key || !$user->data['user_last_confirm_key'] || $confirm_key != $user->data['user_last_confirm_key'])

REPLACE
if ($user_id != $user->data['user_id'] || $session_id != $user->session_id || !$confirm_key)
Оно отключает эту багофичу. Но хотелось бы лучшее решение, когда эти коды подтверждения все же использовались, но для хранения кодов использовалась бы дополнительная таблица. Попробую заняться этим вечером.
phpBBex 1.7.1 — phpBB 3 с уникальными функциями, не существующими в модах
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
Аватара пользователя
izstas
phpBB 1.4.4
Сообщения: 112
Стаж: 19 лет 6 месяцев
Откуда: Елец
Поблагодарили: 2 раза

Re: Подтверждения при массовом удалении работают неправильно

Сообщение izstas »

На phpbb.com нашёл тему, правда по двойке - вроде бы это таблица CAPTCH'и. Так что придётся делать отдельную таблицу.
Аватара пользователя
VEG
phpBB 2.0.7a
Сообщения: 609
Стаж: 20 лет 5 месяцев
Откуда: Минск
Благодарил (а): 20 раз
Поблагодарили: 141 раз

Re: Подтверждения при массовом удалении работают неправильно

Сообщение VEG »

Сделал. Как и хотелось — для каждого пользователя сохраняется неограниченное количество кодов подтверждения, каждый код хранится 15 минут, после чего становится недействительным и удаляется из базы.
Что у меня получилось вы видите ниже. Если не будет обнаружено проблем — оформлю в виде мода.
Может быть стоит отправить разработчикам phpbb? По мне так ляп очень неприятный, для пользователя выглядит как баг, хотя это и особенность реализации. Исправить нужно обязательно.

Внимание! В коде комментарии на русском языке, чтобы все работало сохраняйте php файл в UTF-8 без BOM или удалите комментарии

SQL

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

CREATE TABLE IF NOT EXISTS `phpbb_user_confirm_keys` (
  `confirm_key` varchar(10) NOT NULL,
  `user_id` mediumint(8) NOT NULL,
  `confirm_time` int(11) NOT NULL,
  PRIMARY KEY  (`confirm_key`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
OPEN

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

includes/constants.php
FIND

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

// Additional tables
ADD AFTER

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

define('USER_CONFIRM_KEYS_TABLE',	$table_prefix . 'user_confirm_keys');
OPEN

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

includes/functions.php
FIND

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

	if ($check && $confirm)
	{
		$user_id = request_var('user_id', 0);
		$session_id = request_var('sess', '');
		$confirm_key = request_var('confirm_key', '');

		if ($user_id != $user->data['user_id'] || $session_id != $user->session_id || !$confirm_key || !$user->data['user_last_confirm_key'] || $confirm_key != $user->data['user_last_confirm_key'])
		{
			return false;
		}

		// Reset user_last_confirm_key
		$sql = 'UPDATE ' . USERS_TABLE . " SET user_last_confirm_key = ''
			WHERE user_id = " . $user->data['user_id'];
		$db->sql_query($sql);

		return true;
	}
REPLACE

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

	// Удаляем из базы ключи, которым больше 15 минут
	$sql = "DELETE FROM " . USER_CONFIRM_KEYS_TABLE . " 
		WHERE confirm_time < " . (time() - 900);
	$db->sql_query($sql);

	if ($check && $confirm)
	{
		$user_id = request_var('user_id', 0);
		$session_id = request_var('sess', '');
		$confirm_key = request_var('confirm_key', '');
		if ($user_id != $user->data['user_id'] || $session_id != $user->session_id || !$confirm_key) return false;

		// Проверяем, есть ли предоставленный ключ подтверждения в базе
		$sql = "SELECT * FROM " . USER_CONFIRM_KEYS_TABLE . " 
			WHERE user_id = " . $user->data['user_id'] . " AND confirm_key = '" . $db->sql_escape($confirm_key) . "'";
		$result = $db->sql_query($sql);
		if(!$db->sql_fetchrow($result)) return false;
		
		// Удаляем использованный ключ
		$sql = "DELETE FROM " . USER_CONFIRM_KEYS_TABLE . " 
			WHERE user_id = " . $user->data['user_id'] . " AND confirm_key = '" . $db->sql_escape($confirm_key) . "'";
		$db->sql_query($sql);

		return true;
	}
FIND

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

	$sql = 'UPDATE ' . USERS_TABLE . " SET user_last_confirm_key = '" . $db->sql_escape($confirm_key) . "'
		WHERE user_id = " . $user->data['user_id'];
	$db->sql_query($sql);
REPLACE

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

	// Записываем новый ключ подтверждения в таблицу
	$data = array(
		'confirm_key'	=> $confirm_key,
		'user_id'		=> (int) $user->data['user_id'],
		'confirm_time'	=> (int) time(),
	);
	$sql = 'INSERT INTO ' . USER_CONFIRM_KEYS_TABLE . ' ' . $db->sql_build_array('INSERT', $data);
	$db->sql_query($sql);
Последний раз редактировалось VEG 10.08.2008 8:30, всего редактировалось 1 раз.
phpBBex 1.7.1 — phpBB 3 с уникальными функциями, не существующими в модах
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)
Аватара пользователя
VEG
phpBB 2.0.7a
Сообщения: 609
Стаж: 20 лет 5 месяцев
Откуда: Минск
Благодарил (а): 20 раз
Поблагодарили: 141 раз

Re: Подтверждения при массовом удалении работают неправильно

Сообщение VEG »

Вот что пишут авторы phpbb по этому поводу
Acyd Burn писал(а):The confirm box is a secure way of requesting an action - due to it's mechanism you are only able to confirm one action at a time, once another confirm box is opened all previous "confirmations" become invalid - this is to protect the admin to not being tricked into performing any malicious action.
I suggest you do not let the confirm box open - effectively skipping your second step.
У них паранойя. Такой простой вещью они сильно снижают удобство управления большим форумом. Кто-нибудь может привести пример, где можно в нехороших целях использовать то, что можно одновременно делать подтверждения нескольким действиям?
Даже на такую мелочь нужно делать мод :lol:
phpBBex 1.7.1 — phpBB 3 с уникальными функциями, не существующими в модах
phpBB [ media ] — универсальный bbcode для вставки аудио и видео (поддержка более 30 сервисов, без правок кода)

Вернуться в «Поддержка phpBB 3.0.х»