db: accept TCP IP-only addresses while preserving stored projections

This commit is contained in:
evgeny committed 2026-10-17 19:58:54 +02:00
1 parent 2c7c3c9e8b
commit d2a8e6fda7
2 files changed
+56 -2

No files matched your search

+28
View File
@@ -36,8 +36,36 @@ static struct TOPO_NODE* record(struct UTUN_INSTANCE* inst, uint64_t timestamp,
return ni;
}
/* Старая БД запрещала port=0; перестройка CHECK сохраняет адреса и восстанавливает индексы. */
static void test_zero_port_schema(void) {
sqlite3 *db = NULL; assert(sqlite3_open(":memory:", &db) == SQLITE_OK);
assert(sqlite3_exec(db, "CREATE TABLE node_addresses("
"id INTEGER PRIMARY KEY,node_id INTEGER,family INTEGER,protocol INTEGER,address BLOB,"
"port INTEGER CHECK(port > 0 AND port <= 65535),rtt INTEGER,addr_type INTEGER,config_type INTEGER,"
"nat_mapping INTEGER,nat_inbound INTEGER,nat_source INTEGER,address_kind INTEGER,socket_id INTEGER,"
"options BLOB,created_at INTEGER);"
"CREATE UNIQUE INDEX idx_na_unique ON node_addresses(node_id,family,socket_id,protocol,address,port,address_kind);"
"INSERT INTO node_addresses VALUES(7,1,4,2,X'CB00712C',443,15,4,2,0,0,1,1,3,X'0102',123)",
NULL, NULL, NULL) == SQLITE_OK);
assert(!topo_node_sqlite_init(db));
sqlite3_stmt *statement = NULL;
assert(sqlite3_prepare_v2(db, "SELECT port,rtt,nat_source,length(options),created_at FROM node_addresses WHERE id=7",
-1, &statement, NULL) == SQLITE_OK);
assert(sqlite3_step(statement) == SQLITE_ROW && sqlite3_column_int(statement, 0) == 443);
assert(sqlite3_column_int(statement, 1) == 15 && sqlite3_column_int(statement, 2) == ADDRESS_SOURCE_ETCP);
assert(sqlite3_column_int(statement, 3) == 2 && sqlite3_column_int(statement, 4) == 123);
sqlite3_finalize(statement);
assert(sqlite3_exec(db, "UPDATE node_addresses SET port=0 WHERE id=7", NULL, NULL, NULL) == SQLITE_OK);
assert(sqlite3_exec(db, "INSERT INTO node_addresses SELECT 8,node_id,family,protocol,address,port,rtt,"
"addr_type,config_type,nat_mapping,nat_inbound,nat_source,address_kind,socket_id,options,created_at"
" FROM node_addresses WHERE id=7", NULL, NULL, NULL) == SQLITE_CONSTRAINT);
assert(!topo_node_sqlite_init(db));
sqlite3_close(db);
}
/* Новый wire и SQL сохраняют адреса, протоколы, классификацию и REALITY; смена формата оставляет bootstrap. */
static void test_compact_addresses(struct UTUN_INSTANCE *inst) {
test_zero_port_schema();
sqlite3 *saved_db = inst->topo_sqlite_db;
assert(sqlite3_open(":memory:", &inst->topo_sqlite_db) == SQLITE_OK);
sqlite3 *db = inst->topo_sqlite_db;