|
|
|
@ -699,7 +699,7 @@ void chat_sync_connect_from_invite(uint64_t channel_id, uint64_t node_id, |
|
|
|
inv->node_id = node_id; |
|
|
|
inv->node_id = node_id; |
|
|
|
memcpy(inv->pubkey, pubkey_bin, 32); |
|
|
|
memcpy(inv->pubkey, pubkey_bin, 32); |
|
|
|
|
|
|
|
|
|
|
|
size_t addrs_sz = (size_t)addr_count * 7; |
|
|
|
size_t addrs_sz = (size_t)addr_count * 8; |
|
|
|
inv->addrs_data = u_malloc(addrs_sz); |
|
|
|
inv->addrs_data = u_malloc(addrs_sz); |
|
|
|
if (!inv->addrs_data) { u_free(inv); return; } |
|
|
|
if (!inv->addrs_data) { u_free(inv); return; } |
|
|
|
memcpy(inv->addrs_data, addrs_data, addrs_sz); |
|
|
|
memcpy(inv->addrs_data, addrs_data, addrs_sz); |
|
|
|
@ -933,12 +933,13 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer, |
|
|
|
struct sockaddr_in* sin = (struct sockaddr_in*)&lk->remote_addr; |
|
|
|
struct sockaddr_in* sin = (struct sockaddr_in*)&lk->remote_addr; |
|
|
|
uint8_t ip[4]; memcpy(ip, &sin->sin_addr, 4); uint16_t port = ntohs(sin->sin_port); |
|
|
|
uint8_t ip[4]; memcpy(ip, &sin->sin_addr, 4); uint16_t port = ntohs(sin->sin_port); |
|
|
|
char sql[256]; snprintf(sql, sizeof(sql), |
|
|
|
char sql[256]; snprintf(sql, sizeof(sql), |
|
|
|
"INSERT OR REPLACE INTO node_addresses(node_id,family,address,port,addr_type) VALUES(?,4,?,?,0)"); |
|
|
|
"INSERT OR REPLACE INTO node_addresses(node_id,family,address,port,addr_type,socket_id) VALUES(?,4,?,?,0,?)"); |
|
|
|
sqlite3_stmt* as = NULL; |
|
|
|
sqlite3_stmt* as = NULL; |
|
|
|
if (sqlite3_prepare_v2(vdb, sql, -1, &as, NULL) == SQLITE_OK) { |
|
|
|
if (sqlite3_prepare_v2(vdb, sql, -1, &as, NULL) == SQLITE_OK) { |
|
|
|
sqlite3_bind_int64(as, 1, (sqlite3_int64)peer); |
|
|
|
sqlite3_bind_int64(as, 1, (sqlite3_int64)peer); |
|
|
|
sqlite3_bind_blob(as, 2, ip, 4, SQLITE_STATIC); |
|
|
|
sqlite3_bind_blob(as, 2, ip, 4, SQLITE_STATIC); |
|
|
|
sqlite3_bind_int(as, 3, port); |
|
|
|
sqlite3_bind_int(as, 3, port); |
|
|
|
|
|
|
|
sqlite3_bind_int(as, 4, (int)lk->conn->sock_id); |
|
|
|
sqlite3_step(as); sqlite3_finalize(as); |
|
|
|
sqlite3_step(as); sqlite3_finalize(as); |
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_DB_SYNC, "%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); |
|
|
|
(unsigned long long)peer, ip[0], ip[1], ip[2], ip[3], port); |
|
|
|
@ -991,8 +992,9 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer, |
|
|
|
else { sock = sock->next; continue; } |
|
|
|
else { sock = sock->next; continue; } |
|
|
|
if (sa->ss_family == AF_INET) { |
|
|
|
if (sa->ss_family == AF_INET) { |
|
|
|
struct sockaddr_in* sin = (struct sockaddr_in*)sa; |
|
|
|
struct sockaddr_in* sin = (struct sockaddr_in*)sa; |
|
|
|
if (joff + 7 > sizeof(jbuf)) break; |
|
|
|
if (joff + 8 > sizeof(jbuf)) break; |
|
|
|
jbuf[joff++] = 4; |
|
|
|
jbuf[joff++] = 4; |
|
|
|
|
|
|
|
jbuf[joff++] = sock->sock_id; |
|
|
|
memcpy(jbuf + joff, &sin->sin_addr, 4); joff += 4; |
|
|
|
memcpy(jbuf + joff, &sin->sin_addr, 4); joff += 4; |
|
|
|
uint16_t p = ntohs(sin->sin_port); |
|
|
|
uint16_t p = ntohs(sin->sin_port); |
|
|
|
jbuf[joff++] = (uint8_t)((p >> 8) & 0xFF); |
|
|
|
jbuf[joff++] = (uint8_t)((p >> 8) & 0xFF); |
|
|
|
@ -1000,8 +1002,9 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer, |
|
|
|
addr_cnt++; |
|
|
|
addr_cnt++; |
|
|
|
} else if (sa->ss_family == AF_INET6) { |
|
|
|
} else if (sa->ss_family == AF_INET6) { |
|
|
|
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)sa; |
|
|
|
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)sa; |
|
|
|
if (joff + 19 > sizeof(jbuf)) break; |
|
|
|
if (joff + 20 > sizeof(jbuf)) break; |
|
|
|
jbuf[joff++] = 6; |
|
|
|
jbuf[joff++] = 6; |
|
|
|
|
|
|
|
jbuf[joff++] = sock->sock_id; |
|
|
|
memcpy(jbuf + joff, &sin6->sin6_addr, 16); joff += 16; |
|
|
|
memcpy(jbuf + joff, &sin6->sin6_addr, 16); joff += 16; |
|
|
|
uint16_t p = ntohs(sin6->sin6_port); |
|
|
|
uint16_t p = ntohs(sin6->sin6_port); |
|
|
|
jbuf[joff++] = (uint8_t)((p >> 8) & 0xFF); |
|
|
|
jbuf[joff++] = (uint8_t)((p >> 8) & 0xFF); |
|
|
|
@ -1066,22 +1069,24 @@ static void cs_handle_channel_join(struct chat_sync* cs, uint64_t peer, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* save/update node addresses */ |
|
|
|
/* save/update node addresses */ |
|
|
|
for (uint8_t i = 0; i < addr_cnt && p + 1 <= pl + len; i++) { |
|
|
|
for (uint8_t i = 0; i < addr_cnt && p + 2 <= pl + len; i++) { |
|
|
|
uint8_t fm = *p++; |
|
|
|
uint8_t fm = *p++; |
|
|
|
|
|
|
|
uint8_t sid = *p++; |
|
|
|
int ip_len = (fm == 4) ? 4 : 16; |
|
|
|
int ip_len = (fm == 4) ? 4 : 16; |
|
|
|
if (p + ip_len + 2 > pl + len) break; |
|
|
|
if (p + ip_len + 2 > pl + len) break; |
|
|
|
const uint8_t* ip = p; p += ip_len; |
|
|
|
const uint8_t* ip = p; p += ip_len; |
|
|
|
uint16_t port = ((uint16_t)p[0] << 8) | p[1]; p += 2; |
|
|
|
uint16_t port = ((uint16_t)p[0] << 8) | p[1]; p += 2; |
|
|
|
|
|
|
|
|
|
|
|
char sql[256]; snprintf(sql, sizeof(sql), |
|
|
|
char sql[256]; snprintf(sql, sizeof(sql), |
|
|
|
"INSERT OR REPLACE INTO node_addresses(node_id,family,address,port,addr_type)" |
|
|
|
"INSERT OR REPLACE INTO node_addresses(node_id,family,address,port,addr_type,socket_id)" |
|
|
|
" VALUES(?,?,?,?,0)"); |
|
|
|
" VALUES(?,?,?,?,0,?)"); |
|
|
|
sqlite3_stmt* stmt = NULL; |
|
|
|
sqlite3_stmt* stmt = NULL; |
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) { |
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) { |
|
|
|
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)node_id); |
|
|
|
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)node_id); |
|
|
|
sqlite3_bind_int(stmt, 2, fm); |
|
|
|
sqlite3_bind_int(stmt, 2, fm); |
|
|
|
sqlite3_bind_blob(stmt, 3, ip, ip_len, SQLITE_STATIC); |
|
|
|
sqlite3_bind_blob(stmt, 3, ip, ip_len, SQLITE_STATIC); |
|
|
|
sqlite3_bind_int(stmt, 4, (int)port); |
|
|
|
sqlite3_bind_int(stmt, 4, (int)port); |
|
|
|
|
|
|
|
sqlite3_bind_int(stmt, 5, (int)sid); |
|
|
|
sqlite3_step(stmt); sqlite3_finalize(stmt); |
|
|
|
sqlite3_step(stmt); sqlite3_finalize(stmt); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -1189,27 +1194,29 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer, |
|
|
|
topo_node_sqlite_node_update_verified(db, node_id, peer_name, x25519, ed_pub, join_ts); |
|
|
|
topo_node_sqlite_node_update_verified(db, node_id, peer_name, x25519, ed_pub, join_ts); |
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t j = 0; j < ac; j++) { |
|
|
|
for (uint8_t j = 0; j < ac; j++) { |
|
|
|
if (p + 1 > pl + len) break; |
|
|
|
if (p + 2 > pl + len) break; |
|
|
|
uint8_t fm = *p++; |
|
|
|
uint8_t fm = *p++; |
|
|
|
|
|
|
|
uint8_t sid = *p++; |
|
|
|
int ip_len = (fm == 4) ? 4 : 16; |
|
|
|
int ip_len = (fm == 4) ? 4 : 16; |
|
|
|
if (p + ip_len + 2 > pl + len) break; |
|
|
|
if (p + ip_len + 2 > pl + len) break; |
|
|
|
const uint8_t* ip = p; p += ip_len; |
|
|
|
const uint8_t* ip = p; p += ip_len; |
|
|
|
uint16_t port = ((uint16_t)p[0] << 8) | p[1]; p += 2; |
|
|
|
uint16_t port = ((uint16_t)p[0] << 8) | p[1]; p += 2; |
|
|
|
|
|
|
|
|
|
|
|
char sql[256]; snprintf(sql, sizeof(sql), |
|
|
|
char sql[256]; snprintf(sql, sizeof(sql), |
|
|
|
"INSERT OR REPLACE INTO node_addresses(node_id,family,address,port,addr_type)" |
|
|
|
"INSERT OR REPLACE INTO node_addresses(node_id,family,address,port,addr_type,socket_id)" |
|
|
|
" VALUES(?,?,?,?,0)"); |
|
|
|
" VALUES(?,?,?,?,0,?)"); |
|
|
|
sqlite3_stmt* stmt = NULL; |
|
|
|
sqlite3_stmt* stmt = NULL; |
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) { |
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) { |
|
|
|
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)node_id); |
|
|
|
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)node_id); |
|
|
|
sqlite3_bind_int(stmt, 2, fm); |
|
|
|
sqlite3_bind_int(stmt, 2, fm); |
|
|
|
sqlite3_bind_blob(stmt, 3, ip, ip_len, SQLITE_STATIC); |
|
|
|
sqlite3_bind_blob(stmt, 3, ip, ip_len, SQLITE_STATIC); |
|
|
|
sqlite3_bind_int(stmt, 4, (int)port); |
|
|
|
sqlite3_bind_int(stmt, 4, (int)port); |
|
|
|
|
|
|
|
sqlite3_bind_int(stmt, 5, (int)sid); |
|
|
|
sqlite3_step(stmt); sqlite3_finalize(stmt); |
|
|
|
sqlite3_step(stmt); sqlite3_finalize(stmt); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
member_sync_cancel(g_cs->inst, peer, ch_id); |
|
|
|
member_sync_cancel(g_cs->inst, peer, ch_id); |
|
|
|
member_sync_set_online(g_cs->inst, peer, 0); |
|
|
|
member_sync_set_online(g_cs->inst, peer, 0); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
cs_refresh_channels(cs); |
|
|
|
cs_refresh_channels(cs); |
|
|
|
@ -1283,22 +1290,24 @@ static void cs_handle_peer_upsert(struct chat_sync* cs, uint64_t peer, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 0; i < ac; i++) { |
|
|
|
for (uint8_t i = 0; i < ac; i++) { |
|
|
|
if (p + 1 > pl + len) break; |
|
|
|
if (p + 2 > pl + len) break; |
|
|
|
uint8_t fm = *p++; |
|
|
|
uint8_t fm = *p++; |
|
|
|
|
|
|
|
uint8_t sid = *p++; |
|
|
|
int ip_len = (fm == 4) ? 4 : 16; |
|
|
|
int ip_len = (fm == 4) ? 4 : 16; |
|
|
|
if (p + ip_len + 2 > pl + len) break; |
|
|
|
if (p + ip_len + 2 > pl + len) break; |
|
|
|
const uint8_t* ip = p; p += ip_len; |
|
|
|
const uint8_t* ip = p; p += ip_len; |
|
|
|
uint16_t port = ((uint16_t)p[0] << 8) | p[1]; p += 2; |
|
|
|
uint16_t port = ((uint16_t)p[0] << 8) | p[1]; p += 2; |
|
|
|
|
|
|
|
|
|
|
|
char sql[256]; snprintf(sql, sizeof(sql), |
|
|
|
char sql[256]; snprintf(sql, sizeof(sql), |
|
|
|
"INSERT OR REPLACE INTO node_addresses(node_id,family,address,port,addr_type)" |
|
|
|
"INSERT OR REPLACE INTO node_addresses(node_id,family,address,port,addr_type,socket_id)" |
|
|
|
" VALUES(?,?,?,?,0)"); |
|
|
|
" VALUES(?,?,?,?,0,?)"); |
|
|
|
sqlite3_stmt* stmt = NULL; |
|
|
|
sqlite3_stmt* stmt = NULL; |
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) { |
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) { |
|
|
|
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)node_id); |
|
|
|
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)node_id); |
|
|
|
sqlite3_bind_int(stmt, 2, fm); |
|
|
|
sqlite3_bind_int(stmt, 2, fm); |
|
|
|
sqlite3_bind_blob(stmt, 3, ip, ip_len, SQLITE_STATIC); |
|
|
|
sqlite3_bind_blob(stmt, 3, ip, ip_len, SQLITE_STATIC); |
|
|
|
sqlite3_bind_int(stmt, 4, (int)port); |
|
|
|
sqlite3_bind_int(stmt, 4, (int)port); |
|
|
|
|
|
|
|
sqlite3_bind_int(stmt, 5, (int)sid); |
|
|
|
sqlite3_step(stmt); sqlite3_finalize(stmt); |
|
|
|
sqlite3_step(stmt); sqlite3_finalize(stmt); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|