Аудит репозитория после #25 и #26. Расхождения между тем, что написано, и тем, что есть: - README обещал `tglock-cli-*` в таблице загрузок, но в релизе v2.0.0-beta.1 такого артефакта нет: задача `cli` в release.yml сработает только на следующем теге. Заменено на честную формулировку с командой сборки из main. - ui/main.ts держал начальным значением маршрута строку «Автоматический маршрут», которую бэкенд больше не отдаёт: при коде 0 возвращается «Маршрут ещё не выбран». Иначе до первого опроса статуса интерфейс показывал название несуществующего маршрута. - ARCHITECTURE_V2.md не упоминал ни разделения на библиотеку и два бинаря, ни фичи `gui`, ни правила различения протоколов, ни политики прямого релея, ни того, что GUI не запускается без WebView. Добавлены разделы, а последнее внесено в Current limitations вместе с отсутствием подписи бинарей. - ISSUE_AUDIT.md описывал состояние на 29 июля. Сам аудит оставлен как фиксация на дату, сверху добавлен статус на 30 июля: что закрыто, что осталось открытым и почему, и что исправлено вне списка issues. - HABR.md — черновик статьи, а не документация, но был указан в README как «подробный технический разбор». В нём «два файла, 350 строк, четыре платформы», тогда как сейчас 2872 строки Rust, семь файлов и три платформы плюс headless. Добавлена шапка с поправкой, ссылка в README переписана так, чтобы читателя не отправляли к устаревшим числам за документацией. Проверено: fmt, clippy в обоих вариантах сборки, 47 + 12 тестов, npm run build, все ссылки на файлы в .md существуют. Co-authored-by: by-sonic <171230345+by-sonic@users.noreply.github.com>
6.8 KiB
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 оставлены открытыми осознанно. Появился headless
tglock-cli, который на таких машинах работает, но сам GUI по-прежнему не создаёт окно без 3D-ускорения. Это обход, а не исправление.- #9 (Android) остаётся в backlog без сроков, #21 ждёт подтверждения на пересобранной сборке macOS.
Дополнительно исправлено то, чего в 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-ов.