Skip to content

Commit e818f86

Browse files
authored
Merge pull request #8666 from yostyle/yostyle/fix_crypto_migration
Move crypto migration
2 parents abccc7d + f3c6535 commit e818f86

File tree

3 files changed

+30
-47
lines changed

3 files changed

+30
-47
lines changed

changelog.d/8666.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix crypto migration from kotlin to rust when an account has a single session and no backup.

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import org.matrix.android.sdk.api.session.crypto.model.MXUsersDevicesMap
5555
import org.matrix.android.sdk.api.session.events.model.Content
5656
import org.matrix.android.sdk.api.session.events.model.Event
5757
import org.matrix.android.sdk.api.session.events.model.EventType
58+
import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent
5859
import org.matrix.android.sdk.api.session.events.model.content.EncryptionEventContent
5960
import org.matrix.android.sdk.api.session.events.model.content.RoomKeyContent
6061
import org.matrix.android.sdk.api.session.events.model.content.RoomKeyWithHeldContent
@@ -134,6 +135,7 @@ internal class RustCryptoService @Inject constructor(
134135
private val getRoomUserIds: GetRoomUserIdsUseCase,
135136
private val outgoingRequestsProcessor: OutgoingRequestsProcessor,
136137
private val matrixConfiguration: MatrixConfiguration,
138+
private val perSessionBackupQueryRateLimiter: PerSessionBackupQueryRateLimiter,
137139
) : CryptoService {
138140

139141
private val isStarting = AtomicBoolean(false)
@@ -494,7 +496,32 @@ internal class RustCryptoService @Inject constructor(
494496
*/
495497
@Throws(MXCryptoError::class)
496498
override suspend fun decryptEvent(event: Event, timeline: String): MXEventDecryptionResult {
497-
return olmMachine.decryptRoomEvent(event)
499+
return try {
500+
olmMachine.decryptRoomEvent(event)
501+
} catch (mxCryptoError: MXCryptoError) {
502+
if (mxCryptoError is MXCryptoError.Base && (
503+
mxCryptoError.errorType == MXCryptoError.ErrorType.UNKNOWN_INBOUND_SESSION_ID ||
504+
mxCryptoError.errorType == MXCryptoError.ErrorType.UNKNOWN_MESSAGE_INDEX)) {
505+
Timber.v("Try to perform a lazy migration from legacy store")
506+
/**
507+
* It's a bit hacky, check how this can be better integrated with rust?
508+
*/
509+
val content = event.content?.toModel<EncryptedEventContent>() ?: throw mxCryptoError
510+
val roomId = event.roomId
511+
val sessionId = content.sessionId
512+
val senderKey = content.senderKey
513+
if (roomId != null && sessionId != null) {
514+
// try to perform a lazy migration from legacy store
515+
val legacy = tryOrNull("Failed to access legacy crypto store") {
516+
cryptoStore.getInboundGroupSession(sessionId, senderKey.orEmpty())
517+
}
518+
if (legacy == null || olmMachine.importRoomKey(legacy).isFailure) {
519+
perSessionBackupQueryRateLimiter.tryFromBackupIfPossible(sessionId, roomId)
520+
}
521+
}
522+
}
523+
throw mxCryptoError
524+
}
498525
}
499526

500527
/**

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

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,17 @@ import dagger.Lazy
2222
import kotlinx.coroutines.CoroutineName
2323
import kotlinx.coroutines.CoroutineScope
2424
import kotlinx.coroutines.SupervisorJob
25-
import kotlinx.coroutines.launch
2625
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
27-
import org.matrix.android.sdk.api.extensions.tryOrNull
2826
import org.matrix.android.sdk.api.failure.Failure
2927
import org.matrix.android.sdk.api.failure.MatrixError
3028
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupLastVersionResult
3129
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersion
3230
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersionResult
33-
import org.matrix.android.sdk.api.session.crypto.model.GossipingToDeviceObject
3431
import org.matrix.android.sdk.api.session.crypto.model.MXUsersDevicesMap
3532
import org.matrix.android.sdk.api.session.events.model.Content
3633
import org.matrix.android.sdk.api.session.events.model.Event
37-
import org.matrix.android.sdk.api.session.events.model.EventType
3834
import org.matrix.android.sdk.api.session.uia.UiaResult
3935
import org.matrix.android.sdk.internal.auth.registration.handleUIA
40-
import org.matrix.android.sdk.internal.crypto.OlmMachine
41-
import org.matrix.android.sdk.internal.crypto.PerSessionBackupQueryRateLimiter
4236
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.BackupKeysResult
4337
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.CreateKeysBackupVersionBody
4438
import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.KeysBackupData
@@ -59,7 +53,6 @@ import org.matrix.android.sdk.internal.crypto.model.rest.KeysUploadBody
5953
import org.matrix.android.sdk.internal.crypto.model.rest.KeysUploadResponse
6054
import org.matrix.android.sdk.internal.crypto.model.rest.RestKeyInfo
6155
import org.matrix.android.sdk.internal.crypto.model.rest.SignatureUploadResponse
62-
import org.matrix.android.sdk.internal.crypto.store.IMXCommonCryptoStore
6356
import org.matrix.android.sdk.internal.crypto.tasks.ClaimOneTimeKeysForUsersDeviceTask
6457
import org.matrix.android.sdk.internal.crypto.tasks.DefaultSendVerificationMessageTask
6558
import org.matrix.android.sdk.internal.crypto.tasks.DownloadKeysForUsersTask
@@ -102,10 +95,7 @@ internal class RequestSender @Inject constructor(
10295
private val getRoomSessionDataTask: GetRoomSessionDataTask,
10396
private val moshi: Moshi,
10497
cryptoCoroutineScope: CoroutineScope,
105-
private val rateLimiter: PerSessionBackupQueryRateLimiter,
106-
private val cryptoStore: IMXCommonCryptoStore,
10798
private val localEchoRepository: LocalEchoRepository,
108-
private val olmMachine: Lazy<OlmMachine>,
10999
) {
110100

111101
private val scope = CoroutineScope(
@@ -246,44 +236,9 @@ internal class RequestSender @Inject constructor(
246236
.newBuilder()
247237
.add(CheckNumberType.JSON_ADAPTER_FACTORY)
248238
.build()
249-
.adapter<Map<String, Map<String, Any>>>(Map::class.java)
239+
.adapter<Map<String, HashMap<String, Any>>>(Map::class.java)
250240
val jsonBody = adapter.fromJson(body)!!
251241

252-
if (eventType == EventType.ROOM_KEY_REQUEST) {
253-
scope.launch {
254-
Timber.v("Intercepting key request, try backup")
255-
/**
256-
* It's a bit hacky, check how this can be better integrated with rust?
257-
*/
258-
try {
259-
jsonBody.forEach { (_, deviceToContent) ->
260-
deviceToContent.forEach { (_, content) ->
261-
val hashMap = content as? Map<*, *>
262-
val action = hashMap?.get("action")?.toString()
263-
if (GossipingToDeviceObject.ACTION_SHARE_REQUEST == action) {
264-
val requestBody = hashMap["body"] as? Map<*, *>
265-
val roomId = requestBody?.get("room_id") as? String
266-
val sessionId = requestBody?.get("session_id") as? String
267-
val senderKey = requestBody?.get("sender_key") as? String
268-
if (roomId != null && sessionId != null) {
269-
// try to perform a lazy migration from legacy store
270-
val legacy = tryOrNull("Failed to access legacy crypto store") {
271-
cryptoStore.getInboundGroupSession(sessionId, senderKey.orEmpty())
272-
}
273-
if (legacy == null || olmMachine.get().importRoomKey(legacy).isFailure) {
274-
rateLimiter.tryFromBackupIfPossible(sessionId, roomId)
275-
}
276-
}
277-
}
278-
}
279-
}
280-
Timber.v("Intercepting key request, try backup")
281-
} catch (failure: Throwable) {
282-
Timber.v(failure, "Failed to use backup")
283-
}
284-
}
285-
}
286-
287242
val userMap = MXUsersDevicesMap<Any>()
288243
userMap.join(jsonBody)
289244

0 commit comments

Comments
 (0)