Validate peer keys against full active group member records
This commit is contained in:
1 parent
8f28adeb0f
commit
2d054591d5
2 files changed
+25
No files matched your search
@@ -927,6 +927,28 @@ int topo_node_sqlite_member_allowed(sqlite3* db, const char* channel_id, uint64_
|
||||
sqlite3_finalize(statement); return allowed;
|
||||
}
|
||||
|
||||
int topo_node_sqlite_member_key_allowed(sqlite3* db, const char* channel_id, const uint8_t key[32]) {
|
||||
if (!db || !channel_id || !channel_id[0] || !key) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "member key admission: invalid database/channel/key"); return 0;
|
||||
}
|
||||
uint64_t node = sc_derive_node_id_from_pubkey(key);
|
||||
char table[80], sql[320]; peers_table_name(channel_id, table, sizeof(table));
|
||||
snprintf(sql, sizeof(sql), "SELECT 1 FROM \"%s\" WHERE node_id=? AND x25519_pubkey=? AND source=0 AND deleted=0", table);
|
||||
sqlite3_stmt* st = NULL;
|
||||
int rc = sqlite3_prepare_v2(db, sql, -1, &st, NULL);
|
||||
if (rc == SQLITE_OK) rc = sqlite3_bind_int64(st, 1, (sqlite3_int64)node);
|
||||
if (rc == SQLITE_OK) rc = sqlite3_bind_blob(st, 2, key, 32, SQLITE_STATIC);
|
||||
if (rc == SQLITE_OK) rc = sqlite3_step(st);
|
||||
int allowed = rc == SQLITE_ROW;
|
||||
if (rc != SQLITE_ROW && rc != SQLITE_DONE)
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "member key admission failed channel=%s node=%016llx rc=%d: %s",
|
||||
channel_id, (unsigned long long)node, rc, sqlite3_errmsg(db));
|
||||
if (sqlite3_finalize(st) != SQLITE_OK) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "member key admission finalize failed channel=%s", channel_id); return 0;
|
||||
}
|
||||
return allowed;
|
||||
}
|
||||
|
||||
int topo_node_sqlite_member_del(sqlite3* db, const char* channel_id, uint64_t node_id) {
|
||||
if (!db || !channel_id) { DEBUG_ERROR(DEBUG_CATEGORY_BGP, "member delete: invalid arguments"); return -1; }
|
||||
char peers_tbl[80]; peers_table_name(channel_id, peers_tbl, sizeof(peers_tbl));
|
||||
|
||||
@@ -99,6 +99,9 @@ int topo_node_sqlite_member_in_channel(sqlite3* db, const char* channel_id, uint
|
||||
/* Допуск участника: полная запись source=0 и deleted=0. 1/0, ошибка логируется и даёт 0.
|
||||
* БД заполняет проверяющий подписи member_sync/chat_join; BGP-placeholder не предоставляет доступ. */
|
||||
int topo_node_sqlite_member_allowed(sqlite3* db, const char* channel_id, uint64_t node_id);
|
||||
/* Проверить точный X25519-ключ полного действующего мембера: 1 — есть, 0 — нет/ошибка (закрытый отказ).
|
||||
* node_id вычисляется из key, SQL также сверяет все 32 байта; заглушки source=1 и deleted исключены. */
|
||||
int topo_node_sqlite_member_key_allowed(sqlite3* db, const char* channel_id, const uint8_t key[32]);
|
||||
|
||||
/* Обновить owner-блок и deleted из adm_tags в одной существующей строке;0/-1,отсутствующая строка — ошибка.
|
||||
* adm_tags/adm_tags_sig могут быть NULL;ненулевая подпись64 байта,проверяется вызывающим.
|
||||
|
||||
Reference in new issue
Block a user