Show recovery instead of verification if this is the last session and recovery is set up

* Show recovery instead of verification if this is the last session and recovery is set up

* Rename `recoveryKeyState` to `recoveryState`

* Remove duplicates on session security state changes.

* Fix missing "Save recovery key" button

* Fix unit tests

* Rename `isLastDevice` to `isOnlyDeviceLeft`

* Address PR comments
This commit is contained in:
Stefan Ceriu
2024-02-16 11:38:49 +02:00
committed by GitHub
parent e0c9f43026
commit db05540cc5
23 changed files with 255 additions and 208 deletions
@@ -21,7 +21,7 @@ import MatrixRustSDK
class SecureBackupController: SecureBackupControllerProtocol {
private let encryption: Encryption
private let recoveryKeyStateSubject = CurrentValueSubject<SecureBackupRecoveryKeyState, Never>(.unknown)
private let recoveryStateSubject = CurrentValueSubject<SecureBackupRecoveryState, Never>(.unknown)
private let keyBackupStateSubject = CurrentValueSubject<SecureBackupKeyBackupState, Never>(.unknown)
// periphery:ignore - retaining purpose
@@ -33,8 +33,8 @@ class SecureBackupController: SecureBackupControllerProtocol {
/// Used to dedupe remote backup state requests
@CancellableTask private var remoteBackupStateTask: Task<Void, Error>?
var recoveryKeyState: CurrentValuePublisher<SecureBackupRecoveryKeyState, Never> {
recoveryKeyStateSubject.asCurrentValuePublisher()
var recoveryState: CurrentValuePublisher<SecureBackupRecoveryState, Never> {
recoveryStateSubject.asCurrentValuePublisher()
}
var keyBackupState: CurrentValuePublisher<SecureBackupKeyBackupState, Never> {
@@ -76,16 +76,16 @@ class SecureBackupController: SecureBackupControllerProtocol {
switch state {
case .unknown:
recoveryKeyStateSubject.send(.unknown)
recoveryStateSubject.send(.unknown)
case .enabled:
recoveryKeyStateSubject.send(.enabled)
recoveryStateSubject.send(.enabled)
case .disabled:
recoveryKeyStateSubject.send(.disabled)
recoveryStateSubject.send(.disabled)
case .incomplete:
recoveryKeyStateSubject.send(.incomplete)
recoveryStateSubject.send(.incomplete)
}
MXLog.info("Recovery state changed to: \(state), setting local state to \(recoveryKeyStateSubject.value)")
MXLog.info("Recovery state changed to: \(state), setting local state to \(recoveryStateSubject.value)")
})
updateBackupStateFromRemote()
@@ -120,7 +120,7 @@ class SecureBackupController: SecureBackupControllerProtocol {
func generateRecoveryKey() async -> Result<String, SecureBackupControllerError> {
do {
guard recoveryKeyState.value == .disabled else {
guard recoveryState.value == .disabled else {
MXLog.info("Resetting recovery key")
let key = try await encryption.resetRecoveryKey()
@@ -135,9 +135,9 @@ class SecureBackupController: SecureBackupControllerProtocol {
switch state {
case .starting, .creatingBackup, .creatingRecoveryKey, .backingUp:
recoveryKeyStateSubject.send(.settingUp)
recoveryStateSubject.send(.settingUp)
case .done:
recoveryKeyStateSubject.send(.enabled)
recoveryStateSubject.send(.enabled)
case .roomKeyUploadError:
MXLog.error("Failed enabling recovery: room key upload error")
keyUploadErrored = true
@@ -162,17 +162,7 @@ class SecureBackupController: SecureBackupControllerProtocol {
return .failure(.failedConfirmingRecoveryKey)
}
}
func isLastSession() async -> Result<Bool, SecureBackupControllerError> {
do {
MXLog.info("Checking if last session")
return try await .success(encryption.isLastDevice())
} catch {
MXLog.error("Failed checking if last session with error: \(error)")
return .failure(.failedFetchingSessionState)
}
}
func waitForKeyBackupUpload() async -> Result<Void, SecureBackupControllerError> {
do {
MXLog.info("Waiting for backup upload steady state")