# Файл записи закрыт защищённым полем и отдаётся вошедшему по токену файла

- **Дата:** 2026-08-12
- **Источник:** [../../openspec/changes/archive/2026-08-12-oidc-login/design.md](../../openspec/changes/archive/2026-08-12-oidc-login/design.md),
  раздел «Что изменило ревью кода», плюс отчёт триажа
  [../../openspec/changes/archive/2026-08-12-oidc-login/review/report.md](../../openspec/changes/archive/2026-08-12-oidc-login/review/report.md),
  пункт 3
- **Статус:** заменено на [ADR-2026-08-22-storage-without-pocketbase](ADR-2026-08-22-storage-without-pocketbase.md)

## Решение

Поле файла в хранилище **помечается защищённым**, а правило просмотра коллекции
файлов пускает всякого узнанного. Ссылка `/api/files/<коллекция>/<запись>/<имя>`
перестаёт быть правом пройти по ней: нужен короткий токен файла, который берут,
предъявив сессию.

Запись заменяет [ADR-2026-08-12-file-link-open-but-not-logged](ADR-2026-08-12-file-link-open-but-not-logged.md).

## Почему

Прежнее решение было обусловленным и само назвало условие своего пересмотра:

> Решение действует до разграничения доступа: задачи `oidc-login` и
> `record-ownership` меняют условие, и тогда пометку стоит пересмотреть новой
> записью.

Условие наступило. Прежний довод — «право прочитать задачу даёт знание её
идентификатора, и файл встаёт вровень с `GET /api/status/:id`» — держался на том,
что опрос готовности открыт анонимно. Этот change закрывает опрос за вход, и
файл, оставшийся открытым, стал бы единственным анонимным путём к содержимому
записи — самому чувствительному, что есть у проекта.

Вторая половина прежнего решения остаётся в силе: имя файла в журнал по-прежнему
не пишется. Защищённое поле сужает право пройти, но не отменяет запрета —
строка журнала со ссылкой собирала бы половину ключа.

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

## Последствия

- `+` содержимое записи перестало быть доступным по одному знанию ссылки; после
  закрытия API это был последний анонимный путь к нему.
- `+` условие, названное прежней записью, отработало как задумано: решение
  пересмотрено записью, а не молча.
- `−` ссылка усложнилась для потребителя: браузер с одной кукой файла не
  получает, нужен порядок «сессия → токен файла → ссылка». Будущее приложение
  обязано этот шаг делать, и задача про прослушивание записи начинается с него.
- `−` разграничения по владельцу нет: токен файла берёт всякий вошедший, и по
  ссылке он получит **любую** запись, а не только свою. Сужение приносит
  `record-ownership`; до неё круг сузился с «кто угодно из интернета» до «кто
  угодно из вошедших», и это меньше, чем кажется.
- `−` отзыва у выданного токена нет, как не было у ссылки; смягчает только его
  короткий срок.
