Files
shacraft-launcher/docs/refactor-2026-09-09.md
T

7.6 KiB
Raw Blame History

Глобальный рефакторинг — 2026-09-09

Границы работы

Переработаны backend/шаблоны сайта и React/Rust-слои нового лаунчера. Не менялись миры, модпак, порты, compose-топология, цены или режимы аккаунтов. Не переносились production-БД, секреты и приватный ключ подписи.

Backend

  • Монолит main.py разделён на HTTP routers, services, schemas, middleware и единый резолвер ресурсов. Entrypoint app.main:app сохранён.
  • Cookie/bearer вход используют одну реализацию аккаунтов, паролей и сессий.
  • Ограничитель попыток входа защищён от гонок и бесконечного роста памяти. Он process-local; multi-worker развертывание требует общего хранилища.
  • Оплата и подписка фиксируются одной SQLite-транзакцией. Claim/reject, продление, recovery и привязки сериализуют конфликтующие операции.
  • JSON metadata проверяются централизованно: неверный UTF-8, не-object JSON и небезопасные идентификаторы не приводят к непредусмотренному чтению пути.
  • Jinja наследование убирает копии фона/шапки/навигации. Размер фона 72×83 задаётся единожды. HTML-формы, скрипты и визуальная структура сохранены.
  • Python зависимости зафиксированы на версиях действовавшего runtime. Добавлены pytest, Ruff, CI и изолированный test-stage Docker.

Лаунчер

  • React разделён на компоненты, hooks, типизированный IPC и reducers. TypeScript проверяется сборкой; ошибки IPC не теряются.
  • Сохранены новые изменения GitHub 0.1.1: обязательный ShaCraft-аккаунт, verified aoc nickname, реальный онлайн, управление окном и Windows-фиксы установки/полных библиотек/точной Java major/длинной JVM-команды.
  • Сохранения настроек упорядочены; lifecycle install/launch/exit явный; демонстрационные значения прогресса не выдаются за реальную установку.
  • Rust commands выделены по ответственности. Неиспользуемые команды unsigned sync/inspect удалены; запись профиля требует verified manifest.
  • Общие атомарные записи и process-local permits защищают файлы от конфликтующих операций. Проверяются переносимые пути, symlink и подпись.
  • HTTPS exact-host policy распространяется и на redirects отдельных игровых провайдеров. Метаданные архивов Adoptium проверяются до загрузки.
  • GitHub: тесты/сборка на push/PR; ручная матрица пакетов Linux/Windows/macOS Intel/ARM с сохранением артефактов. Это не подпись релизов и не автообновление.

Проверки

Фактический итог: 88 backend-тестов + 23 subtests (локально и в изолированном Docker), 22 UI-теста, 59 Rust unit tests и отдельная живая read-only проверка production signed-manifest — успешно. npm ci/audit: 0 известных уязвимостей на момент прогона; строгий TypeScript/Vite и Ruff проходят. Это итог после объединения со всеми изменениями GitHub 0.1.1; прежние upstream Rust-тесты сохранены. Browser smoke: вход/регистрация ShaCraft, preview-gating, настройки, закрытие Escape и восстановление фокуса проверены без отправки учётных данных. Четыре тяжёлых/live игровых сценария не запускались.

Backend выложен, image ID контейнера совпадает с собранным образом; главная/Help/Моды/кабинет/healthz/catalog/signed-manifest отвечают 200, публичная админка по-прежнему закрыта Caddy (403). Внешний вид проверен в браузере. Время запуска mc-aoc не изменилось. Резервный образ сохранён как shacraft-backend:before-refactor-20260909, исходники — /root/shacraft-rollback-NWKzLR. Схема БД не менялась.

Backend: неизменность полного OpenAPI-снимка, публичные шаблоны, аккаунты, пароли/recovery, rate limit, LoginSystem gating, admin auth, платежи, rollback/параллельные операции, каталоги/manifest/config, startup/shutdown. Внешние эффекты замещены заглушками, БД только временная.

Launcher: строгий TypeScript + Vite, тесты UI state/settings/listeners, Rust unit tests по подписи/путям/хранилищу/IPC guards/trusted hosts. Полная холодная установка игры, OAuth и запуск на Windows/macOS требуют отдельного ручного beta-прогона; не выдавать локальные проверки за такой тест.

Не замаскированные рефактором ограничения

  1. Привязка ника: NoGravity подтверждает авторизацию игрока на сервере, но не связь с конкретным веб-запросом. Нужен одноразовый challenge в игре.
  2. Реферальная акция: enforcement REFERRAL_ENABLED и новизны самого плательщика не соответствует всей публичной формулировке. Требуется отдельное согласованное изменение бизнес-правил и регрессионные тесты.
  3. RCON/уведомления после commit не имеют outbox/retry. Сбой может потребовать ручной выдачи, а не повторного начисления подписки.
  4. Microsoft OAuth не является текущим способом входа: используется ShaCraft account + verified nickname. Неактивный OAuth-модуль требует собственного client ID и API approval при отдельной будущей активации.
  5. Нужны подписанные installer/update-релизы, native beta на всех ОС, полноценная отмена загрузок и recovery пользовательских данных.
  6. Блокировки лаунчера process-local; symlink-проверки не защищают от злонамеренного same-user TOCTOU. Keychain хранения refresh token пока нет.