Custom-client: сервер виден+залочен + preset-пароль (Win+Android)

preconfigure.sh генерит src/custom_client.json (override-settings
server/relay/key + verification-method + disable-change-permanent-password;
preset-пароль salt+00b64(sha256(pw+salt)) в HARD_SETTINGS) и патчит
common.rs встроенным неподписанным загрузчиком (обход ED25519-подписи
RustDesk). Пароль из RUSTDESK_PRESET_PASSWORD, plaintext не хранится.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 18:23:56 +03:00
parent b7729d5a4c
commit dc15b03156
2 changed files with 121 additions and 5 deletions
+18
View File
@@ -92,3 +92,21 @@ Rust 1.75 (rustup override в клоне) · MSVC 14.44 из vcvars64.
## Секреты в CI (gitea Actions)
`RUSTDESK_SERVER`, `RUSTDESK_PUB_KEY`, (опц.) `RUSTDESK_API_SERVER`. Префикс имён — не `GITHUB_`/`GITEA_`
(зарезервированы), при необходимости `GT_`.
## Custom-client: сервер виден+залочен + preset-пароль
Требование: сервер показан в Настройках и НЕизменяем + вшитый постоянный пароль (+ временный).
Механизм RustDesk (изучен по коду 1.4.9):
- `src/common.rs::load_custom_client()` (зовётся из core_main) читает `custom.txt` рядом с exe —
base64 + **ED25519-подпись** по вшитому pubkey `5Qbwsde3…` (приватник у генератора RustDesk Pro, у нас нет).
- Он заполняет `OVERWRITE_SETTINGS` (override — залоченные опции), `DEFAULT_SETTINGS`, `BUILTIN_SETTINGS` (локи),
`HARD_SETTINGS` (top-level, вкл. preset-пароль).
- `custom-rendezvous-server`/`relay-server`/`key`/`api-server`/`verification-method``KEYS_SETTINGS`
в `override-settings` показываются И залочены. `disable-change-permanent-password` ∈ BUILDIN.
- Preset-пароль (`hbb_common/src/config/permanent_password.rs`): `HARD_SETTINGS.password="00"+base64(sha256(pw+salt))`,
`HARD_SETTINGS.salt=<любая непустая соль>`. Формат «00»+b64(h1), h1=sha256(pw+salt)[..32].
Наша реализация (`preconfigure.sh`, вкл. по умолчанию; выкл. `RUSTDESK_NO_CUSTOM_CLIENT=1`):
- Пишет `src/custom_client.json` (override-settings + password/salt из `RUSTDESK_PRESET_PASSWORD`).
- Патчит `common.rs`: добавляет `read_custom_client_unsigned()` (парсит JSON БЕЗ подписи, тот же apply-код) +
`include_str!("custom_client.json")` в начало `load_custom_client()`. Работает Windows+Android (без внешнего файла).
- Пароль — только из env/secret `RUSTDESK_PRESET_PASSWORD`, солёный хэш пишется в gitignored-клон, plaintext нигде.