60 lines
8.5 KiB
Plaintext
60 lines
8.5 KiB
Plaintext
Внедрение группы устройств в чат (devgroup).
|
||
|
||
Первый этап: объединение устройств одного пользователя и группировка в списке участников.
|
||
|
||
1. Идентичность и хранение.
|
||
Устройство состоит максимум в одной devgroup. При создании группы генерируются две отдельные общие пары ключей:
|
||
X25519 для шифрования и Ed25519 для подписей. Публичный ключ Ed25519 идентифицирует группу.
|
||
Обе пары одинаковы на всех устройствах devgroup; при добавлении устройств передаются существующие ключи.
|
||
Принадлежность подтверждает подпись devgroup над идентичностью конкретного устройства (node_id и его публичные ключи).
|
||
Одного совпадения публичного ключа devgroup недостаточно.
|
||
Публичные данные devgroup хранятся в отдельных полях nodes: оба публичных ключа, удостоверение устройства, JSON профиля и его подпись.
|
||
Эти же данные входят в TOPO_NODE и подписанный снимок node_snapshots; nodes содержит их согласованную проекцию.
|
||
Принадлежность общая для узла, независимо от каналов; в peers_<channel_id> и userinfo поля devgroup не добавляются.
|
||
Секреты хранятся отдельно от публичного профиля и не теряются при перезапуске; текущий local_identity перезаписывается при старте.
|
||
|
||
2. Приглашение.
|
||
A нажимает «Добавить устройство» в свойствах B: приглашение отправляется B, на A показывается PIN из 4 цифр.
|
||
На B автоматически появляется диалог ввода PIN с экрана A; введённый PIN возвращается A для проверки.
|
||
Обмен идёт через ETCP-router с обязательными сквозным шифрованием и подписью; BGP обеспечивает маршрут.
|
||
Приглашение одноразовое, привязано к ключам B и случайному ID, действует 2 минуты, допускает 3 попытки.
|
||
Только после успешной проверки PIN A создаёт обе пары ключей, если группы ещё нет; иначе использует существующие.
|
||
A передаёт ключи и профиль группы. B проверяет и сохраняет их, затем подтверждает успех.
|
||
Повторы идемпотентны; потеря подтверждения означает неизвестный результат, а не отказ. Переданные секреты отменой не отзываются.
|
||
Устройство из другой devgroup должно сначала выйти из неё; неявного слияния групп нет.
|
||
|
||
3. Профиль и версии.
|
||
Ник, ver, timestamp и публичный ключ X25519 входят в расширяемый JSON, целиком подписанный ключом Ed25519 devgroup
|
||
с отдельным назначением подписи. Подпись связывает ключ шифрования с идентичностью группы.
|
||
Хранятся и пересылаются исходные подписанные байты. Победитель определяется по (ver, timestamp, SHA256(JSON)).
|
||
Локальное изменение увеличивает максимальную известную ver на 1; при репликации версия не увеличивается.
|
||
Для профиля devgroup задаётся отдельный ограниченный размер с учётом полного NODEINFO; лимит userinfo менять не требуется.
|
||
Версия профиля devgroup и timestamp подписанного снимка узла независимы.
|
||
|
||
4. Репликация первого этапа.
|
||
Данные devgroup распространяются через текущую синхронизацию nodes (NODEINFO/BGP) в составе общей подписанной записи узла.
|
||
Текущих гарантий доставки достаточно для первого этапа; отдельный протокол синхронизации и offline-доставки не добавляется.
|
||
Проверяются подпись узла, удостоверение принадлежности и подпись профиля devgroup. Обновление снимка заменяет блок целиком.
|
||
Более свежий профиль своей devgroup устройство принимает и публикует в новом собственном снимке во всех своих топологических группах.
|
||
Чужие снимки не меняются; неизменившийся профиль не вызывает новой публикации.
|
||
Синхронизация зависит от распространения NODEINFO через существующие группы; отдельная сеть устройств в первый этап не входит.
|
||
После восстановления связи и при вступлении в новую группу используется штатный обмен NODEINFO.
|
||
|
||
5. Выход.
|
||
Кнопка «Отключить от моих устройств» доступна в свойствах self. Выход удаляет локальные ключи и публикует новый собственный снимок с пустым блоком devgroup и увеличенным timestamp.
|
||
Локальное состояние, снимок node_snapshots и поля nodes меняются атомарно; уведомления и распространение выполняются после commit.
|
||
Старые сетевые записи не возвращают устройство в группу. Принудительный отзыв устройства со сменой ключей — отдельный этап.
|
||
|
||
6. Список участников и границы этапа.
|
||
В Qt и Android устройства с проверенной принадлежностью объединяются под раскрывающимся [+] с актуальным ником devgroup.
|
||
Принадлежность берётся из nodes по node_id; профиль выбирается простым поиском наиболее свежего проверенного объявления
|
||
среди текущих записей известных узлов devgroup по порядку из п. 3. Отдельный постоянный кеш профилей не нужен.
|
||
Изменение общей записи обновляет отображение участника во всех каналах, где он присутствует.
|
||
Внутри показываются устройства текущего канала. Права и действия остаются у конкретных устройств;
|
||
заголовок группы не подменяется node_id одного из них. Группа online, если доступно хотя бы одно активное устройство.
|
||
Звонки на все устройства и объединение DM в первый этап не входят.
|
||
|
||
Порядок реализации: nodes/TOPO_NODE/снимок и проверка devgroup → NODEINFO/BGP и профиль → приглашения → API/headless → Qt и Android.
|
||
Проверить подделки, конфликты версий, обновление через штатный обмен NODEINFO, повторы, потери ответов, перезапуск, ошибки сохранения и выход.
|
||
Логи показывают состояния и причины отказов, но не PIN и секреты.
|