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:
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