Ignore errors from importing secrets from secret storage

This commit is contained in:
Hubert Chathi 2025-09-09 13:12:05 -04:00
parent 9bc2c4a776
commit b808a257a8
3 changed files with 12 additions and 2 deletions

View file

@ -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")

View file

@ -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()

View file

@ -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<Unit> = 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()
}
}
}