Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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()
}
}
}

Expand Down
Loading