Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

«Нельзя отредактировать это сообщение, поскольку время, отведенное на редактиров

Автор wandrien, сентября 25, 2017, 14:27

0 Пользователи и 1 гость просматривают эту тему.

wandrien

«Нельзя отредактировать это сообщение, поскольку время, отведенное на редактирование, истекло.»

Версии движка меняются, а суть остаётся. Как и годы назад, в Блоруме и в Конлангах, топикстартер всё так же может редактировать чужие сообщения, но не может свои.

У меня есть навыки программирования, линукс-машина и достаточно злости на это вредное насекомое. У вас есть хостинг с бажным кодом. Ты на суше, я на море — нам не встретимся никак?

Bhudh

Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

wandrien


Bhudh

Если баг в коде движка, который можно установить на любой удовлетворяющий его требованиям сервер — какая разница, какой хостер содержит этот сервер и кто его владелец?
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

wandrien

Да, что-то я позабыл, на каком я сайте общаюсь.

— Я правильно интерпретирую семантику вопроса, но полностью игнорирую его суть.
— Не могли бы вы привести пример?
— Мог бы.

RawonaM

Цитата: wandrien от У меня есть навыки программирования, линукс-машина и достаточно злости на это вредное насекомое. У вас есть хостинг с бажным кодом. Ты на суше, я на море — нам не встретимся никак?
В чем проблема? Идете на сайт движка, ссылка внизу страницы, патчите, сабмитите и ждете когда выйдет релиз, затем ЛФ обновится.

wandrien

Цитата: RawonaM от октября  6, 2017, 11:51
Цитата: wandrien от У меня есть навыки программирования, линукс-машина и достаточно злости на это вредное насекомое. У вас есть хостинг с бажным кодом. Ты на суше, я на море — нам не встретимся никак?
В чем проблема? Идете на сайт движка, ссылка внизу страницы, патчите, сабмитите и ждете когда выйдет релиз, затем ЛФ обновится.
Я не настолько заинтересован в этом фиксе, чтобы идти длинным путём через разработчиков и багтрекер. Если учесть возраст бага, можно предположить, что этот фикс могут принять примерно никогда.
Очевидно, вы также не настолько заинтересованы в этом фиксе, чтобы накатывать патчи не от разработчиков.

Ок, вопрос прояснён.

RawonaM

Цитата: wandrien от октября  6, 2017, 12:31
Цитата: RawonaM от октября  6, 2017, 11:51
Цитата: wandrien от У меня есть навыки программирования, линукс-машина и достаточно злости на это вредное насекомое. У вас есть хостинг с бажным кодом. Ты на суше, я на море — нам не встретимся никак?
В чем проблема? Идете на сайт движка, ссылка внизу страницы, патчите, сабмитите и ждете когда выйдет релиз, затем ЛФ обновится.
Я не настолько заинтересован в этом фиксе, чтобы идти длинным путём через разработчиков и багтрекер. Если учесть возраст бага, можно предположить, что этот фикс могут принять примерно никогда.
Очевидно, вы также не настолько заинтересованы в этом фиксе, чтобы накатывать патчи не от разработчиков.
Почему ж нет, оттуда можете взять код и пофискить, пришлите нам патч, скорее всего это будет насколько маленькое изменение, что код можно запостить в этой теме.


kemerover

Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 4 раза в одном файле.

if ($row['approved'] && !empty($modSettings['edit_disable_time']) && $row['poster_time'] + ($modSettings['edit_disable_time'] + 5) * 60 time())
	
fatal_lang_error('modify_post_time_passed'false);
elseif (
$row['id_member_poster'] == $user_info['id'] && !allowedTo('modify_own'))
	
isAllowedTo('modify_replies');
else
	
isAllowedTo('modify_own');

Bhudh

Когда экономят на булевых переменных...
'can_modify' => (!$context['is_locked'] || allowedTo('moderate_board')) && (allowedTo('modify_any') || (allowedTo('modify_replies') && $context['user']['started']) || (allowedTo('modify_own') && $message['id_member'] == $user_info['id'] && (empty($modSettings['edit_disable_time']) || !$message['approved'] || $message['poster_time'] + $modSettings['edit_disable_time'] * 60 time())))
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

wandrien

Цитата: kemerover от октября  6, 2017, 15:30
https://github.com/SimpleMachines/SMF2.1/search?q=modify_post_time_passed
Воа!

Интересно. Поискал код, который определяет, показывать ли кнопку правки поста.
https://github.com/SimpleMachines/SMF2.1/search?utf8=✓&q='can_modify'&type=

Вот такое условие:

(!$context['is_locked'] || allowedTo('moderate_board')) && (allowedTo('modify_any') || (allowedTo('modify_replies') && $context['user']['started']) || (allowedTo('modify_own') && $message['id_member'] == $user_info['id'] && (empty($modSettings['edit_disable_time']) || !$message['approved'] || $message['poster_time'] + $modSettings['edit_disable_time'] * 60 time())))
(Мда, с таким стилем и обфускатор не нужен.)
Что превращается в:

(!$context['is_locked'] || allowedTo('moderate_board'))
&&
(
    
allowedTo('modify_any')
    ||
    (
allowedTo('modify_replies') && $context['user']['started'])
    ||
    (
        
allowedTo('modify_own')
        &&
        
$message['id_member'] == $user_info['id']
        &&
        (
            empty(
$modSettings['edit_disable_time'])
            ||
            !
$message['approved']
            ||
            
$message['poster_time'] + $modSettings['edit_disable_time'] * 60 time()
        )
    )
)


Теперь находим, где проверяется post-запрос: https://github.com/SimpleMachines/SMF2.1/blob/a9a826e2da61ddb5e12be2c7b684529cb46dc24d/Sources/Post.php#L607


if ($row['id_member'] == $user_info['id'] && !allowedTo('modify_any'))
{
	
// Give an extra five minutes over the disable time threshold, so they can type - assuming the post is public.
	
if (
$row['approved'] && !empty($modSettings['edit_disable_time']) && $row['poster_time'] + ($modSettings['edit_disable_time'] + 5) * 60 time())
	
	
fatal_lang_error('modify_post_time_passed'false);
	
elseif (
$row['id_member_poster'] == $user_info['id'] && !allowedTo('modify_own'))
	
	
isAllowedTo('modify_replies');
	
else
	
	
isAllowedTo('modify_own');
}
elseif (
$row['id_member_poster'] == $user_info['id'] && !allowedTo('modify_any'))
	
isAllowedTo('modify_replies');
else
	
isAllowedTo('modify_any');


Видимо, где-то здесь ошибка в логике. Придётся ставить, дальше так не понять.

wandrien

Цитата: kemerover от октября  6, 2017, 15:52
Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 4 раза в одном файле.
Забудьте слово логика, когда дело касается PHP. :)

wandrien

Цитата: kemerover от октября  6, 2017, 15:52
Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 4 раза в одном файле.

if ($row['approved'] && !empty($modSettings['edit_disable_time']) && $row['poster_time'] + ($modSettings['edit_disable_time'] + 5) * 60 time())
	
fatal_lang_error('modify_post_time_passed'false);
elseif (
$row['id_member_poster'] == $user_info['id'] && !allowedTo('modify_own'))
	
isAllowedTo('modify_replies');
else
	
isAllowedTo('modify_own');

Ну дык:
Если время прошло, то ошибка.
Иначе если текущий юзер автор темы...

На первый взгляд, это и есть ошибка. Но надо проверять.

wandrien

Цитата: Bhudh от октября  6, 2017, 16:01
Когда экономят на булевых переменных...
Я бы сказал, когда у людей нет ни образования, ни чувства прекрасного.

Wolliger Mensch

Цитата: wandrien от сентября 25, 2017, 14:27
Нельзя отредактировать это сообщение, поскольку время, отведенное на редактиров

Offtop
Каждый раз, читая название ветки, думаю — кто такие эти редактиры? :what: ;D
«Вот интересно, каких лингвистических жемчуг можно найти в море отодвинутых книг», Ян Гавлиш.
«Впредь прошу помнить, что придумал игру не для любых ассоциаций, а для семантически оправданных. Например, чтó это такое: ,,рулетке" — ,,выпечке"?? Тем более, что сей ляпсус я сам совершил...», Марбол
«Ветхий Завет написан на иврите и частично на армейском», Vesle Anne
«МЛ(ять)КО ... ПЛ(ять)NЪ», Тася
«Вот откроет этот спойлер, например, Марго, ничего не подозревая, а потом будут по всему форуму блюющие смайлики...», Авал
«Томан приличный мужчина. Правда по патриархальным меркам слегка голодранец», Vesle Anne
«Возможен ли фонетический переход "ж" в "п с придыханием"», forest

kemerover

Цитата: wandrien от октября  6, 2017, 16:39
Цитата: kemerover от октября  6, 2017, 15:52
Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 4 раза в одном файле.

if ($row['approved'] && !empty($modSettings['edit_disable_time']) && $row['poster_time'] + ($modSettings['edit_disable_time'] + 5) * 60 time())
	
fatal_lang_error('modify_post_time_passed'false);
elseif (
$row['id_member_poster'] == $user_info['id'] && !allowedTo('modify_own'))
	
isAllowedTo('modify_replies');
else
	
isAllowedTo('modify_own');

Ну дык:
Если время прошло, то ошибка.
Иначе если текущий юзер автор темы...

На первый взгляд, это и есть ошибка. Но надо проверять.
Ну что ошибка, если время прошло, это понятно. А дальше логика не ясна.
Если текущий юзер автор сообщения и не может изменять свои сообщения, то разрешить ему изменять ответы?

wandrien

Цитата: kemerover от октября  7, 2017, 11:23
Цитата: wandrien от октября  6, 2017, 16:39
Цитата: kemerover от октября  6, 2017, 15:52
Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 4 раза в одном файле.

if ($row['approved'] && !empty($modSettings['edit_disable_time']) && $row['poster_time'] + ($modSettings['edit_disable_time'] + 5) * 60 time())
	
fatal_lang_error('modify_post_time_passed'false);
elseif (
$row['id_member_poster'] == $user_info['id'] && !allowedTo('modify_own'))
	
isAllowedTo('modify_replies');
else
	
isAllowedTo('modify_own');

Ну дык:
Если время прошло, то ошибка.
Иначе если текущий юзер автор темы...

На первый взгляд, это и есть ошибка. Но надо проверять.
Ну что ошибка, если время прошло, это понятно. А дальше логика не ясна.
Если текущий юзер автор сообщения и не может изменять свои сообщения, то разрешить ему изменять ответы?
Там названия функций такие "говорящие", шо капец:
allowedTo - проверяет права и возвращает булево значение.
isAllowedTo - проверяет права и генерирует сообщение об ошибке, если прав нет.
Как вообще в голову приходят такие названия?  :???

Надо посмотреть, как именно устанавливаются  modify_replies, modify_any и modify_own, и что они означают. (Что теоретически должны и как на самом деле.) Должен ли modify_replies давать права на правку своих сообщений в теме? По логике здравого смысла - да. А сейчас получается, что чужие сообщения править можно, а свои - нельзя, т.к. фейлится проверка таймаута.

У меня пока не было времени установить двигло, может быть, завтра найдётся. (Сказал я, вернувшись с корпоратива.  :pop: )

RawonaM

Работа идет  ;up:

Когда будет результат, пришлите ЛС на всякий случай, я редко сюда заглядываю :)

Easyskanker

Цитата: wandrien от сентября 25, 2017, 14:27
«Нельзя отредактировать это сообщение, поскольку время, отведенное на редактирование, истекло.»

Версии движка меняются, а суть остаётся. Как и годы назад, в Блоруме и в Конлангах, топикстартер всё так же может редактировать чужие сообщения, но не может свои.
У меня нет функции редактировать чужие сообщения в блоруме и конлангах. Может, у вас там модераторские права? Вообще, фича с коротким временем на редактирование хорошая, потому как время изменения сообщения не пишется, соответственно легко выставить собеседника дураком, меняя свои сообщения. Иногда это выходит невольно даже при небольшом отведенном времени.

Bhudh

Цитата: Easyskanker от октября 10, 2017, 18:58У меня нет функции редактировать чужие сообщения в блоруме и конлангах. Может, у вас там модераторские права?
Видимо, Вы пропустили слово «топикстартер». В своих темах он модератор, в чужих — нет.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Easyskanker

Спасибо, теперь вижу, в чем проблема. Видимо, с 2016 года ввели такую функцию, а я не обратил внимание.

wandrien

Вот такой инженерный хоррор повторяется с небольшими вариациями в 4 или 5 местах в одном файле:


if ($row['id_member'] == $user_info['id'] && !allowedTo('modify_any'))
{
	
if ((!
$modSettings['postmod_active'] || $row['approved']) && !empty($modSettings['edit_disable_time']) && $row['poster_time'] + ($modSettings['edit_disable_time'] + 5) * 60 time())
	
	
fatal_lang_error('modify_post_time_passed'false);
	
elseif (
$topic_info['id_member_started'] == $user_info['id'] && !allowedTo('modify_own'))
	
	
isAllowedTo('modify_replies');
	
else
	
	
isAllowedTo('modify_own');
}
elseif (
$topic_info['id_member_started'] == $user_info['id'] && !allowedTo('modify_any'))
{
	
isAllowedTo('modify_replies');
	
	
// If you're modifying a reply, I say it better be logged...
	
$moderationAction true;
}
else
{
	
isAllowedTo('modify_any');
	
	
// Log it, assuming you're not modifying your own post.
	
if (
$row['id_member'] != $user_info['id'])
	
	
$moderationAction true;
}


Код не просто неправильно спроектирован, а весь целиком состоит из WTF-ов и фейспальмов. При его чтении возникают странные разные мысли... то хочется накатить водяры и пойти по бабам, то купить ружьё и уехать на поиска автора. Но надо его как-то фиксить.

Вчера весь вечер ломал голову, как это можно пофиксить малой кровью - изменением как можно меньшего числа строк.

Если в самом первом условии мы дописываем && !allowedTo('modify_replies'), то получаем побочный эффект в виде лишнего журналирования действий модерации, когда пользователь изменяет свои сообщения в блого-темах до истечения таймаута.

Если править код внутри первой ветки if-ов, то кровь кишки ужас надо переписать весь этот блок.

Но видимо, так и сделаю. И так в 5-ти местах. В общем патч простого бага не будет выглядеть очевидным и простым. Боже, покарай идиотов.

RawonaM

Цитата: wandrien от января 26, 2019, 08:10
Если в самом первом условии мы дописываем && !allowedTo('modify_replies'), то получаем побочный эффект в виде лишнего журналирования действий модерации, когда пользователь изменяет свои сообщения в блого-темах до истечения таймаута.
Думаю это незначительный побочный эффект. Главное патч затрагивает как можно меньше кода. Если апстрим апдейт и этот код будут конфликтовать, потом не обязательно найдётся время разбираться, скорее либо апдейт либо патч придётся оставить.

wandrien

В таком виде патч получается простым. В 4-х местах изменяется по 1 строке:


diff 
--git a/Sources/Post.php b/Sources/Post.php
index 4db6106
..7a67f00 100644
--- a/Sources/Post.php
+++ b/Sources/Post.php
@@ -638,+638,@@ function Post()
 
	
	
	
	
$attachment_stuff[] = $row2;
 
	
	
	
$smcFunc['db_free_result']($request);
 
-
	
	
	
if (
$row['id_member'] == $user_info['id'] && !allowedTo('modify_any'))
+
	
	
	
if (
$row['id_member'] == $user_info['id'] && !allowedTo('modify_any') && !allowedTo('modify_replies'))
 
	
	
	
{
 
	
	
	
	
// Give an extra five minutes over the disable time threshold, so they can type - assuming the post is public.
 
	
	
	
	
if (
$row['approved'] && !empty($modSettings['edit_disable_time']) && $row['poster_time'] + ($modSettings['edit_disable_time'] + 5) * 60 time())
@@ -
741,+741,@@ function Post()
 
	
	
	
$attachment_stuff[] = $row2;
 
	
	
$smcFunc['db_free_result']($request);
 
-
	
	
if (
$row['id_member'] == $user_info['id'] && !allowedTo('modify_any'))
+
	
	
if (
$row['id_member'] == $user_info['id'] && !allowedTo('modify_any') && !allowedTo('modify_replies'))
 
	
	
{
 
	
	
	
// Give an extra five minutes over the disable time threshold, so they can type - assuming the post is public.
 
	
	
	
if (
$row['approved'] && !empty($modSettings['edit_disable_time']) && $row['poster_time'] + ($modSettings['edit_disable_time'] + 5) * 60 time())
@@ -
1438,+1438,@@ function Post2()
 
	
	
if (isset(
$_POST['sticky']) && (!allowedTo('make_sticky') || $_POST['sticky'] == $topic_info['is_sticky']))
 
	
	
	
unset(
$_POST['sticky']);
 
-
	
	
if (
$row['id_member'] == $user_info['id'] && !allowedTo('modify_any'))
+
	
	
if (
$row['id_member'] == $user_info['id'] && !allowedTo('modify_any') && !allowedTo('modify_replies'))
 
	
	
{
 
	
	
	
if ((!
$modSettings['postmod_active'] || $row['approved']) && !empty($modSettings['edit_disable_time']) && $row['poster_time'] + ($modSettings['edit_disable_time'] + 5) * 60 time())
 
	
	
	
	
fatal_lang_error('modify_post_time_passed'false);
@@ -
2684,+2684,@@ function JavaScriptModify()
 
	
	
if (!empty(
$row['locked']))
 
	
	
	
isAllowedTo('moderate_board');
 
-
	
	
if (
$row['id_member'] == $user_info['id'] && !allowedTo('modify_any'))
+
	
	
if (
$row['id_member'] == $user_info['id'] && !allowedTo('modify_any') && !allowedTo('modify_replies'))
 
	
	
{
 
	
	
	
if ((!
$modSettings['postmod_active'] || $row['approved']) && !empty($modSettings['edit_disable_time']) && $row['poster_time'] + ($modSettings['edit_disable_time'] + 5) * 60 time())
 
	
	
	
	
fatal_lang_error('modify_post_time_passed'false);


(Еще комментарии с 'mymod ...' добавлю в код, что-то я упустил этот момент. )

~~~

Вот так выглядит логгирование при правке сообщений на ванильном движке:


                            Блоггер      Модератор
Свой пост до таймаута       -            -
Свой пост после таймаута    (ошибка)     -
Чужой пост                  лог          лог


Вот так стало после патча:


                            Блоггер      Модератор
Свой пост до таймаута       лог          -
Свой пост после таймаута    лог          -
Чужой пост                  лог          лог


А в идеале, полагаю, должно быть так:


                            Блоггер      Модератор
Свой пост до таймаута       -            -
Свой пост после таймаута    лог          лог
Чужой пост                  лог          лог


Предлагаю изменение логики логгирования добавить отдельным патчем. Он не будет связан с этим и встанет в другую часть кода. Патч тоже будет простой.


Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр