Редактирования в период grace period обходят проверку медиа `skip_review_media_groups`

Резюме

Проверка «review media» (настройка сайта skip_review_media_groups) применяется только при создании сообщения, в классе NewPostManager. Редактирования проходят через PostRevisor, который никогда не выполняет проверку медиа. Таким образом, пользователь может сначала опубликовать обычный текст (пройдя проверку), а затем добавить изображения через редактирование — и сообщение никогда не попадет в очередь на проверку.

Что хуже, если редактирование происходит в течение editing_grace_period (по умолчанию 5 минут) и разница меньше editing_grace_period_max_diff (по умолчанию 100 символов — одна строка markdown с загруженным изображением занимает ~40–60 символов), то редактирование не создает ревизию и не отображает значок карандаша, поэтому обход полностью незаметен в интерфейсе.

Шаги для воспроизведения

  1. Настройте skip_review_media_groups так, чтобы обычные пользователи (например, TL0/TL1) не были освобождены от проверки — сообщения с медиа должны требовать одобрения.
  2. Создайте сообщение, содержащее только текст, от имени обычного пользователя. Оно будет одобрено/опубликовано в обычном режиме (нет медиа → нет проверки).
  3. В течение grace period отредактируйте сообщение и вставьте загруженное изображение.

Ожидаемый результат

Сообщение (теперь содержащее медиа) должно быть отправлено в очередь на проверку, или хотя бы редактирование должно проходить ту же проверку медиа, что и при создании сообщения.

Фактический результат

  • Сообщение публикуется с изображением и никогда не попадает в очередь на проверку.
  • Запись ревизии не создается, индикатор редактирования не отображается.

Подтверждение (производственная среда)

p.version                                   # => 1
PostRevision.where(post_id: p.id).count     # => 0
p.created_at                                # => 2026-07-30 07:33:28 UTC
p.updated_at                                # => 2026-07-30 07:34:00 UTC
UploadReference.where(target: p).pluck(:created_at)
                                            # => [2026-07-30 07:34:01 UTC]

Сообщение только с текстом создано в 07:33:28, изображение добавлено редактированием примерно через 32 секунды — нет видимой истории редактирования, нет проверки.

Соответствующий код

  • lib/new_post_manager.rb — post_needs_approval? возвращает :contains_media через contains_embedded_media?, но это выполняется только для новых сообщений.
  • app/models/post_analyzer.rb#embedded_media_count — логика подсчета медиа.
  • PostRevisor — нет аналогичной проверки медиа при редактировании.

Предлагаемое исправление

Выполните проверку contains_media также в PostRevisor (когда редактирование добавляет медиа, а редактор не входит в skip_review_media_groups / не является сотрудником), помещая в очередь ReviewablePost для отредактированного сообщения.

2 лайка

Спасибо за сообщение @Editor0732 :+1: Будет исправлено

Я попытался развернуть этот PR и заметил асимметрию в механизмах модерации медиа между новыми постами и редактированием, и хотел бы поднять этот вопрос:

Новые посты с медиа — ReviewableQueuedPost (проверка перед публикацией)

  • Пост не создается вообще; содержимое находится в проверяемой нагрузке до одобрения
  • Автор видит раздел «ожидает одобрения» (pending_posts) на странице темы
  • Пост становится видимым для всех только после одобрения модератором (perform_approve_postPostCreator)
  • При отклонении содержимое отбрасывается — оно никогда не было публичным

Редактирования, добавляющие медиа — ReviewablePost (публикация сначала, проверка потом)

  • Редактирование вступает в силу немедленно; новая версия (включая изображение) мгновенно становится видимой для всех
  • Для автора нет уведомления «на проверке» — и для редактирования в период грейс-периода даже нет ревизии, так что оригинальное содержимое не оставляет следов в интерфейсе
  • При отклонении пост удаляется (perform_reject_and_delete), его можно восстановить через предыдущую ревизию

Проблема

n
При текущем подходе проблемное изображение становится публично доступным до того, как модератор сможет вмешаться, потенциально на долгое время в зависимости от времени проверки. Это, кажется, ослабляет саму суть skip_review_media_groups — в описании настройки сказано, что посты, содержащие медиа, «отправляются на проверку сотрудникам», что подразумевает, что они не должны быть публичными в это время.

Возможное улучшение

  1. Очередь для редактируемого содержимого вместо его применения (кажется, лучше). Когда редактирование вводит новое медиа, оставляем пост неизменным, уведомляем автора, что новое редактирование ожидает проверки, и применяем редактируемое содержимое к посту только после одобрения модератором — отбрасываем при отклонении. Это максимально приближает поведение к поведению новых постов. (С точки зрения реализации, это потребует проверяемого варианта, одобрение которого выполняет revise для существующего поста, а не создает новый.)

  2. Скрыть пост, когда редактирование вводит новое медиа, так что только автор видит его с уведомлением «ожидает одобрения», и использовать существующее действие perform_approve_and_unhide при одобрении — действия ReviewablePost уже поддерживают это.

Спасибо, что протестировали это. Согласен, вся система рецензий некорректно спроектирована для обработки «рецензирования/отложенных правок» :thinking:

Боюсь, это гораздо более сложная задача, и потребуется больше времени на её планирование и реализацию.