From c3f946fb639b0394436c599ae9d03e1435f62aa6 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 13 Jul 2026 18:11:10 +0300 Subject: [PATCH] =?UTF-8?q?chat=5Fsync:=20fix=20join=20group=20stall=20?= =?UTF-8?q?=E2=80=94=20remove=20node=5Fid=20match=20in=20cs=5Fon=5Fconn=5F?= =?UTF-8?q?up,=20add=20CS=5FMSG=5FERROR=20protocol=20response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/chatgui/src/joindialog.cpp | 1 + tools/chatgui/transport/chat_sync.c | 15 +++++++++++++-- tools/chatgui/transport/chat_sync.h | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/tools/chatgui/src/joindialog.cpp b/tools/chatgui/src/joindialog.cpp index 0a2d8da7..ad54f4cc 100644 --- a/tools/chatgui/src/joindialog.cpp +++ b/tools/chatgui/src/joindialog.cpp @@ -168,6 +168,7 @@ void JoinDialog::onConnectResult(uint64_t nodeId, uint64_t channelId, int result const char* errMsg = "Unknown error."; switch (result) { + case -1: errMsg = "Channel not found."; break; case -3: errMsg = "Connection timed out."; break; case -4: errMsg = "Peer is unreachable."; break; case -6: errMsg = "Already connected to this peer."; break; diff --git a/tools/chatgui/transport/chat_sync.c b/tools/chatgui/transport/chat_sync.c index 7c77de28..0609f6ce 100644 --- a/tools/chatgui/transport/chat_sync.c +++ b/tools/chatgui/transport/chat_sync.c @@ -60,6 +60,7 @@ static const char* cs_msg_name(uint8_t type) { case CS_MSG_CHANNEL_JOIN: return "CHANNEL_JOIN"; case CS_MSG_WELCOME: return "WELCOME"; case CS_MSG_PEER_UPSERT: return "PEER_UPSERT"; + case CS_MSG_ERROR: return "ERROR"; case CS_MSG_PEER_REMOVE: return "PEER_REMOVE"; default: return "???"; } @@ -327,6 +328,14 @@ static void chat_sync_recv_cb(struct ETCP_CONN* conn, struct ll_entry* entry) { case CS_MSG_CHANNEL_JOIN: cs_handle_channel_join(g_cs, peer, ch_id, pl, plen); break; case CS_MSG_WELCOME: cs_handle_welcome(g_cs, peer, ch_id, pl, plen); break; case CS_MSG_PEER_UPSERT: cs_handle_peer_upsert(g_cs, peer, ch_id, pl, plen); break; + case CS_MSG_ERROR: { + DEBUG_WARN(DEBUG_CATEGORY_CONNECTIVITY, "%s: RECV ERROR from=%016llx ch=%s", CS_ID, (unsigned long long)peer, ch_id); + if (g_cs->info_req_timer) { uasync_cancel_timeout(g_cs->inst->ua, g_cs->info_req_timer); g_cs->info_req_timer = NULL; } + uint8_t err[20]; memcpy(err, &peer, 8); int r = CONN_MGR_ERR_NOT_FOUND; memcpy(err + 8, &r, 4); + memcpy(err + 12, &g_cs->pending_invite_ch_id, 8); gui_bridge_post(GUI_EVT_CONNECT_RESULT, err, 20); + g_cs->pending_invite_node_id = 0; g_cs->pending_invite_ch_id = 0; + break; + } case CS_MSG_PEER_REMOVE: cs_handle_peer_remove(g_cs, peer, ch_id, pl, plen); break; default: DEBUG_WARN(DEBUG_CATEGORY_CONNECTIVITY, "%s: UNKNOWN msg type=%02x from=%016llx", CS_ID, type, (unsigned long long)peer); break; } @@ -370,7 +379,8 @@ static void cs_on_conn_up(struct ETCP_CONN* conn, void* arg) { uint64_t peer = conn->peer_node_id; if (peer == 0 || peer == g_cs->inst->node_id) return; - if (g_cs->pending_invite_node_id == peer && g_cs->pending_invite_ch_id != 0) { + if (g_cs->pending_invite_ch_id != 0 && !g_cs->info_req_timer) { + g_cs->pending_invite_node_id = peer; char ch_id_str[64]; snprintf(ch_id_str, sizeof(ch_id_str), "%llu", (unsigned long long)g_cs->pending_invite_ch_id); @@ -677,7 +687,8 @@ static void cs_handle_channel_info_req(struct chat_sync* cs, uint64_t peer, char name[128]; int is_dm; uint64_t owner; uint8_t x25519[32], ed_pub[32], ch_sig[64]; if (topo_node_sqlite_channel_get(cs->inst->topo_groups->topo_sqlite_db, ch_id, name, (int)sizeof(name), &is_dm, &owner, x25519, ed_pub, ch_sig) != 0) { - DEBUG_INFO(DEBUG_CATEGORY_CONNECTIVITY, "%s: CHANNEL_INFO_REQ unknown ch=%s", CS_ID, ch_id); + DEBUG_WARN(DEBUG_CATEGORY_CONNECTIVITY, "%s: CHANNEL_INFO_REQ unknown ch=%s from=%016llx", CS_ID, ch_id, (unsigned long long)peer); + uint8_t err[1] = { CS_MSG_ERROR }; cs_send(cs, ch_id, peer, err, 1); return; } uint64_t myid = cs->inst->node_id; diff --git a/tools/chatgui/transport/chat_sync.h b/tools/chatgui/transport/chat_sync.h index ea511e2f..21b8ed43 100644 --- a/tools/chatgui/transport/chat_sync.h +++ b/tools/chatgui/transport/chat_sync.h @@ -21,6 +21,7 @@ struct UASYNC; #define CS_MSG_PUSH 0x04 #define CS_MSG_ACK_PUSH 0x05 #define CS_MSG_SYNC_DONE 0x06 +#define CS_MSG_ERROR 0x07 #define CS_MSG_CHANNEL_INFO_REQ 0x09 #define CS_MSG_CHANNEL_INFO_RESP 0x0A #define CS_MSG_CHANNEL_JOIN 0x0B