Skip to content

Commit 3aac59a

Browse files
authored
Merge pull request #5080 from vector-im/feature/adm/encrypted-last-message
Updating encrypted room list message previews on key updates
2 parents 45eb3bc + 57bf044 commit 3aac59a

File tree

12 files changed

+90
-29
lines changed

12 files changed

+90
-29
lines changed

changelog.d/4867.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixes room summaries showing encrypted content after verifying device

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ interface CryptoService {
140140
fun getLiveCryptoDeviceInfo(userIds: List<String>): LiveData<List<CryptoDeviceInfo>>
141141

142142
fun addNewSessionListener(newSessionListener: NewSessionListener)
143-
144143
fun removeSessionListener(listener: NewSessionListener)
145144

146145
fun getOutgoingRoomKeyRequests(): List<OutgoingRoomKeyRequest>

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomService.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,4 +242,12 @@ interface RoomService {
242242
*/
243243
fun getFlattenRoomSummaryChildrenOfLive(spaceId: String?,
244244
memberships: List<Membership> = Membership.activeMemberships()): LiveData<List<RoomSummary>>
245+
246+
/**
247+
* Refreshes the RoomSummary LatestPreviewContent for the given @param roomId
248+
* If the roomId is null, all rooms are updated
249+
*
250+
* This is useful for refreshing summary content with encrypted messages after receiving new room keys
251+
*/
252+
fun refreshJoinedRoomSummaryPreviews(roomId: String?)
245253
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/NewSessionListener.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@
1515
*/
1616
package org.matrix.android.sdk.internal.crypto
1717

18+
/**
19+
* This listener notifies on new Megolm sessions being created
20+
*/
1821
interface NewSessionListener {
22+
23+
/**
24+
* @param roomId the room id where the new Megolm session has been created for, may be null when importing from external sessions
25+
* @param senderKey the sender key of the device which the Megolm session is shared with
26+
* @param sessionId the session id of the Megolm session
27+
*/
1928
fun onNewSession(roomId: String?, senderKey: String, sessionId: String)
2029
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/actions/MegolmSessionDataImporter.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import org.matrix.android.sdk.internal.crypto.MXOlmDevice
2222
import org.matrix.android.sdk.internal.crypto.MegolmSessionData
2323
import org.matrix.android.sdk.internal.crypto.OutgoingGossipingRequestManager
2424
import org.matrix.android.sdk.internal.crypto.RoomDecryptorProvider
25+
import org.matrix.android.sdk.internal.crypto.algorithms.megolm.MXMegolmDecryption
2526
import org.matrix.android.sdk.internal.crypto.model.ImportRoomKeysResult
2627
import org.matrix.android.sdk.internal.crypto.model.rest.RoomKeyRequestBody
2728
import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore
@@ -76,7 +77,11 @@ internal class MegolmSessionDataImporter @Inject constructor(private val olmDevi
7677
outgoingGossipingRequestManager.cancelRoomKeyRequest(roomKeyRequestBody)
7778

7879
// Have another go at decrypting events sent with this session
79-
decrypting.onNewSession(megolmSessionData.senderKey!!, sessionId!!)
80+
when (decrypting) {
81+
is MXMegolmDecryption -> {
82+
decrypting.onNewSession(megolmSessionData.roomId, megolmSessionData.senderKey!!, sessionId!!)
83+
}
84+
}
8085
} catch (e: Exception) {
8186
Timber.e(e, "## importRoomKeys() : onNewSession failed")
8287
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/IMXDecrypting.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,6 @@ internal interface IMXDecrypting {
4545
*/
4646
fun onRoomKeyEvent(event: Event, defaultKeysBackupService: DefaultKeysBackupService) {}
4747

48-
/**
49-
* Check if the some messages can be decrypted with a new session
50-
*
51-
* @param senderKey the session sender key
52-
* @param sessionId the session id
53-
*/
54-
fun onNewSession(senderKey: String, sessionId: String) {}
55-
5648
/**
5749
* Determine if we have the keys necessary to respond to a room key request
5850
*

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,19 +318,20 @@ internal class MXMegolmDecryption(private val userId: String,
318318

319319
outgoingGossipingRequestManager.cancelRoomKeyRequest(content)
320320

321-
onNewSession(senderKey, roomKeyContent.sessionId)
321+
onNewSession(roomKeyContent.roomId, senderKey, roomKeyContent.sessionId)
322322
}
323323
}
324324

325325
/**
326326
* Check if the some messages can be decrypted with a new session
327327
*
328+
* @param roomId the room id where the new Megolm session has been created for, may be null when importing from external sessions
328329
* @param senderKey the session sender key
329330
* @param sessionId the session id
330331
*/
331-
override fun onNewSession(senderKey: String, sessionId: String) {
332+
fun onNewSession(roomId: String?, senderKey: String, sessionId: String) {
332333
Timber.tag(loggerTag.value).v("ON NEW SESSION $sessionId - $senderKey")
333-
newSessionListener?.onNewSession(null, senderKey, sessionId)
334+
newSessionListener?.onNewSession(roomId, senderKey, sessionId)
334335
}
335336

336337
override fun hasKeysForKeyRequest(request: IncomingRoomKeyRequest): Boolean {

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/crosssigning/UpdateTrustWorker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ import timber.log.Timber
5252
import javax.inject.Inject
5353

5454
internal class UpdateTrustWorker(context: Context, params: WorkerParameters, sessionManager: SessionManager) :
55-
SessionSafeCoroutineWorker<UpdateTrustWorker.Params>(context, params, sessionManager, Params::class.java) {
55+
SessionSafeCoroutineWorker<UpdateTrustWorker.Params>(context, params, sessionManager, Params::class.java) {
5656

5757
@JsonClass(generateAdapter = true)
5858
internal data class Params(

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/RoomSummaryEntityQueries.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ internal fun RoomSummaryEntity.Companion.getOrCreate(realm: Realm, roomId: Strin
4949
return where(realm, roomId).findFirst() ?: realm.createObject(roomId)
5050
}
5151

52+
internal fun RoomSummaryEntity.Companion.getOrNull(realm: Realm, roomId: String): RoomSummaryEntity? {
53+
return where(realm, roomId).findFirst()
54+
}
55+
5256
internal fun RoomSummaryEntity.Companion.getDirectRooms(realm: Realm,
5357
excludeRoomIds: Set<String>? = null): RealmResults<RoomSummaryEntity> {
5458
return RoomSummaryEntity.where(realm)

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomService.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.lifecycle.LiveData
2020
import androidx.lifecycle.Transformations
2121
import androidx.paging.PagedList
2222
import com.zhuinden.monarchy.Monarchy
23+
import org.matrix.android.sdk.api.query.QueryStringValue
2324
import org.matrix.android.sdk.api.session.events.model.Event
2425
import org.matrix.android.sdk.api.session.room.Room
2526
import org.matrix.android.sdk.api.session.room.RoomService
@@ -32,6 +33,7 @@ import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
3233
import org.matrix.android.sdk.api.session.room.model.RoomSummary
3334
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
3435
import org.matrix.android.sdk.api.session.room.peeking.PeekResult
36+
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
3537
import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount
3638
import org.matrix.android.sdk.api.util.Optional
3739
import org.matrix.android.sdk.api.util.toOptional
@@ -51,6 +53,7 @@ import org.matrix.android.sdk.internal.session.room.peeking.PeekRoomTask
5153
import org.matrix.android.sdk.internal.session.room.peeking.ResolveRoomStateTask
5254
import org.matrix.android.sdk.internal.session.room.read.MarkAllRoomsReadTask
5355
import org.matrix.android.sdk.internal.session.room.summary.RoomSummaryDataSource
56+
import org.matrix.android.sdk.internal.session.room.summary.RoomSummaryUpdater
5457
import org.matrix.android.sdk.internal.session.user.accountdata.UpdateBreadcrumbsTask
5558
import org.matrix.android.sdk.internal.util.fetchCopied
5659
import javax.inject.Inject
@@ -69,6 +72,7 @@ internal class DefaultRoomService @Inject constructor(
6972
private val roomSummaryDataSource: RoomSummaryDataSource,
7073
private val roomChangeMembershipStateDataSource: RoomChangeMembershipStateDataSource,
7174
private val leaveRoomTask: LeaveRoomTask,
75+
private val roomSummaryUpdater: RoomSummaryUpdater
7276
) : RoomService {
7377

7478
override suspend fun createRoom(createRoomParams: CreateRoomParams): String {
@@ -92,6 +96,23 @@ internal class DefaultRoomService @Inject constructor(
9296
return roomSummaryDataSource.getRoomSummaries(queryParams, sortOrder)
9397
}
9498

99+
override fun refreshJoinedRoomSummaryPreviews(roomId: String?) {
100+
val roomSummaries = getRoomSummaries(roomSummaryQueryParams {
101+
if (roomId != null) {
102+
this.roomId = QueryStringValue.Equals(roomId)
103+
}
104+
memberships = listOf(Membership.JOIN)
105+
})
106+
107+
if (roomSummaries.isNotEmpty()) {
108+
monarchy.runTransactionSync { realm ->
109+
roomSummaries.forEach {
110+
roomSummaryUpdater.refreshLatestPreviewContent(realm, it.roomId)
111+
}
112+
}
113+
}
114+
}
115+
95116
override fun getRoomSummariesLive(queryParams: RoomSummaryQueryParams,
96117
sortOrder: RoomSortOrder): LiveData<List<RoomSummary>> {
97118
return roomSummaryDataSource.getRoomSummariesLive(queryParams, sortOrder)

0 commit comments

Comments
 (0)