Repository navigation
v0.6.3
What's Changed
- fix(config): сериализовать чтение-изменение-запись конфига by @RoboNET in #33
- fix(config): переживать преходящий отказ переименования на Windows by @RoboNET in #36
- fix(auth): сохранять ротированный refresh-токен by @RoboNET in #35
- chore: release v0.6.3 by @github-actions[bot] in #37
Full Changelog: v0.6.2...v0.6.3
Что заметит скрипт
Номер версии патчевый, но наблюдаемое поведение в двух местах изменилось — если вы разбираете вывод yt строгой схемой, прочитайте это.
Появился новый отказ. Запись конфига теперь идёт под файловым локом (config.json.lock). Если лок занят другим процессом yt дольше таймаута, команда завершится с config_error (exit 9) там, где раньше запись всегда удавалась. Таймаут — 10 секунд, для записи после интерактивного входа — 60, для сохранения ротированного refresh-токена — 20.
Появилось новое предупреждение в stderr. Если ротированный refresh-токен не удалось сохранить, команда всё равно завершается успешно (access-токен уже получен), но в stderr печатается строка вида {"warning":{"code":"refresh_token_not_saved",...}}. Отличайте warning от error по корневому ключу: наличие такой строки не означает неуспех команды.
Зачем это всё
Три правки, все про креденшелы:
- Конфиг больше не теряет параллельные правки. Читался целиком, менялся и писался целиком, без сериализации между процессами. У авто-перелогина окно равно длительности браузерного флоу — минуты, — и в него попадали в том числе ужесточения политик профиля: пользователь сузил права, а профиль возвращался к более широким, без единого сообщения.
- Ротированный refresh-токен сохраняется. Раньше он подхватывался только на ветке перелогина, а на обычном обновлении отбрасывался. Если федерация ротирует токены при каждом обмене, сохранённый умирал после первого же обновления, и вместо тихого продления пользователь получал браузер.
- Запись переживает преходящий отказ на Windows. Замена файла там конфликтует, если кто-то на мгновение держит его открытым — антивирус, индексатор, чужой процесс.
Попутно закрыты две вещи, каждая тяжелее исходной: общее фиксированное имя временного файла (две одновременные записи могли обрезать конфиг друг друга — порча креденшелов всех профилей; то же было в кеше токенов) и запись без сброса на диск.