mirror of
https://github.com/by-sonic/tglock.git
synced 2026-11-05 15:21:55 +03:00
8ce9355243
* fix(tunnel): медиа и «прокси не настроен»: один пакет на кадр, настоящие фронты, kwsN-1 только для медиа Три причины, каждая проверена на живом Telegram запросом req_DH_params: сервер сверяет номер DC внутри него с собой и отвечает -444 на чужой. - WebSocket-фронт разбирает один пакет на входящий кадр, остаток ждёт следующего. Клиент пишет запросы пачками, TGLock слал их одним кадром, и всё, что шло вторым, застревало: текст проходил, файлы вставали. Теперь поток режется на пакеты, как в Flowseal/tg-ws-proxy. Пачка через beta.18 висит на всех DC, через эту сборку принимается на всех. - Кластер kwsN-1 отвергает обычное соединение с -444, а Telegram Desktop в ответ выключает прокси как настроенный неверно. При сбое kwsN основное соединение откатывалось именно туда. Теперь kwsN-1 только для медиа. - Адреса из списка DC не говорят на TLS ни из какой сети (проверено с чистой сети), поэтому первый маршрут каждого DC не работал никогда. Закреплены настоящие фронты, и DC1, DC3, DC5 стали доступны по WebSocket, чего не было. У CDN203 своего фронта нет: остались TCP, Worker и CF-прокси. Обрыв туннеля, через который уже шли данные, больше не ставит маршрут на паузу. Таймаут соединения 8 с, как в tg-ws-proxy. probe_proxy.mjs получил --identity и --batched: они и нашли эти баги. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat: журнал ошибок в диагностике, --log-file для роутеров; 2.0.0-beta.19 «Скопировать диагностику» отдавала только счётчики, и по ней нельзя было понять, какой маршрут не ответил. Теперь в отчёте есть строки сбоев туннелей, а домены Worker и CF-прокси в них заменены на <домен>. --log-file и --log-max-mb (log_file, log_max_mb в настройках), как в tg-ws-proxy: журнал идёт в файл с ротацией, а не в системный журнал роутера. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(routes): запасной WebSocket на порту 80 родных адресов, включая CDN203 Родные адреса Telegram принимают WebSocket без TLS на порту 80. Измерено req_DH_params: DC определяется адресом, имя хоста не важно, а 91.105.192.100 отдаёт ключи CDN. Для CDN203, откуда часто идёт видео, это первый прямой WebSocket: на 443 фронта у него нет, и там, где провайдер закрыл только 443, до него раньше было не достать без Worker. Защита та же, что у родного TCP: внутри тот же обфусцированный MTProto. В Host идёт адрес, имени Telegram в открытом виде нет. Маршрут разрешён только до закреплённых адресов и пробуется последним. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(routes): паузы маршрутов по результатам ревью, пределы и журнал - Обрыв не наказывает маршрут, только если туннель работал и получал ответы 15 с. Одного ответа мало: маршрут, который ответил раз и умер, оставался предпочтительным навсегда. - Клиент спросил, не дождался ответа за 5 с и ушёл: маршрут считается неработающим. Иначе CDN, принявший TCP и молчащий, держал первое место, и очередь до порта 80 не доходила. - Предел пакета 2 МиБ вместо 16: чужое устройство в LAN-режиме не заставит роутер копить десятки мегабайт на соединение. - Журнал: разовая ошибка записи его больше не выключает, неудачная ротация не теряет бэкап и держит предел, права 0600 и на уже существующем файле. - В отчёт диагностики не попадает Worker, заданный адресом. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: babin <Thartewerner536e@engineer.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
79 lines
2.7 KiB
TOML
79 lines
2.7 KiB
TOML
[package]
|
|
name = "tglock"
|
|
version = "2.0.0-beta.19"
|
|
edition = "2021"
|
|
rust-version = "1.88"
|
|
description = "Telegram unblock via local WebSocket tunnel"
|
|
license = "MIT"
|
|
autobins = false
|
|
|
|
[features]
|
|
default = ["gui"]
|
|
# The desktop GUI. Turning it off drops Tauri, the system WebView and the
|
|
# frontend bundle from the build, which is what makes headless servers and
|
|
# machines without a GPU or monitor able to build and run TGLock at all.
|
|
gui = ["dep:tauri", "dep:tauri-build", "dep:tauri-plugin-opener"]
|
|
# The headless binary. Deliberately NOT in `default`.
|
|
#
|
|
# When both binaries exist in one build, the Tauri bundler picks the wrong one
|
|
# as the application: `tauri build --target <triple>` packaged tglock-cli and
|
|
# shipped it as the app in v2.0.0-beta.2 and v2.0.0-beta.3. Keeping the CLI
|
|
# behind its own non-default feature means it simply does not exist during an
|
|
# application build, so there is nothing to pick wrongly.
|
|
cli = ["dep:clap", "dep:toml"]
|
|
|
|
[lib]
|
|
name = "tglock_lib"
|
|
path = "src/lib.rs"
|
|
crate-type = ["staticlib", "cdylib", "rlib"]
|
|
|
|
[[bin]]
|
|
name = "tglock"
|
|
path = "src/main.rs"
|
|
required-features = ["gui"]
|
|
|
|
[[bin]]
|
|
name = "tglock-cli"
|
|
path = "src/bin/cli.rs"
|
|
required-features = ["cli"]
|
|
|
|
[dependencies]
|
|
tauri = { version = "2", features = ["tray-icon"], optional = true }
|
|
tauri-plugin-opener = { version = "2", optional = true }
|
|
clap = { version = "4", features = ["derive"], optional = true }
|
|
# Файл конфигурации CLI. TOML, а не JSON, потому что файл правят руками и в нём
|
|
# нужны комментарии.
|
|
toml = { version = "0.8", optional = true }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
tokio = { version = "1", features = [
|
|
"rt-multi-thread",
|
|
"net",
|
|
"io-util",
|
|
"time",
|
|
"macros",
|
|
"sync",
|
|
"signal",
|
|
] }
|
|
tokio-tungstenite = { version = "0.24", features = ["rustls-tls-webpki-roots"] }
|
|
# Explicit ring provider supports Android and static musl without OpenSSL.
|
|
rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"] }
|
|
webpki-roots = "0.26"
|
|
futures-util = "0.3"
|
|
aes = "0.8"
|
|
ctr = "0.9"
|
|
cipher = "0.4"
|
|
sha2 = "0.10"
|
|
rand = "0.8"
|
|
|
|
[build-dependencies]
|
|
tauri-build = { version = "2", features = [], optional = true }
|
|
|
|
[dev-dependencies]
|
|
rcgen = "0.13"
|
|
tokio-rustls = { version = "0.26", default-features = false, features = ["ring", "tls12"] }
|
|
# `start_paused` в тестах: таймаут ожидания запроса от клиента — десять секунд,
|
|
# и ждать их по-настоящему в тесте нельзя. В сборку не попадает: dev-зависимости
|
|
# участвуют только в тестах.
|
|
tokio = { version = "1", features = ["test-util"] }
|