diff --git a/matrix-sdk-android/src/kotlinCrypto/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/kotlinCrypto/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt index 66550c4f33..d0bd65e9bb 100755 --- a/matrix-sdk-android/src/kotlinCrypto/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/kotlinCrypto/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt @@ -1033,7 +1033,8 @@ internal class DefaultCryptoService @Inject constructor( override suspend fun receiveSyncChanges( toDevice: ToDeviceSyncResponse?, deviceChanges: DeviceListResponse?, - keyCounts: DeviceOneTimeKeysCountSyncResponse? + keyCounts: DeviceOneTimeKeysCountSyncResponse?, + deviceUnusedFallbackKeyTypes: List? ) { withContext(coroutineDispatchers.crypto) { deviceListManager.handleDeviceListsChanges(deviceChanges?.changed.orEmpty(), deviceChanges?.left.orEmpty()) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt index 060ed85d04..3b308fff95 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt @@ -222,7 +222,13 @@ interface CryptoService { fun start() suspend fun onSyncWillProcess(isInitialSync: Boolean) fun isStarted(): Boolean - suspend fun receiveSyncChanges(toDevice: ToDeviceSyncResponse?, deviceChanges: DeviceListResponse?, keyCounts: DeviceOneTimeKeysCountSyncResponse?) + + suspend fun receiveSyncChanges( + toDevice: ToDeviceSyncResponse?, + deviceChanges: DeviceListResponse?, + keyCounts: DeviceOneTimeKeysCountSyncResponse?, + deviceUnusedFallbackKeyTypes: List?) + suspend fun onLiveEvent(roomId: String, event: Event, isInitialSync: Boolean, cryptoStoreAggregator: CryptoStoreAggregator?) suspend fun onStateEvent(roomId: String, event: Event, cryptoStoreAggregator: CryptoStoreAggregator?) {} suspend fun onSyncCompleted(syncResponse: SyncResponse, cryptoStoreAggregator: CryptoStoreAggregator) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/SyncResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/SyncResponse.kt index 382d8a1740..3948acef65 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/SyncResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/SyncResponse.kt @@ -64,5 +64,12 @@ data class SyncResponse( * but that algorithm is not listed in device_unused_fallback_key_types, the client will upload a new key. */ @Json(name = "org.matrix.msc2732.device_unused_fallback_key_types") - val deviceUnusedFallbackKeyTypes: List? = null, -) + val devDeviceUnusedFallbackKeyTypes: List? = null, + @Json(name = "device_unused_fallback_key_types") + val stableDeviceUnusedFallbackKeyTypes: List? = null, + + ) { + + @Transient + val deviceUnusedFallbackKeyTypes: List? = stableDeviceUnusedFallbackKeyTypes ?: devDeviceUnusedFallbackKeyTypes +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/KeysUploadBody.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/KeysUploadBody.kt index 363dee9a8d..1d1fb3e1fe 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/KeysUploadBody.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/KeysUploadBody.kt @@ -46,6 +46,6 @@ internal data class KeysUploadBody( * If the user had previously uploaded a fallback key for a given algorithm, it is replaced. * The server will only keep one fallback key per algorithm for each user. */ - @Json(name = "org.matrix.msc2732.fallback_keys") + @Json(name = "fallback_keys") val fallbackKeys: JsonDict? = null ) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt index 737a8fd9f0..3d0c816cb0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt @@ -183,7 +183,8 @@ internal class SyncResponseHandler @Inject constructor( cryptoService.receiveSyncChanges( syncResponse.toDevice, syncResponse.deviceLists, - syncResponse.deviceOneTimeKeysCount + syncResponse.deviceOneTimeKeysCount, + syncResponse.deviceUnusedFallbackKeyTypes ) }.also { Timber.v("Finish handling toDevice in $it ms") diff --git a/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/OlmMachine.kt b/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/OlmMachine.kt index 4424bdccdc..838dbf30f7 100644 --- a/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/OlmMachine.kt +++ b/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/OlmMachine.kt @@ -263,7 +263,8 @@ internal class OlmMachine @Inject constructor( suspend fun receiveSyncChanges( toDevice: ToDeviceSyncResponse?, deviceChanges: DeviceListResponse?, - keyCounts: DeviceOneTimeKeysCountSyncResponse? + keyCounts: DeviceOneTimeKeysCountSyncResponse?, + deviceUnusedFallbackKeyTypes: List?, ): ToDeviceSyncResponse { val response = withContext(coroutineDispatchers.io) { val counts: MutableMap = mutableMapOf() @@ -282,9 +283,8 @@ internal class OlmMachine @Inject constructor( .adapter(ToDeviceSyncResponse::class.java) val events = adapter.toJson(toDevice ?: ToDeviceSyncResponse()) - // TODO once our sync response type parses the unused fallback key // field pass in the list of unused fallback keys here - val receiveSyncChanges = inner.receiveSyncChanges(events, devices, counts, unusedFallbackKeys = null) + val receiveSyncChanges = inner.receiveSyncChanges(events, devices, counts, deviceUnusedFallbackKeyTypes) val outAdapter = moshi.adapter>( Types.newParameterizedType( diff --git a/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt b/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt index 140cbde3be..d168663a1b 100755 --- a/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt +++ b/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt @@ -605,10 +605,11 @@ internal class RustCryptoService @Inject constructor( override suspend fun receiveSyncChanges( toDevice: ToDeviceSyncResponse?, deviceChanges: DeviceListResponse?, - keyCounts: DeviceOneTimeKeysCountSyncResponse? + keyCounts: DeviceOneTimeKeysCountSyncResponse?, + deviceUnusedFallbackKeyTypes: List?, ) { // Decrypt and handle our to-device events - val toDeviceEvents = this.olmMachine.receiveSyncChanges(toDevice, deviceChanges, keyCounts) + val toDeviceEvents = this.olmMachine.receiveSyncChanges(toDevice, deviceChanges, keyCounts, deviceUnusedFallbackKeyTypes) // Notify the our listeners about room keys so decryption is retried. toDeviceEvents.events.orEmpty().forEach { event ->