Files
tglock/docs/ISSUE_AUDIT.md
T
Никита Sonic f03e9106ee docs: инструкция по Cloudflare Worker + скрипт, снять флаг пререлиза (#29)
Резервный маршрут через Worker был в коде с 2.0, но воспользоваться им никто
не мог: в ARCHITECTURE_V2.md описан только контракт эндпоинта — это
спецификация для того, кто будет писать воркер, а не руководство. Ни скрипта,
ни шагов в репозитории не было. Поэтому люди, у которых легли все обычные
маршруты, писали «не работает» вместо того, чтобы включить запасной выход.

Добавлено:
- worker/tglock-worker.js — готовый скрипт. Проверяет путь и upgrade,
  подтверждает подпротокол binary (без этого клиент рвёт рукопожатие),
  соединяется только с семью адресами Telegram, которые запрашивает TGLock,
  и поддерживает необязательный TGLOCK_TOKEN. Без списка адресов воркер стал
  бы открытым TCP-прокси для любого, кто узнает его адрес.
- docs/CLOUDFLARE_WORKER.md — когда это нужно и когда нет (таблица
  «что видно в приложении → нужен ли Worker»), установка через веб-интерфейс,
  проверка живости, подключение в GUI и через --worker, ограничение доступа,
  контракт для своих реализаций.
- Ссылки из README: в FAQ про блокировку web.telegram.org и в блок docs.

Контракт закреплён тестами, чтобы документация не разошлась с кодом:
- worker_path вынесен в функцию, из неё же строятся боевые маршруты;
- documented_worker_contract_matches_the_requested_path сверяет формат пути;
- worker_allowlist_covers_every_address_a_route_can_ask_for падает, если в
  маршрутах появится адрес, которого нет в скрипте воркера;
- connects_through_the_documented_worker_contract поднимает сервер, ведущий
  себя ровно по документации, и проверяет что туннель работает в обе стороны
  и что запрошен именно документированный URI.

Чего тесты не проверяют: развёрнутый воркер в самом Cloudflare. Это указано и
в самой инструкции.

Отдельно: снят флаг prerelease в release.yml. До правки /releases/latest
отдавал v2.0.0-beta.1, то есть кнопка «Скачать» в README вела на сборку без
CLI и без фикса рендера. Существующий релиз v2.0.0-beta.2 помечен как latest
вручную.

Co-authored-by: by-sonic <171230345+by-sonic@users.noreply.github.com>
2026-07-30 14:06:19 +03:00

87 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TGLock 2.0 issue audit
Проверено 29 июля 2026 года: все 15 issues и 5 pull requests, существовавшие
в репозитории на момент аудита.
> **Статус на 30 июля 2026.** Аудит ниже оставлен как есть — это фиксация
> состояния на дату проверки. Что с тех пор сделано:
>
> - Разобраны все issues и pull requests. Открытых PR не осталось.
> - Закрыты #1#5, #8, #11, #13, #14, #19, #23 и #3 — с техническими
> объяснениями в самих issues.
> - #15 реализован заново поверх архитектуры 2.0 в #25: смерджить исходный PR
> было нельзя, он патчил `bypass.rs`, `network.rs` и `ws_proxy.rs`, которых
> больше нет, и правил системный DNS. Взято разделение GUI/CLI и произвольный
> bind-адрес; DNS-менеджмент и проверка root отброшены как ненужные.
> - #12 закрыт: относился к шрифту старого egui-интерфейса.
> - #10 и #17 закрыты выпуском `v2.0.0-beta.2`: GUI перед стартом просит у
> WebView программный рендер. Проверить это на машине без 3D-ускорения
> возможности не было, поэтому закрыто как «исправление выпущено», а не
> «исправлено» — репортерам предложено переоткрыть, если проблема осталась.
> Независимо от WebView работает `tglock-cli`.
> - #21 закрыт: репорт относился к сборке macOS, которой больше нет, в
> `v2.0.0-beta.2` она пересобрана универсальным `.dmg`.
> - #9 (Android) остаётся единственным открытым — backlog без сроков.
>
> Единственная претензия из публичного обсуждения, которую нельзя закрыть
> кодом: инсталлятор не подписан, из-за чего часть антивирусов на него
> реагирует. Требует покупки сертификата.
>
> Дополнительно исправлено то, чего в issues не было: коллизия MTProto-init с
> байтом `0x05` (одно соединение из 256 уходило в SOCKS5-ветку и умирало),
> подсчёт туннеля до успешного рукопожатия, неверные подписи маршрутов в
> интерфейсе и генерация нового секрета при каждом старте сервиса. Подробности —
> в [ARCHITECTURE_V2.md](ARCHITECTURE_V2.md).
>
> Из списка «не подтверждённых обещаний» в конце документа закрыты все четыре
> пункта: формулировки про звонки и про «Подключено» приведены в соответствие с
> кодом, LAN-режим ограничен адресами Telegram на уровне типа, Cloudflare Worker
> остаётся исключительно пользовательской настройкой.
## Выводы
Главная причина жалоб «прокси подключён, но Telegram не работает» — приложение
считало успешный запуск локального SOCKS5-сервера успешным подключением к
Telegram. Единственный upstream `kws{dc}.web.telegram.org` может резолвиться в
недоступный IP или блокироваться провайдером.
TGLock 2.0 разделяет эти состояния и использует адаптивный список Telegram IP,
`kwsN`/`kwsN-1`, системный DNS и опциональный пользовательский Cloudflare
Worker. TLS SNI и WebSocket Host проверяются. Системный DNS и файл `hosts`
не изменяются.
## Классификация
| Issue | Наблюдение | Решение для 2.0 |
|---|---|---|
| #1 | Порт 1080 занят | Уже есть выбор порта; добавить автоматический подбор |
| #2, #11 | Неверный сетевой адаптер | В переписанном Rust-ядре привязка исходящего адаптера отсутствует; добавить только как расширенную настройку |
| #3 | Rust 1.75 не собирает зависимости | `Cargo.lock` зафиксирован; MSRV 1.88 документирована и проверяется в CI |
| #4 | Linux/серверный режим | Добавить headless CLI и systemd/Docker-примеры |
| #5 | macOS | Публиковать universal `.app`, затем подписанный и notarized DMG |
| #8, #19, #21, #23 | Нет подключения | Резервные маршруты, live-probe, понятная диагностика вместо ложного «Подключено» |
| #9 | Android | Не входит в desktop 2.0; LAN остаётся отдельным сценарием |
| #10, #17 | GUI не запускается без GPU/монитора | Headless CLI; отдельно проверить software rendering |
| #13 | Discord/YouTube | Вне области проекта; не смешивать с Telegram-транспортом |
| #14 | Медиа, звонки, LAN | Медиа тестировать отдельно; звонки не обещать без UDP; LAN ограничить Telegram-адресами |
## Pull requests
- #6 относится к старой Windows-реализации выбора адаптера.
- #12 относился к шрифту старого GUI. В v2 интерфейс перенесён на Tauri 2 и
использует системную типографику каждой платформы.
- #15 содержит полезное направление разделения GUI/CLI, но основан на старой
архитектуре и меняет DNS системы.
- #18 — экспериментальный Linux GUI без подтверждённого мобильного сценария.
- #7 не содержит продуктового изменения.
## Не подтверждённые обещания
- Голосовые и видеозвонки нельзя заявлять рабочими: SOCKS5 UDP Associate не
реализован, а Telegram может обходить proxy для части звонков.
- «Подключено» допустимо показывать только после успешного WebSocket handshake,
а не после открытия локального порта.
- LAN-режим не должен становиться открытым универсальным SOCKS5-прокси.
- Резерв через чужую Cloudflare-инфраструктуру нельзя включать без ясной модели
доверия, владельца, мониторинга и политики обновления endpoint-ов.