From 410d6bd69070d6e6d19cb5e9eade5b78894b86ed Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 19 Mar 2024 11:49:03 -0400 Subject: [PATCH] Fixes binary payloads in the search results. --- .../amethyst/model/LocalCache.kt | 74 +++++++++++-------- .../com/vitorpamplona/quartz/events/Event.kt | 2 + .../quartz/events/EventInterface.kt | 2 + .../quartz/events/FileStorageEvent.kt | 2 + .../quartz/events/GeneralListEvent.kt | 2 + .../quartz/events/GiftWrapEvent.kt | 2 + .../vitorpamplona/quartz/events/OtsEvent.kt | 2 + .../quartz/events/PrivateDmEvent.kt | 2 + .../quartz/events/SealedGossipEvent.kt | 2 + 9 files changed, 59 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 3a4284c01..acd2709d1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -1629,39 +1629,51 @@ object LocalCache { } return notes.filter { _, note -> - ( - note.event !is GenericRepostEvent && - note.event !is RepostEvent && - note.event !is CommunityPostApprovalEvent && - note.event !is ReactionEvent && - note.event !is GiftWrapEvent && - note.event !is SealedGossipEvent && - note.event !is OtsEvent && - note.event !is LnZapEvent && - note.event !is LnZapRequestEvent - ) && - ( - note.event?.content()?.contains(text, true) - ?: false || - note.event?.matchTag1With(text) ?: false || - note.idHex.startsWith(text, true) || - note.idNote().startsWith(text, true) - ) + if (note.event is GenericRepostEvent || + note.event is RepostEvent || + note.event is CommunityPostApprovalEvent || + note.event is ReactionEvent || + note.event is LnZapEvent || + note.event is LnZapRequestEvent + ) { + return@filter false + } + + if (note.event?.matchTag1With(text) == true || + note.idHex.startsWith(text, true) || + note.idNote().startsWith(text, true) + ) { + return@filter true + } + + if (note.event?.isContentEncoded() == false) { + return@filter note.event?.content()?.contains(text, true) ?: false + } + + return@filter false } + addressables.filter { _, addressable -> - ( - addressable.event !is GenericRepostEvent && - addressable.event !is RepostEvent && - addressable.event !is CommunityPostApprovalEvent && - addressable.event !is ReactionEvent && - addressable.event !is GiftWrapEvent && - addressable.event !is LnZapEvent && - addressable.event !is LnZapRequestEvent - ) && - ( - addressable.event?.content()?.contains(text, true) - ?: false || addressable.event?.matchTag1With(text) ?: false || addressable.idHex.startsWith(text, true) - ) + if (addressable.event is GenericRepostEvent || + addressable.event is RepostEvent || + addressable.event is CommunityPostApprovalEvent || + addressable.event is ReactionEvent || + addressable.event is LnZapEvent || + addressable.event is LnZapRequestEvent + ) { + return@filter false + } + + if (addressable.event?.matchTag1With(text) == true || + addressable.idHex.startsWith(text, true) + ) { + return@filter true + } + + if (addressable.event?.isContentEncoded() == false) { + return@filter addressable.event?.content()?.contains(text, true) ?: false + } + + return@filter false } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt index 786289aa6..f0f35f3a4 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt @@ -54,6 +54,8 @@ open class Event( val content: String, val sig: HexKey, ) : EventInterface { + override fun isContentEncoded() = false + override fun countMemory(): Long { return 12L + id.bytesUsedInMemory() + diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/EventInterface.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/EventInterface.kt index ae2d56396..2bcccba78 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/EventInterface.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/EventInterface.kt @@ -27,6 +27,8 @@ import java.math.BigDecimal @Immutable interface EventInterface { + fun isContentEncoded(): Boolean + fun countMemory(): Long fun id(): HexKey diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/FileStorageEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/FileStorageEvent.kt index f5f6df63e..0a72d616f 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/FileStorageEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/FileStorageEvent.kt @@ -36,6 +36,8 @@ class FileStorageEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + override fun isContentEncoded() = true + fun type() = tags.firstOrNull { it.size > 1 && it[0] == TYPE }?.get(1) fun decryptKey() = tags.firstOrNull { it.size > 2 && it[0] == DECRYPT }?.let { AESGCM(it[1], it[2]) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt index add6767f9..5628c5820 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt @@ -42,6 +42,8 @@ abstract class GeneralListEvent( ) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) { @Transient private var privateTagsCache: Array>? = null + override fun isContentEncoded() = true + fun category() = dTag() fun bookmarkedPosts() = taggedEvents() diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/GiftWrapEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/GiftWrapEvent.kt index f844ee68d..832938c32 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/GiftWrapEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/GiftWrapEvent.kt @@ -38,6 +38,8 @@ class GiftWrapEvent( ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { @Transient private var cachedInnerEvent: Map = mapOf() + override fun isContentEncoded() = true + fun preCachedGift(signer: NostrSigner): Event? { return cachedInnerEvent[signer.pubKey] } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/OtsEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/OtsEvent.kt index f4f895322..7b6646489 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/OtsEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/OtsEvent.kt @@ -48,6 +48,8 @@ class OtsEvent( @Transient var verifiedTime: Long? = null + override fun isContentEncoded() = true + fun digestEvent() = tags.firstOrNull { it.size > 1 && it[0] == "e" }?.get(1) fun digest() = digestEvent()?.hexToByteArray() diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/PrivateDmEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/PrivateDmEvent.kt index adf4c1213..e44a803ce 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/PrivateDmEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/PrivateDmEvent.kt @@ -40,6 +40,8 @@ class PrivateDmEvent( ) : Event(id, pubKey, createdAt, KIND, tags, content, sig), ChatroomKeyable { @Transient private var decryptedContent: Map = mapOf() + override fun isContentEncoded() = true + /** * This may or may not be the actual recipient's pub key. The event is intended to look like a * nip-04 EncryptedDmEvent but may omit the recipient, too. This value can be queried and used for diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/SealedGossipEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/SealedGossipEvent.kt index 4fd6194ef..655089517 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/SealedGossipEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/SealedGossipEvent.kt @@ -39,6 +39,8 @@ class SealedGossipEvent( ) : WrappedEvent(id, pubKey, createdAt, KIND, tags, content, sig) { @Transient private var cachedInnerEvent: Map = mapOf() + override fun isContentEncoded() = true + fun preCachedGossip(signer: NostrSigner): Event? { return cachedInnerEvent[signer.pubKey] }