6c01d3e08c
Портал давал человеку два обещания про запись его разговора — «живёт месяц и
стирается сама» и «потребуешь удалить свои данные — удалим и голос». Обе чистки
были построены и обе ходили в хранилище с именем obzvon_zapisi, которого в
настройках НЕ СУЩЕСТВОВАЛО. Врать они не врали — честно отвечали «не смог
удалить файл», — но удалять им было нечего. Оба обещания были бумажными.
Построено:
• config/filesystems.php — диск obzvon_zapisi. Драйвер переключается одной
переменной окружения OBZVON_ZAPISI_DRIVER: в день покупки объектного
хранилища меняется настройка, а не код;
• ObzvonZapisHranilishche — единственная дверь к звуку. Приём с проверкой,
открытие ПОТОКОМ со следом в журнале ПДн ДО чтения, ссылка со сроком в час
там, где хранилище её умеет, и NULL там, где не умеет;
• PereveztiZapisJob — переезд записи с сервера робота. Не воскрешает стёртый
голос, не создаёт вторую копию, не оставляет сироты при проигранной гонке;
• ZvukovoyFayl — одно место, где живёт знание «что такое запись разговора»:
расширения, подписи форматов, граница пустой записи в 44 байта.
Три замка изоляции, и все три нужны: RLS на строке, явная сверка клиента и
сверка САМОГО ПУТИ — recording_path заполняет чужая машина, и путь вида
7/../8/golos.wav увёл бы в папку другого клиента при законной сверке клиента.
Исправлена ложь в бумаге. В комментарии диска obzvon_materialy было написано,
что вызов url на закрытом диске бросит исключение и публичной ссылки не
появится. Замерено живым запуском: у местного драйвера url не бросает НИКОГДА,
а молча отдаёт /storage/путь. Ссылка ведёт в папку публичного диска, где записи
нет, — вреда нет, но и обещанной защиты нет. Настоящая защита в том, что url не
зовёт никто.
Ловушка круга: проверка З-2.2 утверждала, что хранилища нет, и покраснела бы от
самой постройки. Вычеркнута не была — переписана. Она стерегла живое: пометить
строку стёртой при живом файле значит выкинуть её из указателя под чистку
навсегда. Теперь «файл жив, а убрать не вышло» строится честно — подставлено
хранилище, у которого delete отвечает отказом.
22 новых сторожа, каждый показан красным в пять заходов. Убрана подмена
настроек в заготовке z22DiskZapisey — пять сторожей З-2.2 теперь охраняют и
наличие хранилища тоже.
Прогон обзвона 212 из 212, статанализ 0 ошибок.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>