From e04eb733e71babd3e1e8d760afa823228b96b8ff Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 22 Aug 2023 14:04:49 -0400 Subject: [PATCH] - Protecting contact lists of all accounts in the device. - Pruning events that are not from or cite an account. --- .../java/com/vitorpamplona/amethyst/LocalPreferences.kt | 4 ++++ .../main/java/com/vitorpamplona/amethyst/ServiceManager.kt | 7 +++++-- .../java/com/vitorpamplona/amethyst/model/LocalCache.kt | 4 ++-- app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt | 3 +-- .../src/main/java/com/vitorpamplona/quartz/events/Event.kt | 3 ++- .../java/com/vitorpamplona/quartz/events/EventInterface.kt | 1 + 6 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index c6f9017bc..a4bbd919e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -205,6 +205,10 @@ object LocalPreferences { } } + fun allLocalAccountNPubs(): Set { + return savedAccounts().toSet() + } + fun saveToEncryptedStorage(account: Account) { val prefs = encryptedPreferences(account.userProfile().pubkeyNpub()) prefs.edit().apply { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt b/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt index 0d4de5610..d4f2efd81 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt @@ -31,6 +31,7 @@ import com.vitorpamplona.amethyst.service.NostrUserProfileDataSource import com.vitorpamplona.amethyst.service.NostrVideoDataSource import com.vitorpamplona.amethyst.service.relays.Client import com.vitorpamplona.amethyst.ui.actions.ImageUploader +import com.vitorpamplona.quartz.encoders.decodePublicKeyAsHexOrNull import java.io.File object ServiceManager { @@ -117,11 +118,13 @@ object ServiceManager { fun cleanUp() { LocalCache.cleanObservers() + val accounts = LocalPreferences.allLocalAccountNPubs().mapNotNull { decodePublicKeyAsHexOrNull(it) }.toSet() + account?.let { LocalCache.pruneOldAndHiddenMessages(it) LocalCache.pruneHiddenMessages(it) - LocalCache.pruneContactLists(it) - LocalCache.pruneRepliesAndReactions(it) + LocalCache.pruneContactLists(accounts) + LocalCache.pruneRepliesAndReactions(accounts) } } } 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 867e7e153..32ec733fb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -729,7 +729,7 @@ object LocalCache { val author = getOrCreateUser(event.pubKey) val repliesTo = event.boostedPost().mapNotNull { checkGetOrCreateNote(it) } + - event.taggedAddresses().mapNotNull { getOrCreateAddressableNote(it) } + event.taggedAddresses().map { getOrCreateAddressableNote(it) } note.loadEvent(event, author, repliesTo) @@ -751,7 +751,7 @@ object LocalCache { val author = getOrCreateUser(event.pubKey) val repliesTo = event.boostedPost().mapNotNull { checkGetOrCreateNote(it) } + - event.taggedAddresses().mapNotNull { getOrCreateAddressableNote(it) } + event.taggedAddresses().map { getOrCreateAddressableNote(it) } note.loadEvent(event, author, repliesTo) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt index 7871305b4..e9237ab6e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt @@ -253,8 +253,7 @@ open class Note(val idHex: String) { zaps = zaps.minus(note) liveSet?.zaps?.invalidateData() } else if (zaps.containsValue(note)) { - val toRemove = zaps.filterValues { it == note } - zaps = zaps.minus(toRemove.keys) + zaps = zaps.filterValues { it != note } liveSet?.zaps?.invalidateData() } } 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 2bf84d6dd..b891b4f93 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt @@ -98,6 +98,7 @@ open class Event( override fun matchTag1With(text: String) = tags.any { it.size > 1 && it[1].contains(text, true) } override fun isTaggedUser(idHex: String) = tags.any { it.size > 1 && it[0] == "p" && it[1] == idHex } + override fun isTaggedUsers(idHexes: Set) = tags.any { it.size > 1 && it[0] == "p" && it[1] in idHexes } override fun isTaggedEvent(idHex: String) = tags.any { it.size > 1 && it[0] == "e" && it[1] == idHex } @@ -199,7 +200,7 @@ open class Event( return try { hasCorrectIDHash() && hasVerifedSignature() } catch (e: Exception) { - Log.e("Event", "Fail checking if event $id has a valid signature", e) + Log.e("Event", "Event $id does not have a valid signature: ${toJson()}", e) false } } 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 777b1cffa..2cc03a5a3 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/EventInterface.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/EventInterface.kt @@ -30,6 +30,7 @@ interface EventInterface { fun hasValidSignature(): Boolean fun isTaggedUser(idHex: String): Boolean + fun isTaggedUsers(idHex: Set): Boolean fun isTaggedEvent(idHex: String): Boolean