commit 3fc06550bf02d96f845abe0b541e775d8c2378e4
parent a63bca978238ffc6adec2997e1c3f7e30c9c4727
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Thu, 2 Nov 2023 16:22:00 +0100
fix(core/e2ee): ignore encryption of stories
Diffstat:
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/experiments/EndToEndEncryption.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/experiments/EndToEndEncryption.kt
@@ -369,7 +369,7 @@ class EndToEndEncryption : MessagingRuleFeature(
}
private fun messageHook(conversationId: String, messageId: Long, senderId: String, messageContent: MessageContent) {
- val (contentType, buffer) = tryDecryptMessage(senderId, messageId, conversationId, messageContent.contentType ?: ContentType.CHAT, messageContent.content)
+ val (contentType, buffer) = tryDecryptMessage(senderId, messageId, conversationId, messageContent.contentType ?: ContentType.CHAT, messageContent.content!!)
messageContent.contentType = contentType
messageContent.content = buffer
}
@@ -383,11 +383,11 @@ class EndToEndEncryption : MessagingRuleFeature(
val messageContent = event.messageContent
val destinations = event.destinations
- val e2eeConversations = destinations.conversations.filter { getState(it.toString()) && getE2EParticipants(it.toString()).isNotEmpty() }
+ val e2eeConversations = destinations.conversations!!.filter { getState(it.toString()) && getE2EParticipants(it.toString()).isNotEmpty() }
if (e2eeConversations.isEmpty()) return@subscribe
- if (e2eeConversations.size != destinations.conversations.size) {
+ if (e2eeConversations.size != destinations.conversations!!.size || destinations.stories?.isNotEmpty() == true) {
if (!forceMessageEncryption) return@subscribe
context.longToast("You can't send encrypted content to both encrypted and unencrypted conversations!")
event.canceled = true
@@ -414,12 +414,22 @@ class EndToEndEncryption : MessagingRuleFeature(
context.event.subscribe(UnaryCallEvent::class) { event ->
if (event.uri != "/messagingcoreservice.MessagingCoreService/CreateContentMessage") return@subscribe
val protoReader = ProtoReader(event.buffer)
+ var hasStory = false
val conversationIds = mutableListOf<SnapUUID>()
protoReader.eachBuffer(3) {
+ if (contains(2)) {
+ hasStory = true
+ return@eachBuffer
+ }
conversationIds.add(SnapUUID.fromBytes(getByteArray(1, 1, 1) ?: return@eachBuffer))
}
+ if (hasStory) {
+ context.log.debug("Skipping encryption for story message")
+ return@subscribe
+ }
+
if (conversationIds.any { !getState(it.toString()) || getE2EParticipants(it.toString()).isEmpty() }) {
context.log.debug("Skipping encryption for conversation ids: ${conversationIds.joinToString(", ")}")
return@subscribe
@@ -490,15 +500,15 @@ class EndToEndEncryption : MessagingRuleFeature(
context.event.subscribe(BuildMessageEvent::class, priority = 0) { event ->
val message = event.message
if (message.messageState != MessageState.COMMITTED) return@subscribe
- val conversationId = message.messageDescriptor.conversationId.toString()
+ val conversationId = message.messageDescriptor!!.conversationId.toString()
messageHook(
conversationId = conversationId,
- messageId = message.messageDescriptor.messageId,
+ messageId = message.messageDescriptor!!.messageId!!,
senderId = message.senderId.toString(),
- messageContent = message.messageContent
+ messageContent = message.messageContent!!
)
- message.messageContent.instanceNonNull()
+ message.messageContent!!.instanceNonNull()
.getObjectField("mQuotedMessage")
?.getObjectField("mContent")
?.also { quotedMessage ->