From a1140fd8fa26e0e9361b84b895c4c32c44efd75e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 1 Feb 2024 17:28:29 +0100 Subject: [PATCH 1/5] Improve getClearContent() method: it should not fallback to the encrypted content when the content is not decrypted. --- .../android/sdk/api/session/events/model/Event.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt index bad8b3766d..196b419598 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt @@ -219,10 +219,16 @@ data class Event( } /** - * @return the event content + * @return the event content. + * If the content is encrypted, it will return the decrypted content, or null if the content is not + * decrypted. */ fun getClearContent(): Content? { - return getDecryptedContent() ?: content + return if (isEncrypted()) { + getDecryptedContent() + } else { + content + } } /** From e04bfe8981d47abd0bcc3a337657d8aa86284e16 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 1 Feb 2024 18:02:04 +0100 Subject: [PATCH 2/5] Remove dead code --- .../org/matrix/android/sdk/internal/crypto/RustCryptoService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt index d743631264..e68cac31a3 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt @@ -664,7 +664,7 @@ internal class RustCryptoService @Inject constructor( when (event.type) { EventType.ROOM_KEY -> { val content = event.getClearContent().toModel() ?: return@forEach - content.sessionKey + val roomId = content.sessionId ?: return@forEach val sessionId = content.sessionId From ec96f4e0ae787cb5ef7800374ad6fa8644c8733a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 1 Feb 2024 18:03:34 +0100 Subject: [PATCH 3/5] Fix assignment issue. `sessionId` was used instead of `roomId`. This may fix issue of Event not decrypted if the key is coming late for the last Event displayed in the Room list. --- .../android/sdk/internal/crypto/RustCryptoService.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt index e68cac31a3..c0407ca4e8 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt @@ -627,7 +627,7 @@ internal class RustCryptoService @Inject constructor( } private fun notifyRoomKeyReceived( - roomId: String, + roomId: String?, sessionId: String, ) { megolmSessionImportManager.dispatchNewSession(roomId, sessionId) @@ -665,8 +665,8 @@ internal class RustCryptoService @Inject constructor( EventType.ROOM_KEY -> { val content = event.getClearContent().toModel() ?: return@forEach - val roomId = content.sessionId ?: return@forEach - val sessionId = content.sessionId + val roomId = content.roomId + val sessionId = content.sessionId ?: return@forEach notifyRoomKeyReceived(roomId, sessionId) matrixConfiguration.cryptoAnalyticsPlugin?.onRoomKeyImported(sessionId, EventType.ROOM_KEY) @@ -674,8 +674,8 @@ internal class RustCryptoService @Inject constructor( EventType.FORWARDED_ROOM_KEY -> { val content = event.getClearContent().toModel() ?: return@forEach - val roomId = content.sessionId ?: return@forEach - val sessionId = content.sessionId + val roomId = content.roomId + val sessionId = content.sessionId ?: return@forEach notifyRoomKeyReceived(roomId, sessionId) matrixConfiguration.cryptoAnalyticsPlugin?.onRoomKeyImported(sessionId, EventType.FORWARDED_ROOM_KEY) From 7dc8c436cf35a8ebbbe51b7620259a0bc044ac2c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 1 Feb 2024 18:43:59 +0100 Subject: [PATCH 4/5] Fix test. `getClearContent()` return the decrypted content for encrypted Event, and it is null in this case --- .../sdk/internal/session/event/ValidDecryptedEventTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/event/ValidDecryptedEventTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/event/ValidDecryptedEventTest.kt index 5fda242b90..534d7ba6ad 100644 --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/event/ValidDecryptedEventTest.kt +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/event/ValidDecryptedEventTest.kt @@ -89,7 +89,7 @@ class ValidDecryptedEventTest { ).toContent() ) - val unValidatedContent = mixedEvent.getClearContent().toModel() + val unValidatedContent = mixedEvent.content.toModel() unValidatedContent?.body shouldBe "some message" mixedEvent.toValidDecryptedEvent()?.clearContent?.toModel() shouldBe null From 3611052386fcb6ad46d9fe7ebf8deae5377648db Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 2 Feb 2024 09:46:44 +0100 Subject: [PATCH 5/5] Add changelog. --- changelog.d/8744.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/8744.bugfix diff --git a/changelog.d/8744.bugfix b/changelog.d/8744.bugfix new file mode 100644 index 0000000000..3ce7637059 --- /dev/null +++ b/changelog.d/8744.bugfix @@ -0,0 +1 @@ +Improve `Event.getClearContent()` and fix assignment issue that may help to decrypt last Event in the room list.