Files
OpenFlux/node_wizard_exitnode.go
saharev1 17557e472b Транспорт cups.online (CLI + iOS) и мастер установки узла
Две крупные вещи плюс их обвязка.

== cups.online как транспорт ==

Пакет transport/cupsonline/ перенесён из upstream/main дословно (с их
тестами на фейковом cups-сервере). Нода без --url создаёт комнаты на
interview.cups.online и печатает base64-строку, которую клиент подаёт
как --url; трафик прячется в сообщениях комнаты. Проведён в main.go через
buildMuxTransport — получает adaptive/batch-кодек (совместимость с
batched-only upstream) и мультиплекс, как остальные doc-транспорты.

Зависимость: не хватало utils.Infof (always-on лог, в отличие от Debugf) —
добавлен по образцу upstream.

KDF-контекст для cups (фикс из ветки hotfix bc9ada0). Список комнат
создаётся НОДОЙ при старте и раздаётся клиентам как URL, поэтому нода его
заранее не знает и берёт контекст "http://#", а клиент вывел бы его из
списка — разные ключи, рукопожатия нет, снаружи как таймаут. Теперь URL
cupsonline трактуется как отсутствующий (в main.go на call-site и в
iOS-мосте wrapEncryption), ровно как upstream-нода. Проверено: cups →
"http://#", yandex → URL документа не затронут.

iOS. Транспорт был в Go-lib, но недостижим из приложения: у мостов свой
switch. Добавлен case "cupsonline" в оба — export_ios.go (локальный SOCKS)
и export_ios_packet.go (System VPN). В Swift: TransportKind.cupsonline
(«Cups.online»), поле ввода строки комнат в редакторе профиля, иконка,
закрыты все исчерпывающие switch по транспорту. Ключ шифрования идёт как у
прочих — из Keychain по профилю. e2e по CLI подтверждён (200 через cups).

== Мастер установки узла ==

Порт из PR #110 (meepo161): установка узла с десктопа/телефона по SSH.
- provision/ — SSH-провижининг с пиннингом хоста (provision.go, pin.go);
- node_wizard.go — режим --node-wizard: ядро говорит с приложением по
  stdin/stdout построчным JSON, делает SSH-работу, проверяет документ
  канала и собирает openflux://-ссылку. Секреты идут только через stdin,
  не в лог и не в командную строку. Проверяется в main.go до разбора
  флагов;
- node_wizard_exitnode.go — под тегом exitnode мастер из сборки
  исключён (иначе пиннинг-инсталлер пинил бы бинарь, в котором сам лежит);
- deploy/node-install.sh + docker-compose для vyandex client/exit.

Мастеру нужна проверка документа Volga. Вместо переноса разошедшегося
auth-слоя из форка добавлен аддитивный шим CheckVolgaDocument поверх
нашего authorize() в transport/yandex/vyandex.go: успешная авторизация =
редактор открылся = канал годен; капча/логин отдаются как
ErrCaptchaRequired/ErrLoginRequired.
2026-09-27 05:08:50 +03:00

17 lines
414 B
Go

//go:build exitnode
package main
import (
"fmt"
"io"
)
// The exit-node build (deploy/node-install.sh installs it) leaves the
// desktop wizard out: its pinned installer would otherwise be part of the
// very binary whose hashes that installer pins.
func runNodeWizard(_ io.Reader, out io.Writer) int {
fmt.Fprintln(out, `{"ok":false,"error":"--node-wizard is not part of the exit-node build"}`)
return 2
}