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

7.5 KiB
Raw Blame History

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.

Из списка «не подтверждённых обещаний» в конце документа закрыты все четыре пункта: формулировки про звонки и про «Подключено» приведены в соответствие с кодом, 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-ов.