Files
transcriber/tasks/items/reject-control-chars-in-extension.md
T
av 11269c1567 учёт: заведён урожай ревью входа по конфигу
- пять задач партии review-2026-08-23: многозначность Remote-Name и Remote-Email,
  мелочи входа, механизация правила о зависимостях конфига, снятие мёртвого
  читателя .env, управляющие знаки в расширении
- две существующие разведки дополнены находками того же прогона: адрес объекта в
  тексте отказа SpeechKit и выводимость имени копии из журнала
2026-08-23 14:03:52 +03:00

3.5 KiB

🐞 Отвергать расширение с управляющими знаками на приёме, а не отдавать 500

  • Тип: fix
  • Категория: Очередь — Вторая половина того же разреза: границы полей журнала задаются там же, где судится состав расширения
  • Зачем: комментарий кода объявляет этот исход недопустимым и ради него заведён предел длины расширения, но разрез сделан по длине и не сделан по составу знаков: отправитель получает 500, владелец — строку ERROR, неотличимую от аварии хранилища
  • Теги: review-2026-08-23

Расширение приходит из имени, данного отправителем, и приём судит у него только длину. Управляющий знак внутри расширения проходит предел длины, доезжает до заведения временной копии и роняет его: отправитель получает 500 за вход, за который отвечает сам, а владелец — строку ERROR, неотличимую от аварии хранилища. Ровно этот исход комментарий кода объявляет недопустимым и ради него заводит предел длины.

Нашёл прогон ревью config-test-headers-login 2026-08-23. Триаж тест не воспроизводил, поэтому находка понижена до гипотезы.

Воспроизведение

Принять запись, чьё расширение несёт управляющий знак: ответ 500, в журнале строка ERROR. Ожидался отказ приёма своим кодом.

Падающий тест прохода adversary: имя доезжает формой RFC 2231 (filename*=UTF-8''запись.mp%003), ответ 500, журнал level=ERROR msg="Failed to stage uploaded file" error="failed to create work file: open /tmp/transcriber-….mp\x003: invalid argument".

Затрагивает

  • internal/service/transcribe.go:171-188 — разрез расширения по длине и сборка имени копии;
  • internal/adapter/repo/sqlite/file_repo.go:56-67 — заведение временной копии, которое и отказывает.

Критерии приёмки

  • Приём судит состав знаков расширения так же, как судит длину. Оракул: тест приёма — имя с управляющим знаком в расширении даёт отказ приёма своим кодом, а не 500; в журнале нет строки ERROR об отказе хранилища.
  • Приём принимает годное расширение по-прежнему. Оракул: тот же тест — .mp3, .ogg и имя без расширения дают прежний исход.

Рамки

Половину про путь из *os.PathError в журнале держит journal-fields-bounded-by-service, здесь она не переписывается.