Author Topic: «Нельзя отредактировать это сообщение, поскольку время, отведенное на редактиров  (Read 1494 times)

0 Members and 1 Guest are viewing this topic.

Offline wandrien

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

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

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

Offline Bhudh

  • Posts: 54307
  • Gender: Male
  • aka 蝎
    • Сайты по языкознанию
У вас есть хостинг с бажным кодом.
Ну хостинг-то тут при чём?
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Offline wandrien

  • Posts: 6595
У вас есть хостинг с бажным кодом.
Ну хостинг-то тут при чём?
При том, что у него есть владелец. Ну а дальше по газмановской песне...

Offline Bhudh

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

Offline wandrien

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

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

Offline RawonaM

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

Offline wandrien

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

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

Offline RawonaM

  • Posts: 42820
Quote from: wandrien
У меня есть навыки программирования, линукс-машина и достаточно злости на это вредное насекомое. У вас есть хостинг с бажным кодом. Ты на суше, я на море — нам не встретимся никак?
В чем проблема? Идете на сайт движка, ссылка внизу страницы, патчите, сабмитите и ждете когда выйдет релиз, затем ЛФ обновится.
Я не настолько заинтересован в этом фиксе, чтобы идти длинным путём через разработчиков и багтрекер. Если учесть возраст бага, можно предположить, что этот фикс могут принять примерно никогда.
Очевидно, вы также не настолько заинтересованы в этом фиксе, чтобы накатывать патчи не от разработчиков.
Почему ж нет, оттуда можете взять код и пофискить, пришлите нам патч, скорее всего это будет насколько маленькое изменение, что код можно запостить в этой теме.


Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 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');

Offline Bhudh

  • Posts: 54307
  • Gender: Male
  • aka 蝎
    • Сайты по языкознанию
Когда экономят на булевых переменных…
'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.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Offline wandrien

  • Posts: 6595
Воа!

Интересно. Поискал код, который определяет, показывать ли кнопку правки поста.
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');


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

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

Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 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');

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

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

Когда экономят на булевых переменных…
Я бы сказал, когда у людей нет ни образования, ни чувства прекрасного.

Offline Wolliger Mensch

  • Global Moderator
  • *
  • Posts: 52000
  • Gender: Male
  • Haariger Affe
    • Подушка
Нельзя отредактировать это сообщение, поскольку время, отведенное на редактиров

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

Offline kemerover

  • Posts: 1453
  • Gender: Male
Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 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');

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

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

Offline wandrien

  • Posts: 6595
Я так и не смог понять, какая логика у этого чуда инженерной мысли, которое повторяетс 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: )

Offline RawonaM

  • Posts: 42820
Работа идет  ;up:

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

Offline Easyskanker

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

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

Offline Bhudh

  • Posts: 54307
  • Gender: Male
  • aka 蝎
    • Сайты по языкознанию
У меня нет функции редактировать чужие сообщения в блоруме и конлангах. Может, у вас там модераторские права?
Видимо, Вы пропустили слово «топикстартер». В своих темах он модератор, в чужих — нет.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Offline Easyskanker

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

Offline wandrien

  • Posts: 6595
Вот такой инженерный хоррор повторяется с небольшими вариациями в 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-ти местах. В общем патч простого бага не будет выглядеть очевидным и простым. Боже, покарай идиотов.

Offline RawonaM

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

Offline wandrien

  • Posts: 6595
В таком виде патч получается простым. В 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 ...' добавлю в код, что-то я упустил этот момент. )

~~~

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


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


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


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


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


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


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


 

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Note: this post will not display until it's been approved by a moderator.
Name: Email:
Verification:
Type the letters shown in the picture
Listen to the letters / Request another image
Type the letters shown in the picture:
√49 Напишите ответ строчными буквами:
«Сто одёжек, все без застёжек» — что это?: