@ -108,7 +108,7 @@ static void ac_gc(struct auto_connect* ac) {
continue ;
}
/* expired and not up — cancel */
DEBUG_DEBUG ( DEBUG_CATEGORY_CONNECTIVITY , " %s: GC closing flight node=0x%016llx (expired) " , AC_ID , ( unsigned long long ) nid ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DB_SYNC , " %s: GC closing flight node=0x%016llx (expired) " , AC_ID , ( unsigned long long ) nid ) ;
chat_core_connect_auto_cancel ( ac - > flights [ i ] . ca_state ) ;
memset ( & ac - > flights [ i ] , 0 , sizeof ( ac - > flights [ i ] ) ) ;
}
@ -183,7 +183,7 @@ static void ac_fill(struct auto_connect* ac) {
f - > node_id = 0 ; f - > created_tb = 0 ;
continue ;
}
DEBUG_DEBUG ( DEBUG_CATEGORY_CONNECTIVITY , " %s: flight[%d] launched node=0x%016llx " , AC_ID , slot , ( unsigned long long ) nid ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DB_SYNC , " %s: flight[%d] launched node=0x%016llx " , AC_ID , slot , ( unsigned long long ) nid ) ;
uint8_t evt [ 7 ] ; evt [ 0 ] = 0 ; uint16_t t = 0 , n = ( uint16_t ) ac - > channel_count , s = 0 ;
memcpy ( evt + 1 , & t , 2 ) ; memcpy ( evt + 3 , & n , 2 ) ; memcpy ( evt + 5 , & s , 2 ) ;
gui_bridge_post ( GUI_EVT_AUTO_CONNECT_STATUS , evt , 7 ) ;
@ -196,7 +196,7 @@ static void ac_result_cb(int result, uint64_t node_id, void* arg) {
struct ac_flight * f = ( struct ac_flight * ) arg ;
if ( ! g_ac | | ! g_ac - > active ) return ;
const char * rs = result = = CC_OK ? " OK " : " FAIL " ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: result node=0x%016llx %s " , AC_ID , ( unsigned long long ) node_id , rs ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: result node=0x%016llx %s " , AC_ID , ( unsigned long long ) node_id , rs ) ;
if ( result = = CC_OK ) f - > ca_state = NULL ; /* already freed by ca_ready_cb, prevent double-free in GC/stop */
}
@ -225,7 +225,7 @@ void chat_sync_auto_connect_start(struct UTUN_INSTANCE* inst) {
ac - > active = 1 ;
g_ac = ac ;
ac_load_channels ( ac ) ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: start, %d channels loaded " , AC_ID , ac - > channel_count ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: start, %d channels loaded " , AC_ID , ac - > channel_count ) ;
ac_gc ( ac ) ;
ac_fill ( ac ) ;
ac - > retry_timer = uasync_set_timeout ( inst - > ua , AC_RETRY_MS * 10 , ac , ac_retry_timer_cb , " ac_retry " ) ;
@ -243,11 +243,11 @@ void chat_sync_auto_connect_stop(void) {
memcpy ( evt + 1 , & z , 2 ) ; memcpy ( evt + 3 , & z , 2 ) ; memcpy ( evt + 5 , & z , 2 ) ;
gui_bridge_post ( GUI_EVT_AUTO_CONNECT_STATUS , evt , 7 ) ;
u_free ( ac ) ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: stopped " , AC_ID ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: stopped " , AC_ID ) ;
}
void chat_sync_auto_connect_switch_group ( struct UTUN_INSTANCE * inst , uint64_t new_group_id ) {
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: switch group 0x%016llx " , AC_ID , ( unsigned long long ) new_group_id ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: switch group 0x%016llx " , AC_ID , ( unsigned long long ) new_group_id ) ;
chat_sync_auto_connect_stop ( ) ;
chat_sync_auto_connect_start ( inst ) ;
}
@ -322,10 +322,10 @@ static int cs_send(struct chat_sync* cs, const char* ch_id, uint64_t dst,
struct ll_entry * entry = queue_entry_new ( 0 ) ;
if ( ! entry ) { u_free ( buf ) ; return - 1 ; }
entry - > dgram = buf ; entry - > len = total ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: SEND %s to=%016llx ch=%s len=%zu " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: SEND %s to=%016llx ch=%s len=%zu " ,
CS_ID , cs_msg_name ( payload [ 0 ] ) , ( unsigned long long ) dst , ch_id , len ) ;
struct ETCP_CONN * conn = cs_find_conn_for_node ( cs - > inst , dst ) ;
if ( ! conn ) { DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: no conn for node %016llx " , CS_ID , ( unsigned long long ) dst ) ; u_free ( buf ) ; queue_entry_free ( entry ) ; return - 1 ; }
if ( ! conn ) { DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: no conn for node %016llx " , CS_ID , ( unsigned long long ) dst ) ; u_free ( buf ) ; queue_entry_free ( entry ) ; return - 1 ; }
return etcp_send ( conn , entry ) ;
}
@ -373,20 +373,22 @@ static void chat_sync_recv_cb(struct ETCP_CONN* conn, struct ll_entry* entry) {
char ch_id [ 64 ] ; memcpy ( ch_id , d + 2 , ch_len ) ; ch_id [ ch_len ] = ' \0 ' ;
uint8_t type = d [ 2 + ch_len ] ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: recv %s(%02x) from=%016llx ch=%s len=%zu " ,
CS_ID , cs_msg_name ( type ) , type , ( unsigned long long ) peer , ch_id , dlen ) ;
const uint8_t * pl = d + 3 + ch_len ;
size_t plen = dlen - 3 - ch_len ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: RECV %s from=%016llx ch=%s len=%zu " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: RECV %s from=%016llx ch=%s len=%zu " ,
CS_ID , cs_msg_name ( type ) , ( unsigned long long ) peer , ch_id , plen ) ;
switch ( type ) {
case CS_MSG_CHANNEL_INFO_REQ : cs_handle_channel_info_req ( g_cs , peer , ch_id , pl , plen ) ; break ;
case CS_MSG_CHANNEL_INFO_RESP : cs_handle_channel_info_resp ( g_cs , peer , ch_id , pl , plen ) ; break ;
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_CHANNEL_INFO_REQ : DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: → handle INFO_REQ " , CS_ID ) ; cs_handle_channel_info_req ( g_cs , peer , ch_id , pl , plen ) ; break ;
case CS_MSG_CHANNEL_INFO_RESP : DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: → handle INFO_RESP " , CS_ID ) ; cs_handle_channel_info_resp ( g_cs , peer , ch_id , pl , plen ) ; break ;
case CS_MSG_CHANNEL_JOIN : DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: → handle JOIN " , CS_ID ) ; cs_handle_channel_join ( g_cs , peer , ch_id , pl , plen ) ; break ;
case CS_MSG_WELCOME : DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: → handle WELCOME " , CS_ID ) ; cs_handle_welcome ( g_cs , peer , ch_id , pl , plen ) ; break ;
case CS_MSG_PEER_UPSERT : DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: → handle PEER_UPSERT " , CS_ID ) ; 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 ) ;
DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %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 = CC_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 ) ;
@ -394,7 +396,7 @@ static void chat_sync_recv_cb(struct ETCP_CONN* conn, struct ll_entry* entry) {
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 ;
default : DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: UNKNOWN msg type=%02x from=%016llx " , CS_ID , type , ( unsigned long long ) peer ) ; break ;
}
u_free ( entry - > dgram ) ; queue_entry_free ( entry ) ;
}
@ -405,7 +407,7 @@ static void cs_info_req_timeout_cb(void* arg) {
struct chat_sync * cs = ( struct chat_sync * ) arg ;
if ( ! cs | | ! cs - > initialized ) return ;
cs - > info_req_timer = NULL ;
DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_REQ timeout peer=%016llx ch=%llu " ,
DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_INFO_REQ timeout peer=%016llx ch=%llu " ,
CS_ID , ( unsigned long long ) cs - > pending_invite_node_id ,
( unsigned long long ) cs - > pending_invite_ch_id ) ;
uint8_t err [ 12 ] ; memcpy ( err , & cs - > pending_invite_node_id , 8 ) ;
@ -420,7 +422,7 @@ static void cs_join_timeout_cb(void* arg) {
if ( ! cs | | ! cs - > initialized ) return ;
cs - > join_timer = NULL ;
uint64_t peer = cs - > pending_invite_node_id ;
DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_JOIN timeout peer=%016llx ch=%llu " ,
DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_JOIN timeout peer=%016llx ch=%llu " ,
CS_ID , ( unsigned long long ) peer , ( unsigned long long ) cs - > pending_invite_ch_id ) ;
uint8_t err [ 20 ] ; memcpy ( err , & peer , 8 ) ;
int r = CC_ERR_TIMEOUT ; memcpy ( err + 8 , & r , 4 ) ;
@ -433,16 +435,16 @@ static void cs_join_timeout_cb(void* arg) {
/* ── helper: find active ETCP_CONN for node ── */
static struct ETCP_CONN * cs_find_conn_for_node ( struct UTUN_INSTANCE * inst , uint64_t node_id ) {
if ( ! inst - > connections ) { DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: find_conn connections=NULL " , CS_ID ) ; return NULL ; }
if ( ! inst - > connections ) { DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: find_conn connections=NULL " , CS_ID ) ; return NULL ; }
struct ll_entry * e = queue_find_data_by_index ( inst - > connections , ( const uint8_t * ) & node_id ) ;
if ( e ) {
struct conn_queue_entry * ce = ( struct conn_queue_entry * ) e - > data ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: find_conn node=%016llx found=%p initialized=%d links_up=%d state=%d " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: find_conn node=%016llx found=%p initialized=%d links_up=%d state=%d " ,
CS_ID , ( unsigned long long ) node_id , ( void * ) ce - > conn , ce - > conn - > initialized , ce - > conn - > links_up , ce - > conn - > state ) ;
if ( ce - > conn - > initialized & & ce - > conn - > links_up ) return ce - > conn ;
return NULL ;
}
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: find_conn node=%016llx NOT FOUND in queue (head=%p count=%d) " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: find_conn node=%016llx NOT FOUND in queue (head=%p count=%d) " ,
CS_ID , ( unsigned long long ) node_id , ( void * ) inst - > connections - > head , queue_entry_count ( inst - > connections ) ) ;
return NULL ;
}
@ -482,7 +484,7 @@ static void cs_post_channel_online(struct chat_sync* cs, const char* ch_id) {
static void _on_member_sync_done ( uint64_t peer , const char * ns , int result , void * arg ) {
struct channel_cache * ch = ( struct channel_cache * ) arg ;
if ( result = = MT_OK & & ch ) ch - > synced = CS_SYNC_DONE ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: member_sync %s ns=%s peer=%016llx " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: member_sync %s ns=%s peer=%016llx " ,
CS_ID , result = = MT_OK ? " OK " : " FAIL " , ns , ( unsigned long long ) peer ) ;
}
@ -491,15 +493,16 @@ static void cs_on_conn_up(struct ETCP_CONN* conn, void* arg) {
if ( ! conn | | ! g_cs ) return ;
uint64_t peer = conn - > peer_node_id ;
if ( peer = = 0 | | peer = = g_cs - > inst - > node_id ) return ;
if ( ! conn - > initialized ) { DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: conn_up SKIP — not initialized peer=%016llx " , CS_ID , ( unsigned long long ) peer ) ; return ; }
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: conn_up peer=%016llx init=%d links=%d " , CS_ID , ( unsigned long long ) peer , conn - > initialized , conn - > links_up ) ;
if ( ! conn - > initialized ) { DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: conn_up SKIP — not initialized peer=%016llx " , CS_ID , ( unsigned long long ) peer ) ; return ; }
DEBUG_DEBUG ( DEBUG_CATEGORY_DEBUG , " %s: conn_up peer=%016llx pending_invite=%llu links_up=%d " , CS_ID , ( unsigned long long ) peer , ( unsigned long long ) g_cs - > pending_invite_ch_id , conn - > links_up ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DB_SYNC , " %s: conn_up peer=%016llx pending_invite=%llu links_up=%d " , CS_ID , ( unsigned long long ) peer , ( unsigned long long ) g_cs - > pending_invite_ch_id , conn - > links_up ) ;
if ( g_cs - > pending_invite_ch_id ! = 0 & & ! g_cs - > info_req_timer ) {
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: conn_up invite path peer=%016llx ch=%llu " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: conn_up invite path peer=%016llx ch=%llu " ,
CS_ID , ( unsigned long long ) peer , ( unsigned long long ) g_cs - > pending_invite_ch_id ) ;
if ( g_cs - > pending_invite_node_id ! = 0 & & g_cs - > pending_invite_node_id ! = peer )
DEBUG_WARN ( DEBUG_CATEGORY_DEBUG , " %s: invite node_id MISMATCH: invite=0x%016llx ETCP_peer=0x%016llx — invite is STALE! " ,
DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: invite node_id MISMATCH: invite=0x%016llx ETCP_peer=0x%016llx — invite is STALE! " ,
CS_ID , ( unsigned long long ) g_cs - > pending_invite_node_id , ( unsigned long long ) peer ) ;
g_cs - > pending_invite_node_id = peer ;
char ch_id_str [ 64 ] ;
@ -523,17 +526,18 @@ static void cs_on_conn_down(struct ETCP_CONN* conn, void* arg) {
( void ) arg ;
if ( ! conn | | ! g_cs ) return ;
uint64_t peer = conn - > peer_node_id ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: conn_down peer=%016llx " , CS_ID , ( unsigned long long ) peer ) ;
uint16_t rtt = conn - > rtt_avg_100 ;
if ( rtt > 0 & & peer ! = 0 & & g_cs - > inst - > topo_sqlite_db ) {
sqlite3 * db = g_cs - > inst - > topo_sqlite_db ;
sqlite3_stmt * st = NULL ;
sqlite3_prepare_v2 ( db , " UPDATE node_addresses SET rtt=? WHERE node_id=? " , - 1 , & st , NULL ) ;
if ( st ) { sqlite3_bind_int ( st , 1 , ( int ) rtt ) ; sqlite3_bind_int64 ( st , 2 , ( sqlite3_int64 ) peer ) ; sqlite3_step ( st ) ; sqlite3_finalize ( st ) ; }
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: conn_down saved rtt=%u for node %016llx " , CS_ID , rtt , ( unsigned long long ) peer ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: conn_down saved rtt=%u for node %016llx " , CS_ID , rtt , ( unsigned long long ) peer ) ;
}
cs_cancel_proto_timers ( g_cs ) ;
if ( g_cs - > pending_invite_node_id = = peer ) {
DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: conn down while waiting invite resp peer=%016llx, timers cancelled, state kept for retry on reconnect " ,
DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: conn down while waiting invite resp peer=%016llx, timers cancelled, state kept for retry on reconnect " ,
CS_ID , ( unsigned long long ) peer ) ;
/* invite state survives connection flaps: only timeout or explicit protocol end clears it */
}
@ -554,6 +558,7 @@ static void cs_on_conn_down(struct ETCP_CONN* conn, void* arg) {
static void cs_on_new_conn ( struct ETCP_CONN * conn , void * arg ) {
( void ) arg ;
if ( ! conn ) return ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: new_conn conn=%p " , CS_ID , ( void * ) conn ) ;
etcp_conn_add_up_cbk ( conn , cs_on_conn_up , NULL ) ;
etcp_conn_add_down_cbk ( conn , cs_on_conn_down , NULL ) ;
}
@ -618,6 +623,7 @@ int chat_sync_init(struct UTUN_INSTANCE* inst,
void ( * gui_cb ) ( void * , int , const uint8_t * , int ) ) {
( void ) gui_cb ;
if ( ! inst ) return - 1 ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: init " , CS_ID ) ;
struct chat_sync * cs = u_calloc ( 1 , sizeof ( * cs ) ) ;
if ( ! cs ) return - 1 ;
cs - > inst = inst ;
@ -646,13 +652,14 @@ int chat_sync_init(struct UTUN_INSTANCE* inst,
member_sync_init ( inst ) ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: initialized " , CS_ID ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: initialized " , CS_ID ) ;
return 0 ;
}
void chat_sync_destroy ( struct UTUN_INSTANCE * inst ) {
struct chat_sync * cs = g_cs ;
if ( ! cs | | ! inst ) return ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: destroy " , CS_ID ) ;
chat_sync_auto_connect_stop ( ) ;
member_sync_destroy ( inst ) ;
cs - > initialized = 0 ; g_cs = NULL ;
@ -707,8 +714,10 @@ void chat_sync_connect_from_invite(uint64_t channel_id, uint64_t node_id,
g_cs - > pending_invite_ch_id = channel_id ;
g_cs - > pending_invite_node_id = node_id ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: invite ch=%llu node=%016llx pubkey=%016llx addrs=%d " ,
CS_ID , channel_id , node_id , * ( const uint64_t * ) pubkey_bin , addr_count ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: invite start ch=%llu node=0x%016llx pubkey=%016llx... addrs=%d " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: invite start ch=%llu node=0x%016llx pubkey=%016llx... addrs=%d " ,
CS_ID , channel_id , node_id , * ( const uint64_t * ) pubkey_bin , addr_count ) ;
gui_bridge_post_uasync_fn (
@ -720,7 +729,7 @@ void chat_sync_connect_from_invite(uint64_t channel_id, uint64_t node_id,
static int cs_ed25519_sign ( const uint8_t * privkey , const uint8_t * msg , size_t msg_len ,
uint8_t * sig_out ) {
EVP_PKEY * pkey = EVP_PKEY_new_raw_private_key ( EVP_PKEY_ED25519 , NULL , privkey , SC_PRIVKEY_SIZE ) ;
if ( ! pkey ) { DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: EVP_PKEY_new failed " , CS_ID ) ; return - 1 ; }
if ( ! pkey ) { DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: EVP_PKEY_new failed " , CS_ID ) ; return - 1 ; }
EVP_MD_CTX * mdctx = EVP_MD_CTX_new ( ) ;
if ( ! mdctx ) { EVP_PKEY_free ( pkey ) ; return - 1 ; }
int ok = ( EVP_DigestSignInit ( mdctx , NULL , NULL , NULL , pkey ) = = 1 )
@ -733,7 +742,7 @@ static int cs_ed25519_sign(const uint8_t* privkey, const uint8_t* msg, size_t ms
static int cs_ed25519_verify ( const uint8_t * pubkey , const uint8_t * msg , size_t msg_len ,
const uint8_t * sig ) {
EVP_PKEY * pkey = EVP_PKEY_new_raw_public_key ( EVP_PKEY_ED25519 , NULL , pubkey , SC_PUBKEY_SIZE ) ;
if ( ! pkey ) { DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: EVP_PKEY_new pub failed " , CS_ID ) ; return - 1 ; }
if ( ! pkey ) { DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: EVP_PKEY_new pub failed " , CS_ID ) ; return - 1 ; }
EVP_MD_CTX * mdctx = EVP_MD_CTX_new ( ) ;
if ( ! mdctx ) { EVP_PKEY_free ( pkey ) ; return - 1 ; }
int rc = EVP_DigestVerifyInit ( mdctx , NULL , NULL , NULL , pkey )
@ -779,16 +788,17 @@ static int _get_node_name(sqlite3* db, uint64_t node_id, char* out, size_t sz) {
static void cs_handle_channel_info_req ( struct chat_sync * cs , uint64_t peer ,
const char * ch_id , const uint8_t * pl , size_t len ) {
( void ) pl ; ( void ) len ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: INFO_REQ ch=%s from=%016llx " , CS_ID , ch_id , ( unsigned long long ) 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_sqlite_db ,
ch_id , name , ( int ) sizeof ( name ) , & is_dm , & owner , x25519 , ed_pub , ch_sig ) ! = 0 ) {
DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_REQ unknown ch=%s from=%016llx " , CS_ID , ch_id , ( unsigned long long ) peer ) ;
DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %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 ;
if ( memcmp ( cs - > inst - > my_keys . public_key , x25519 , 32 ) ! = 0 )
DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_RESP pubkey MISMATCH: my=%016llx ch=%016llx — channel was created with DIFFERENT keys! " ,
DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_INFO_RESP pubkey MISMATCH: my=%016llx ch=%016llx — channel was created with DIFFERENT keys! " ,
CS_ID , * ( const uint64_t * ) cs - > inst - > my_keys . public_key , * ( const uint64_t * ) x25519 ) ;
/* load or create join_sig */
uint8_t my_join_sig [ 64 ] = { 0 } ; uint64_t my_join_ts = 0 ;
@ -802,7 +812,7 @@ static void cs_handle_channel_info_req(struct chat_sync* cs, uint64_t peer,
my_join_ts = ( uint64_t ) ntp_time_get_seconds ( cs - > inst ) ;
memcpy ( join_msg + mlen , & my_join_ts , 8 ) ; mlen + = 8 ;
cs_ed25519_sign ( cs - > inst - > my_ed25519_privkey , join_msg , mlen , my_join_sig ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DEBUG , " %s: CHANNEL_INFO_RESP created NEW join_sig: myid=%016llx ts=%llu " ,
DEBUG_DEBUG ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_INFO_RESP created NEW join_sig: myid=%016llx ts=%llu " ,
CS_ID , ( unsigned long long ) myid , ( unsigned long long ) my_join_ts ) ;
}
}
@ -846,10 +856,11 @@ static void cs_handle_channel_info_req(struct chat_sync* cs, uint64_t peer,
static void cs_handle_channel_info_resp ( struct chat_sync * cs , uint64_t peer ,
const char * ch_id , const uint8_t * pl , size_t len ) {
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: INFO_RESP ch=%s from=%016llx len=%zu " , CS_ID , ch_id , ( unsigned long long ) peer , len ) ;
if ( cs - > info_req_timer ) { uasync_cancel_timeout ( cs - > inst - > ua , cs - > info_req_timer ) ; cs - > info_req_timer = NULL ; }
if ( len < 1 ) { DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_RESP too short len=%zu peer=%016llx " , CS_ID , len , ( unsigned long long ) peer ) ; return ; }
if ( len < 1 ) { DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_INFO_RESP too short len=%zu peer=%016llx " , CS_ID , len , ( unsigned long long ) peer ) ; return ; }
uint8_t nl = pl [ 0 ] ;
if ( 1 + nl + 8 + 1 + 32 + 32 + 64 + 1 + 64 + 8 + 1 > len ) { DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_RESP truncated len=%zu " , CS_ID , len ) ; return ; }
if ( 1 + nl + 8 + 1 + 32 + 32 + 64 + 1 + 64 + 8 + 1 > len ) { DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_INFO_RESP truncated len=%zu " , CS_ID , len ) ; return ; }
const uint8_t * p = pl + 1 ;
char name [ 128 ] ; memcpy ( name , p , nl ) ; name [ nl ] = ' \0 ' ; p + = nl ;
uint64_t owner ; memcpy ( & owner , p , 8 ) ; p + = 8 ;
@ -867,7 +878,7 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer,
char inv_name [ 128 ] = " " ;
if ( p + inv_name_len < = pl + len ) { memcpy ( inv_name , p , inv_name_len ) ; inv_name [ inv_name_len ] = ' \0 ' ; }
DEBUG_DEBUG ( DEBUG_CATEGORY_DEBUG , " %s: CHANNEL_INFO_RESP from peer=%016llx owner=%016llx ch_x25519=%016llx ch_ed=%016llx name=%s " ,
DEBUG_DEBUG ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_INFO_RESP from peer=%016llx owner=%016llx ch_x25519=%016llx ch_ed=%016llx name=%s " ,
CS_ID , ( unsigned long long ) peer , ( unsigned long long ) owner ,
* ( const uint64_t * ) x25519 , * ( const uint64_t * ) ed_pub , name ) ;
@ -879,7 +890,7 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer,
memcpy ( vmsg + vlen , x25519 , 32 ) ; vlen + = 32 ;
memcpy ( vmsg + vlen , ed_pub , 32 ) ; vlen + = 32 ;
if ( cs_ed25519_verify ( ed_pub , vmsg , vlen , ch_sig ) ! = 0 ) {
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_RESP invalid ch_sig ch=%s " , CS_ID , ch_id ) ;
DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_INFO_RESP invalid ch_sig ch=%s " , CS_ID , ch_id ) ;
return ;
}
@ -887,13 +898,13 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer,
topo_node_sqlite_channel_put ( cs - > inst - > topo_sqlite_db ,
ch_id , name , ( int ) is_dm , owner , x25519 , NULL , ed_pub , NULL , ch_sig ) ;
chat_core_ensure_channel_ready ( ch_id ) ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: channel ready for sync ch=%s, db_sync will pick up via periodic check or active conn " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: channel ready for sync ch=%s, db_sync will pick up via periodic check or active conn " ,
CS_ID , ch_id ) ;
/* verify inviter's join_sig AND save node info using ETCP-authenticated keys */
{ struct ETCP_CONN * inv_conn = cs_find_conn_for_node ( cs - > inst , peer ) ;
if ( ! inv_conn ) {
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_RESP no ETCP conn for inviter peer=%016llx " , CS_ID , ( unsigned long long ) peer ) ;
DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_INFO_RESP no ETCP conn for inviter peer=%016llx " , CS_ID , ( unsigned long long ) peer ) ;
return ;
}
const uint8_t * inv_x25519 = inv_conn - > crypto_ctx . peer_public_key ;
@ -908,7 +919,7 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer,
if ( inviter_join_sig ) memcpy ( ivmsg + ilen , inviter_join_sig , 64 ) ; else memset ( ivmsg + ilen , 0 , 64 ) ;
ilen + = 64 ;
if ( cs_ed25519_verify ( inv_ed , ivmsg , ilen , inviter_update_sig ) ! = 0 ) {
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_RESP invalid inviter_update_sig peer=%016llx ts=%llu " ,
DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_INFO_RESP invalid inviter_update_sig peer=%016llx ts=%llu " ,
CS_ID , ( unsigned long long ) peer , ( unsigned long long ) inviter_update_ts ) ;
}
/* save inviter node_info to local DB */
@ -936,7 +947,7 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer,
sqlite3_bind_blob ( as , 2 , ip , 4 , SQLITE_STATIC ) ;
sqlite3_bind_int ( as , 3 , port ) ;
sqlite3_step ( as ) ; sqlite3_finalize ( as ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DEBUG , " %s: saved inviter addr peer=%016llx %d.%d.%d.%d:%d " , CS_ID ,
DEBUG_DEBUG ( DEBUG_CATEGORY_DB_SYNC , " %s: saved inviter addr peer=%016llx %d.%d.%d.%d:%d " , CS_ID ,
( unsigned long long ) peer , ip [ 0 ] , ip [ 1 ] , ip [ 2 ] , ip [ 3 ] , port ) ;
}
}
@ -944,7 +955,7 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer,
}
}
int rc = topo_node_sqlite_member_put ( vdb , ch_id , peer , inviter_join_sig , inviter_join_ts , inviter_update_sig , inviter_update_ts , inv_x25519 , inv_ed , inv_name , inviter_join_sig ) ;
if ( rc ! = 0 ) DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: member_put(inviter) FAILED ch=%s peer=%016llx rc=%d " , CS_ID , ch_id , ( unsigned long long ) peer , rc ) ;
if ( rc ! = 0 ) DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: member_put(inviter) FAILED ch=%s peer=%016llx rc=%d " , CS_ID , ch_id , ( unsigned long long ) peer , rc ) ;
topo_node_sqlite_node_update_verified ( vdb , peer , inv_name , inv_x25519 , inv_ed , inviter_join_ts ) ;
}
@ -1018,9 +1029,10 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer,
static void cs_handle_channel_join ( struct chat_sync * cs , uint64_t peer ,
const char * ch_id , const uint8_t * pl , size_t len ) {
if ( len < 8 + 32 + 32 + 64 + 8 + 1 + 1 ) { DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_JOIN too short len=%zu peer=%016llx " , CS_ID , len , ( unsigned long long ) peer ) ; return ; }
if ( len < 8 + 32 + 32 + 64 + 8 + 1 + 1 ) { DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: CHANNEL_JOIN too short len=%zu peer=%016llx " , CS_ID , len , ( unsigned long long ) peer ) ; return ; }
const uint8_t * p = pl ;
uint64_t node_id ; memcpy ( & node_id , p , 8 ) ; p + = 8 ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: JOIN ch=%s node=%016llx from=%016llx " , CS_ID , ch_id , ( unsigned long long ) node_id , ( unsigned long long ) peer ) ;
const uint8_t * x25519 = p ; p + = 32 ;
const uint8_t * ed_pub = p ; p + = 32 ;
const uint8_t * join_sig = p ; p + = 64 ;
@ -1039,7 +1051,7 @@ static void cs_handle_channel_join(struct chat_sync* cs, uint64_t peer,
size_t nl = strlen ( nm ) ; memcpy ( vmsg + vlen , nm , nl ) ; vlen + = nl ; vmsg [ vlen + + ] = ' \0 ' ; }
memcpy ( vmsg + vlen , & join_ts , 8 ) ; vlen + = 8 ;
if ( cs_ed25519_verify ( ed_pub , vmsg , vlen , join_sig ) ! = 0 ) {
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: JOIN invalid sig node=0x%016llx ch=%s — signed(node=%016llx x25519=%016llx ed=%016llx name=%s ts=%llu) " , CS_ID ,
DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: JOIN invalid sig node=0x%016llx ch=%s — signed(node=%016llx x25519=%016llx ed=%016llx name=%s ts=%llu) " , CS_ID ,
( unsigned long long ) node_id , ch_id ,
( unsigned long long ) node_id , * ( const uint64_t * ) x25519 , * ( const uint64_t * ) ed_pub , joiner_name , ( unsigned long long ) join_ts ) ;
return ;
@ -1047,7 +1059,7 @@ static void cs_handle_channel_join(struct chat_sync* cs, uint64_t peer,
sqlite3 * db = cs - > inst - > topo_sqlite_db ;
int rc = topo_node_sqlite_member_put ( db , ch_id , node_id , join_sig , join_ts , NULL , 0 , x25519 , ed_pub , joiner_name , NULL ) ;
if ( rc ! = 0 ) DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: member_put(joiner) FAILED ch=%s node=0x%016llx rc=%d " , CS_ID , ch_id , ( unsigned long long ) node_id , rc ) ;
if ( rc ! = 0 ) DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: member_put(joiner) FAILED ch=%s node=0x%016llx rc=%d " , CS_ID , ch_id , ( unsigned long long ) node_id , rc ) ;
topo_node_sqlite_node_update_verified ( db , node_id , joiner_name , x25519 , ed_pub , join_ts ) ;
/* save joiner node_info to local DB */
if ( db & & joiner_name [ 0 ] ) {
@ -1127,10 +1139,10 @@ static void cs_handle_channel_join(struct chat_sync* cs, uint64_t peer,
/* 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 " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %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 " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: JOIN accepted node=0x%016llx ch=%s addrs=%d " ,
CS_ID , ( unsigned long long ) node_id , ch_id , addr_cnt ) ;
}
@ -1140,11 +1152,12 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer,
const char * ch_id , const uint8_t * pl , size_t len ) {
if ( cs - > join_timer ) { uasync_cancel_timeout ( cs - > inst - > ua , cs - > join_timer ) ; cs - > join_timer = NULL ; }
( void ) peer ;
if ( len < 2 ) { DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: WELCOME too short len=%zu peer=%016llx " , CS_ID , len , ( unsigned long long ) peer ) ; return ; }
if ( len < 2 ) { DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: WELCOME too short len=%zu peer=%016llx " , CS_ID , len , ( unsigned long long ) peer ) ; return ; }
sqlite3 * db = cs - > inst - > topo_sqlite_db ;
const uint8_t * p = pl ;
uint16_t pc ; memcpy ( & pc , p , 2 ) ; p + = 2 ;
DEBUG_TRACE ( DEBUG_CATEGORY_DB_SYNC , " %s: WELCOME ch=%s from=%016llx peers=%u " , CS_ID , ch_id , ( unsigned long long ) peer , pc ) ;
for ( uint16_t i = 0 ; i < pc ; i + + ) {
if ( ( size_t ) ( p - pl ) + 8 + 32 + 32 + 64 + 8 + 1 + 1 > len ) break ;
uint64_t node_id ; memcpy ( & node_id , p , 8 ) ; p + = 8 ;
@ -1171,7 +1184,7 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer,
if ( ver ) {
if ( EVP_DigestVerifyInit ( ver , NULL , NULL , NULL , pkey ) ! = 1
| | EVP_DigestVerify ( ver , join_sig , 64 , vmsg , vlen ) ! = 1 )
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: WELCOME invalid join_sig node=0x%016llx " , CS_ID , ( unsigned long long ) node_id ) ;
DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: WELCOME invalid join_sig node=0x%016llx " , CS_ID , ( unsigned long long ) node_id ) ;
EVP_MD_CTX_free ( ver ) ;
}
EVP_PKEY_free ( pkey ) ;
@ -1179,7 +1192,7 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer,
}
int rc = topo_node_sqlite_member_put ( db , ch_id , node_id , join_sig , join_ts , NULL , 0 , x25519 , ed_pub , peer_name , NULL ) ;
if ( rc ! = 0 ) DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: member_put(welcome) FAILED ch=%s node=0x%016llx rc=%d " , CS_ID , ch_id , ( unsigned long long ) node_id , rc ) ;
if ( rc ! = 0 ) DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: member_put(welcome) FAILED ch=%s node=0x%016llx rc=%d " , CS_ID , ch_id , ( unsigned long long ) node_id , rc ) ;
topo_node_sqlite_node_update_verified ( db , node_id , peer_name , x25519 , ed_pub , join_ts ) ;
for ( uint8_t j = 0 ; j < ac ; j + + ) {
@ -1216,9 +1229,9 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer,
const char * my_name = cs - > inst - > name [ 0 ] ? cs - > inst - > name : " " ;
int src = topo_node_sqlite_member_put ( db , ch_id , myid , NULL , 0 , NULL , 0 , my_x25 , my_ed , my_name , NULL ) ;
if ( src ! = 0 )
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: member_put(self) FAILED in WELCOME ch=%s rc=%d " , CS_ID , ch_id , src ) ;
DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: member_put(self) FAILED in WELCOME ch=%s rc=%d " , CS_ID , ch_id , src ) ;
else
DEBUG_DEBUG ( DEBUG_CATEGORY_DEBUG , " %s: WELCOME added self to peers ch=%s node=0x%016llx " , CS_ID , ch_id , ( unsigned long long ) myid ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DB_SYNC , " %s: WELCOME added self to peers ch=%s node=0x%016llx " , CS_ID , ch_id , ( unsigned long long ) myid ) ;
}
uint8_t evt [ 65 ] ; uint8_t ch_id_len = ( uint8_t ) strlen ( ch_id ) ;
@ -1227,7 +1240,7 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer,
gui_bridge_post ( GUI_EVT_MEMBERS_CHANGED , evt , 1 + ch_id_len ) ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: WELCOME processed ch=%s peers=%d — message sync triggered via db_sync (active conn or peer_check timer every 5s) " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: WELCOME processed ch=%s peers=%d — message sync triggered via db_sync (active conn or peer_check timer every 5s) " ,
CS_ID , ch_id , pc ) ;
}
@ -1235,7 +1248,7 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer,
static void cs_handle_peer_upsert ( struct chat_sync * cs , uint64_t peer ,
const char * ch_id , const uint8_t * pl , size_t len ) {
if ( len < 8 + 32 + 32 + 64 + 8 + 1 + 1 + 1 ) { DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: PEER_UPSERT too short len=%zu " , CS_ID , len ) ; return ; }
if ( len < 8 + 32 + 32 + 64 + 8 + 1 + 1 + 1 ) { DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: PEER_UPSERT too short len=%zu " , CS_ID , len ) ; return ; }
const uint8_t * p = pl ;
uint64_t node_id ; memcpy ( & node_id , p , 8 ) ; p + = 8 ;
const uint8_t * x25519 = p ; p + = 32 ;
@ -1256,7 +1269,7 @@ static void cs_handle_peer_upsert(struct chat_sync* cs, uint64_t peer,
size_t nl = strlen ( nm ) ; memcpy ( vmsg + vlen , nm , nl ) ; vlen + = nl ; vmsg [ vlen + + ] = ' \0 ' ; }
memcpy ( vmsg + vlen , & join_ts , 8 ) ; vlen + = 8 ;
if ( cs_ed25519_verify ( ed_pub , vmsg , vlen , join_sig ) ! = 0 ) {
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: PEER_UPSERT invalid sig node=0x%016llx " , CS_ID ,
DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: PEER_UPSERT invalid sig node=0x%016llx " , CS_ID ,
( unsigned long long ) node_id ) ;
return ;
}
@ -1264,7 +1277,7 @@ static void cs_handle_peer_upsert(struct chat_sync* cs, uint64_t peer,
sqlite3 * db = cs - > inst - > topo_sqlite_db ;
int rc = topo_node_sqlite_member_put ( db , ch_id , node_id , join_sig , join_ts , NULL , 0 , x25519 , ed_pub , peer_name , NULL ) ;
if ( rc ! = 0 ) DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: member_put(peer_upsert) FAILED ch=%s node=0x%016llx rc=%d " , CS_ID , ch_id , ( unsigned long long ) node_id , rc ) ;
if ( rc ! = 0 ) DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " %s: member_put(peer_upsert) FAILED ch=%s node=0x%016llx rc=%d " , CS_ID , ch_id , ( unsigned long long ) node_id , rc ) ;
topo_node_sqlite_node_update_verified ( db , node_id , peer_name , x25519 , ed_pub , join_ts ) ;
if ( db & & peer_name [ 0 ] ) {
sqlite3_stmt * ns = NULL ;
@ -1304,7 +1317,7 @@ static void cs_handle_peer_upsert(struct chat_sync* cs, uint64_t peer,
/* propagate to others (except sender and the subject node) */
cs_propagate ( cs , ch_id , peer , pl , len ) ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: PEER_UPSERT node=0x%016llx ch=%s " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: PEER_UPSERT node=0x%016llx ch=%s " ,
CS_ID , ( unsigned long long ) node_id , ch_id ) ;
}
@ -1312,7 +1325,7 @@ static void cs_handle_peer_upsert(struct chat_sync* cs, uint64_t peer,
static void cs_handle_peer_remove ( struct chat_sync * cs , uint64_t peer ,
const char * ch_id , const uint8_t * pl , size_t len ) {
if ( len < 8 ) { DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: PEER_REMOVE too short len=%zu " , CS_ID , len ) ; return ; }
if ( len < 8 ) { DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " %s: PEER_REMOVE too short len=%zu " , CS_ID , len ) ; return ; }
uint64_t node_id ; memcpy ( & node_id , pl , 8 ) ;
sqlite3 * db = cs - > inst - > topo_sqlite_db ;
@ -1323,6 +1336,6 @@ static void cs_handle_peer_remove(struct chat_sync* cs, uint64_t peer,
cs_propagate ( cs , ch_id , peer , pl , len ) ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: PEER_REMOVE node=0x%016llx ch=%s " ,
DEBUG_INFO ( DEBUG_CATEGORY_DB_SYNC , " %s: PEER_REMOVE node=0x%016llx ch=%s " ,
CS_ID , ( unsigned long long ) node_id , ch_id ) ;
}