Skip to content

HTTP API для локальной сети (opt-in): режимы, заряд, статус (XIC-13) - #6

Merged
Oksion merged 6 commits into
mainfrom
feature/http-api
Jul 24, 2026
Merged

HTTP API для локальной сети (opt-in): режимы, заряд, статус (XIC-13)#6
Oksion merged 6 commits into
mainfrom
feature/http-api

Conversation

@Oksion

@Oksion Oksion commented Jul 24, 2026

Copy link
Copy Markdown
Owner

Что это

Опциональный HTTP API для управления XiControl из локальной сети — с телефона или из автоматизаций Home Assistant. Реализация XIC-13.

По умолчанию выключен — включается в Настройки → HTTP API. Когда выключен, хост не создаётся вовсе (0 нагрузки на CPU, замерено).

Маршруты

Все — с заголовком Authorization: Bearer <токен>:

Метод / путь Что делает
GET /status режим, защита заряда, «В дорогу», сова, % заряда, зарядка, ватты, здоровье батареи
POST /mode {"value":"turbo"} режим производительности
POST /care {"on":true} «беречь ~80%» вкл/выкл
POST /travel {"on":true} «В дорогу» (разовый заряд до 100%)
POST /owl {"on":true} «режим совы» вкл/выкл

Решения дизайна

  • HttpListener (http.sys), не ASP.NET Core — без второго shared framework, в духе «не усложнять». ~100 строк, нулевые новые зависимости.
  • Bind 127.0.0.1 по умолчанию. Доступ из сети — отдельный тумблер с предупреждением; тогда создаётся правило брандмауэра со скоупом LocalSubnet (удаляется при выключении, как schtasks у автозапуска — только по явному действию).
  • Токен: генерируется в UI, показывается один раз, хранится только SHA-256, сверка constant-time, передача Bearer-заголовком.
  • Жёсткий белый список зашит в роутер — настройки, автозапуск и запуск программ через API невозможны (403 на выключенную команду, 404 на неизвестный путь, 401 без токена).
  • Настройки API — в %ProgramData%\XiControl\api.json под ACL «запись только Administrators/SYSTEM» + проверка владельца при чтении: сторонний процесс без прав администратора не может ни включить сервер, ни подменить токен-хеш. Опирается на границу elevation — единственную реальную локальную границу (DDL/DPAPI(CurrentUser) отвергнуты, разбор в описании issue).
  • Плейнтекст-HTTP без TLS — осознанный компромисс: радиус поражения белого списка мал (переключение режимов/заряда, чтение статуса).

Команды маршалятся в UI-поток и идут через тот же AppController, что меню/панель/клавиши.

Проверки

  • dotnet build XiControl.sln -c Release — 0 ошибок / 0 предупреждений.
  • dotnet test — 141 зелёный (+9 новых ApiRouterTests: авторизация, пер-командные 403, исчерпывающий белый список).
  • E2e на живом железе (TM2424): 401 без/с неверным токеном; 200 /status с реальными данными; 403 на выключенную команду; 404 на /autostart. Безопасность: запись api.json и создание файлов в папке из непривилегированной консоли → Access denied; в localhost-режиме порт по LAN-адресу недоступен; в LAN-режиме POST /travel с телефона отрабатывает.
  • CPU при включённом сервере в простое — 0% за 6 с (async-ожидание на IOCP).

Локализация

Все строки вкладки — в ru/en/zh (parity-тест зелёный).

Документация

README (раздел «HTTP API» + список возможностей + англ. резюме), CLAUDE.md («Что это» + «Архитектура»), CHANGELOG [Unreleased], ROADMAP ✅ Сделано (unreleased), SECURITY.md (поверхность атаки и компромиссы), docs/03-architecture.md (дерево модулей).

🤖 Generated with Claude Code

Oksion and others added 6 commits July 24, 2026 16:12
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… «не берём» (XIC-2)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…к (XIC-13)

Хост на HttpListener (без ASP.NET Core), выключен по умолчанию; bind 127.0.0.1,
LAN — отдельным тумблером с firewall-правилом LocalSubnet. Токен: sha256-хеш,
Bearer, constant-time. Настройки в ProgramData под ACL (запись только админам,
владелец проверяется) — правкой config.json API не включить. Вкладка «HTTP API»
с пер-командными тумблерами; GET /status + POST /mode|care|travel|owl.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ture (XIC-13)

Синхронизация документации с фичей HTTP API: список возможностей и раздел
использования в README (+ англ. резюме), модули в CLAUDE «Архитектура» и
дереве docs/03, запись в CHANGELOG [Unreleased], перенос пункта в ROADMAP
✅ Сделано (unreleased), поверхность атаки и компромиссы в SECURITY.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Oksion
Oksion merged commit f09829a into main Jul 24, 2026
1 check passed
@Oksion
Oksion deleted the feature/http-api branch July 24, 2026 12:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant