diff --git a/src/config_parser_doc.md b/src/config_parser_doc.md index e173c069..5b822d5c 100644 --- a/src/config_parser_doc.md +++ b/src/config_parser_doc.md @@ -73,7 +73,7 @@ Servers, clients, networks, маршруты, allowed_keys и NTP добавля | nat | tun_ifname, tun_ip (IPv4), nat_via, port_start/end, forward=proto:node_id:IPv4:internal_port:external_port | | tcp_proxy_client | enabled, tun_name/ip, mtu, via_node, socks/http_proxy enabled/addr, forward=port -> IPv4:port | | tcp_proxy_server | tcp_recv_buf, fib, so_mark, netif, bind_ip, connect_timeout | -| chatserver / chat | db_path, join_password, allowed_groups, storage sizes, headless/audio binds и chat_setting API | +| chatserver / chat | db_path, add_key, allowed_groups, storage sizes, headless/audio binds и chat_setting API | | ntp | enabled, server, interval | | stun | enabled, server | | reality | enabled, server_name, dest, short_id/short_ids, public/private_key, version, time_window, relay_idle_timeout, fingerprint | @@ -93,9 +93,17 @@ auto_sockets принимает no/yes/android, auto_socket_protocols — tcp/ud `print_config` выводит снимок в config/INFO. Private/signing keys заменены признаками наличия; сети выводятся независимо от количества firewall rules. -`print_chatserver_invite_link` печатает bootstrap utun:// v3 в config/INFO и stderr при включённом чате: -channel_id=join_key=0, до 32 конфигурационных адресов, socketId=0, SNI до 63 байтов. -Это не invite конкретного канала и не снимок фактического bind/NAT. +`[chatserver] add_key` — 32 ненулевых случайных байта (64 HEX-символа), разрешающие запросить +добавление сервера в произвольный канал приглашающего. При загрузке из файла отсутствующий ключ +создаёт и атомарно сохраняет config_updater; заданный ошибочный/нулевой ключ отклоняется. +Ключ постоянный: перезапуск сохраняет ссылку, явная замена запрещает новые операции по старой ссылке. +Уже добавленные каналы от смены ключа не удаляются. Старое join_password больше не используется. + +Серверную ссылку собирает `chat_server_link_build` через общий кодек из текущей проекции NODEINFO: +публичный ключ, socket_id, IP/port, протоколы и REALITY плюс add_key. Отдельный тип SERVER версии 0x04 +не содержит ID канала или временного JOIN-ключа. Получить её можно через `chatcli server_link`; +foreground CLI также выводит её в stderr после старта. Обычный лог содержит только node/endpoints, +полную ссылку и add_key в него не выводим. `update_config_keys` — устаревшее добавление global-секции с двумя проверенными HEX-ключами в конец файла. Возвращает 0/-1, проверяет запись/закрытие, но не атомарно и не согласует node_id; штатный путь — config_updater. diff --git a/src/config_updater_doc.md b/src/config_updater_doc.md index 647b216f..0ac6c370 100644 --- a/src/config_updater_doc.md +++ b/src/config_updater_doc.md @@ -2,6 +2,7 @@ Модуль обеспечивает согласованные X25519-ключи и node_id в INI-файле до его загрузки ядром. При включённом REALITY также обеспечивает private_key и непустой список short_ids. +При наличии [chatserver] или global.chatserver_enabled обеспечивает постоянный add_key сервера. Публичный контракт приведён в config_updater.h, общий разбор строк — в config_ini.h. ## Выбор значений @@ -21,6 +22,9 @@ Некорректный/пустой/отсутствующий short_ids заменяется четырьмя случайными ID. Корректный список сохраняется целиком. Ошибка одного элемента отклоняет весь список. - При выключенном REALITY его параметры не исправляются. +- Отсутствующий [chatserver] add_key генерируется через RAND_bytes (32 байта) и сохраняется + той же атомарной заменой файла. Заданный неверный/нулевой ключ вызывает отказ без изменения файла: + автоматическая ротация секрета запрещена. Повторный запуск сохраняет корректный ключ побайтно. HEX проверяется посимвольно до декодирования. Частичные результаты проверки не применяются. Встроенный NUL и физические строки длиннее 1022 байтов до LF запрещены; CR учитывается в этом пределе. diff --git a/tools/chatcli_commands.txt b/tools/chatcli_commands.txt index cd6d6788..9bbe7db6 100644 --- a/tools/chatcli_commands.txt +++ b/tools/chatcli_commands.txt @@ -106,11 +106,26 @@ invite_nodes и список nodes (node_id, имя). Пример: chatcli invite_nodes 12345 +server_link + Получить серверную utun:// ссылку текущего узла с постоянным ключом добавления. + Требуются включённый chatserver, сохранённый add_key и опубликованные адреса. + Ссылка секретная; старые серверные ссылки версии 0x03 нужно получить заново. + Пример на сервере: chatcli server_link + +server_add + Добавить выбранный свой канал на сервер по его серверной ссылке. + Клиент создаёт обычное приглашение через себя и передаёт его серверу вместе с кодом доступа. + Сервер проверяет код и выполняет обычный JOIN по установленному соединению. + Ответ adding=true означает запуск; итог приходит событием connect_result через listen. + Повторное добавление не создаёт второй канал. Неверный/сменённый ключ даёт результат -10. + Пример на клиенте: chatcli server_add 12345 'utun://...' + connect Подключиться к каналу по invite-ссылке. Декодирует ссылку, сохраняет pubkey и адреса узла в БД, запускает процесс подключения. - Пример: chatcli connect utun://AgR0ZXN0... + Принимает только ссылку CHANNEL версии 0x04; серверная ссылка требует server_add. + Пример: chatcli connect 'utun://...' create Создать новый канал. Генерирует ключи X25519/Ed25519,