Добавить опциональную авторизацию клиента и динамические лимиты трафика

Сервер получает флаги --require-auth/--backend-url (по умолчанию выключено,
поведение уже развёрнутых нод не меняется). Auth-кадр хендшейка расширен с
"session_id:leg_id" до "session_id:leg_id:token"; при включённом
--require-auth сервер валидирует токен через новый AuthValidator
(BackendClient к netrunner-backend, с кешем на 60с).

Muxer теперь ведёт монотонный учёт трафика сессии (переживает реконнект
ног — раньше total_bytes мог занижаться после переподключения) и раз в ~30с
отчитывается бэкенду; при превышении лимита сессия разрывается. Токен
клиента прокидывается через EngineConfig/TunnelConfig до Tauri-плагина
(desktop.rs + Android Kotlin-плагин).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 00:31:03 +07:00
parent 99a9eee908
commit 40ddb0a0f6
14 changed files with 440 additions and 25 deletions
+12
View File
@@ -775,6 +775,11 @@ pub struct EngineConfig {
/// приходить динамически со списком серверов (вместе с их собственным
/// `--decoy-host`), чтобы клиент и сервер не расходились в выборе decoy-хоста.
pub decoy_sni: String,
/// Bearer-токен клиента (JWT, выданный `netrunner-backend` при логине) —
/// отправляется серверу в auth-кадре. `None`, если сервер не запущен с
/// `--require-auth` или приложение ещё не залогинено (Ghost Protocol seed
/// генерируется/логинится в фоне почти сразу, см. `netrunner-app/src/lib/api.ts`).
pub auth_token: Option<String>,
}
impl EngineConfig {
@@ -791,6 +796,7 @@ impl EngineConfig {
excluded_apps: Vec::new(),
excluded_domains: Vec::new(),
decoy_sni: netrunner_core::net::DEFAULT_DECOY_HOST.to_string(),
auth_token: None,
}
}
@@ -799,6 +805,11 @@ impl EngineConfig {
self
}
pub fn with_auth_token(mut self, auth_token: Option<String>) -> Self {
self.auth_token = auth_token;
self
}
pub fn with_cache_path(mut self, path: impl Into<String>) -> Self {
self.cache_path = path.into();
self
@@ -901,6 +912,7 @@ impl EngineBuilder {
let muxer = ClientHandler::connect(
&self.config.remote_address,
self.config.decoy_sni.clone(),
self.config.auth_token.clone(),
rx_for_client_handler,
tx_for_client_handler,
)