From c3c5f80cac889d58a82ce03c4d81826851962ad8 Mon Sep 17 00:00:00 2001 From: Hubert Chathi Date: Tue, 9 Sep 2025 13:12:05 -0400 Subject: [PATCH 1/4] Ignore errors from importing secrets from secret storage --- .../matrix/api/encryption/RecoveryException.kt | 1 + .../matrix/impl/encryption/RecoveryExceptionMapper.kt | 3 +++ .../matrix/impl/encryption/RustEncryptionService.kt | 10 ++++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/RecoveryException.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/RecoveryException.kt index 70b335d4f9..33a2a89705 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/RecoveryException.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/RecoveryException.kt @@ -10,6 +10,7 @@ package io.element.android.libraries.matrix.api.encryption import io.element.android.libraries.matrix.api.exception.ClientException sealed class RecoveryException(message: String) : Exception(message) { + class Import(message: String) : RecoveryException(message) class SecretStorage(message: String) : RecoveryException(message) data object BackupExistsOnServer : RecoveryException("BackupExistsOnServer") data class Client(val exception: ClientException) : RecoveryException(exception.message ?: "Unknown error") diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt index b9679eb160..d98f3dd25f 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt @@ -19,6 +19,9 @@ fun Throwable.mapRecoveryException(): RecoveryException { is RustRecoveryException.SecretStorage -> RecoveryException.SecretStorage( message = errorMessage ) + is RustRecoveryException.Import -> RecoveryException.Import( + message = errorMessage + ) is RustRecoveryException.BackupExistsOnServer -> RecoveryException.BackupExistsOnServer is RustRecoveryException.Client -> RecoveryException.Client( source.mapClientException() diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt index 7c87666fe7..a5f0fd5412 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt @@ -44,6 +44,7 @@ import org.matrix.rustcomponents.sdk.UserIdentity import org.matrix.rustcomponents.sdk.BackupUploadState as RustBackupUploadState import org.matrix.rustcomponents.sdk.EnableRecoveryProgress as RustEnableRecoveryProgress import org.matrix.rustcomponents.sdk.SteadyStateException as RustSteadyStateException +import org.matrix.rustcomponents.sdk.RecoveryException as RustRecoveryException internal class RustEncryptionService( client: Client, @@ -182,8 +183,13 @@ internal class RustEncryptionService( override suspend fun recover(recoveryKey: String): Result = withContext(dispatchers.io) { runCatchingExceptions { service.recover(recoveryKey) - }.mapFailure { - it.mapRecoveryException() + }.recoverCatching { + if (it is RustRecoveryException.Import) { + // We ignore import errors because the user will be notified about them via the "Key storage out of sync" detection. + Unit + } else { + throw it.mapRecoveryException() + } } } From 700fdb16e60194bc77d18ec7a01118a8155e971a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 Oct 2025 17:25:12 +0200 Subject: [PATCH 2/4] Remove duplicate Import class in RecoveryException --- .../android/libraries/matrix/api/encryption/RecoveryException.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/RecoveryException.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/RecoveryException.kt index ffad44415e..7dffbf3653 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/RecoveryException.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/RecoveryException.kt @@ -10,7 +10,6 @@ package io.element.android.libraries.matrix.api.encryption import io.element.android.libraries.matrix.api.exception.ClientException sealed class RecoveryException(message: String) : Exception(message) { - class Import(message: String) : RecoveryException(message) class SecretStorage(message: String) : RecoveryException(message) class Import(message: String) : RecoveryException(message) data object BackupExistsOnServer : RecoveryException("BackupExistsOnServer") From 1f0b18bda23e14c7cd6a129405259670acb564b4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 Oct 2025 17:25:44 +0200 Subject: [PATCH 3/4] Remove duplicated code. --- .../matrix/impl/encryption/RecoveryExceptionMapper.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt index fca724d463..5568d008ec 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt @@ -19,9 +19,6 @@ fun Throwable.mapRecoveryException(): RecoveryException { is RustRecoveryException.SecretStorage -> RecoveryException.SecretStorage( message = errorMessage ) - is RustRecoveryException.Import -> RecoveryException.Import( - message = errorMessage - ) is RustRecoveryException.BackupExistsOnServer -> RecoveryException.BackupExistsOnServer is RustRecoveryException.Import -> RecoveryException.Import( message = errorMessage From 1dce112c9041e75a1b6f23936fe76838acd4465c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 8 Oct 2025 12:18:00 +0200 Subject: [PATCH 4/4] Fix import ordering --- .../libraries/matrix/impl/encryption/RustEncryptionService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt index c6ee52a5d4..f380bbe532 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt @@ -44,8 +44,8 @@ import org.matrix.rustcomponents.sdk.Encryption import org.matrix.rustcomponents.sdk.UserIdentity import org.matrix.rustcomponents.sdk.BackupUploadState as RustBackupUploadState import org.matrix.rustcomponents.sdk.EnableRecoveryProgress as RustEnableRecoveryProgress -import org.matrix.rustcomponents.sdk.SteadyStateException as RustSteadyStateException import org.matrix.rustcomponents.sdk.RecoveryException as RustRecoveryException +import org.matrix.rustcomponents.sdk.SteadyStateException as RustSteadyStateException class RustEncryptionService( client: Client,