Show a more appropriate error when user enter a wrong backup passphrase

This commit is contained in:
Benoit Marty 2020-06-26 15:07:34 +02:00 committed by Valere
parent 8c5ec2c57f
commit 6131c10d31
2 changed files with 39 additions and 28 deletions

View File

@ -44,11 +44,11 @@ class BackupToQuadSMigrationTask @Inject constructor(
sealed class Result { sealed class Result {
object Success : Result() object Success : Result()
abstract class Failure(val error: String?) : Result() abstract class Failure(val throwable: Throwable?) : Result()
object InvalidRecoverySecret : Failure(null) object InvalidRecoverySecret : Failure(null)
object NoKeyBackupVersion : Failure(null) object NoKeyBackupVersion : Failure(null)
object IllegalParams : Failure(null) object IllegalParams : Failure(null)
class ErrorFailure(throwable: Throwable) : Failure(throwable.localizedMessage) class ErrorFailure(throwable: Throwable) : Failure(throwable)
} }
data class Params( data class Params(

View File

@ -35,6 +35,7 @@ import im.vector.matrix.android.internal.crypto.keysbackup.util.extractCurveKeyF
import im.vector.matrix.android.internal.crypto.model.rest.UserPasswordAuth import im.vector.matrix.android.internal.crypto.model.rest.UserPasswordAuth
import im.vector.matrix.android.internal.util.awaitCallback import im.vector.matrix.android.internal.util.awaitCallback
import im.vector.riotx.R import im.vector.riotx.R
import im.vector.riotx.core.error.ErrorFormatter
import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.extensions.exhaustive
import im.vector.riotx.core.platform.VectorViewModel import im.vector.riotx.core.platform.VectorViewModel
import im.vector.riotx.core.platform.WaitingViewData import im.vector.riotx.core.platform.WaitingViewData
@ -48,6 +49,7 @@ class BootstrapSharedViewModel @AssistedInject constructor(
@Assisted initialState: BootstrapViewState, @Assisted initialState: BootstrapViewState,
@Assisted val args: BootstrapBottomSheet.Args, @Assisted val args: BootstrapBottomSheet.Args,
private val stringProvider: StringProvider, private val stringProvider: StringProvider,
private val errorFormatter: ErrorFormatter,
private val session: Session, private val session: Session,
private val bootstrapTask: BootstrapCrossSigningTask, private val bootstrapTask: BootstrapCrossSigningTask,
private val migrationTask: BackupToQuadSMigrationTask, private val migrationTask: BackupToQuadSMigrationTask,
@ -301,7 +303,7 @@ class BootstrapSharedViewModel @AssistedInject constructor(
} }
} }
private fun startMigrationFlow(prevState: BootstrapStep, passphrase: String?, recoveryKey: String?) { private fun startMigrationFlow(previousStep: BootstrapStep, passphrase: String?, recoveryKey: String?) {//TODO Rename param
setState { setState {
copy(step = BootstrapStep.Initializing) copy(step = BootstrapStep.Initializing)
} }
@ -316,38 +318,37 @@ class BootstrapSharedViewModel @AssistedInject constructor(
} }
} }
migrationTask.invoke(this, BackupToQuadSMigrationTask.Params(passphrase, recoveryKey, progressListener)) { migrationTask.invoke(this, BackupToQuadSMigrationTask.Params(passphrase, recoveryKey, progressListener)) {
if (it is BackupToQuadSMigrationTask.Result.Success) { when (it) {
setState { is BackupToQuadSMigrationTask.Result.Success -> {
copy(
passphrase = passphrase,
passphraseRepeat = passphrase,
migrationRecoveryKey = recoveryKey
)
}
val userPassword = reAuthHelper.data
if (userPassword == null) {
setState { setState {
copy( copy(
step = BootstrapStep.AccountPassword(false) passphrase = passphrase,
passphraseRepeat = passphrase,
migrationRecoveryKey = recoveryKey
) )
} }
} else { val userPassword = reAuthHelper.data
startInitializeFlow(userPassword) if (userPassword == null) {
setState {
copy(
step = BootstrapStep.AccountPassword(false)
)
}
} else {
startInitializeFlow(userPassword)
}
} }
} else { is BackupToQuadSMigrationTask.Result.Failure -> {
_viewEvents.post( _viewEvents.post(
BootstrapViewEvents.ModalError( BootstrapViewEvents.ModalError(it.toHumanReadable())
(it as? BackupToQuadSMigrationTask.Result.Failure)?.error
?: stringProvider.getString(R.string.matrix_error
)
)
)
setState {
copy(
step = prevState
) )
setState {
copy(
step = previousStep
)
}
} }
} }.exhaustive
} }
} }
} }
@ -519,6 +520,16 @@ class BootstrapSharedViewModel @AssistedInject constructor(
}.exhaustive }.exhaustive
} }
private fun BackupToQuadSMigrationTask.Result.Failure.toHumanReadable(): String {
return when (this) {
is BackupToQuadSMigrationTask.Result.InvalidRecoverySecret -> stringProvider.getString(R.string.keys_backup_passphrase_error_decrypt)
is BackupToQuadSMigrationTask.Result.ErrorFailure -> errorFormatter.toHumanReadable(throwable)
// is BackupToQuadSMigrationTask.Result.NoKeyBackupVersion,
// is BackupToQuadSMigrationTask.Result.IllegalParams,
else -> stringProvider.getString(R.string.unexpected_error)
}
}
// ====================================== // ======================================
// Companion, view model assisted creation // Companion, view model assisted creation
// ====================================== // ======================================