# Редактирования в период grace period обходят проверку медиа \`skip\_review\_media\_groups\`

**URL:** https://meta.discourse.org/t/grace-period-edits-bypass-skip-review-media-groups-media-review/408899
**Category:** Bug
**Tags:** moderation, uploads, composer, review-queue
**Created:** [30.Июль.2026 08:49:32 UTC](https://meta.discourse.org/t/grace-period-edits-bypass-skip-review-media-groups-media-review/408899 "2026-07-30T08:49:32Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![Editor0732](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/editor0732/32/492698_2.png) [@Editor0732](https://meta.discourse.org/u/Editor0732)
#### Post date: [30.Июль.2026 08:49:32 UTC](https://meta.discourse.org/t/grace-period-edits-bypass-skip-review-media-groups-media-review/408899/1 "2026-07-30T08:49:32Z")

</div>

## Резюме

Проверка «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 отредактируйте сообщение и вставьте загруженное изображение.

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

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

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

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

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

```plaintext
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 для отредактированного сообщения.

---

<div class="post-metadata">

### Author: ![zogstrip](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zogstrip/32/512781_2.png) [@zogstrip](https://meta.discourse.org/u/zogstrip)
#### Post date: [03.Август.2026 20:47:05 UTC](https://meta.discourse.org/t/grace-period-edits-bypass-skip-review-media-groups-media-review/408899/3 "2026-08-03T20:47:05Z")

</div>

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

> <https://github.com/discourse/discourse/pull/42281>
>
> Previously, the \`skip\_review\_media\_groups\` check only ran when a post was create…d, so a user could publish plain text and then edit an image in without the post ever reaching the review queue — and inside \`editing\_grace\_period\` that edit creates no revision, so it left no trace in the UI either.
> 
> This change runs the same check on edits, queueing a \`ReviewablePost\` when an edit introduces media the post did not already have, comparing media by its sources rather than its markup so that rescaling an image is not mistaken for adding one.
> 
> Reported in \[meta t/408899\](https://meta.discourse.org/t/grace-period-edits-bypass-skip-review-media-groups-media-review/408899).

---

<div class="post-metadata">

### Author: ![Editor0732](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/editor0732/32/492698_2.png) [@Editor0732](https://meta.discourse.org/u/Editor0732)
#### Post date: [04.Август.2026 01:28:56 UTC](https://meta.discourse.org/t/grace-period-edits-bypass-skip-review-media-groups-media-review/408899/4 "2026-08-04T01:28:56Z")

</div>

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

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

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

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

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

### Проблема

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

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

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

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

---

<div class="post-metadata">

### Author: ![zogstrip](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zogstrip/32/512781_2.png) [@zogstrip](https://meta.discourse.org/u/zogstrip)
#### Post date: [04.Август.2026 08:36:46 UTC](https://meta.discourse.org/t/grace-period-edits-bypass-skip-review-media-groups-media-review/408899/5 "2026-08-04T08:36:46Z")

</div>

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

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