From bc8a03cbcee71f8b3537d027e86023200d0b6799 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 29 Jun 2023 16:45:29 +0700 Subject: [PATCH] [HOT-FIX] `Webfinger` is recalled many times (cherry picked from commit 1873e0f199c29965543a7504f30308e0024c725c) --- lib/features/base/base_controller.dart | 16 ++++--- .../config/authorization_interceptors.dart | 11 +++++ .../login/presentation/login_bindings.dart | 32 ++++++-------- .../login/presentation/login_controller.dart | 43 ++++++++----------- .../exceptions/remote_exception_thrower.dart | 42 +++++++++--------- 5 files changed, 75 insertions(+), 69 deletions(-) diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index a32e51548..05abb09d8 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -143,16 +143,20 @@ abstract class BaseController extends GetxController currentOverlayContext!, AppLocalizations.of(currentContext!).badCredentials); } - performInvokeLogoutAction(); + if (authorizationInterceptors.isAppRunning) { + performInvokeLogoutAction(); + } return error; } else if (error is ConnectionError) { logError('BaseController::_performFilterExceptionInError(): ConnectionError'); - if (currentOverlayContext != null && currentContext != null) { - _appToast.showToastErrorMessage( - currentOverlayContext!, - AppLocalizations.of(currentContext!).connectionError); + if (authorizationInterceptors.isAppRunning) { + if (currentOverlayContext != null && currentContext != null) { + _appToast.showToastErrorMessage( + currentOverlayContext!, + AppLocalizations.of(currentContext!).connectionError); + } + performInvokeLogoutAction(); } - performInvokeLogoutAction(); return error; } diff --git a/lib/features/login/data/network/config/authorization_interceptors.dart b/lib/features/login/data/network/config/authorization_interceptors.dart index 209fbb9b5..e7f0a60c1 100644 --- a/lib/features/login/data/network/config/authorization_interceptors.dart +++ b/lib/features/login/data/network/config/authorization_interceptors.dart @@ -143,6 +143,17 @@ class AuthorizationInterceptors extends InterceptorsWrapper { String _getTokenAsBearerHeader(String token) => 'Bearer $token'; + bool get isAppRunning { + switch(_authenticationType) { + case AuthenticationType.basic: + return _authorization != null; + case AuthenticationType.oidc: + return _configOIDC != null && _token != null; + case AuthenticationType.none: + return false; + } + } + void clear() { _authorization = null; _token = null; diff --git a/lib/features/login/presentation/login_bindings.dart b/lib/features/login/presentation/login_bindings.dart index 2660d1abc..c8d6678ab 100644 --- a/lib/features/login/presentation/login_bindings.dart +++ b/lib/features/login/presentation/login_bindings.dart @@ -47,7 +47,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_m import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart'; import 'package:tmail_ui_user/features/login/presentation/login_controller.dart'; -import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; @@ -56,23 +55,20 @@ class LoginBindings extends BaseBindings { @override void bindingsController() { Get.lazyPut(() => LoginController( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), )); } diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index 9c81cef77..6c8f0918b 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -8,14 +8,13 @@ import 'package:dartz/dartz.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; -import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:model/account/password.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_oidc.dart'; -import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; +import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; import 'package:tmail_ui_user/features/login/domain/model/login_constants.dart'; @@ -26,6 +25,7 @@ import 'package:tmail_ui_user/features/login/domain/state/authentication_user_st import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_all_recent_login_url_latest_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_all_recent_login_username_state.dart'; +import 'package:tmail_ui_user/features/login/domain/state/get_authenticated_account_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_authentication_info_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_oidc_configuration_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_oidc_is_available_state.dart'; @@ -34,7 +34,6 @@ import 'package:tmail_ui_user/features/login/domain/state/get_token_oidc_state.d import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_all_recent_login_url_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_all_recent_login_username_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; @@ -45,18 +44,14 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_con import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart'; import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart'; -import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; -import 'package:tmail_ui_user/main/routes/navigation_router.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; -import 'package:tmail_ui_user/main/routes/route_utils.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart'; import 'package:universal_html/html.dart' as html; -class LoginController extends ReloadableController { +class LoginController extends BaseController { final AuthenticationInteractor _authenticationInteractor; final DynamicUrlInterceptors _dynamicUrlInterceptors; @@ -71,15 +66,12 @@ class LoginController extends ReloadableController { final GetAllRecentLoginUrlOnMobileInteractor _getAllRecentLoginUrlOnMobileInteractor; final SaveLoginUsernameOnMobileInteractor _saveLoginUsernameOnMobileInteractor; final GetAllRecentLoginUsernameOnMobileInteractor _getAllRecentLoginUsernameOnMobileInteractor; + final GetAuthenticatedAccountInteractor _getAuthenticatedAccountInteractor; final TextEditingController urlInputController = TextEditingController(); final TextEditingController usernameInputController = TextEditingController(); LoginController( - LogoutOidcInteractor logoutOidcInteractor, - DeleteAuthorityOidcInteractor deleteAuthorityOidcInteractor, - GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor, - UpdateAuthenticationAccountInteractor updateAuthenticationAccountInteractor, this._authenticationInteractor, this._dynamicUrlInterceptors, this._checkOIDCIsAvailableInteractor, @@ -93,9 +85,7 @@ class LoginController extends ReloadableController { this._getAllRecentLoginUrlOnMobileInteractor, this._saveLoginUsernameOnMobileInteractor, this._getAllRecentLoginUsernameOnMobileInteractor, - ) : super( - getAuthenticatedAccountInteractor, - updateAuthenticationAccountInteractor + this._getAuthenticatedAccountInteractor, ); final loginFormType = LoginFormType.baseUrlForm.obs; @@ -141,10 +131,12 @@ class LoginController extends ReloadableController { void handleFailureViewState(Failure failure) { super.handleFailureViewState(failure); if (failure is GetAuthenticationInfoFailure) { - getAuthenticatedAccountAction(); + _getAuthenticatedAccountAction(); } else if (failure is CheckOIDCIsAvailableFailure || failure is GetStoredOidcConfigurationFailure || - failure is GetOIDCIsAvailableFailure) { + failure is GetOIDCIsAvailableFailure || + failure is GetAuthenticatedAccountFailure || + failure is NoAuthenticatedAccountFailure) { _showFormLoginWithCredentialAction(); } } @@ -173,14 +165,11 @@ class LoginController extends ReloadableController { @override void handleExceptionAction({Failure? failure, Exception? exception}) { super.handleExceptionAction(failure: failure, exception: exception); - clearState(); - } - - @override - void handleReloaded(Session session) { - pushAndPop( - RouteUtils.generateNavigationRoute(AppRoutes.dashboard, NavigationRouter()), - arguments: session); + if (failure is CheckOIDCIsAvailableFailure || failure is GetOIDCIsAvailableFailure) { + _showFormLoginWithCredentialAction(); + } else { + clearState(); + } } void _getAuthenticationInfo() { @@ -191,6 +180,10 @@ class LoginController extends ReloadableController { consumeState(_getStoredOidcConfigurationInteractor.execute()); } + void _getAuthenticatedAccountAction() { + consumeState(_getAuthenticatedAccountInteractor.execute()); + } + void handleNextInUrlInputFormPress() { _saveRecentLoginUrl(); _checkOIDCIsAvailable(); diff --git a/lib/main/exceptions/remote_exception_thrower.dart b/lib/main/exceptions/remote_exception_thrower.dart index bd082aa50..0e5f54550 100644 --- a/lib/main/exceptions/remote_exception_thrower.dart +++ b/lib/main/exceptions/remote_exception_thrower.dart @@ -23,31 +23,33 @@ class RemoteExceptionThrower extends ExceptionThrower { } else { if (error is DioError) { logError('RemoteExceptionThrower::throwException():type: ${error.type} | response: ${error.response} | error: ${error.error}'); - switch (error.type) { - case DioErrorType.connectionTimeout: - throw ConnectionTimeout(message: error.message); - case DioErrorType.connectionError: - throw ConnectionError(message: error.message); - default: - if (error.response?.statusCode == HttpStatus.internalServerError) { - throw const InternalServerError(); - } else if (error.response?.statusCode == HttpStatus.badGateway) { - throw BadGateway(); - } else if (error.response?.statusCode == HttpStatus.unauthorized) { - throw const BadCredentialsException(); - } else if (error.error is SocketException) { - throw const SocketError(); - } else { - if (error.response != null) { - throw UnknownError( - code: error.response!.statusCode, - message: error.response!.statusMessage); + if (error.response != null) { + if (error.response!.statusCode == HttpStatus.internalServerError) { + throw const InternalServerError(); + } else if (error.response!.statusCode == HttpStatus.badGateway) { + throw BadGateway(); + } else if (error.response!.statusCode == HttpStatus.unauthorized) { + throw const BadCredentialsException(); + } else { + throw UnknownError( + code: error.response!.statusCode, + message: error.response!.statusMessage); + } + } else { + switch (error.type) { + case DioErrorType.connectionTimeout: + throw ConnectionTimeout(message: error.message); + case DioErrorType.connectionError: + throw ConnectionError(message: error.message); + default: + if (error.error is SocketException) { + throw const SocketError(); } else if (error.error != null) { throw UnknownError(message: error.error!.toString()); } else { throw const UnknownError(); } - } + } } } else if (error is ErrorMethodResponseException) { final errorResponse = error.errorResponse as ErrorMethodResponse;