diff --git a/Riot/Modules/Secrets/Reset/SecretsResetCoordinator.swift b/Riot/Modules/Secrets/Reset/SecretsResetCoordinator.swift index 4f1277219..426907887 100644 --- a/Riot/Modules/Secrets/Reset/SecretsResetCoordinator.swift +++ b/Riot/Modules/Secrets/Reset/SecretsResetCoordinator.swift @@ -56,11 +56,31 @@ final class SecretsResetCoordinator: SecretsResetCoordinatorType { func toPresentable() -> UIViewController { return self.secretsResetViewController } + + // MARK: - Private + + private func showAuthentication(with authenticationSessionParameters: AuthenticationSessionParameters) { + + let reauthenticationCoordinatorParameters = ReauthenticationCoordinatorParameters(session: self.session, + presenter: self.toPresentable(), + title: nil, + message: VectorL10n.secretsResetAuthenticationMessage, + authenticationSessionParameters: authenticationSessionParameters) + + let coordinator = ReauthenticationCoordinator(parameters: reauthenticationCoordinatorParameters) + coordinator.delegate = self + coordinator.start() + self.add(childCoordinator: coordinator) + } } // MARK: - SecretsResetViewModelCoordinatorDelegate extension SecretsResetCoordinator: SecretsResetViewModelCoordinatorDelegate { + func secretsResetViewModel(_ viewModel: SecretsResetViewModelType, needsToAuthenticateWith authenticationSessionParamaters: AuthenticationSessionParameters) { + self.showAuthentication(with: authenticationSessionParamaters) + } + func secretsResetViewModelDidResetSecrets(_ viewModel: SecretsResetViewModelType) { self.delegate?.secretsResetCoordinatorDidResetSecrets(self) } @@ -69,3 +89,21 @@ extension SecretsResetCoordinator: SecretsResetViewModelCoordinatorDelegate { self.delegate?.secretsResetCoordinatorDidCancel(self) } } + +// MARK: - ReauthenticationCoordinatorDelegate +extension SecretsResetCoordinator: ReauthenticationCoordinatorDelegate { + + func reauthenticationCoordinatorDidComplete(_ coordinator: ReauthenticationCoordinatorType, withAuthenticationParameters authenticationParameters: [String: Any]?) { + + self.secretsResetViewModel.process(viewAction: .authenticationInfoEntered(authenticationParameters ?? [:])) + } + + func reauthenticationCoordinatorDidCancel(_ coordinator: ReauthenticationCoordinatorType) { + self.remove(childCoordinator: coordinator) + } + + func reauthenticationCoordinator(_ coordinator: ReauthenticationCoordinatorType, didFailWithError error: Error) { + self.secretsResetViewModel.update(viewState: .error(error)) + self.remove(childCoordinator: coordinator) + } +} diff --git a/Riot/Modules/Secrets/Reset/SecretsResetViewController.swift b/Riot/Modules/Secrets/Reset/SecretsResetViewController.swift index 341899aca..6008a1fb0 100644 --- a/Riot/Modules/Secrets/Reset/SecretsResetViewController.swift +++ b/Riot/Modules/Secrets/Reset/SecretsResetViewController.swift @@ -44,8 +44,6 @@ final class SecretsResetViewController: UIViewController { private var errorPresenter: MXKErrorPresentation! private var activityPresenter: ActivityIndicatorPresenter! - private var authenticatedSessionFactory: AuthenticatedSessionViewControllerFactory? - // MARK: - Setup class func instantiate(with viewModel: SecretsResetViewModelType) -> SecretsResetViewController { @@ -134,8 +132,6 @@ final class SecretsResetViewController: UIViewController { self.renderLoading() case .resetDone: self.renderLoaded() - case .showAuthentication(authData: let authData): - self.showAuthentication(authData: authData) case .error(let error): self.render(error: error) } @@ -153,33 +149,6 @@ final class SecretsResetViewController: UIViewController { self.activityPresenter.removeCurrentActivityIndicator(animated: true) self.errorPresenter.presentError(from: self, forError: error, animated: true, handler: nil) } - - private func showAuthentication(authData: SecretsResetAuthData) { - self.activityPresenter.removeCurrentActivityIndicator(animated: true) - - let authenticatedSessionFactory = authData.authenticatedSessionViewControllerFactory - - authenticatedSessionFactory.viewController(forPath: authData.path, httpMethod: authData.httpMethod, title: nil, message: VectorL10n.secretsResetAuthenticationMessage, onViewController: { [weak self] (viewController) in - guard let self = self else { - return - } - self.present(viewController, animated: true, completion: nil) - }, onAuthenticated: { [weak self] (authInfo) in - guard let self = self else { - return - } - self.viewModel.process(viewAction: .authenticationInfoEntered(authInfo)) - }, onCancelled: { - - }, onFailure: { [weak self] (error) in - guard let self = self else { - return - } - self.render(error: error) - }) - - self.authenticatedSessionFactory = authenticatedSessionFactory - } // MARK: - Actions diff --git a/Riot/Modules/Secrets/Reset/SecretsResetViewModel.swift b/Riot/Modules/Secrets/Reset/SecretsResetViewModel.swift index 96d59f4da..72330e934 100644 --- a/Riot/Modules/Secrets/Reset/SecretsResetViewModel.swift +++ b/Riot/Modules/Secrets/Reset/SecretsResetViewModel.swift @@ -26,6 +26,7 @@ final class SecretsResetViewModel: SecretsResetViewModelType { private let session: MXSession private let recoveryService: MXRecoveryService + private let crossSigningService: CrossSigningService // MARK: Public @@ -37,6 +38,7 @@ final class SecretsResetViewModel: SecretsResetViewModelType { init(session: MXSession) { self.session = session self.recoveryService = session.crypto.recoveryService + self.crossSigningService = CrossSigningService() } // MARK: - Public @@ -47,8 +49,8 @@ final class SecretsResetViewModel: SecretsResetViewModelType { break case .reset: self.askAuthentication() - case .authenticationInfoEntered(let authInfo): - self.resetSecrets(with: authInfo) + case .authenticationInfoEntered(let authParameters): + self.resetSecrets(with: authParameters) case .cancel: self.coordinatorDelegate?.secretsResetViewModelDidCancel(self) } @@ -56,18 +58,18 @@ final class SecretsResetViewModel: SecretsResetViewModelType { // MARK: - Private - private func update(viewState: SecretsResetViewState) { + func update(viewState: SecretsResetViewState) { self.viewDelegate?.secretsResetViewModel(self, didUpdateViewState: viewState) } - private func resetSecrets(with authInfo: [String: Any]) { + private func resetSecrets(with authParameters: [String: Any]) { guard let crossSigning = self.session.crypto.crossSigning else { return } NSLog("[SecretsResetViewModel] resetSecrets") self.update(viewState: .resetting) - crossSigning.setup(withAuthParams: authInfo, success: { [weak self] in + crossSigning.setup(withAuthParams: authParameters, success: { [weak self] in guard let self = self else { return } @@ -93,12 +95,8 @@ final class SecretsResetViewModel: SecretsResetViewModelType { }) } - // NOTE: Use a Coordinator instead of AuthenticatedSessionViewControllerFactory and delegate the presentation to SecretsResetCoordinator private func askAuthentication() { - let path = "\(kMXAPIPrefixPathUnstable)/keys/device_signing/upload" - let authenticatedSessionFactory = AuthenticatedSessionViewControllerFactory(session: self.session) - let authData = SecretsResetAuthData(path: path, httpMethod: "POST", authenticatedSessionViewControllerFactory: authenticatedSessionFactory) - - self.update(viewState: .showAuthentication(authData: authData)) + let authenticationSessionParameters = self.crossSigningService.setupCrossSigningAuthenticationSessionParameters() + self.coordinatorDelegate?.secretsResetViewModel(self, needsToAuthenticateWith: authenticationSessionParameters) } } diff --git a/Riot/Modules/Secrets/Reset/SecretsResetViewModelType.swift b/Riot/Modules/Secrets/Reset/SecretsResetViewModelType.swift index 7f40d7238..26b9b295c 100644 --- a/Riot/Modules/Secrets/Reset/SecretsResetViewModelType.swift +++ b/Riot/Modules/Secrets/Reset/SecretsResetViewModelType.swift @@ -23,6 +23,7 @@ protocol SecretsResetViewModelViewDelegate: class { } protocol SecretsResetViewModelCoordinatorDelegate: class { + func secretsResetViewModel(_ viewModel: SecretsResetViewModelType, needsToAuthenticateWith authenticationSessionParamaters: AuthenticationSessionParameters) func secretsResetViewModelDidResetSecrets(_ viewModel: SecretsResetViewModelType) func secretsResetViewModelDidCancel(_ viewModel: SecretsResetViewModelType) } @@ -33,5 +34,6 @@ protocol SecretsResetViewModelType { var viewDelegate: SecretsResetViewModelViewDelegate? { get set } var coordinatorDelegate: SecretsResetViewModelCoordinatorDelegate? { get set } + func update(viewState: SecretsResetViewState) func process(viewAction: SecretsResetViewAction) } diff --git a/Riot/Modules/Secrets/Reset/SecretsResetViewState.swift b/Riot/Modules/Secrets/Reset/SecretsResetViewState.swift index d5ce37444..b7cb0acb8 100644 --- a/Riot/Modules/Secrets/Reset/SecretsResetViewState.swift +++ b/Riot/Modules/Secrets/Reset/SecretsResetViewState.swift @@ -18,15 +18,8 @@ import Foundation -struct SecretsResetAuthData { - let path: String - let httpMethod: String - let authenticatedSessionViewControllerFactory: AuthenticatedSessionViewControllerFactory -} - /// SecretsResetViewController view state enum SecretsResetViewState { - case showAuthentication(authData: SecretsResetAuthData) case resetting case resetDone case error(Error)