Browse Source

chat join: запуск JOIN_INFO_REQ при уже поднятом соединении + добавление джойнера в группу

- cm_invite_trampoline: если уже подключены к connection-узлу — cs_on_conn_up
  повторно не сработает, запускаем join-хендшейк напрямую (cs_start_channel_join)
- chat_join_process_request: после верификации ключа сразу добавляем джойнера
  в CHAT-группу (topo_group_new_conn), чтобы BGP подключился
v2
evgeny 2 weeks ago
parent
commit
d58d4d39c4
  1. 15
      src/chat/chat_join.c
  2. 10
      src/chat/chat_sync.c

15
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);

10
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 */

Loading…
Cancel
Save