|
|
|
|
@ -153,9 +153,10 @@ static void cs_handle_peer_upsert(struct chat_sync* cs, uint64_t peer,
|
|
|
|
|
static void cs_handle_channel_invite(struct chat_sync* cs, uint64_t peer, |
|
|
|
|
const char* ch_id, const uint8_t* pl, size_t len); |
|
|
|
|
static int cs_send_channel_invite(struct chat_sync* cs, struct UTUN_INSTANCE* inst, |
|
|
|
|
const char* ch_id, uint64_t target_node_id, const char* ch_name, |
|
|
|
|
const uint8_t* ch_x25519, const uint8_t* ch_ed, const uint8_t* ch_sig); |
|
|
|
|
|
|
|
|
|
const char* ch_id, uint64_t target_node_id, |
|
|
|
|
const char* ch_name, uint64_t owner, |
|
|
|
|
const uint8_t* ch_x25519, const uint8_t* ch_ed, |
|
|
|
|
const uint8_t* ch_sig); |
|
|
|
|
/* ── Recv dispatcher ── */ |
|
|
|
|
|
|
|
|
|
static void chat_sync_recv_cb(struct ETCP_CONN* conn, struct ll_entry* entry) { |
|
|
|
|
@ -487,10 +488,10 @@ static void cs_on_conn_up(struct ETCP_CONN* conn, int event, void* arg) { (void)
|
|
|
|
|
/* we are the inviter — send CHANNEL_INVITE to the joiner */ |
|
|
|
|
char ch_id[64]; snprintf(ch_id, sizeof(ch_id), "%llu", |
|
|
|
|
(unsigned long long)g_cs->pending_invite_ch_id); |
|
|
|
|
char ch_name[128]; uint8_t ch_x2[32], ch_ed2[32], ch_sig[64]; |
|
|
|
|
char ch_name[128]; uint8_t ch_x2[32], ch_ed2[32], ch_sig[64]; uint64_t ch_owner; |
|
|
|
|
if (topo_node_sqlite_channel_get(g_cs->inst->topo_sqlite_db, |
|
|
|
|
ch_id, ch_name, (int)sizeof(ch_name), NULL, ch_x2, ch_ed2, ch_sig) == 0) { |
|
|
|
|
cs_send_channel_invite(g_cs, g_cs->inst, ch_id, peer, ch_name, ch_x2, ch_ed2, ch_sig); |
|
|
|
|
ch_id, ch_name, (int)sizeof(ch_name), &ch_owner, ch_x2, ch_ed2, ch_sig) == 0) { |
|
|
|
|
cs_send_channel_invite(g_cs, g_cs->inst, ch_id, peer, ch_name, ch_owner, ch_x2, ch_ed2, ch_sig); |
|
|
|
|
if (g_cs->invite_send_timer) { uasync_cancel_timeout(g_cs->inst->ua, g_cs->invite_send_timer); } |
|
|
|
|
g_cs->invite_send_timer = uasync_set_timeout(g_cs->inst->ua, |
|
|
|
|
CS_INVITE_SEND_TIMEOUT_MS * 10, g_cs, cs_invite_send_timeout_cb, "cs_invite_send"); |
|
|
|
|
@ -1484,9 +1485,9 @@ static void cs_handle_channel_invite(struct chat_sync* cs, uint64_t peer,
|
|
|
|
|
|
|
|
|
|
static int cs_send_channel_invite(struct chat_sync* cs, struct UTUN_INSTANCE* inst, |
|
|
|
|
const char* ch_id, uint64_t target_node_id, |
|
|
|
|
const char* ch_name, const uint8_t* ch_x25519, |
|
|
|
|
const uint8_t* ch_ed, const uint8_t* ch_sig) { |
|
|
|
|
uint64_t owner = inst->node_id; |
|
|
|
|
const char* ch_name, uint64_t owner, |
|
|
|
|
const uint8_t* ch_x25519, const uint8_t* ch_ed, |
|
|
|
|
const uint8_t* ch_sig) { |
|
|
|
|
uint8_t join_sig[64] = {0}; uint64_t join_ts = 0; |
|
|
|
|
{ sqlite3* vdb = inst->topo_sqlite_db; |
|
|
|
|
topo_node_sqlite_member_get_join(vdb, ch_id, inst->node_id, join_sig, &join_ts); } |
|
|
|
|
@ -1578,7 +1579,7 @@ void chat_sync_invite_to_channel(struct UTUN_INSTANCE* inst, const char* ch_id,
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Already connected — send invite now, wait for joiner to respond */ |
|
|
|
|
cs_send_channel_invite(g_cs, inst, ch_id, target_node_id, ch_name, ch_x25519, ch_ed, ch_sig); |
|
|
|
|
cs_send_channel_invite(g_cs, inst, ch_id, target_node_id, ch_name, owner, ch_x25519, ch_ed, ch_sig); |
|
|
|
|
g_cs->pending_invite_ch_id = channel_id; |
|
|
|
|
g_cs->pending_invite_node_id = target_node_id; |
|
|
|
|
g_cs->pending_invite_is_inviter = 1; |
|
|
|
|
@ -1616,10 +1617,10 @@ static void cs_invite_trampoline(void* arg) {
|
|
|
|
|
/* Check if already connected */ |
|
|
|
|
struct ETCP_CONN* conn = cs_find_conn_for_node(inst, target_node_id); |
|
|
|
|
if (conn && conn->links_up && conn->initialized) { |
|
|
|
|
char ch_name[128]; uint8_t ch_x2[32], ch_ed2[32], ch_sig[64]; |
|
|
|
|
char ch_name[128]; uint8_t ch_x2[32], ch_ed2[32], ch_sig[64]; uint64_t ch_owner; |
|
|
|
|
if (topo_node_sqlite_channel_get(inst->topo_sqlite_db, |
|
|
|
|
ch_id, ch_name, (int)sizeof(ch_name), NULL, ch_x2, ch_ed2, ch_sig) == 0) { |
|
|
|
|
cs_send_channel_invite(g_cs, inst, ch_id, target_node_id, ch_name, ch_x2, ch_ed2, ch_sig); |
|
|
|
|
ch_id, ch_name, (int)sizeof(ch_name), &ch_owner, ch_x2, ch_ed2, ch_sig) == 0) { |
|
|
|
|
cs_send_channel_invite(g_cs, inst, ch_id, target_node_id, ch_name, ch_owner, ch_x2, ch_ed2, ch_sig); |
|
|
|
|
g_cs->pending_invite_ch_id = channel_id; |
|
|
|
|
g_cs->pending_invite_node_id = target_node_id; |
|
|
|
|
g_cs->pending_invite_is_inviter = 1; |
|
|
|
|
|