diff --git a/lib/features/base/reloadable/reloadable_controller.dart b/lib/features/base/reloadable/reloadable_controller.dart index 5ce8d2601..44386a9cf 100644 --- a/lib/features/base/reloadable/reloadable_controller.dart +++ b/lib/features/base/reloadable/reloadable_controller.dart @@ -4,12 +4,14 @@ import 'package:core/presentation/state/success.dart'; import 'package:dartz/dartz.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:model/account/authentication_type.dart'; 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_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/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'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; @@ -23,7 +25,9 @@ abstract class ReloadableController extends BaseController { final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find(); final CachingManager _cachingManager = Get.find(); - ReloadableController(); + final LogoutOidcInteractor _logoutOidcInteractor; + + ReloadableController(this._logoutOidcInteractor); @override void onData(Either newState) { @@ -93,13 +97,23 @@ abstract class ReloadableController extends BaseController { void handleReloaded(Session session) {} - void _clearAllCacheAction() async { - await _cachingManager.clearAll(); - } - - void logoutAction() { - _deleteCredentialAction(); - _clearAllCacheAction(); + void logoutAction() async { + final authenticationType = _authorizationInterceptors.authenticationType; + if (authenticationType == AuthenticationType.oidc) { + await _logoutOidcInteractor.execute() + .then((value) async { + await Future.wait([ + _deleteCredentialInteractor.execute(), + _cachingManager.clearAll(), + ]); + }); + } else { + await Future.wait([ + _deleteCredentialInteractor.execute(), + _cachingManager.clearAll(), + ]); + } + _authorizationInterceptors.clear(); goToLogin(); } } \ No newline at end of file diff --git a/lib/features/login/data/datasource/authentication_oidc_datasource.dart b/lib/features/login/data/datasource/authentication_oidc_datasource.dart index f98a2f8e9..e738b08d7 100644 --- a/lib/features/login/data/datasource/authentication_oidc_datasource.dart +++ b/lib/features/login/data/datasource/authentication_oidc_datasource.dart @@ -23,5 +23,5 @@ abstract class AuthenticationOIDCDataSource { List scopes, String refreshToken); - Future logout(TokenId tokenId, OIDCConfiguration config); + Future logout(TokenId tokenId, OIDCConfiguration config); } \ No newline at end of file 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 db00683e1..a9c5b9a00 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 @@ -71,7 +71,11 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { } @override - Future logout(TokenId tokenId, OIDCConfiguration config) { - throw UnimplementedError(); + Future logout(TokenId tokenId, OIDCConfiguration config) { + return Future.sync(() async { + return await _oidcHttpClient.logoutOidc(tokenId, config); + }).catchError((error) { + throw error; + }); } } \ No newline at end of file diff --git a/lib/features/login/data/network/config/authorization_interceptors.dart b/lib/features/login/data/network/config/authorization_interceptors.dart index c4be31d45..f688b2258 100644 --- a/lib/features/login/data/network/config/authorization_interceptors.dart +++ b/lib/features/login/data/network/config/authorization_interceptors.dart @@ -51,6 +51,8 @@ class AuthorizationInterceptors extends InterceptorsWrapper { OIDCConfiguration? get oidcConfig => _configOIDC; + AuthenticationType get authenticationType => _authenticationType; + @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { switch(_authenticationType) { diff --git a/lib/features/login/data/network/oidc_http_client.dart b/lib/features/login/data/network/oidc_http_client.dart index c98474757..0a96a3fc6 100644 --- a/lib/features/login/data/network/oidc_http_client.dart +++ b/lib/features/login/data/network/oidc_http_client.dart @@ -8,6 +8,7 @@ import 'package:flutter_appauth/flutter_appauth.dart'; import 'package:model/oidc/oidc_configuration.dart'; import 'package:model/oidc/request/oidc_request.dart'; import 'package:model/oidc/response/oidc_response.dart'; +import 'package:model/oidc/token_id.dart'; import 'package:model/oidc/token_oidc.dart'; import 'package:tmail_ui_user/features/login/data/extensions/authentication_token_extension.dart'; import 'package:tmail_ui_user/features/login/data/extensions/service_path_extension.dart'; @@ -98,4 +99,14 @@ class OIDCHttpClient { throw NotFoundAccessTokenException(); } } + + Future logoutOidc(TokenId tokenId, OIDCConfiguration config) async { + final endSession = await _appAuth.endSession(EndSessionRequest( + idTokenHint: tokenId.uuid, + postLogoutRedirectUrl: config.redirectUrl, + discoveryUrl: config.discoveryUrl + )); + log('OIDCHttpClient::logoutOidc(): ${endSession?.state}'); + return endSession?.state?.isNotEmpty == true; + } } \ 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 ee5ddb463..c411e14cb 100644 --- a/lib/features/login/data/repository/authentication_oidc_repository_impl.dart +++ b/lib/features/login/data/repository/authentication_oidc_repository_impl.dart @@ -63,7 +63,7 @@ class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository { } @override - Future logout(TokenId tokenId, OIDCConfiguration config) { - throw UnimplementedError(); + Future logout(TokenId tokenId, OIDCConfiguration config) { + return _oidcDataSource.logout(tokenId, config); } } \ 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 4d0b2ce9b..02721ea70 100644 --- a/lib/features/login/domain/repository/authentication_oidc_repository.dart +++ b/lib/features/login/domain/repository/authentication_oidc_repository.dart @@ -23,5 +23,5 @@ abstract class AuthenticationOIDCRepository { List scopes, String refreshToken); - Future logout(TokenId tokenId, OIDCConfiguration config); + Future logout(TokenId tokenId, OIDCConfiguration config); } \ No newline at end of file diff --git a/lib/features/login/domain/usecases/get_authenticated_account_interactor.dart b/lib/features/login/domain/usecases/get_authenticated_account_interactor.dart index 81cca3631..de2eab1b7 100644 --- a/lib/features/login/domain/usecases/get_authenticated_account_interactor.dart +++ b/lib/features/login/domain/usecases/get_authenticated_account_interactor.dart @@ -24,6 +24,7 @@ class GetAuthenticatedAccountInteractor { try { yield Right(LoadingState()); final account = await _accountRepository.getCurrentAccount(); + log('GetAuthenticatedAccountInteractor::execute(): account: $account'); yield Right(GetAuthenticatedAccountSuccess(account)); if (account.authenticationType == AuthenticationType.oidc) { yield* _getStoredTokenOidcInteractor.execute(account.id); diff --git a/lib/features/login/domain/usecases/get_stored_token_oidc_interactor.dart b/lib/features/login/domain/usecases/get_stored_token_oidc_interactor.dart index 00c89ef5a..f82f3e237 100644 --- a/lib/features/login/domain/usecases/get_stored_token_oidc_interactor.dart +++ b/lib/features/login/domain/usecases/get_stored_token_oidc_interactor.dart @@ -18,6 +18,7 @@ class GetStoredTokenOidcInteractor { Stream> execute(String tokenIdHash) async* { try { + log('GetStoredTokenOidcInteractor::execute(): tokenIdHash: $tokenIdHash'); yield Right(LoadingState()); final futureValue = await Future.wait([ _credentialRepository.getBaseUrl(), diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart index 05379351c..3b7862544 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart @@ -14,6 +14,18 @@ import 'package:tmail_ui_user/features/email/domain/repository/email_repository. 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/email_bindings.dart'; +import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart'; +import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart'; +import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart'; +import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_datasource_impl.dart'; +import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; +import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart'; +import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc_repository_impl.dart'; +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/mailbox/data/datasource/mailbox_datasource.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart'; @@ -36,6 +48,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_s import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart'; import 'package:tmail_ui_user/features/thread/data/datasource_impl/local_thread_datasource_impl.dart'; import 'package:tmail_ui_user/features/thread/data/datasource_impl/thread_datasource_impl.dart'; @@ -58,6 +71,7 @@ class MailboxDashBoardBindings extends BaseBindings { @override void bindingsController() { Get.put(MailboxDashBoardController( + Get.find(), Get.find(), Get.find(), Get.find(), @@ -75,6 +89,8 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override @@ -90,6 +106,12 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => StateDataSourceImpl(Get.find())); Get.lazyPut(() => MailboxDataSourceImpl(Get.find())); Get.lazyPut(() => MailboxCacheDataSourceImpl(Get.find())); + Get.lazyPut(() => HiveAccountDatasourceImpl(Get.find())); + Get.lazyPut(() => AuthenticationOIDCDataSourceImpl( + Get.find(), + Get.find(), + Get.find() + )); } @override @@ -102,6 +124,10 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => GetAllRecentSearchLatestInteractor(Get.find())); Get.lazyPut(() => QuickSearchEmailInteractor(Get.find())); Get.lazyPut(() => MarkAsMailboxReadInteractor(Get.find())); + Get.lazyPut(() => LogoutOidcInteractor( + Get.find(), + Get.find(), + )); } @override @@ -110,6 +136,8 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override @@ -136,5 +164,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), )); + Get.lazyPut(() => AccountRepositoryImpl(Get.find())); + Get.lazyPut(() => AuthenticationOIDCRepositoryImpl(Get.find())); } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index 83c61216d..529fc1ade 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -37,12 +37,10 @@ import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_int import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.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/get_user_profile_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/mark_as_mailbox_read_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/quick_search_email_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/mark_as_mailbox_read_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart'; @@ -50,6 +48,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_re import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/email_receive_time_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/quick_search_filter.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/manage_account_arguments.dart'; import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; @@ -65,7 +64,6 @@ import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; class MailboxDashBoardController extends ReloadableController { - final GetUserProfileInteractor _getUserProfileInteractor = Get.find(); final AppToast _appToast = Get.find(); final ImagePaths _imagePaths = Get.find(); final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find(); @@ -106,13 +104,14 @@ class MailboxDashBoardController extends ReloadableController { late StreamSubscription _emailReceiveManagerStreamSubscription; MailboxDashBoardController( + LogoutOidcInteractor logoutOidcInteractor, this._moveToMailboxInteractor, this._deleteEmailPermanentlyInteractor, this._saveRecentSearchInteractor, this._getAllRecentSearchLatestInteractor, this._quickSearchEmailInteractor, this._markAsMailboxReadInteractor, - ); + ) : super(logoutOidcInteractor); @override void onInit() { diff --git a/lib/features/manage_account/domain/state/log_out_oidc_state.dart b/lib/features/manage_account/domain/state/log_out_oidc_state.dart new file mode 100644 index 000000000..4801a724a --- /dev/null +++ b/lib/features/manage_account/domain/state/log_out_oidc_state.dart @@ -0,0 +1,20 @@ + +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class LogoutOidcSuccess extends UIState { + + LogoutOidcSuccess(); + + @override + List get props => []; +} + +class LogoutOidcFailure extends FeatureFailure { + final dynamic exception; + + LogoutOidcFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file 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 new file mode 100644 index 000000000..98409e586 --- /dev/null +++ b/lib/features/manage_account/domain/usecases/log_out_oidc_interactor.dart @@ -0,0 +1,48 @@ + +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:model/account/authentication_type.dart'; +import 'package:model/oidc/oidc_configuration.dart'; +import 'package:model/oidc/token_oidc.dart'; +import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; +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/manage_account/domain/state/log_out_oidc_state.dart'; + +class LogoutOidcInteractor { + + final AccountRepository _accountRepository; + final AuthenticationOIDCRepository _authenticationOIDCRepository; + + LogoutOidcInteractor(this._accountRepository, this._authenticationOIDCRepository); + + Future> execute() async { + try { + final currentAccount = await _accountRepository.getCurrentAccount(); + + if (currentAccount.authenticationType == AuthenticationType.oidc) { + final result = await Future.wait([ + _authenticationOIDCRepository.getStoredTokenOIDC(currentAccount.id), + _authenticationOIDCRepository.getStoredOidcConfiguration() + ]).then((result) async { + final tokenOidc = result.first as TokenOIDC; + final oidcConfig = result.last as OIDCConfiguration; + return await _authenticationOIDCRepository.logout(tokenOidc.tokenId, oidcConfig); + }); + log('LogoutOidcInteractor::execute(): statusSuccess: $result'); + if (result) { + return Right(LogoutOidcSuccess()); + } else { + return Left(LogoutOidcFailure(null)); + } + } else { + return Left(LogoutOidcFailure(NotFoundAuthenticatedAccountException())); + } + } catch (e) { + log('LogoutOidcInteractor::execute(): EXCEPTION: $e'); + return 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 a09697a4a..0152b820d 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart @@ -1,7 +1,20 @@ import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart'; +import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart'; +import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart'; +import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart'; +import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_datasource_impl.dart'; +import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; +import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart'; +import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc_repository_impl.dart'; +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/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'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/profiles_bindings.dart'; @@ -17,27 +30,43 @@ class ManageAccountDashBoardBindings extends BaseBindings { @override void bindingsController() { - Get.lazyPut(() => ManageAccountDashBoardController()); + Get.lazyPut(() => ManageAccountDashBoardController(Get.find())); } @override void bindingsDataSource() { + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override void bindingsDataSourceImpl() { + Get.lazyPut(() => HiveAccountDatasourceImpl(Get.find())); + Get.lazyPut(() => AuthenticationOIDCDataSourceImpl( + Get.find(), + Get.find(), + Get.find() + )); } @override void bindingsInteractor() { Get.lazyPut(() => GetUserProfileInteractor(Get.find())); + Get.lazyPut(() => LogoutOidcInteractor( + Get.find(), + Get.find(), + )); } @override void bindingsRepository() { + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override void bindingsRepositoryImpl() { + Get.lazyPut(() => AccountRepositoryImpl(Get.find())); + Get.lazyPut(() => AuthenticationOIDCRepositoryImpl(Get.find())); } } \ No newline at end of file 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 e22666960..88c38840b 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -9,6 +9,7 @@ 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/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'; import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; @@ -27,7 +28,9 @@ class ManageAccountDashBoardController extends ReloadableController { Session? sessionCurrent; - ManageAccountDashBoardController(); + ManageAccountDashBoardController( + LogoutOidcInteractor logoutOidcInteractor + ) : super(logoutOidcInteractor); @override void onReady() { diff --git a/model/lib/oidc/oidc_configuration.dart b/model/lib/oidc/oidc_configuration.dart index 7824bc033..d0c57482c 100644 --- a/model/lib/oidc/oidc_configuration.dart +++ b/model/lib/oidc/oidc_configuration.dart @@ -24,6 +24,8 @@ class OIDCConfiguration with EquatableMixin { } } + String get clientIdHash => clientId.hashCode.toString(); + @override List get props => [ authority,