Load known node identities for verified LAN candidates

This commit is contained in:
evgeny committed 2026-10-25 17:43:21 +01:00
1 parent 28c447370a
commit e8713e7a2c
3 files changed
+43

No files matched your search

+37
View File
@@ -1183,6 +1183,43 @@ struct TOPO_NODE* topo_node_sqlite_snapshot_load(sqlite3* db, struct TOPO_GROUPS
return ni;
}
/* LAN-подтверждение может дать первый адрес узлу, чьи ключи уже проверены member_sync. */
struct TOPO_NODE* topo_node_sqlite_identity_load(sqlite3* db, uint64_t node_id) {
if (!db || !node_id) { DEBUG_ERROR(DEBUG_CATEGORY_BGP, "identity load: invalid arguments"); return NULL; }
sqlite3_stmt* stmt = NULL;
struct TOPO_NODE* ni = NULL;
const char* sql = "SELECT name,x25519_pubkey,ed25519_pubkey,client_type FROM nodes WHERE node_id=?";
int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc == SQLITE_OK) rc = sqlite3_bind_int64(stmt, 1, (sqlite3_int64)node_id);
if (rc == SQLITE_OK) rc = sqlite3_step(stmt);
if (rc == SQLITE_ROW) {
const uint8_t* x = sqlite3_column_blob(stmt, 1);
const uint8_t* ed = sqlite3_column_blob(stmt, 2);
if (!x || !ed || sqlite3_column_bytes(stmt, 1) != 32 || sqlite3_column_bytes(stmt, 2) != 32 ||
sc_derive_node_id_from_pubkey(x) != node_id) {
DEBUG_WARN(DEBUG_CATEGORY_BGP, "identity load: invalid keys node=%016llx", (unsigned long long)node_id);
} else {
ni = u_calloc(1, sizeof(*ni));
if (!ni) DEBUG_ERROR(DEBUG_CATEGORY_BGP, "identity load: allocation failed");
else {
ni->node_id = node_id; ni->client_type = (uint8_t)sqlite3_column_int(stmt, 3);
memcpy(ni->public_key, x, 32); memcpy(ni->ed25519_public_key, ed, 32);
const char* name = (const char*)sqlite3_column_text(stmt, 0);
if (name && !(ni->node_name = u_strdup(name))) {
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "identity load: name allocation failed"); u_free(ni); ni = NULL;
}
}
}
} else if (rc != SQLITE_DONE) DEBUG_ERROR(DEBUG_CATEGORY_BGP, "identity load: %s", sqlite3_errmsg(db));
else DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "identity load: unknown node=%016llx", (unsigned long long)node_id);
if (sqlite3_finalize(stmt) != SQLITE_OK) {
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "identity load finalize: %s", sqlite3_errmsg(db));
topo_node_destroy(NULL, ni); ni = NULL;
}
if (ni) DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "identity loaded without addresses node=%016llx", (unsigned long long)node_id);
return ni;
}
struct TOPO_NODE* topo_node_sqlite_node_load(sqlite3* db, struct TOPO_GROUPS* groups, uint64_t node_id) {
if (!db || !groups || !groups->instance || groups->instance->topo_groups != groups) {
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "node load: invalid database/groups node=%016llx", (unsigned long long)node_id); return NULL;