commit 3656024c986c76b7ab26c19e4f515ff1c70ea167
parent 3ba4e573adf9e775816b9b115fd966f5a1ff6377
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Sat,  2 Sep 2023 13:24:18 +0200

fix(auto_save): prevent saving outside a conversation

Diffstat:
Mcore/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/impl/SnapUUID.kt | 6+++++-
Mcore/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/AutoSave.kt | 32+++++++++++++++++---------------
2 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/impl/SnapUUID.kt b/core/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/impl/SnapUUID.kt @@ -9,7 +9,7 @@ import java.util.UUID class SnapUUID(obj: Any?) : AbstractWrapper(obj) { private val uuidString by lazy { toUUID().toString() } - val bytes: ByteArray get() = instanceNonNull().getObjectField("mId") as ByteArray + private val bytes: ByteArray get() = instanceNonNull().getObjectField("mId") as ByteArray private fun toUUID(): UUID { val buffer = ByteBuffer.wrap(bytes) @@ -20,6 +20,10 @@ class SnapUUID(obj: Any?) : AbstractWrapper(obj) { return uuidString } + override fun equals(other: Any?): Boolean { + return other is SnapUUID && other.uuidString == uuidString + } + companion object { fun fromString(uuid: String): SnapUUID { return fromUUID(UUID.fromString(uuid)) diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/AutoSave.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/AutoSave.kt @@ -67,15 +67,15 @@ class AutoSave : MessagingRuleFeature("Auto Save", MessagingRuleType.AUTO_SAVE, return autoSaveFilter.any { it == contentType } } - private fun canSave(): Boolean { - if (autoSaveFilter.isEmpty()) return false - - with(context.feature(Messaging::class)) { - if (openedConversationUUID == null) return@canSave false - val conversation = openedConversationUUID.toString() - if (context.feature(StealthMode::class).canUseRule(conversation)) return@canSave false - if (!canUseRule(conversation)) return@canSave false - } + private fun canSaveInConversation(targetConversationId: String): Boolean { + val messaging = context.feature(Messaging::class) + val openedConversationId = messaging.openedConversationUUID?.toString() ?: return false + + if (openedConversationId != targetConversationId) return false + + if (context.feature(StealthMode::class).canUseRule(openedConversationId)) return false + if (!canUseRule(openedConversationId)) return false + return true } @@ -85,9 +85,11 @@ class AutoSave : MessagingRuleFeature("Auto Save", MessagingRuleType.AUTO_SAVE, context.mappings.getMappedClass("callbacks", "FetchConversationWithMessagesCallback"), "onFetchConversationWithMessagesComplete", HookStage.BEFORE, - { canSave() } + { autoSaveFilter.isNotEmpty() } ) { param -> val conversationId = SnapUUID(param.arg<Any>(0).getObjectField("mConversationId")!!) + if (!canSaveInConversation(conversationId.toString())) return@hook + val messages = param.arg<List<Any>>(1).map { Message(it) } messages.forEach { if (!canSaveMessage(it)) return@forEach @@ -102,11 +104,12 @@ class AutoSave : MessagingRuleFeature("Auto Save", MessagingRuleType.AUTO_SAVE, context.mappings.getMappedClass("callbacks", "FetchMessageCallback"), "onFetchMessageComplete", HookStage.BEFORE, - { canSave() } + { autoSaveFilter.isNotEmpty() } ) { param -> val message = Message(param.arg(0)) - if (!canSaveMessage(message)) return@hook val conversationId = message.messageDescriptor.conversationId + if (!canSaveInConversation(conversationId.toString())) return@hook + if (!canSaveMessage(message)) return@hook asyncSaveExecutorService.submit { saveMessage(conversationId, message) @@ -117,20 +120,19 @@ class AutoSave : MessagingRuleFeature("Auto Save", MessagingRuleType.AUTO_SAVE, context.mappings.getMappedClass("callbacks", "SendMessageCallback"), "onSuccess", HookStage.BEFORE, - { canSave() } + { autoSaveFilter.isNotEmpty() } ) { val callback = CallbackBuilder(fetchConversationWithMessagesCallbackClass).build() runCatching { fetchConversationWithMessagesPaginatedMethod.invoke( messaging.conversationManager, messaging.openedConversationUUID!!.instanceNonNull(), Long.MAX_VALUE, - 3, + 10, callback ) }.onFailure { Logger.xposedLog("failed to save message", it) } } - } } \ No newline at end of file