mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-23 18:12:44 +02:00
Key Backup: Use legacy screens if the private key does not work
This commit is contained in:
@@ -48,15 +48,11 @@ final class KeyBackupRecoverCoordinator: KeyBackupRecoverCoordinatorType {
|
||||
|
||||
// Check if we have the private key locally
|
||||
if self.session.crypto.backup.hasPrivateKeyInCryptoStore {
|
||||
rootCoordinator = createRecoverFromPrivateKeyCoordinator()
|
||||
}
|
||||
// Check if a passphrase has been set for given backup
|
||||
else if let megolmBackupAuthData = MXMegolmBackupAuthData(fromJSON: self.keyBackupVersion.authData), megolmBackupAuthData.privateKeySalt != nil {
|
||||
rootCoordinator = self.createRecoverFromPassphraseCoordinator()
|
||||
rootCoordinator = self.createRecoverFromPrivateKeyCoordinator()
|
||||
} else {
|
||||
rootCoordinator = self.createRecoverFromRecoveryKeyCoordinator()
|
||||
rootCoordinator = self.createRecoverWithUserInteractionCoordinator()
|
||||
}
|
||||
|
||||
|
||||
rootCoordinator.start()
|
||||
|
||||
self.add(childCoordinator: rootCoordinator)
|
||||
@@ -70,6 +66,18 @@ final class KeyBackupRecoverCoordinator: KeyBackupRecoverCoordinatorType {
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private func createRecoverWithUserInteractionCoordinator() -> Coordinator & Presentable {
|
||||
let coordinator: Coordinator & Presentable
|
||||
|
||||
// Check if a passphrase has been set for given backup
|
||||
if let megolmBackupAuthData = MXMegolmBackupAuthData(fromJSON: self.keyBackupVersion.authData), megolmBackupAuthData.privateKeySalt != nil {
|
||||
coordinator = self.createRecoverFromPassphraseCoordinator()
|
||||
} else {
|
||||
coordinator = self.createRecoverFromRecoveryKeyCoordinator()
|
||||
}
|
||||
return coordinator
|
||||
}
|
||||
|
||||
private func createRecoverFromPrivateKeyCoordinator() -> KeyBackupRecoverFromPrivateKeyCoordinator {
|
||||
let coordinator = KeyBackupRecoverFromPrivateKeyCoordinator(keyBackup: self.session.crypto.backup, keyBackupVersion: self.keyBackupVersion)
|
||||
coordinator.delegate = self
|
||||
@@ -105,14 +113,30 @@ final class KeyBackupRecoverCoordinator: KeyBackupRecoverCoordinatorType {
|
||||
keyBackupRecoverSuccessViewController.delegate = self
|
||||
self.navigationRouter.push(keyBackupRecoverSuccessViewController, animated: true, popCompletion: nil)
|
||||
}
|
||||
|
||||
private func showRecoverFallback() {
|
||||
let coordinator = self.createRecoverWithUserInteractionCoordinator()
|
||||
self.add(childCoordinator: coordinator)
|
||||
|
||||
// Skip the previously displayed KeyBackupRecoverFromPrivateKeyCoordinator in the navigation stack
|
||||
self.navigationRouter.setRootModule(coordinator)
|
||||
|
||||
coordinator.start()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - KeyBackupRecoverFromPassphraseCoordinatorDelegate
|
||||
extension KeyBackupRecoverCoordinator: KeyBackupRecoverFromPrivateKeyCoordinatorDelegate {
|
||||
|
||||
func keyBackupRecoverFromPrivateKeyCoordinatorDidRecover(_ coordinator: KeyBackupRecoverFromPrivateKeyCoordinatorType) {
|
||||
self.showRecoverSuccess()
|
||||
}
|
||||
|
||||
func keyBackupRecoverFromPrivateKeyCoordinatorDidPrivateKeyFail(_ coordinator: KeyBackupRecoverFromPrivateKeyCoordinatorType) {
|
||||
// The private key did not work. Ask the user to enter their passphrase or recovery key
|
||||
self.showRecoverFallback()
|
||||
}
|
||||
|
||||
func keyBackupRecoverFromPrivateKeyCoordinatorDidCancel(_ coordinator: KeyBackupRecoverFromPrivateKeyCoordinatorType) {
|
||||
self.delegate?.keyBackupRecoverCoordinatorDidCancel(self)
|
||||
}
|
||||
|
||||
+4
-1
@@ -58,11 +58,14 @@ final class KeyBackupRecoverFromPrivateKeyCoordinator: KeyBackupRecoverFromPriva
|
||||
|
||||
// MARK: - KeyBackupRecoverFromPrivateKeyViewModelCoordinatorDelegate
|
||||
extension KeyBackupRecoverFromPrivateKeyCoordinator: KeyBackupRecoverFromPrivateKeyViewModelCoordinatorDelegate {
|
||||
|
||||
func keyBackupRecoverFromPrivateKeyViewModelDidRecover(_ viewModel: KeyBackupRecoverFromPrivateKeyViewModelType) {
|
||||
self.delegate?.keyBackupRecoverFromPrivateKeyCoordinatorDidRecover(self)
|
||||
}
|
||||
|
||||
func keyBackupRecoverFromPrivateKeyViewModelDidPrivateKeyFail(_ viewModel: KeyBackupRecoverFromPrivateKeyViewModelType) {
|
||||
self.delegate?.keyBackupRecoverFromPrivateKeyCoordinatorDidPrivateKeyFail(self)
|
||||
}
|
||||
|
||||
func keyBackupRecoverFromPrivateKeyViewModelDidCancel(_ viewModel: KeyBackupRecoverFromPrivateKeyViewModelType) {
|
||||
self.delegate?.keyBackupRecoverFromPrivateKeyCoordinatorDidCancel(self)
|
||||
}
|
||||
|
||||
+1
@@ -20,6 +20,7 @@ import Foundation
|
||||
|
||||
protocol KeyBackupRecoverFromPrivateKeyCoordinatorDelegate: class {
|
||||
func keyBackupRecoverFromPrivateKeyCoordinatorDidRecover(_ coordinator: KeyBackupRecoverFromPrivateKeyCoordinatorType)
|
||||
func keyBackupRecoverFromPrivateKeyCoordinatorDidPrivateKeyFail(_ coordinator: KeyBackupRecoverFromPrivateKeyCoordinatorType)
|
||||
func keyBackupRecoverFromPrivateKeyCoordinatorDidCancel(_ coordinator: KeyBackupRecoverFromPrivateKeyCoordinatorType)
|
||||
}
|
||||
|
||||
|
||||
+11
-2
@@ -60,7 +60,7 @@ final class KeyBackupRecoverFromPrivateKeyViewModel: KeyBackupRecoverFromPrivate
|
||||
|
||||
self.update(viewState: .loading)
|
||||
|
||||
self.currentHTTPOperation = keyBackup.restoreUsingPrivateKey(inCryptoStore: keyBackupVersion, room: nil, session: nil, success: { [weak self] (_, _) in
|
||||
self.currentHTTPOperation = keyBackup.restore(usingPrivateKeyKeyBackup: keyBackupVersion, room: nil, session: nil, success: { [weak self] (_, _) in
|
||||
guard let sself = self else {
|
||||
return
|
||||
}
|
||||
@@ -79,7 +79,16 @@ final class KeyBackupRecoverFromPrivateKeyViewModel: KeyBackupRecoverFromPrivate
|
||||
})
|
||||
|
||||
}, failure: { [weak self] error in
|
||||
self?.update(viewState: .error(error))
|
||||
guard let sself = self else {
|
||||
return
|
||||
}
|
||||
|
||||
if (error as NSError).domain == MXKeyBackupErrorDomain
|
||||
&& (error as NSError).code == Int(MXKeyBackupErrorInvalidOrMissingLocalPrivateKey.rawValue) {
|
||||
sself.coordinatorDelegate?.keyBackupRecoverFromPrivateKeyViewModelDidPrivateKeyFail(sself)
|
||||
} else {
|
||||
sself.update(viewState: .error(error))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
+1
@@ -24,6 +24,7 @@ protocol KeyBackupRecoverFromPrivateKeyViewModelViewDelegate: class {
|
||||
|
||||
protocol KeyBackupRecoverFromPrivateKeyViewModelCoordinatorDelegate: class {
|
||||
func keyBackupRecoverFromPrivateKeyViewModelDidRecover(_ viewModel: KeyBackupRecoverFromPrivateKeyViewModelType)
|
||||
func keyBackupRecoverFromPrivateKeyViewModelDidPrivateKeyFail(_ viewModel: KeyBackupRecoverFromPrivateKeyViewModelType)
|
||||
func keyBackupRecoverFromPrivateKeyViewModelDidCancel(_ viewModel: KeyBackupRecoverFromPrivateKeyViewModelType)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user