SecretResetCoordinator: Remove AuthenticatedSessionViewControllerFactory and use ReauthenticationCoordinator for reauthentication.

This commit is contained in:
SBiOSoftWhare
2021-02-03 12:10:51 +01:00
parent e9cbafd88f
commit 55183866fc
5 changed files with 49 additions and 49 deletions
@@ -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)
}
}
@@ -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
@@ -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)
}
}
@@ -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)
}
@@ -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)