From 534438df63fde382a610aaa1f06dd4580c47691a Mon Sep 17 00:00:00 2001
From: Cory McWilliams <cory@unprompted.com>
Date: Sat, 31 May 2025 17:42:10 -0400
Subject: [PATCH] ssb: The message_refs table had loads of erroneous entries. 
 This fixes that and adds channel/hashtag refs.

---
 src/ssb.db.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/ssb.db.c b/src/ssb.db.c
index 36ab1c99..ff7176eb 100644
--- a/src/ssb.db.c
+++ b/src/ssb.db.c
@@ -277,6 +277,13 @@ void tf_ssb_db_init(tf_ssb_t* ssb)
 		"CREATE TRIGGER IF NOT EXISTS messages_ad AFTER DELETE ON messages BEGIN INSERT INTO messages_fts(messages_fts, rowid, content) VALUES ('delete', old.rowid, "
 		"old.content); END");
 
+	if (_tf_ssb_db_has_rows(db, "SELECT * FROM sqlite_schema WHERE type = 'trigger' AND name = 'messages_ai_refs' AND NOT sql LIKE '%ltrim%'"))
+	{
+		tf_printf("Deleting incorrect messages_refs...\n");
+		_tf_ssb_db_exec(db, "DROP TABLE IF EXISTS messages_refs");
+		tf_printf("Done.\n");
+	}
+
 	if (!_tf_ssb_db_has_rows(db, "PRAGMA table_list('messages_refs')"))
 	{
 		_tf_ssb_db_exec(db, "BEGIN TRANSACTION");
@@ -291,8 +298,9 @@ void tf_ssb_db_init(tf_ssb_t* ssb)
 			"INSERT INTO messages_refs(message, ref) "
 			"SELECT messages.id, j.value FROM messages, json_tree(messages.content) AS j WHERE "
 			"j.value LIKE '&%.sha256' OR "
-			"j.value LIKE '%%%.sha256' OR "
-			"j.value LIKE '@%.ed25519' "
+			"j.value LIKE '!%%.sha256' ESCAPE '!' OR "
+			"j.value LIKE '@%.ed25519' OR "
+			"(j.value LIKE '#%' AND ltrim(substr(j.value, 2), 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_') = '') "
 			"ON CONFLICT DO NOTHING");
 		_tf_ssb_db_exec(db, "COMMIT TRANSACTION");
 		tf_printf("Done.\n");
@@ -304,8 +312,9 @@ void tf_ssb_db_init(tf_ssb_t* ssb)
 		"INSERT INTO messages_refs(message, ref) "
 		"SELECT DISTINCT new.id, j.value FROM json_tree(new.content) AS j WHERE "
 		"j.value LIKE '&%.sha256' OR "
-		"j.value LIKE '%%%.sha256' OR "
-		"j.value LIKE '@%.ed25519' "
+		"j.value LIKE '!%%.sha256' ESCAPE '!' OR "
+		"j.value LIKE '@%.ed25519' OR "
+		"(j.value LIKE '#%' AND ltrim(substr(j.value, 2), 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_') = '') "
 		"ON CONFLICT DO NOTHING; END");
 	_tf_ssb_db_exec(db, "DROP TRIGGER IF EXISTS messages_ad_refs");
 	_tf_ssb_db_exec(db, "CREATE TRIGGER IF NOT EXISTS messages_ad_refs AFTER DELETE ON messages BEGIN DELETE FROM messages_refs WHERE messages_refs.message = old.id; END");
@@ -541,7 +550,7 @@ static char* _tf_ssb_db_get_message_blob_wants(tf_ssb_t* ssb, int64_t rowid)
 
 	if (sqlite3_prepare_v2(db,
 			"SELECT DISTINCT json.value FROM messages, json_tree(messages.content) AS json LEFT OUTER JOIN blobs ON json.value = blobs.id WHERE messages.rowid = ?1 AND "
-			"json.value LIKE '&%%.sha256' AND length(json.value) = ?2 AND blobs.content IS NULL",
+			"json.value LIKE '&%.sha256' AND length(json.value) = ?2 AND blobs.content IS NULL",
 			-1, &statement, NULL) == SQLITE_OK)
 	{
 		if (sqlite3_bind_int64(statement, 1, rowid) == SQLITE_OK && sqlite3_bind_int(statement, 2, k_blob_id_len - 1) == SQLITE_OK)