Проверка «review media» (настройка сайта skip_review_media_groups) применяется только при создании сообщения, в классе NewPostManager. Редактирования проходят через PostRevisor, который никогда не выполняет проверку медиа. Таким образом, пользователь может сначала опубликовать обычный текст (пройдя проверку), а затем добавить изображения через редактирование — и сообщение никогда не попадет в очередь на проверку.
Что хуже, если редактирование происходит в течение editing_grace_period (по умолчанию 5 минут) и разница меньше editing_grace_period_max_diff (по умолчанию 100 символов — одна строка markdown с загруженным изображением занимает ~40–60 символов), то редактирование не создает ревизию и не отображает значок карандаша, поэтому обход полностью незаметен в интерфейсе.
Шаги для воспроизведения
Настройте skip_review_media_groups так, чтобы обычные пользователи (например, TL0/TL1) не были освобождены от проверки — сообщения с медиа должны требовать одобрения.
Создайте сообщение, содержащее только текст, от имени обычного пользователя. Оно будет одобрено/опубликовано в обычном режиме (нет медиа → нет проверки).
В течение grace period отредактируйте сообщение и вставьте загруженное изображение.
Ожидаемый результат
Сообщение (теперь содержащее медиа) должно быть отправлено в очередь на проверку, или хотя бы редактирование должно проходить ту же проверку медиа, что и при создании сообщения.
Фактический результат
Сообщение публикуется с изображением и никогда не попадает в очередь на проверку.
Запись ревизии не создается, индикатор редактирования не отображается.
Сообщение только с текстом создано в 07:33:28, изображение добавлено редактированием примерно через 32 секунды — нет видимой истории редактирования, нет проверки.
Соответствующий код
lib/new_post_manager.rb — post_needs_approval? возвращает :contains_media через contains_embedded_media?, но это выполняется только для новых сообщений.
PostRevisor — нет аналогичной проверки медиа при редактировании.
Предлагаемое исправление
Выполните проверку contains_media также в PostRevisor (когда редактирование добавляет медиа, а редактор не входит в skip_review_media_groups / не является сотрудником), помещая в очередь ReviewablePost для отредактированного сообщения.
Я попытался развернуть этот PR и заметил асимметрию в механизмах модерации медиа между новыми постами и редактированием, и хотел бы поднять этот вопрос:
Новые посты с медиа — ReviewableQueuedPost (проверка перед публикацией)
Пост не создается вообще; содержимое находится в проверяемой нагрузке до одобрения
Автор видит раздел «ожидает одобрения» (pending_posts) на странице темы
Пост становится видимым для всех только после одобрения модератором (perform_approve_post → PostCreator)
При отклонении содержимое отбрасывается — оно никогда не было публичным
Редактирование вступает в силу немедленно; новая версия (включая изображение) мгновенно становится видимой для всех
Для автора нет уведомления «на проверке» — и для редактирования в период грейс-периода даже нет ревизии, так что оригинальное содержимое не оставляет следов в интерфейсе
При отклонении пост удаляется (perform_reject_and_delete), его можно восстановить через предыдущую ревизию
Проблема
n
При текущем подходе проблемное изображение становится публично доступным до того, как модератор сможет вмешаться, потенциально на долгое время в зависимости от времени проверки. Это, кажется, ослабляет саму суть skip_review_media_groups — в описании настройки сказано, что посты, содержащие медиа, «отправляются на проверку сотрудникам», что подразумевает, что они не должны быть публичными в это время.
Возможное улучшение
Очередь для редактируемого содержимого вместо его применения (кажется, лучше). Когда редактирование вводит новое медиа, оставляем пост неизменным, уведомляем автора, что новое редактирование ожидает проверки, и применяем редактируемое содержимое к посту только после одобрения модератором — отбрасываем при отклонении. Это максимально приближает поведение к поведению новых постов. (С точки зрения реализации, это потребует проверяемого варианта, одобрение которого выполняет revise для существующего поста, а не создает новый.)
Скрыть пост, когда редактирование вводит новое медиа, так что только автор видит его с уведомлением «ожидает одобрения», и использовать существующее действие perform_approve_and_unhide при одобрении — действия ReviewablePost уже поддерживают это.