diff --git a/src/chat/chat_join.c b/src/chat/chat_join.c index be09d92a..ac5623b6 100644 --- a/src/chat/chat_join.c +++ b/src/chat/chat_join.c @@ -10,6 +10,7 @@ #include "../utun_instance.h" #include "../routing_layer/topo_node_sqlite.h" +#include "../routing_layer/topo_group.h" #include "../routing_layer/etcp_router.h" #include "../routing_layer/route_crypto.h" #include "../transport_layer/etcp_api.h" @@ -184,8 +185,20 @@ void chat_join_process_request(struct UTUN_INSTANCE* inst, uint64_t group_id, CJ_ID, ch_id, (unsigned long long)m.node_id, rc); return; } - if (rc & MS_APPLY_CHANGED) + if (rc & MS_APPLY_CHANGED) { member_sync_broadcast_one(inst, ch_id, m.node_id); + /* джойнер авторизован — добавляем в CHAT-группу сразу, чтобы BGP подключился */ + uint64_t gid = strtoull(ch_id, NULL, 10); + struct TOPO_GROUP* g = topo_groups_find(inst->topo_groups, gid); + if (g && g->group_type == TOPO_GROUP_TYPE_CHAT) { + struct ETCP_CONN* jc = instance_find_conn(inst, m.node_id); + if (jc) { + topo_group_new_conn(g, jc); + DEBUG_INFO(DEBUG_CATEGORY_CHAT_SYNC, "%s: joiner 0x%016llx added to group ch=%s for BGP", + CJ_ID, (unsigned long long)m.node_id, ch_id); + } + } + } DEBUG_INFO(DEBUG_CATEGORY_CHAT_SYNC, "%s: process_request accepted joiner=0x%016llx ch=%s via=0x%016llx key=%016llx — signed by me", CJ_ID, (unsigned long long)m.node_id, ch_id, (unsigned long long)from_node, (unsigned long long)join_key); diff --git a/src/chat/chat_sync.c b/src/chat/chat_sync.c index 78b80cfb..8411e537 100644 --- a/src/chat/chat_sync.c +++ b/src/chat/chat_sync.c @@ -788,6 +788,16 @@ static void cm_invite_trampoline(void* arg) { int r = topo_group_invite_to_channel(inst, channel_id, ni, node_id); if (r < 0) { DEBUG_ERROR(DEBUG_CATEGORY_GENERAL, "channel invite: FAILED — topo_group_invite_to_channel error=%d", r); + } else { + /* если уже подключены к connection-узлу — cs_on_conn_up отработал до установки + pending_invite_ch_id и повторно не сработает, поэтому запускаем join-хендшейк напрямую */ + struct ETCP_CONN* conn = instance_find_conn(inst, node_id); + if (conn && conn->links_up && conn->initialized) { + g_cs->pending_invite_node_id = node_id; + DEBUG_INFO(DEBUG_CATEGORY_MEMBER_SYNC, "%s: already connected to 0x%016llx — starting join handshake directly", + CS_ID, (unsigned long long)node_id); + cs_start_channel_join(g_cs, node_id); + } } /* free caller-owned ni */