fix(installer): harden admin smoke and rollback cleanup

This commit is contained in:
2026-09-07 22:39:30 +05:00
parent bf10810cfc
commit 079094591b
15 changed files with 1095 additions and 261 deletions
@@ -0,0 +1,50 @@
# Результаты runtime-проверки v1.0.0-rc3
Дата проверки: 2026-09-07.
RC3 проверялся на чистом Debian после успешной проверки целостности
опубликованного артефакта. Hysteria, ACME, firewall, диагностика и основной
authentication backend отработали штатно. Кандидат отклонён из-за несовместимости
installer smoke с HTTP middleware и ложного отчёта rollback cleanup.
## Сводка
| ID | Наблюдение | Итог |
| --------------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
| RC3-LOGIN-01 | стандартный `curl/<version>` получает HTTP 403 от scanner middleware | исправлено для RC4 явным UA установщика |
| RC3-LOGIN-02 | запрос с полем `password` не проходит DTO: требуется `pass` | ожидаемое поведение wire-контракта, добавлена регрессия |
| RC3-LOGIN-03 | `{username, pass}` с неверным паролем доходит до auth logic и возвращает `invalid_credentials` | backend исправен |
| RC3-LOGIN-04 | positive и negative smoke имели две независимые curl-команды | исправлено общим request helper'ом |
| RC3-ROLLBACK-01 | `reset-failed` для уже выгруженного юнита создавал ложное `manual recovery may be required` | исправлено проверкой postcondition |
## Что доказала диагностика login
Последовательность запросов отделила middleware, DTO и authentication logic:
| Запрос | Результат |
| ---------------------------------------- | -------------------------------------------------------- |
| стандартный curl UA + `password` | HTTP 403 до разбора тела |
| допустимый UA + `password` | validation envelope: требуется поле `pass` |
| допустимый UA + `pass` и неверный пароль | operation envelope с `errors[].code=invalid_credentials` |
Следовательно, паника старого `validateStr` не вернулась. Дефект RC3 находился
между smoke-клиентом и scanner middleware, а не в проверке пароля.
## Контракт RC4
- positive и negative login используют один helper;
- helper отправляет JSON `{username, pass}` и `User-Agent: HY2XS-Installer/1.0`;
- success требует `code=20000` и непустой `data.accessToken`;
- rejection требует `code=50000`, причину `invalid_credentials` внутри
`errors[]` и отсутствие выданного токена;
- envelope разбирается как JSON, поэтому совпадение текста внутри `message` не
считается доказательством;
- стандартный curl UA продолжает получать 403: scanner middleware в RC4 не
удаляется;
- уже выгруженный systemd-юнит считается успешным конечным состоянием cleanup
только после наблюдения `LoadState` и `ActiveState`;
- недоступный systemd или сохранившийся `ActiveState=failed` остаются настоящим
rollback failure.
Пересмотр необходимости scanner middleware для loopback-only панели остаётся
отдельной задачей после v1.0.0 и не расширяет change surface RC4.