When checking database integrity, delete messages after a gap.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4005 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
parent
1ab79adb27
commit
954e0227d4
25
src/ssb.db.c
25
src/ssb.db.c
@ -731,6 +731,8 @@ bool tf_ssb_db_check(sqlite3* db, const char* check_author)
|
|||||||
sqlite3_bind_text(statement, 1, check_author, -1, NULL);
|
sqlite3_bind_text(statement, 1, check_author, -1, NULL);
|
||||||
}
|
}
|
||||||
char previous_id[k_id_base64_len];
|
char previous_id[k_id_base64_len];
|
||||||
|
int64_t previous_sequence = -1;
|
||||||
|
char previous_author[k_id_base64_len] = { 0 };
|
||||||
while (sqlite3_step(statement) == SQLITE_ROW)
|
while (sqlite3_step(statement) == SQLITE_ROW)
|
||||||
{
|
{
|
||||||
const char* id = (const char*)sqlite3_column_text(statement, 0);
|
const char* id = (const char*)sqlite3_column_text(statement, 0);
|
||||||
@ -748,6 +750,20 @@ bool tf_ssb_db_check(sqlite3* db, const char* check_author)
|
|||||||
bool actual_sequence_before_author = false;
|
bool actual_sequence_before_author = false;
|
||||||
JSValue j = JS_JSONStringify(context, message, JS_NULL, JS_NewInt32(context, 2));
|
JSValue j = JS_JSONStringify(context, message, JS_NULL, JS_NewInt32(context, 2));
|
||||||
const char* jv = JS_ToCString(context, j);
|
const char* jv = JS_ToCString(context, j);
|
||||||
|
|
||||||
|
bool delete_following = false;
|
||||||
|
if (strcmp(author, previous_author))
|
||||||
|
{
|
||||||
|
printf("%s\n", author);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(author, previous_author) == 0 && sequence != previous_sequence + 1)
|
||||||
|
{
|
||||||
|
printf("Detected gap in messages for %s at sequence = %" PRId64 " => %" PRId64 ".\n", author, previous_sequence, sequence);
|
||||||
|
delete_following = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (tf_ssb_verify_and_strip_signature(context, message, actual_id, sizeof(actual_id), out_signature, sizeof(out_signature), &actual_sequence_before_author))
|
if (tf_ssb_verify_and_strip_signature(context, message, actual_id, sizeof(actual_id), out_signature, sizeof(out_signature), &actual_sequence_before_author))
|
||||||
{
|
{
|
||||||
if (previous && strcmp(previous, previous_id))
|
if (previous && strcmp(previous, previous_id))
|
||||||
@ -769,7 +785,12 @@ bool tf_ssb_db_check(sqlite3* db, const char* check_author)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("%s sequence=%" PRId64 " unable to verify signature for %s sequence_before_author=%d message=[%.*s]\n", author, sequence, id, sequence_before_author, (int)strlen(jv), jv);
|
printf("%s sequence=%" PRId64 " unable to verify signature for %s sequence_before_author=%d message=[%.*s]\n", author, sequence, id, sequence_before_author, (int)strlen(jv), jv);
|
||||||
|
delete_following = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delete_following)
|
||||||
|
{
|
||||||
printf("Deleting author = %s sequence >= %" PRId64 ".\n", author, sequence);
|
printf("Deleting author = %s sequence >= %" PRId64 ".\n", author, sequence);
|
||||||
sqlite3_stmt* delete_statement = NULL;
|
sqlite3_stmt* delete_statement = NULL;
|
||||||
if (sqlite3_prepare(db, "DELETE FROM messages WHERE author = ? AND sequence >= ?", -1, &delete_statement, NULL) == SQLITE_OK)
|
if (sqlite3_prepare(db, "DELETE FROM messages WHERE author = ? AND sequence >= ?", -1, &delete_statement, NULL) == SQLITE_OK)
|
||||||
@ -785,6 +806,10 @@ bool tf_ssb_db_check(sqlite3* db, const char* check_author)
|
|||||||
sqlite3_finalize(delete_statement);
|
sqlite3_finalize(delete_statement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
snprintf(previous_author, sizeof(previous_author), "%s", author);
|
||||||
|
previous_sequence = sequence;
|
||||||
|
|
||||||
JS_FreeCString(context, jv);
|
JS_FreeCString(context, jv);
|
||||||
JS_FreeValue(context, j);
|
JS_FreeValue(context, j);
|
||||||
snprintf(previous_id, sizeof(previous_id), "%s", id);
|
snprintf(previous_id, sizeof(previous_id), "%s", id);
|
||||||
|
Loading…
Reference in New Issue
Block a user