From c445d3c71af16796aea703cf12cd66982d78cfbe Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 3 Jun 2022 18:37:17 +0700 Subject: [PATCH] TF-607 Delete authority oidc when logout --- .../reloadable/reloadable_controller.dart | 33 ++++++++++++++----- .../authentication_oidc_datasource.dart | 2 ++ .../authentication_oidc_datasource_impl.dart | 5 +++ .../oidc_configuration_cache_manager.dart | 5 +++ .../authentication_oidc_repository_impl.dart | 5 +++ .../authentication_oidc_repository.dart | 2 ++ .../state/delete_authority_oidc_state.dart | 17 ++++++++++ .../delete_authority_oidc_interactor.dart | 22 +++++++++++++ .../mailbox_dashboard_bindings.dart | 3 ++ .../mailbox_dashboard_controller.dart | 4 ++- .../usecases/log_out_oidc_interactor.dart | 10 +++--- .../manage_account_dashboard_bindings.dart | 7 +++- .../manage_account_dashboard_controller.dart | 6 ++-- lib/main/bindings/local/local_bindings.dart | 2 +- 14 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 lib/features/login/domain/state/delete_authority_oidc_state.dart create mode 100644 lib/features/login/domain/usecases/delete_authority_oidc_interactor.dart diff --git a/lib/features/base/reloadable/reloadable_controller.dart b/lib/features/base/reloadable/reloadable_controller.dart index 44386a9cf..358efe021 100644 --- a/lib/features/base/reloadable/reloadable_controller.dart +++ b/lib/features/base/reloadable/reloadable_controller.dart @@ -1,6 +1,7 @@ import 'package:core/data/network/config/dynamic_url_interceptors.dart'; import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/app_logger.dart'; import 'package:dartz/dartz.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; @@ -9,8 +10,10 @@ import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/log_out_oidc_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart'; import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; @@ -26,8 +29,11 @@ abstract class ReloadableController extends BaseController { final CachingManager _cachingManager = Get.find(); final LogoutOidcInteractor _logoutOidcInteractor; + final DeleteAuthorityOidcInteractor _deleteAuthorityOidcInteractor; - ReloadableController(this._logoutOidcInteractor); + ReloadableController( + this._logoutOidcInteractor, + this._deleteAuthorityOidcInteractor); @override void onData(Either newState) { @@ -38,6 +44,8 @@ abstract class ReloadableController extends BaseController { goToLogin(); } else if (failure is GetSessionFailure) { _handleGetSessionFailure(); + } else if (failure is LogoutOidcFailure) { + log('ReloadableController::onData(): LogoutOidcFailure: $failure'); } }, (success) { @@ -45,6 +53,8 @@ abstract class ReloadableController extends BaseController { _handleGetCredentialSuccess(success); } else if (success is GetSessionSuccess) { _handleGetSessionSuccess(success); + } else if (success is LogoutOidcSuccess) { + handleLogoutOidcSuccess(success); } } ); @@ -100,19 +110,26 @@ abstract class ReloadableController extends BaseController { void logoutAction() async { final authenticationType = _authorizationInterceptors.authenticationType; if (authenticationType == AuthenticationType.oidc) { - await _logoutOidcInteractor.execute() - .then((value) async { - await Future.wait([ - _deleteCredentialInteractor.execute(), - _cachingManager.clearAll(), - ]); - }); + consumeState(_logoutOidcInteractor.execute()); } else { await Future.wait([ _deleteCredentialInteractor.execute(), _cachingManager.clearAll(), ]); + + _authorizationInterceptors.clear(); + goToLogin(); } + } + + void handleLogoutOidcSuccess(LogoutOidcSuccess success) async { + log('ReloadableController::handleLogoutOidcSuccess(): $success'); + await Future.wait([ + _deleteCredentialInteractor.execute(), + _deleteAuthorityOidcInteractor.execute(), + _cachingManager.clearAll(), + ]); + _authorizationInterceptors.clear(); goToLogin(); } diff --git a/lib/features/login/data/datasource/authentication_oidc_datasource.dart b/lib/features/login/data/datasource/authentication_oidc_datasource.dart index e738b08d7..7024c2a66 100644 --- a/lib/features/login/data/datasource/authentication_oidc_datasource.dart +++ b/lib/features/login/data/datasource/authentication_oidc_datasource.dart @@ -14,6 +14,8 @@ abstract class AuthenticationOIDCDataSource { Future persistAuthorityOidc(String authority); + Future deleteAuthorityOidc(); + Future getStoredOidcConfiguration(); Future refreshingTokensOIDC( diff --git a/lib/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart b/lib/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart index a9c5b9a00..6ffaf33ca 100644 --- a/lib/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart +++ b/lib/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart @@ -78,4 +78,9 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { throw error; }); } + + @override + Future deleteAuthorityOidc() { + return _oidcConfigurationCacheManager.deleteAuthorityOidc(); + } } \ No newline at end of file diff --git a/lib/features/login/data/local/oidc_configuration_cache_manager.dart b/lib/features/login/data/local/oidc_configuration_cache_manager.dart index 90b7dfc14..4034cc542 100644 --- a/lib/features/login/data/local/oidc_configuration_cache_manager.dart +++ b/lib/features/login/data/local/oidc_configuration_cache_manager.dart @@ -25,4 +25,9 @@ class OidcConfigurationCacheManager { log('OidcConfigurationCacheManager::persistAuthorityOidc(): $authority'); await _sharedPreferences.setString(OIDCConstant.keyAuthorityOidc, authority); } + + Future deleteAuthorityOidc() async { + log('OidcConfigurationCacheManager::deleteAuthorityOidc()'); + await _sharedPreferences.remove(OIDCConstant.keyAuthorityOidc); + } } \ No newline at end of file diff --git a/lib/features/login/data/repository/authentication_oidc_repository_impl.dart b/lib/features/login/data/repository/authentication_oidc_repository_impl.dart index c411e14cb..6f2cdf827 100644 --- a/lib/features/login/data/repository/authentication_oidc_repository_impl.dart +++ b/lib/features/login/data/repository/authentication_oidc_repository_impl.dart @@ -66,4 +66,9 @@ class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository { Future logout(TokenId tokenId, OIDCConfiguration config) { return _oidcDataSource.logout(tokenId, config); } + + @override + Future deleteAuthorityOidc() { + return _oidcDataSource.deleteAuthorityOidc(); + } } \ No newline at end of file diff --git a/lib/features/login/domain/repository/authentication_oidc_repository.dart b/lib/features/login/domain/repository/authentication_oidc_repository.dart index 02721ea70..4a36864e3 100644 --- a/lib/features/login/domain/repository/authentication_oidc_repository.dart +++ b/lib/features/login/domain/repository/authentication_oidc_repository.dart @@ -14,6 +14,8 @@ abstract class AuthenticationOIDCRepository { Future persistAuthorityOidc(String authority); + Future deleteAuthorityOidc(); + Future getStoredOidcConfiguration(); Future refreshingTokensOIDC( diff --git a/lib/features/login/domain/state/delete_authority_oidc_state.dart b/lib/features/login/domain/state/delete_authority_oidc_state.dart new file mode 100644 index 000000000..946e9658f --- /dev/null +++ b/lib/features/login/domain/state/delete_authority_oidc_state.dart @@ -0,0 +1,17 @@ +import 'package:core/core.dart'; + +class DeleteAuthorityOidcSuccess extends UIState { + DeleteAuthorityOidcSuccess(); + + @override + List get props => []; +} + +class DeleteAuthorityOidcFailure extends FeatureFailure { + final dynamic exception; + + DeleteAuthorityOidcFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/login/domain/usecases/delete_authority_oidc_interactor.dart b/lib/features/login/domain/usecases/delete_authority_oidc_interactor.dart new file mode 100644 index 000000000..1564a9987 --- /dev/null +++ b/lib/features/login/domain/usecases/delete_authority_oidc_interactor.dart @@ -0,0 +1,22 @@ +import 'dart:core'; + +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/state/delete_authority_oidc_state.dart'; + +class DeleteAuthorityOidcInteractor { + final AuthenticationOIDCRepository _authenticationOIDCRepository; + + DeleteAuthorityOidcInteractor(this._authenticationOIDCRepository); + + Future> execute() async { + try { + await _authenticationOIDCRepository.deleteAuthorityOidc(); + return Right(DeleteAuthorityOidcSuccess()); + } catch (exception) { + return Left(DeleteAuthorityOidcFailure(exception)); + } + } +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart index 3b7862544..674966323 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart @@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart'; @@ -72,6 +73,7 @@ class MailboxDashBoardBindings extends BaseBindings { void bindingsController() { Get.put(MailboxDashBoardController( Get.find(), + Get.find(), Get.find(), Get.find(), Get.find(), @@ -128,6 +130,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), )); + Get.lazyPut(() => DeleteAuthorityOidcInteractor(Get.find())); } @override diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index 529fc1ade..64a79c5a3 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -35,6 +35,7 @@ import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state. import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_all_recent_search_latest_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/mark_as_mailbox_read_state.dart'; @@ -105,13 +106,14 @@ class MailboxDashBoardController extends ReloadableController { MailboxDashBoardController( LogoutOidcInteractor logoutOidcInteractor, + DeleteAuthorityOidcInteractor deleteAuthorityOidcInteractor, this._moveToMailboxInteractor, this._deleteEmailPermanentlyInteractor, this._saveRecentSearchInteractor, this._getAllRecentSearchLatestInteractor, this._quickSearchEmailInteractor, this._markAsMailboxReadInteractor, - ) : super(logoutOidcInteractor); + ) : super(logoutOidcInteractor, deleteAuthorityOidcInteractor); @override void onInit() { diff --git a/lib/features/manage_account/domain/usecases/log_out_oidc_interactor.dart b/lib/features/manage_account/domain/usecases/log_out_oidc_interactor.dart index 98409e586..8425604de 100644 --- a/lib/features/manage_account/domain/usecases/log_out_oidc_interactor.dart +++ b/lib/features/manage_account/domain/usecases/log_out_oidc_interactor.dart @@ -18,7 +18,7 @@ class LogoutOidcInteractor { LogoutOidcInteractor(this._accountRepository, this._authenticationOIDCRepository); - Future> execute() async { + Stream> execute() async* { try { final currentAccount = await _accountRepository.getCurrentAccount(); @@ -33,16 +33,16 @@ class LogoutOidcInteractor { }); log('LogoutOidcInteractor::execute(): statusSuccess: $result'); if (result) { - return Right(LogoutOidcSuccess()); + yield Right(LogoutOidcSuccess()); } else { - return Left(LogoutOidcFailure(null)); + yield Left(LogoutOidcFailure(null)); } } else { - return Left(LogoutOidcFailure(NotFoundAuthenticatedAccountException())); + yield Left(LogoutOidcFailure(NotFoundAuthenticatedAccountException())); } } catch (e) { log('LogoutOidcInteractor::execute(): EXCEPTION: $e'); - return Left(LogoutOidcFailure(e)); + yield Left(LogoutOidcFailure(e)); } } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart b/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart index 0152b820d..5bfb6069a 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart @@ -13,6 +13,7 @@ import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; @@ -30,7 +31,10 @@ class ManageAccountDashBoardBindings extends BaseBindings { @override void bindingsController() { - Get.lazyPut(() => ManageAccountDashBoardController(Get.find())); + Get.lazyPut(() => ManageAccountDashBoardController( + Get.find(), + Get.find() + )); } @override @@ -56,6 +60,7 @@ class ManageAccountDashBoardBindings extends BaseBindings { Get.find(), Get.find(), )); + Get.lazyPut(() => DeleteAuthorityOidcInteractor(Get.find())); } @override diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart index 88c38840b..6c985f04a 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -8,6 +8,7 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:model/model.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; @@ -29,8 +30,9 @@ class ManageAccountDashBoardController extends ReloadableController { Session? sessionCurrent; ManageAccountDashBoardController( - LogoutOidcInteractor logoutOidcInteractor - ) : super(logoutOidcInteractor); + LogoutOidcInteractor logoutOidcInteractor, + DeleteAuthorityOidcInteractor deleteAuthorityOidcInteractor + ) : super(logoutOidcInteractor, deleteAuthorityOidcInteractor); @override void onReady() { diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index d249b48b8..ad58d280e 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -47,7 +47,7 @@ class LocalBindings extends Bindings { Get.find(), Get.find(), Get.find(), - Get.find() + Get.find(), )); } } \ No newline at end of file