Security settings: Improve the state of the secure backup section to be exhaustive

This commit is contained in:
manuroe
2021-06-16 13:38:23 +02:00
parent 90355a14f2
commit c23e1c7553
3 changed files with 85 additions and 114 deletions
@@ -60,7 +60,7 @@ private enum BackupRows {
private var viewModel: SettingsSecureBackupViewModelType!
// Need to know the state to make `cellForRow` deliver cells accordingly
private var viewState: SettingsSecureBackupViewState = .checkingBackup {
private var viewState: SettingsSecureBackupViewState = .loading {
didSet {
self.updateBackupRows()
}
@@ -124,91 +124,59 @@ private enum BackupRows {
let backupRows: [BackupRows]
switch self.viewState {
case .checkingBackup:
case .loading:
backupRows = [
.info(text: VectorL10n.securitySettingsSecureBackupInfoChecking),
.description(text: VectorL10n.securitySettingsSecureBackupDescription)
]
case .noSecureBackup:
let noBackup = VectorL10n.settingsKeyBackupInfoNone
let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning
let infoText = [noBackup, signoutWarning].joined(separator: "\n")
backupRows = [
.info(text: infoText),
.createSecureBackupAction,
.description(text: VectorL10n.securitySettingsSecureBackupDescription)
]
case .noSecureBackupButKeyBackup(let keyBackupVersion, let keyBackupVersionTrust):
backupRows = [
.info(text: VectorL10n.securitySettingsSecureBackupInfoValid),
.restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore),
.deleteKeyBackupAction(keyBackupVersion: keyBackupVersion),
.description(text: VectorL10n.securitySettingsSecureBackupDescription)
]
case .noKeyBackup:
let noBackup = VectorL10n.settingsKeyBackupInfoNone
let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning
let infoText = [noBackup, signoutWarning].joined(separator: "\n")
backupRows = [
.info(text: infoText),
.createKeyBackupAction,
.resetSecureBackupAction,
.description(text: VectorL10n.securitySettingsSecureBackupDescription)
]
case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust),
.keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _):
backupRows = [
.info(text: VectorL10n.securitySettingsSecureBackupInfoValid),
.restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore),
.deleteKeyBackupAction(keyBackupVersion: keyBackupVersion),
.resetSecureBackupAction,
.description(text: VectorL10n.securitySettingsSecureBackupDescription)
]
case .keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust):
// TODO: What?
let info = VectorL10n.securitySettingsSecureBackupDescription
backupRows = [
.info(text: info)
]
// let info = VectorL10n.securitySettingsSecureBackupDescription
// let backupStatus = VectorL10n.settingsSecureBackupInfoNotValid
// let signoutWarning = VectorL10n.settingsSecureBackupInfoSignoutWarning
// let backupStrings = [info, "", backupStatus, "", signoutWarning]
// let backupInfoText = backupStrings.joined(separator: "\n")
//
// let version = VectorL10n.settingsSecureBackupInfoVersion(keyBackupVersion.version ?? "")
// let algorithm = VectorL10n.settingsSecureBackupInfoAlgorithm(keyBackupVersion.algorithm)
// let additionalStrings = [version, algorithm]
// let additionalInfoText = additionalStrings.joined(separator: "\n")
//
// let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust)
// let backupTrustInfoText = backupTrust.joined(separator: "\n")
//
// var backupNotTrustedViewStateRows: [BackupRows] = [
// .info(text: backupInfoText),
// .info(text: additionalInfoText),
// .info(text: backupTrustInfoText)
// ]
//
// // TODO: Do not display restore button if all keys are stored on the device
// if true {
// backupNotTrustedViewStateRows.append(.restoreAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.settingsSecureBackupButtonConnect))
// }
//
// backupNotTrustedViewStateRows.append(.deleteAction(keyBackupVersion: keyBackupVersion))
//
// backupRows = backupNotTrustedViewStateRows
case .noSecureBackup(let keyBackupState):
switch keyBackupState {
case .noKeyBackup:
let noBackup = VectorL10n.settingsKeyBackupInfoNone
let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning
let infoText = [noBackup, signoutWarning].joined(separator: "\n")
backupRows = [
.info(text: infoText),
.createSecureBackupAction,
.description(text: VectorL10n.securitySettingsSecureBackupDescription)
]
case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust),
.keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _),
.keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust):
backupRows = [
.info(text: VectorL10n.securitySettingsSecureBackupInfoValid),
.restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore),
.deleteKeyBackupAction(keyBackupVersion: keyBackupVersion),
.description(text: VectorL10n.securitySettingsSecureBackupDescription)
]
}
case .secureBackup(let keyBackupState):
switch keyBackupState {
case .noKeyBackup:
let noBackup = VectorL10n.settingsKeyBackupInfoNone
let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning
let infoText = [noBackup, signoutWarning].joined(separator: "\n")
backupRows = [
.info(text: infoText),
.createKeyBackupAction,
.resetSecureBackupAction,
.description(text: VectorL10n.securitySettingsSecureBackupDescription)
]
case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust),
.keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _),
.keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust):
backupRows = [
.info(text: VectorL10n.securitySettingsSecureBackupInfoValid),
.restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore),
.deleteKeyBackupAction(keyBackupVersion: keyBackupVersion),
.resetSecureBackupAction,
.description(text: VectorL10n.securitySettingsSecureBackupDescription)
]
}
}
self.backupRows = backupRows
}
@@ -46,7 +46,7 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType {
switch viewAction {
case .load:
viewDelegate.settingsSecureBackupViewModel(self, didUpdateViewState: .checkingBackup)
viewDelegate.settingsSecureBackupViewModel(self, didUpdateViewState: .loading)
self.checkKeyBackupState()
case .resetSecureBackup,
.createSecureBackup: // The implement supports both
@@ -86,26 +86,27 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType {
private func computeState(withBackupVersionTrust keyBackupVersionTrust: MXKeyBackupVersionTrust? = nil) {
var viewState: SettingsSecureBackupViewState?
var keyBackupState: SettingsSecureBackupViewState.KeyBackupState?
switch self.keyBackup.state {
case MXKeyBackupStateUnknown,
MXKeyBackupStateCheckingBackUpOnHomeserver:
viewState = .checkingBackup
viewState = .loading
case MXKeyBackupStateDisabled, MXKeyBackupStateEnabling:
viewState = .noKeyBackup
keyBackupState = .noKeyBackup
case MXKeyBackupStateNotTrusted:
guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else {
return
}
viewState = .keyBackupNotTrusted(keyBackupVersion, keyBackupVersionTrust)
keyBackupState = .keyBackupNotTrusted(keyBackupVersion, keyBackupVersionTrust)
case MXKeyBackupStateReadyToBackUp:
guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else {
return
}
viewState = .keyBackup(keyBackupVersion, keyBackupVersionTrust)
keyBackupState = .keyBackup(keyBackupVersion, keyBackupVersionTrust)
case MXKeyBackupStateWillBackUp, MXKeyBackupStateBackingUp:
guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else {
@@ -114,28 +115,22 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType {
// Get the backup progress before updating the state
self.keyBackup.backupProgress { [weak self] (progress) in
guard let sself = self else {
guard let self = self else {
return
}
sself.viewDelegate?.settingsSecureBackupViewModel(sself, didUpdateViewState: .keyBackupAndRunning(keyBackupVersion, keyBackupVersionTrust, progress))
let keyBackupState: SettingsSecureBackupViewState.KeyBackupState = .keyBackupAndRunning(keyBackupVersion, keyBackupVersionTrust, progress)
let viewState: SettingsSecureBackupViewState = self.recoveryService.hasRecovery() ? .secureBackup(keyBackupState) : .noSecureBackup(keyBackupState)
self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: viewState)
}
default:
break
}
// We want to have a secure backup before having a key backup
if recoveryService.hasRecovery() == false {
switch viewState {
case .checkingBackup:
break
case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust),
.keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _),
.keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust):
viewState = .noSecureBackupButKeyBackup(keyBackupVersion, keyBackupVersionTrust)
default:
viewState = .noSecureBackup
}
// Turn secure backup and key back states into view state
if viewState == nil, let keyBackupState = keyBackupState {
viewState = recoveryService.hasRecovery() ? .secureBackup(keyBackupState) : .noSecureBackup(keyBackupState)
}
if let viewState = viewState {
@@ -16,22 +16,30 @@
import UIKit
/// SettingsSecureBackup view state
/// State of the Secure Backup section in securtiy settings.
///
/// - checkingBackup: Load current backup on the homeserver
/// - checkError: Fail to load current backup data
/// - noKeyBackup: There is no backup on the homeserver
/// - keyBackup: There is a valid backup on the homeserver. All keys have been backed up to it
/// - keyBackupAndRunning: There is a valid backup on the homeserver. Keys are being sent to it
/// - keyBackupNotTrusted: There is a backup on the homeserver but it is not trusted
/// It is a mixed of the state of the Secure Backup(4S) and the state of the Key Backup.
///
/// - loading: Load current state
/// - noSecureBackup: The account has no secure backup
/// - secureBackup: The account has a secure backup
enum SettingsSecureBackupViewState {
case checkingBackup
case noSecureBackup
case noSecureBackupButKeyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust)
case noKeyBackup
case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust)
case keyBackupAndRunning(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress)
case keyBackupNotTrusted(MXKeyBackupVersion, MXKeyBackupVersionTrust)
case loading
case noSecureBackup(KeyBackupState)
case secureBackup(KeyBackupState)
/// Internal key backup state. It is independent from the secure backup state.
///
/// - noKeyBackup: There is no backup on the homeserver
/// - keyBackup: There is a valid backup on the homeserver. All keys have been backed up to it
/// - keyBackupAndRunning: There is a valid backup on the homeserver. Keys are being sent to it
/// - keyBackupNotTrusted: There is a backup on the homeserver but it is not trusted
enum KeyBackupState {
case noKeyBackup
case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust)
case keyBackupAndRunning(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress)
case keyBackupNotTrusted(MXKeyBackupVersion, MXKeyBackupVersionTrust)
}
}
/// State representing a network request made by the module