«Нельзя отредактировать это сообщение, поскольку время, отведенное на редактирование, истекло.»
Версии движка меняются, а суть остаётся. Как и годы назад, в Блоруме и в Конлангах, топикстартер всё так же может редактировать чужие сообщения, но не может свои.
У меня есть навыки программирования, линукс-машина и достаточно злости на это вредное насекомое. У вас есть хостинг с бажным кодом. Ты на суше, я на море — нам не встретимся никак?
Цитата: wandrien от сентября 25, 2017, 14:27У вас есть хостинг с бажным кодом.
Ну хостинг-то тут при чём?
Цитата: Bhudh от сентября 25, 2017, 15:51
Цитата: wandrien от сентября 25, 2017, 14:27У вас есть хостинг с бажным кодом.
Ну хостинг-то тут при чём?
При том, что у него есть владелец. Ну а дальше по газмановской песне...
Если баг в коде движка, который можно установить на любой удовлетворяющий его требованиям сервер — какая разница, какой хостер содержит этот сервер и кто его владелец?
Да, что-то я позабыл, на каком я сайте общаюсь.
— Я правильно интерпретирую семантику вопроса, но полностью игнорирую его суть.
— Не могли бы вы привести пример?
— Мог бы.
Цитата: wandrien от У меня есть навыки программирования, линукс-машина и достаточно злости на это вредное насекомое. У вас есть хостинг с бажным кодом. Ты на суше, я на море — нам не встретимся никак?
В чем проблема? Идете на сайт движка, ссылка внизу страницы, патчите, сабмитите и ждете когда выйдет релиз, затем ЛФ обновится.
Цитата: RawonaM от октября 6, 2017, 11:51
Цитата: wandrien от У меня есть навыки программирования, линукс-машина и достаточно злости на это вредное насекомое. У вас есть хостинг с бажным кодом. Ты на суше, я на море — нам не встретимся никак?
В чем проблема? Идете на сайт движка, ссылка внизу страницы, патчите, сабмитите и ждете когда выйдет релиз, затем ЛФ обновится.
Я не настолько заинтересован в этом фиксе, чтобы идти длинным путём через разработчиков и багтрекер. Если учесть возраст бага, можно предположить, что этот фикс могут принять примерно никогда.
Очевидно, вы также не настолько заинтересованы в этом фиксе, чтобы накатывать патчи не от разработчиков.
Ок, вопрос прояснён.
Цитата: wandrien от октября 6, 2017, 12:31
Цитата: RawonaM от октября 6, 2017, 11:51
Цитата: wandrien от У меня есть навыки программирования, линукс-машина и достаточно злости на это вредное насекомое. У вас есть хостинг с бажным кодом. Ты на суше, я на море — нам не встретимся никак?
В чем проблема? Идете на сайт движка, ссылка внизу страницы, патчите, сабмитите и ждете когда выйдет релиз, затем ЛФ обновится.
Я не настолько заинтересован в этом фиксе, чтобы идти длинным путём через разработчиков и багтрекер. Если учесть возраст бага, можно предположить, что этот фикс могут принять примерно никогда.
Очевидно, вы также не настолько заинтересованы в этом фиксе, чтобы накатывать патчи не от разработчиков.
Почему ж нет, оттуда можете взять код и пофискить, пришлите нам патч, скорее всего это будет насколько маленькое изменение, что код можно запостить в этой теме.
https://github.com/SimpleMachines/SMF2.1/search?q=modify_post_time_passed
Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 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');
Когда экономят на булевых переменных...
'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())))
Цитата: 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= (https://github.com/SimpleMachines/SMF2.1/search?utf8=%E2%9C%93&q=%27can_modify%27&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');
Видимо, где-то здесь ошибка в логике. Придётся ставить, дальше так не понять.
Цитата: kemerover от октября 6, 2017, 15:52
Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 4 раза в одном файле.
Забудьте слово логика, когда дело касается PHP. :)
Цитата: 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');
Ну дык:
Если время прошло, то ошибка.
Иначе если текущий юзер автор темы...
На первый взгляд, это и есть ошибка. Но надо проверять.
Цитата: Bhudh от октября 6, 2017, 16:01
Когда экономят на булевых переменных...
Я бы сказал, когда у людей нет ни образования, ни чувства прекрасного.
Цитата: wandrien от сентября 25, 2017, 14:27
Нельзя отредактировать это сообщение, поскольку время, отведенное на редактиров
Каждый раз, читая название ветки, думаю — кто такие эти редактиры? :what: ;D
Цитата: 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');
Ну дык:
Если время прошло, то ошибка.
Иначе если текущий юзер автор темы...
На первый взгляд, это и есть ошибка. Но надо проверять.
Ну что ошибка, если время прошло, это понятно. А дальше логика не ясна.
Если текущий юзер автор сообщения и не может изменять свои сообщения, то разрешить ему изменять ответы?
Цитата: 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: )
Работа идет ;up:
Когда будет результат, пришлите ЛС на всякий случай, я редко сюда заглядываю :)
Цитата: wandrien от сентября 25, 2017, 14:27
«Нельзя отредактировать это сообщение, поскольку время, отведенное на редактирование, истекло.»
Версии движка меняются, а суть остаётся. Как и годы назад, в Блоруме и в Конлангах, топикстартер всё так же может редактировать чужие сообщения, но не может свои.
У меня нет функции редактировать чужие сообщения в блоруме и конлангах. Может, у вас там модераторские права? Вообще, фича с коротким временем на редактирование хорошая, потому как время изменения сообщения не пишется, соответственно легко выставить собеседника дураком, меняя свои сообщения. Иногда это выходит невольно даже при небольшом отведенном времени.
Цитата: Easyskanker от октября 10, 2017, 18:58У меня нет функции редактировать чужие сообщения в блоруме и конлангах. Может, у вас там модераторские права?
Видимо, Вы пропустили слово «топикстартер». В своих темах он модератор, в чужих — нет.
Спасибо, теперь вижу, в чем проблема. Видимо, с 2016 года ввели такую функцию, а я не обратил внимание.
Вот такой инженерный хоррор повторяется с небольшими вариациями в 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-ти местах. В общем патч простого бага не будет выглядеть очевидным и простым. Боже, покарай идиотов.
Цитата: wandrien от января 26, 2019, 08:10
Если в самом первом условии мы дописываем && !allowedTo('modify_replies'), то получаем побочный эффект в виде лишнего журналирования действий модерации, когда пользователь изменяет свои сообщения в блого-темах до истечения таймаута.
Думаю это незначительный побочный эффект. Главное патч затрагивает как можно меньше кода. Если апстрим апдейт и этот код будут конфликтовать, потом не обязательно найдётся время разбираться, скорее либо апдейт либо патч придётся оставить.
В таком виде патч получается простым. В 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,7 +638,7 @@ 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,7 +741,7 @@ 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,7 +1438,7 @@ 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,7 +2684,7 @@ 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 ...' добавлю в код, что-то я упустил этот момент. )
~~~
Вот так выглядит логгирование при правке сообщений на ванильном движке:
Блоггер Модератор
Свой пост до таймаута - -
Свой пост после таймаута (ошибка) -
Чужой пост лог лог
Вот так стало после патча:
Блоггер Модератор
Свой пост до таймаута лог -
Свой пост после таймаута лог -
Чужой пост лог лог
А в идеале, полагаю, должно быть так:
Блоггер Модератор
Свой пост до таймаута - -
Свой пост после таймаута лог лог
Чужой пост лог лог
Предлагаю изменение логики логгирования добавить отдельным патчем. Он не будет связан с этим и встанет в другую часть кода. Патч тоже будет простой.
Да не нужно этот логгинг изменять, это не так часто будет.
Поздравляю с первым патчем :UU:
Я вот думаю нельзя ли эти патчи как-то в движок тоже сабмитить. Никогда не пробовал.
Цитата: RawonaM от января 27, 2019, 10:05
Поздравляю с первым патчем :UU:
Вау! Попробовал в своём блоге. Работает! :UU:
Спасибо!
Цитата: Lodur от января 27, 2019, 10:38
Цитата: RawonaM от января 27, 2019, 10:05
Поздравляю с первым патчем :UU:
Вау! Попробовал в своём блоге. Работает! :UU:
Спасибо!
Речь не о блогах, а вот о таких резделах:
https://lingvoforum.net/index.php/board,145.0.html
https://lingvoforum.net/index.php/board,343.0.html
В блоге у вас полный набор прав модератора.
Цитата: wandrien от января 27, 2019, 10:45
В блоге у вас полный набор прав модератора.
Разве было так? Помнится, Светлана жаловалась (давно), что не может редактировать свои сообщения в своём блоге. Уроки татарского. Причина была именно та же: "истекло время редактирования". При этом сообщения других можно было редактировать, и т. д. Может, конечно, это ещё на старой версии движка было.
Цитата: Lodur от января 27, 2019, 16:02
Разве было так?
Да. Блоггер — полноценный модератор в своём блоге. Всегда так было, сколько помню.
Цитата: Lodur от января 27, 2019, 16:02
Помнится, Светлана жаловалась (давно), что не может редактировать свои сообщения в своём блоге.
Точно в блоге?
Речь тут идёт о разделах с настройкой «блорум»: «Блорум», «Уроки по языкам», «Конланги лфчан».
Цитата: mnashe от января 27, 2019, 16:09
Цитата: Lodur от января 27, 2019, 16:02
Разве было так?
Да. Блоггер — полноценный модератор в своём блоге. Всегда так было, сколько помню.
Цитата: Lodur от января 27, 2019, 16:02
Помнится, Светлана жаловалась (давно), что не может редактировать свои сообщения в своём блоге.
Точно в блоге?
Речь тут идёт о разделах с настройкой «блорум»: «Блорум», «Уроки по языкам», «Конланги лфчан».
Хочу еще сделать, чтобы в таких разделах топикстартер в теме тоже подписывался как Блоггер. Надо?
Цитата: wandrien от января 27, 2019, 16:17
Цитата: mnashe от Речь тут идёт о разделах с настройкой «блорум»: «Блорум», «Уроки по языкам», «Конланги лфчан».
Хочу еще сделать, чтобы в таких разделах топикстартер в теме тоже подписывался как Блоггер. Надо?
Если есть права, то должна быть и соответствующая подпись.
Цитата: Rusiok от января 27, 2019, 16:48
Если есть права, то должна быть и соответствующая подпись.
Специальный код заменяет слово Moderator на Blogger при совпадении начала имени раздела с ником.
(Это RawonaM'ов мод, естественно).
Цитата: mnashe от января 27, 2019, 16:53
Цитата: Rusiok от января 27, 2019, 16:48
Если есть права, то должна быть и соответствующая подпись.
Специальный код заменяет слово Moderator на Blogger при совпадении начала имени раздела с ником.
(Это RawonaM'ов мод, естественно).
Там надо ровно 2 строчки дописать.
Цитата: wandrien от января 27, 2019, 16:54
Там надо ровно 2 строчки дописать.
А, нет. Побольше. Чёртов движок... :green:
Цитата: wandrien от января 27, 2019, 16:54
Там надо ровно 2 строчки дописать.
Куда, зачем?
Там вроде всё как надо :what:
Цитата: mnashe от января 27, 2019, 16:59
Цитата: wandrien от января 27, 2019, 16:54
Там надо ровно 2 строчки дописать.
Куда, зачем?
Там вроде всё как надо :what:
Цитата: wandrien от января 27, 2019, 16:17
Цитата: mnashe от января 27, 2019, 16:09
Речь тут идёт о разделах с настройкой «блорум»: «Блорум», «Уроки по языкам», «Конланги лфчан».
Хочу еще сделать, чтобы в таких разделах топикстартер в теме тоже подписывался как Блоггер. Надо?
Цитата: wandrien от января 27, 2019, 16:17
Хочу еще сделать, чтобы в таких разделах топикстартер в теме тоже подписывался как Блоггер. Надо?
Мне кажется не надо, это только в заблуждение введёт. Может топик стратер или ещё как-то.
Цитата: RawonaM от января 27, 2019, 18:47
Цитата: wandrien от января 27, 2019, 16:17
Хочу еще сделать, чтобы в таких разделах топикстартер в теме тоже подписывался как Блоггер. Надо?
Мне кажется не надо, это только в заблуждение введёт. Может топик стратер или ещё как-то.
Если с названием определимся, можно сделать.
Я тут код посмотрел. Для реализации нужно либо хардкодить названия соответствующих подразделов в код, либо выполнять зубодробительные запросы к базе, чтобы получить права для пользователя. Я за первый способ, конечно же. :D