Browse Source

fix chatgui: pass chain_hash in PUSH + start member_sync on server join

chat_sync_push: add chain_hash parameter, use it instead of zeros
  (fixes chain_hash mismatch → all PUSH messages were rejected)

on_db_sync_insert: pass computed chain_h to chat_sync_push

cs_handle_channel_join: call member_sync_start for the joiner
  (server now initiates member sync when client joins.
  Previously merkle_sync was only started by client → timeout
  because server never responded)

cs_handle_welcome: add DEBUG_INFO before member_sync_start on client side
topo_upd
Evgeny 3 months ago
parent
commit
4636a69225
  1. 2
      tools/chatgui/transport/chat_core.c
  2. 12
      tools/chatgui/transport/chat_sync.c
  3. 3
      tools/chatgui/transport/chat_sync.h

2
tools/chatgui/transport/chat_core.c

@ -1047,7 +1047,7 @@ static void on_db_sync_insert(struct DB_SYNC_INSTANCE* si, const char* data, siz
if (rc==SQLITE_DONE) {
uint8_t evt[65]; uint8_t cl=(uint8_t)strlen(ch_id); evt[0]=cl; memcpy(evt+1,ch_id,cl);
gui_bridge_post(GUI_EVT_MSG_RECEIVED, evt, 1+cl);
chat_sync_push(g_cc.inst, ch_id, jn, jct, (const uint8_t*)jd_start, (uint32_t)jd_len, ts, dh);
chat_sync_push(g_cc.inst, ch_id, jn, jct, (const uint8_t*)jd_start, (uint32_t)jd_len, ts, dh, chain_h);
} else if (rc == SQLITE_CONSTRAINT) {
DEBUG_WARN(DEBUG_CATEGORY_CONNECTIVITY, "%s: on_db_sync_insert duplicate ch=%s ts=%lld dh=0x%016llx",
CC_ID, ch_id, (long long)ts, (unsigned long long)dh);

12
tools/chatgui/transport/chat_sync.c

@ -625,7 +625,8 @@ void chat_sync_destroy(struct UTUN_INSTANCE* inst) {
int chat_sync_push(struct UTUN_INSTANCE* inst,
const char* ch_id, uint64_t node_id,
const char* content_type, const uint8_t* data, uint32_t data_len,
uint64_t timestamp, uint64_t datahash) {
uint64_t timestamp, uint64_t datahash,
const uint8_t* chain_hash) {
if (!g_cs || !g_cs->initialized) return -1;
struct channel_cache* ch = cs_find(g_cs, ch_id);
@ -652,7 +653,7 @@ int chat_sync_push(struct UTUN_INSTANCE* inst,
uint32_t dlen = data_len;
memcpy(p, &dlen, 4); p += 4;
if (data_len) { memcpy(p, data, data_len); p += data_len; }
memset(p, 0, 32); p += 32;
memcpy(p, chain_hash ? chain_hash : (const uint8_t*)"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 32); p += 32;
int sent = 0;
uint64_t myid = g_cs->inst->node_id;
@ -1012,6 +1013,11 @@ static void cs_handle_channel_join(struct chat_sync* cs, uint64_t peer,
{ uint8_t evt[65]; uint8_t cl=(uint8_t)strlen(ch_id); evt[0]=cl; memcpy(evt+1,ch_id,cl);
gui_bridge_post(GUI_EVT_MEMBERS_CHANGED, evt, 1+cl); }
/* initiate member sync with the joiner (server side) */
member_sync_start(cs->inst, node_id, ch_id, NULL, NULL);
DEBUG_INFO(DEBUG_CATEGORY_CONNECTIVITY, "%s: JOIN starting member_sync with joiner node=0x%016llx ch=%s",
CS_ID, (unsigned long long)node_id, ch_id);
DEBUG_INFO(DEBUG_CATEGORY_CONNECTIVITY, "%s: JOIN accepted node=0x%016llx ch=%s addrs=%d",
CS_ID, (unsigned long long)node_id, ch_id, addr_cnt);
}
@ -1078,6 +1084,8 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer,
memcpy(msg + 1, &ch2->msg_count, 4);
memcpy(msg + 5, ch2->last_chain_hash, 32);
cs_send(cs, ch2->channel_id, peer, msg, 37);
DEBUG_INFO(DEBUG_CATEGORY_CONNECTIVITY, "%s: WELCOME starting member_sync with inviter node=0x%016llx ch=%s",
CS_ID, (unsigned long long)peer, ch_id);
member_sync_start(cs->inst, peer, ch2->channel_id, _on_member_sync_done, ch2);
}
break;

3
tools/chatgui/transport/chat_sync.h

@ -50,7 +50,8 @@ void chat_sync_destroy(struct UTUN_INSTANCE* inst);
int chat_sync_push(struct UTUN_INSTANCE* inst,
const char* channel_id, uint64_t node_id,
const char* content_type, const uint8_t* data, uint32_t data_len,
uint64_t timestamp, uint64_t datahash);
uint64_t timestamp, uint64_t datahash,
const uint8_t* chain_hash);
/* Прослойка conn_mgr: загрузить nodeinfo из БД и подключиться */
void chat_sync_connect_node(struct UTUN_INSTANCE* inst, uint64_t node_id);

Loading…
Cancel
Save