31 Commits

Author SHA1 Message Date
samosvalishe 7d1ae10a47 fix(dnsdial): вернуть простую UDP-пробу auto до auto-пробы реального хоста 2026-06-17 22:49:00 +03:00
samosvalishe 1ec4fd463d fix(dnsdial): не вешать старт auto на DoH-пробу 2026-06-17 22:03:03 +03:00
samosvalishe e503aaee33 style: ASCII-пунктуация 2026-06-17 10:03:41 +03:00
samosvalishe 1ec2b2610a feat(dnsdial): auto-проба реального хоста с DoH recovery
auto-режим пробил UDP/53 нейтральным dns.google и залипал на UDP
навсегда. При выборочной фильтрации (dns.google резолвится, целевой
хост - нет) это вело к таймаутам резолва. Проба теперь валидирует
резолв реального хоста; при провале UDP уходит на DoH. Добавлен
рантайм-recovery в обе стороны: серия неудач UDP -> DoH, периодическая
перепроба DoH -> UDP.
2026-06-17 10:03:40 +03:00
samosvalishe 40796b4844 fix(dnsdial): убрать динамический фоллбэк на DoH
Откат: динамическое переключение ломало one-shot автовыбор UDP/53. Возврат к sticky-пробе при старте.
2026-06-11 21:04:58 +03:00
samosvalishe f24c5416de fix(dnsdial): динамический фоллбэк на DoH при отказе UDP/53 после пробы 2026-06-11 19:27:30 +03:00
samosvalishe e061345089 feat: авторизация по client-id, freeturn:// URI и подписки
- internal/clientsdb: БД клиентов с hot-reload + length-prefixed ID wire
- internal/uri: parse/encode share-ссылок freeturn://
- internal/sub: загрузка и парсинг подписок (sub.md)
- client: флаги -auth, -client-id, -sub; позиционный URI; ID через crypto/rand
- server: подкоманда clients (add/remove/list), чтение ID под -clients-file
- запись/чтение ID учитывают DTLS record-orientation (буфер на запись целиком)
- docs: uri.md, sub.md; правки flags/deploy/quickstart
- снят UTF-8 BOM по всем исходникам
2026-05-24 01:14:38 +03:00
samosvalishe 41d877dc64 chore: free turn proxy 2026-05-24 00:01:57 +03:00
samosvalishe 2b85d937ea refactor(provider/vk): перенести vkauth/captcha/browserprofile/namegen под provider/vk/internal
Переносит VK-specific пакеты под internal/provider/vk/internal/* — теперь
недоступны для импорта извне provider/vk (Go internal/ rule). ish остался в
internal/client/ish — не VK-specific.

vk.SetCaptchaLoggers удалён: логгеры captcha/manual подключаются внутри vk.New,
debug-флаг передаётся через новое поле Config.Debug. cmd/client/main.go больше
не импортирует captcha-пакеты.

Документация обновлена.
2026-05-23 14:36:58 +03:00
samosvalishe 12c1ad6283 feat: абстракция провайдера (vk + static)
Вытаскивает источник TURN-creds из захардкоженной привязки к VK в интерфейс
internal/provider.Provider. Pipeline (proxy/udprelay, proxy/tcpfwd) работает
только через интерфейс — без VK-specific импортов и sentinel'ов.

Реализации:
- internal/provider/vk: фасад над client/vkauth (требует -link)
- internal/provider/static: фиксированные creds для self-hosted coturn /
  metered / любого RFC 5766/8656 TURN (флаги -static-user/-static-pass/
  -static-addr)

Изменения интерфейса:
- common.GetCredsFunc дропнула link (provider держит сам)
- udprelay AuthHandler: LockoutUntilUnix → BackoffUntilUnix
- vkauth sentinels обёрнуты в provider.ErrBackoffActive / ErrFatalNoStreams
  через errors.Join (backward-compat сохранён)

Документация: docs/providers.md (новый), docs/glossary.md и docs/flags.md
обновлены.
2026-05-23 14:11:05 +03:00
samosvalishe dd8233208c fix(lint): устранить замечания golangci-lint + переход на dockers_v2
Проход lint (52 → 0):
- vkauth/token: переименовать затенённый err (govet shadow x3)
- udprelay/loop: явный _ = conn.Close() (errcheck x2)
- captcha/manual: ReadHeaderTimeout + html.EscapeString (G112, G705)
- proxy/tcpfwd: хелпер nonNegUint64 для байтовых счётчиков io.Copy (G115)
- proxy/bondclient, wire/bondframe: bounds-проверки на len->uint16/uint32
- wire/srtpmimicry: задокументирована усечка RTP seq mod 2^16
- dnsdial/doh: bounds-проверка + binary.BigEndian.PutUint16
- captcha/slider: clamp luma до 255 перед конверсией uint8
- vkauth/types: обоснованный nolint для публичных учёток VK SDK

Новый пакет internal/randx — Intn/IntN/Float64 на crypto/rand, drop-in замена
math/rand. Мигрированы все места antifingerprint-jitter (~22) в captcha, slider,
namegen, vkauth, udprelay.

GoReleaser:
- bump GORELEASER_VERSION v2.5.0 → v2.15.4 в Taskfile и обоих CI-workflow;
  текущий синтаксис .goreleaser.yaml (archives.ids, format_overrides.formats)
  требует v2.8+
- миграция dockers + docker_manifests → dockers_v2 (единый блок, multi-platform
  buildx); Dockerfile.goreleaser использует конвенцию ARG TARGETPLATFORM
2026-05-23 01:37:42 +03:00
samosvalishe 971b1ac8fc chore: правка форматирования 2026-05-23 00:33:45 +03:00
samosvalishe 8b2e028f99 fix: устранить замечания комплексной проверки
Критичное:
- go.mod: версия 1.25.5→1.25.0 (go mod tidy); Dockerfile: тег 1.25
- release.yml: go-version 1.25.5 → stable
- удалён temp-файл types.go.tmp.18500.1c9f4278a15a
- udprelay/loop.go: defer conn1/conn2.Close() при сбое Dial; лог write-error

Безопасность/код:
- browserprofile: пермиссии 0644→0600
- bondserver: once.Do перед go readLane (ordering fix)
- cmd/server: err= → err:= (shadow fix в AfterFunc)
- vkauth/client: vkDelayRandom ctx-aware (возвращает error)
- captcha/manual: whitelist хостов в /generic_proxy (SSRF mitigation)

Инфра:
- .dockerignore: исключить .git/.github/notes/dist из build context
- docker-compose.yml: env_file .env для OBF_KEY
- entrypoint.sh: позиционные аргументы вместо unquoted vars; валидация host:port

CI:
- ci.yml: исправлен путь go module cache (~/go/pkg/mod); добавлен -race
- .gitignore: добавлены /dist/, *.test, coverage.out, .env, *.tmp
- .golangci.yml: добавлены gosec и staticcheck
- routes-macos.sh: set -eu вместо set -u

Код:
- bondclient/bondserver: errors.Is(err, io.EOF) вместо err != io.EOF
- cmd/client: константа dtlsHandshakeConcurrency для HandshakeSem

Доки:
- quickstart.md: добавлен Intel Mac (darwin-amd64)
- build.md: версия Go, Windows/macOS cross-compile инструкции
- flags.md: уточнено описание -bond
2026-05-21 20:14:45 +03:00
samosvalishe 31e35efbf3 refactor: переименовать флаги и поля CLI/конфига
- wrap → obf: -wrap/-wrap-key/-gen-wrap-key → -obf/-obf-key/-gen-obf-key;
  ObfOpts.WrapMode/WrapKey/GenWrapKey → Mode/Key/GenKey
- vless → mode: -vless/-vless-bond → -mode tcp / -bond;
  clientProxyMode/serverProxyMode принимают string вместо bool
- -udp → -transport tcp|udp; TURNOpts.UDP → TransportUDP (везде)
- -vk-link → -link; -dns → -dns-mode; DNSModeUDP → DNSModePlain ("plain")
- KCP: убрать LoadProfileFromEnv/LoadFECFromEnv — хардкодить DefaultProfile/FEC{}
- Добавить валидацию -transport/-mode/-bond/-dns-mode в ParseClient/ParseServer
2026-05-21 19:19:40 +03:00
samosvalishe 6c3d3d341c chore(lint): расширить golangci-конфиг и устранить замечания
- Добавить nilerr, contextcheck, noctx, unconvert, unparam, gocritic, prealloc;
  убрать пресет std-error-handling и check-blank
- Заменить net.Dial/Listen/ListenPacket на context-aware варианты в tcpfwd,
  bondserver, tcpfwdserver, udprelay, udpserver
- Убрать параметр typ из writeToNextLane (всегда FrameData)
- Убрать лишний DohEndpoint из возвращаемых значений forwardRaw
- Анонимные receivers для методов без доступа к self (logx, vkauth, doh)
- Переименовать неиспользуемые параметры в _ (bondclient, bondserver, netconn,
  dtlsdial тесты)
- cmd/client: unlambda fix StreamsAlive → connectedStreams.Load
2026-05-21 16:49:59 +03:00
samosvalishe 4ac1f3e25c chore: убрать случайно добавленный .tmp файл 2026-05-21 12:37:03 +03:00
samosvalishe e417dac087 style: перевести комментарии на русский, убрать очевидные 2026-05-21 12:31:50 +03:00
samosvalishe c4b6774241 style: gofmt/goimports новых файлов
Применить gofmt и goimports к файлам, добавленным в недавних разбиениях
(udprelay/loop.go, udprelay/run.go, vkauth/token_oksession.go). Группы импортов
теперь по порядку stdlib / external / internal.
2026-05-21 02:01:24 +03:00
samosvalishe 0e2d42c912 refactor(vkauth): разбить token.go на файлы по шагам
token.go теперь тонкий оркестратор (~75 строк). Каждый шаг VK-токена в своём
файле:
- token_request.go: хелпер doRequest (POST + browser-заголовки + JSON)
- token_anon.go: fetchAnonToken (шаг 1, login.vk.ru)
- token_call.go: fetchCallToken + captcha-loop + solveCaptcha (шаг 2)
- token_oksession.go: fetchOkRuSession (шаг 3, calls.okcdn.ru)
- token_creds.go: fetchTurnCreds (шаг 4, vchat.joinConversationByLink)

Публичный API (Client, getTokenChain, tokenChainFn) не изменён. Поведение
идентично оригиналу.
2026-05-21 01:26:21 +03:00
samosvalishe 6b8b82f530 refactor(client): убрать deprecated-теги с package-level логгеров
cmd/client — однопроцессный CLI; package-level Log+SetLogger остаётся
каноническим API. captcha.Solve по-прежнему принимает явный логгер для DI.
Также осовременен backoffSteps через min().
2026-05-21 01:20:54 +03:00
samosvalishe 5735b4a297 fix(captcha/dnsdial): начать DI-миграцию package-level логгеров
captcha.Solve теперь принимает явный параметр logx.Logger, и captchaSession
использует его внутри; package-level переменная Log и SetLogger сохранены, но
помечены deprecated.

auto_solver.go обновлён, чтобы передавать captcha.Log в Solve, сохраняя текущую
обвязку до полного DI-прохода.

manual и dnsdial: SetLogger и Log помечены deprecated с пояснением для будущей
struct-based DI; поведение не изменено.
2026-05-21 01:14:43 +03:00
samosvalishe 7ffa21b8aa fix(captcha/manual): останавливать HTTP-сервер при отмене ctx
runCaptchaServerAndWait теперь делает select на ctx.Done вместе с keyCh и
закрывает listener в defer. Без этого, когда родительский manualCtx истекал
(3m), внутренняя горутина блокировалась на keyCh навсегда, оставляя
127.0.0.1:8765 занятым до выхода процесса. SolveViaProxy/SolveViaHTTP принимают
ctx и протягивают его; manualCaptchaSolver в cmd/client/main.go форвардит ctx
вместо того, чтобы его терять.
2026-05-21 00:43:36 +03:00
samosvalishe 242862397a chore: переименовать модуль в github.com/samosvalishe/btp; обновить зависимости
- путь модуля: github.com/cacggghp/vk-turn-proxy → github.com/samosvalishe/btp
- директории cmd: cmd/vk-turn-{client,server} → cmd/{client,server}
- зависимости: pion/turn v5.0.4, kcp-go v5.6.72, smux v1.5.57, x/crypto v0.51,
  klauspost/{compress,cpuid,reedsolomon}, x/{net,sys,text,tools,mod,time}
- README, workflows, GLOSSARY обновлены под новые пути
2026-05-20 12:39:26 +03:00
samosvalishe 9d7d754740 refactor(logging): унифицировать stdlib log.* в logx по client/cmd
internal/client/captcha, captcha/manual, dnsdial: добавить package-level Log +
SetLogger; убрать прямой обход -debug через stdlib log.Printf. cmd/{client,
server}/main.go: сначала строить logger, весь вывод через logger.{Info,Warn,
Error}f; оставлен один log.Fatalf только для сбоя разбора конфига до логгера.
dnsdial: log.Panicf → panic(fmt.Sprintf).

Исправлены уровни:
- vkauth/token.go: пути [FATAL] теперь Errorf; Auto/Manual captcha failed →
  Warnf; ignored-cleanup-error → Debugf.
- vkauth/client.go: HandleAuthError/cache invalidated → Warnf; throttle wait →
  Debugf; Failed-with-client_id → Warnf.
- udprelay: "Backing off 60s" + SetDeadline failed → Warnf.
- captcha: PoW/show_type/check status/debug_info → Debugf; endSession/close-body/
  script-drift → Warnf.

Префиксы нормализованы к [STREAM %d] [Pkg] msg / [Pkg] msg.
2026-05-20 11:26:21 +03:00
samosvalishe 52e7cb83e6 fix: утечки, уровни logx, обход логгера
- logx: добавить префиксы [DEBUG]/[INFO]/[WARN]/[ERROR]; уровни были
  неразличимы в выводе (всё шло через голый log.Printf).
- logx: добавить хелпер OrNop для nil-проверок на стороне конструктора.
- vkauth/{client,token}.go: заменить прямой log.Printf на c.log.Infof
  (97 мест обходили унифицированный логгер после прошлого рефакторинга).
- udprelay.oneTURN: буферизовать error chan (cap 1) + select на ctx.Done в
  TURNLoop — небуферизованный send блокировался навсегда, когда TURNLoop
  выходил по ctx до чтения, утекали горутина + TURN-стрим.

- udprelay: перенести write-цикл conn2->relay в wg.Go (был голый go func, мог
  пережить wg.Wait и читать из закрытого conn).
- udprelay.TURNLoop: заменить time.Sleep(2s) на select+ctx, чтобы shutdown не
  блокировался per-stream.
- udprelay.Run / tcpfwd.Run: возвращать error вместо log.Panicf при сбое listen;
  cmd/* теперь log.Fatalf на всплывшей ошибке.
- cmd/*: log.Panicf → log.Fatalf для CLI-ошибок (без stack trace на плохой флаг).
- kcptun.NewKCPOverDTLS: закрывать серверный kcp.Listener на error-путях после
  SetDeadline/AcceptKCP (утекал при любом сбое).
- doc пакета udprelay: переписать устаревшее утверждение "avoid importing
  vkauth" (файл импортирует vkauth ради sentinel-ошибок).
- udprelay: lifecycle-сообщения ("Established/Closed DTLS connection")
  Errorf → Infof; строка "relayed-address" под DebugEnabled использует Debugf.
- tcpfwd: lifecycle-сообщения ("connected/disconnected/waiting/listening")
  Errorf → Infof, "failed to wrap listener" → Warnf.
- tcpfwd.maintainSession doc: "fixed 2-3s backoff" было неверно (3s при сбое
  setup, 2s после disconnect).
- pool.go doc: "bond client (in main)" → internal/proxy/bondclient.
- srtpmimicry.Unwrap: doc предупреждает, что AEAD открывает in-place внутри
  wire, поэтому вызыватели должны считать wire потреблённым.
- комментарии-алиасы GetCredsFunc udprelay/tcpfwd: убрать фикцию "cmd/main
  wiring stability" (всё в internal/).

Build чисто, go vet чисто, все тесты проходят.
2026-05-19 22:24:21 +03:00
samosvalishe 51bda46446 refactor: симметрия, вынос серверных хендлеров
- internal/proxy/udpserver: handleUDPConnection вынесен из server-main
- internal/proxy/tcpfwdserver: handleVLESSConnection + prefixedConn + pipeConn
  вынесены из server-main
- cmd/vk-turn-server/main.go: 396 → 134 строк, глобалы убраны
- internal/proxy/udprelay: добавлен entrypoint Run() симметрично tcpfwd.Run;
  Pool → packetPool (unexported); listener+fan-in вынесены из client-main
- cmd/vk-turn-client/main.go: 262 → 130 строк, package-глобалы убраны
- dtlsdial.Dialer: кеш self-signed сертификата на Dialer (sync.Once) вместо
  регенерации на каждый handshake
- captcha.solveCaptchaPoW: переиспользование буфера (вместо 10M конкатенаций
  строк), ctx-проверка каждые 1024 итерации (было 4096)

Тесты + lint проходят.
2026-05-19 21:53:13 +03:00
samosvalishe ed6825976a fix: исправить баги, sentinel-ошибки, устаревшие доки
Баги:
- udprelay: errors.Is(DeadlineExceeded) вместо сравнения строк; короткий
  backoff в ветке lockout; обернуть DTLS-ошибку через %w
- bondserver.copyBondToBackend: лимит pending-map в 1024 (паритет с bondclient)
- srtpmimicry.RelayPacketConn: bufPool для горячего UDP-пути (паритет с listen.go)
- vkauth.token.go: ручной солвер под ctx.WithTimeout(ctx, ...) вместо Background
  — нет утечки горутины при shutdown

Гигиена:
- sentinel-ошибки vkauth как var = errors.New(...); вызыватели используют errors.Is
- убраны устаревшие комментарии этапов рефакторинга (Pion SPDX, "Package bond",
  internal/bond, удалённый файл заметок)
- .gitignore: *.exe, *.so

Тесты + lint проходят.
2026-05-19 21:47:48 +03:00
samosvalishe 1fb869b3e1 refactor(layout): переименовать пакеты (split wire/transport/proxy)
internal/wrap → internal/wire/srtpmimicry; правки doc ("обфускация, не security").
internal/bond/{frame,client,server} → internal/wire/bondframe,
internal/proxy/bondclient, internal/proxy/bondserver.
internal/netadapt → internal/netconn.
internal/turnpipe → internal/transport/turndial; internal/dtlsdial →
internal/transport/dtlsdial.
tcputil → internal/transport/kcptun; selectedKCPProfile и selectedFEC теперь
кешируются через sync.Once (env читается один раз вместо per-connection).
internal/proxy/udp → internal/proxy/udprelay; internal/proxy/vless →
internal/proxy/tcpfwd. Флаг CLI -vless сохранён.
internal/ish → internal/client/ish; doc пакета расширен (iSH = Linux user-mode
эмулятор на iOS, только linux/386).

Чисто механическое переименование + обновление import-путей/идентификаторов.
Wire-формат, флаги CLI и поведение не изменены. go build + go test зелёные.
2026-05-19 20:42:46 +03:00
samosvalishe 7fd2d9594d refactor(logx): заменить Deps{Debug,Debugf} на интерфейс logx.Logger
Добавляет internal/logx с Debugf/Infof/Warnf/Errorf + DebugEnabled().
Протягивает logx.Logger через bondclient, bondserver, proxy/udp, proxy/vless,
vkauth. Убирает глобалы isDebug/debugf из обоих бинарей. Переносит
globalBondRegistry из package init в main (инициализация после
config.ParseServer), закрывая давний footgun "Debug=false на init".
2026-05-19 17:54:19 +03:00
samosvalishe acbd90f52e refactor(captcha): вынести ручной flow в internal/client/captcha/manual
- cmd/vk-turn-client/manual_captcha.go (875 строк, был в package main) →
  internal/client/captcha/manual/manual.go как отдельный пакет. Экспортирует
  SolveViaProxy и SolveViaHTTP (переименованы из solveCaptchaViaProxy/
  solveCaptchaViaHTTP). Остальное package-private.

- Глобал isDebug, который ручной flow читал из main, заменён на manual.Debug
  (package var). cmd/vk-turn-client/main.go ставит manualcaptcha.Debug =
  cfg.Debug рядом с существующим isDebug = cfg.Debug.

- Тестовый файл перенесён с кодом; пакет переключён с main на manual.
  TestRewriteProxyRedirectLocation по-прежнему зовёт package-private rewriter
  изнутри пакета.

- План предлагал дробить manual.go дальше (server.go/browser.go/proxy.go/
  rewrite_html.go). Пропущено: лишний churn без выгоды, раз файл живёт в
  своём пакете. Можно сделать позже.
2026-05-19 17:21:07 +03:00
samosvalishe 2167ba990b refactor(layout): переезд в cmd/, свернуть client/internal в internal/client
- server/main.go → cmd/vk-turn-server/main.go. Несёт остаточные правки сервера
  (drop параметра useBond, убрано поле startup-лога).
- client/internal/{browserprofile,captcha,dnsdial,namegen,vkauth} →
  internal/client/* (единая иерархия internal/; параллельное дерево
  client/internal/ убрано). Все Go import-пути обновлены.
- .github/workflows/{ci,release}.yml, Dockerfile, README.md — пути сборки
  переключены на ./cmd/vk-turn-client и ./cmd/vk-turn-server.
- README: убран устаревший пример "server -vless-bond" (флаг удалён ранее);
  добавлены рецепты сборки .so для Android arm64 + Linux arm64/amd64 под
  ручную упаковку для мобилок.
- internal/proxy/udp/udp.go, internal/config/config.go: обновлены устаревшие
  ссылки client/internal/* в doc-комментариях.
- notes/GLOSSARY.md (новый, ~20 терминов): фиксирует DTLS-как-обфускацию,
  wrap=AEAD-не-XOR, четыре значения "client", три значения "stream", пять
  ортогональных переключателей "mode", заметки по сборке libvkturn.so, iSH,
  хрупкость init globalBondRegistry и удаления флагов.

cmd/vk-turn-client/ намеренно оставлен вне этого коммита; сворачивается вместе
с извлечением ручной captcha в следующем коммите, т.к. переименование и правки
импортов manualcaptcha.* попадают в один файл.

Wire-форматы не тронуты. Поведение не изменено кроме уже закоммиченных
удалений CLI.
2026-05-19 17:20:26 +03:00