# Патч hbbs: проверка доступа через кабинет

Основа — официальный [rustdesk-server 1.1.16](https://github.com/rustdesk/rustdesk-server/tree/1.1.16) (AGPL-3.0). Патч `gate.patch` добавляет `src/gate.rs` и три вставки в `src/rendezvous_server.rs`.

## Что делает

1. **PunchHoleRequest.** После проверки ключа сервера hbbs отправляет в кабинет `POST GATE_URL` с полями `token`, `target_id`, `from_ip`, `kind`. Проверка идёт раньше, чем сервер сообщает, есть ли такой компьютер и в сети ли он. Поэтому без доступа нельзя даже узнать, существует ли ID.
   - Отказ — клиент получает `PunchHoleResponse.other_failure` с причиной, и приложение показывает её как есть.
   - Разрешение — маска прав уходит на компьютер в `PunchHole.control_permissions` или `FetchLocalAddr.control_permissions`.
2. **RequestRelay.** Здесь тоже проверяются ключ сервера (в оригинале его тут не проверяют) и доступ. Права, которые прислал сам клиент, всегда заменяются ответом кабинета, поэтому подставить себе права нельзя.
3. **Если кабинет не ответил за `GATE_TIMEOUT_SECS` (по умолчанию 3 с)** — отказ.

## Переменные

| Имя | Значение |
|---|---|
| `GATE_URL` | например `http://127.0.0.1:8090/internal/authorize`. Пусто — проверка выключена, поведение как у оригинала |
| `GATE_TOKEN` | общий секрет с кабинетом (заголовок `Authorization: Bearer …`) |
| `GATE_TIMEOUT_SECS` | таймаут ответа кабинета |

## Ответ кабинета

```json
{"allow": true, "permissions": 1234, "reason": ""}
```

`permissions` — маска `ControlPermissions`: по 2 бита на право, 1 — запрещено, 2 — разрешено, 0 — решает компьютер. Номера прав — в `protos/rendezvous.proto`: keyboard 0, remote_printer 1, clipboard 2, file 3, audio 4, camera 5, terminal 6, tunnel 7, restart 8, recording 9, block_input 10, remote_modify 11, privacy_mode 12, usb 13.

## Ограничения

- Функцию «Поменяться местами» (switch sides) с включённой проверкой сервер отклоняет: у такого запроса нет ключа входа.
- На Android права с сервера не применяются (так в RustDesk 1.5.0).

## Обновление на новую версию RustDesk Server

1. Поменять `RUSTDESK_SERVER_TAG` в `Dockerfile`.
2. Пересобрать образ. Если `git apply` не прошёл — перенести три вставки вручную и выгрузить новый `gate.patch`.
3. Прогнать `tests/` в `cabinet` и проверку `scripts/gate_smoke.py`.
