From ccf971afc4df8231846cf7835dcdc18efa1ecc43 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 1 Mar 2023 10:42:57 +0100 Subject: [PATCH] Update encrypted raw json with decrypted event content for event matching condition --- .../session/pushrules/EventMatchCondition.kt | 16 ++++++- .../pushrules/PushRulesConditionTest.kt | 48 ++++++++++++++++++- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt index 157cee8219..d637b4d0bb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt @@ -39,8 +39,20 @@ class EventMatchCondition( override fun technicalDescription() = "'$key' matches '$pattern'" fun isSatisfied(event: Event): Boolean { - val rawJson: Map<*, *> = event.mxDecryptionResult?.payload - ?: MoshiProvider.providesMoshi().adapter(Event::class.java).toJsonValue(event) as? Map<*, *> + val rawJson: Map<*, *> = (MoshiProvider.providesMoshi().adapter(Event::class.java).toJsonValue(event) as? Map<*, *>) + ?.let { rawJson -> + val decryptedRawJson = event.mxDecryptionResult?.payload + if (decryptedRawJson != null) { + rawJson + .toMutableMap() + .apply { + set("type", decryptedRawJson["type"]) + set("content", decryptedRawJson["content"]) + } + } else { + rawJson + } + } ?: return false val value = extractField(rawJson, key) ?: return false diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt index 3ddf940241..b1a61875fb 100644 --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt @@ -23,7 +23,11 @@ import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test import org.matrix.android.sdk.MatrixTest +import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM +import org.matrix.android.sdk.api.session.crypto.model.OlmDecryptionResult import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent import org.matrix.android.sdk.api.session.events.model.toContent import org.matrix.android.sdk.api.session.room.Room import org.matrix.android.sdk.api.session.room.members.MembershipService @@ -38,12 +42,25 @@ class PushRulesConditionTest : MatrixTest { * Test EventMatchCondition * ========================================================================================== */ + private fun createFakeEncryptedEvent() = Event( + type = EventType.ENCRYPTED, + eventId = "mx0", + roomId = "!fakeRoom", + content = EncryptedEventContent( + algorithm = MXCRYPTO_ALGORITHM_MEGOLM, + ciphertext = "AwgBEpACQEKOkd4Gp0+gSXG4M+btcrnPgsF23xs/lUmS2I4YjmqF...", + sessionId = "TO2G4u2HlnhtbIJk", + senderKey = "5e3EIqg3JfooZnLQ2qHIcBarbassQ4qXblai0", + deviceId = "FAKEE" + ).toContent() + ) + private fun createSimpleTextEvent(text: String): Event { return Event( - type = "m.room.message", + type = EventType.MESSAGE, eventId = "mx0", content = MessageTextContent("m.text", text).toContent(), - originServerTs = 0 + originServerTs = 0, ) } @@ -155,6 +172,33 @@ class PushRulesConditionTest : MatrixTest { } } + @Test + fun test_decrypted_eventmatch_type_condition() { + val condition = EventMatchCondition("type", "m.room.message") + + val simpleDecryptedTextEvent = createFakeEncryptedEvent().apply { + mxDecryptionResult = OlmDecryptionResult( + payload = mapOf( + "type" to EventType.MESSAGE, + "content" to MessageTextContent("m.text", "Yo wtf?").toContent(), + ), + senderKey = "the_real_sender_key", + ) + } + val decryptedDummyEvent = createFakeEncryptedEvent().apply { + mxDecryptionResult = OlmDecryptionResult( + payload = mapOf( + "type" to EventType.DUMMY, + ) + ) + } + val encryptedEvent = createFakeEncryptedEvent() + + assert(condition.isSatisfied(simpleDecryptedTextEvent)) + assertFalse(condition.isSatisfied(decryptedDummyEvent)) + assertFalse(condition.isSatisfied(encryptedEvent)) + } + /* ========================================================================================== * Test RoomMemberCountCondition * ========================================================================================== */