From 5169ffd0b37817d367d3f47fd9ae05cef09836e2 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 26 Oct 2026 19:34:19 +0100 Subject: [PATCH] Specify admin import transaction and notification contracts --- src/chat/chat_admin.h | 6 +++--- src/chat/chat_core.h | 1 + src/routing_layer/topo_node_sqlite.h | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/chat/chat_admin.h b/src/chat/chat_admin.h index 7e55b5d6..0c8b48de 100644 --- a/src/chat/chat_admin.h +++ b/src/chat/chat_admin.h @@ -5,9 +5,9 @@ * выбранному узлу. Передача идёт через сервисный пакет etcp_router с * ROUTE_CRYPTO_SIGN | ROUTE_CRYPTO_ENCRYPT: X25519 ECDH + AES-128-CCM и Ed25519-подпись. * Получатель сверяет выведенные публичные ключи с уже известными ключами канала, - * сохраняет оба privkey и синхронно публикует CHAT_EVT_ADMIN_KEY_RECEIVED. - * Известный дефект: SQL-helper игнорирует ошибки bind; возможен частичный импорт - * с ложным событием успеха. План: doc/chat_audit_findings.txt, продолжение chat_admin. + * сохраняет оба privkey атомарно и после commit синхронно публикует CHAT_EVT_ADMIN_KEY_RECEIVED. + * Ошибка SQL/crypto сохраняет прежнюю пару без события успеха; корректный повтор допустим. + * Внешняя SQL-транзакция отклоняет входящий импорт; незавершённый rollback требует restart. * Модуль включается/отключается chat_sync; все вызовы — в потоке uasync. */ diff --git a/src/chat/chat_core.h b/src/chat/chat_core.h index 3ad16c59..7363c11d 100644 --- a/src/chat/chat_core.h +++ b/src/chat/chat_core.h @@ -335,6 +335,7 @@ void chat_member_tags_commit_trampoline(void* arg); // ── Передача прав админа (владелец → другому узлу) ── // Передать оба канальных privkey выбранному узлу (encrypted+signed через etcp_router). +// uasync-поток; NULL/неинициализированный inst отклоняется с ERROR. Постановка в транспорт не подтверждает импорт. void chat_core_transfer_admin(struct UTUN_INSTANCE* inst, const char* ch_id, uint64_t target_node_id); void chat_core_transfer_admin_trampoline(void* arg); diff --git a/src/routing_layer/topo_node_sqlite.h b/src/routing_layer/topo_node_sqlite.h index 1681ff5e..cbf6fa04 100644 --- a/src/routing_layer/topo_node_sqlite.h +++ b/src/routing_layer/topo_node_sqlite.h @@ -123,10 +123,10 @@ int topo_node_sqlite_channel_get_priv(sqlite3* db, const char* channel_id, int topo_node_sqlite_channel_get_privs(sqlite3* db, const char* channel_id, uint8_t* x25519_priv_out, uint8_t* ed25519_priv_out); -/* Записать оба канальных privkey по 32 байта (импорт прав админа); 0/-1, без проверки пары/подписи. - * Отсутствующая строка даёт 0 без вставки; наличие канала проверяет вызывающий. - * Известный дефект: bind/finalize не проверяются; ошибка bind допускает частичную пару/ложный 0. - * Исправление ещё не выполнено: doc/chat_audit_findings.txt, продолжение chat_admin. */ +/* Атомарно записать оба канальных privkey[32] в одну существующую строку; 0/-1. + * Savepoint проверяет все SQL-операции и откатывает запись при отказе; отсутствие строки — ошибка. + * При внешней транзакции её commit остаётся вызывающему; событие успеха до него запрещено. + * Соответствие пары/подпись проверяет вызывающий. Аргументы обязательны; rollback-отказ логируется. */ int topo_node_sqlite_channel_set_privs(sqlite3* db, const char* channel_id, const uint8_t* x25519_priv, const uint8_t* ed25519_priv);