ssb: Respect blocks when getting blocks and accounts at the db level.
All checks were successful
Build Tilde Friends / Build-All (push) Successful in 8m59s

This commit is contained in:
2025-11-29 12:14:34 -05:00
parent d200e361f7
commit fb6e554e59
3 changed files with 18 additions and 28 deletions

View File

@@ -894,7 +894,7 @@ bool tf_ssb_db_blob_has(sqlite3* db, const char* id)
{ {
bool result = false; bool result = false;
sqlite3_stmt* statement; sqlite3_stmt* statement;
const char* query = "SELECT COUNT(*) FROM blobs WHERE id = ?1"; const char* query = "SELECT COUNT(*) FROM blobs LEFT OUTER JOIN blocks ON blobs.id = blocks.id WHERE blobs.id = ?1 AND blocks.id IS NULL";
if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK)
{ {
if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW)
@@ -911,7 +911,7 @@ bool tf_ssb_db_blob_get(tf_ssb_t* ssb, const char* id, uint8_t** out_blob, size_
bool result = false; bool result = false;
sqlite3_stmt* statement; sqlite3_stmt* statement;
sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3* db = tf_ssb_acquire_db_reader(ssb);
const char* query = "SELECT content FROM blobs WHERE id = ?1"; const char* query = "SELECT content FROM blobs LEFT OUTER JOIN blocks ON blobs.id = blocks.id WHERE blobs.id = ?1 AND blocks.id IS NULL";
if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK)
{ {
if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW)
@@ -1169,7 +1169,8 @@ bool tf_ssb_db_get_latest_message_by_author(tf_ssb_t* ssb, const char* author, i
if (out_message_id) if (out_message_id)
{ {
const char* query = "SELECT id, sequence FROM messages WHERE author = ?1 ORDER BY sequence DESC LIMIT 1"; const char* query = "SELECT messages.id, messages.sequence FROM messages LEFT OUTER JOIN blocks ON messages.id = blocks.id WHERE author = ?1 AND blocks.id IS NULL ORDER "
"BY messages.sequence DESC LIMIT 1";
if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK)
{ {
if (sqlite3_bind_text(statement, 1, author, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) if (sqlite3_bind_text(statement, 1, author, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW)
@@ -1193,7 +1194,8 @@ bool tf_ssb_db_get_latest_message_by_author(tf_ssb_t* ssb, const char* author, i
} }
else else
{ {
const char* query = "SELECT max_sequence FROM messages_stats WHERE author = ?1"; const char* query = "SELECT messages_stats.max_sequence FROM messages_stats LEFT OUTER JOIN blocks ON messages_stats.author = blocks.id WHERE messages_stats.author = ?1 "
"AND blocks.id IS NULL";
if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK)
{ {
if (sqlite3_bind_text(statement, 1, author, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) if (sqlite3_bind_text(statement, 1, author, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW)
@@ -2946,5 +2948,6 @@ void tf_ssb_db_get_blocks(sqlite3* db, void (*callback)(const char* id, double t
{ {
callback((const char*)sqlite3_column_text(statement, 0), sqlite3_column_double(statement, 1), user_data); callback((const char*)sqlite3_column_text(statement, 0), sqlite3_column_double(statement, 1), user_data);
} }
sqlite3_finalize(statement);
} }
} }

View File

@@ -221,14 +221,6 @@ static void _ebt_add_to_clock(ebt_get_clock_t* work, const char* id, int64_t val
} }
} }
static bool _is_blocked(tf_ssb_t* ssb, const char* id)
{
sqlite3* db = tf_ssb_acquire_db_reader(ssb);
bool blocked = tf_ssb_db_is_blocked(db, id);
tf_ssb_release_db_reader(ssb, db);
return blocked;
}
static void _tf_ssb_ebt_get_send_clock_work(tf_ssb_connection_t* connection, void* user_data) static void _tf_ssb_ebt_get_send_clock_work(tf_ssb_connection_t* connection, void* user_data)
{ {
ebt_get_clock_t* work = user_data; ebt_get_clock_t* work = user_data;
@@ -247,10 +239,7 @@ static void _tf_ssb_ebt_get_send_clock_work(tf_ssb_connection_t* connection, voi
for (int i = 0; visible[i]; i++) for (int i = 0; visible[i]; i++)
{ {
int32_t sequence = 0; int32_t sequence = 0;
if (!_is_blocked(ssb, visible[i]))
{
tf_ssb_db_get_latest_message_by_author(ssb, visible[i], &sequence, NULL, 0); tf_ssb_db_get_latest_message_by_author(ssb, visible[i], &sequence, NULL, 0);
}
sequences = tf_resize_vec(sequences, (i + 1) * sizeof(int32_t)); sequences = tf_resize_vec(sequences, (i + 1) * sizeof(int32_t));
sequences[i] = sequence; sequences[i] = sequence;
} }
@@ -269,8 +258,6 @@ static void _tf_ssb_ebt_get_send_clock_work(tf_ssb_connection_t* connection, voi
/* Ask about the incoming connection, too. */ /* Ask about the incoming connection, too. */
char id[k_id_base64_len] = ""; char id[k_id_base64_len] = "";
if (tf_ssb_connection_get_id(connection, id, sizeof(id))) if (tf_ssb_connection_get_id(connection, id, sizeof(id)))
{
if (!_is_blocked(ssb, id))
{ {
int32_t sequence = 0; int32_t sequence = 0;
tf_ssb_db_get_latest_message_by_author(ssb, id, &sequence, NULL, 0); tf_ssb_db_get_latest_message_by_author(ssb, id, &sequence, NULL, 0);
@@ -278,7 +265,6 @@ static void _tf_ssb_ebt_get_send_clock_work(tf_ssb_connection_t* connection, voi
_ebt_add_to_clock(work, id, sequence, true, true); _ebt_add_to_clock(work, id, sequence, true, true);
uv_mutex_unlock(&work->ebt->mutex); uv_mutex_unlock(&work->ebt->mutex);
} }
}
/* Also respond with what we know about all requested identities. */ /* Also respond with what we know about all requested identities. */
tf_ssb_ebt_clock_entry_t* requested = NULL; tf_ssb_ebt_clock_entry_t* requested = NULL;
@@ -300,12 +286,9 @@ static void _tf_ssb_ebt_get_send_clock_work(tf_ssb_connection_t* connection, voi
if (requested_count) if (requested_count)
{ {
for (int i = 0; i < requested_count; i++) for (int i = 0; i < requested_count; i++)
{
if (!_is_blocked(ssb, requested[i].id))
{ {
tf_ssb_db_get_latest_message_by_author(ssb, requested[i].id, &requested[i].value, NULL, 0); tf_ssb_db_get_latest_message_by_author(ssb, requested[i].id, &requested[i].value, NULL, 0);
} }
}
uv_mutex_lock(&work->ebt->mutex); uv_mutex_lock(&work->ebt->mutex);
for (int i = 0; i < requested_count; i++) for (int i = 0; i < requested_count; i++)

View File

@@ -1903,12 +1903,15 @@ void tf_ssb_test_blocks(const tf_test_options_t* options)
} }
JS_FreeValue(context, obj); JS_FreeValue(context, obj);
assert(tf_ssb_db_blob_get(ssb, blob_id, NULL, NULL));
sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3* db = tf_ssb_acquire_db_writer(ssb);
tf_ssb_db_add_block(db, message_id); tf_ssb_db_add_block(db, message_id);
assert(tf_ssb_db_is_blocked(db, message_id)); assert(tf_ssb_db_is_blocked(db, message_id));
/* Blocked already, because the blocked message references it. */ /* Blocked already, because the blocked message references it. */
assert(tf_ssb_db_is_blocked(db, blob_id)); assert(tf_ssb_db_is_blocked(db, blob_id));
tf_ssb_db_add_block(db, blob_id); tf_ssb_db_add_block(db, blob_id);
assert(!tf_ssb_db_blob_get(ssb, blob_id, NULL, NULL));
tf_ssb_db_add_block(db, id); tf_ssb_db_add_block(db, id);
assert(tf_ssb_db_is_blocked(db, id)); assert(tf_ssb_db_is_blocked(db, id));
tf_ssb_db_remove_block(db, blob_id); tf_ssb_db_remove_block(db, blob_id);
@@ -1918,6 +1921,7 @@ void tf_ssb_test_blocks(const tf_test_options_t* options)
assert(!tf_ssb_db_is_blocked(db, blob_id)); assert(!tf_ssb_db_is_blocked(db, blob_id));
assert(!tf_ssb_db_is_blocked(db, id)); assert(!tf_ssb_db_is_blocked(db, id));
tf_ssb_release_db_writer(ssb, db); tf_ssb_release_db_writer(ssb, db);
assert(tf_ssb_db_blob_get(ssb, blob_id, NULL, NULL));
tf_ssb_destroy(ssb); tf_ssb_destroy(ssb);