From d450d309499d063e2646e520fc188dc55ae9b2fc Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 26 Jan 2024 08:36:05 +0700 Subject: [PATCH] TF-2461 Remove logic `retry` in authorizationInterceptors Signed-off-by: dab246 --- .../download_attachments_interactor.dart | 2 +- .../presentation/bindings/email_bindings.dart | 2 +- .../authorization_interceptors.dart | 83 ++++++++----------- .../work_manager/sending_email_worker.dart | 2 +- .../controller/fcm_message_controller.dart | 2 +- 5 files changed, 38 insertions(+), 53 deletions(-) rename lib/features/login/data/network/{config => interceptors}/authorization_interceptors.dart (81%) diff --git a/lib/features/email/domain/usecases/download_attachments_interactor.dart b/lib/features/email/domain/usecases/download_attachments_interactor.dart index 447d75cc9..70484be10 100644 --- a/lib/features/email/domain/usecases/download_attachments_interactor.dart +++ b/lib/features/email/domain/usecases/download_attachments_interactor.dart @@ -12,7 +12,7 @@ import 'package:model/email/attachment.dart'; import 'package:model/oidc/token_oidc.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/state/download_attachments_state.dart'; -import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; +import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; import 'package:tmail_ui_user/features/login/domain/extensions/oidc_configuration_extensions.dart'; import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; diff --git a/lib/features/email/presentation/bindings/email_bindings.dart b/lib/features/email/presentation/bindings/email_bindings.dart index 0563a5a03..1b7bf4ff0 100644 --- a/lib/features/email/presentation/bindings/email_bindings.dart +++ b/lib/features/email/presentation/bindings/email_bindings.dart @@ -22,7 +22,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_int import 'package:tmail_ui_user/features/email/domain/usecases/store_opened_email_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/controller/email_supervisor_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart'; -import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; +import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.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'; diff --git a/lib/features/login/data/network/config/authorization_interceptors.dart b/lib/features/login/data/network/interceptors/authorization_interceptors.dart similarity index 81% rename from lib/features/login/data/network/config/authorization_interceptors.dart rename to lib/features/login/data/network/interceptors/authorization_interceptors.dart index 3e7d611b4..1caeb75a4 100644 --- a/lib/features/login/data/network/config/authorization_interceptors.dart +++ b/lib/features/login/data/network/interceptors/authorization_interceptors.dart @@ -21,9 +21,6 @@ import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class AuthorizationInterceptors extends QueuedInterceptorsWrapper { - static const int _maxRetryCount = 3; - static const String _retryKey = 'Retry'; - final Dio _dio; final AuthenticationClientBase _authenticationClient; final TokenOidcCacheManager _tokenOidcCacheManager; @@ -52,9 +49,11 @@ class AuthorizationInterceptors extends QueuedInterceptorsWrapper { _token = newToken; _configOIDC = newConfig; _authenticationType = AuthenticationType.oidc; + log('AuthorizationInterceptors::setTokenAndAuthorityOidc: TOKEN_INITIAL = $newToken'); } void _updateNewToken(TokenOIDC newToken) { + log('AuthorizationInterceptors::_updateNewToken: NEW_TOKEN = $newToken'); _token = newToken; } @@ -64,7 +63,6 @@ class AuthorizationInterceptors extends QueuedInterceptorsWrapper { @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { - log('AuthorizationInterceptors::onRequest():url: ${options.uri} | data: ${options.data} | header: ${options.headers}'); switch(_authenticationType) { case AuthenticationType.basic: if (_authorization != null) { @@ -79,27 +77,38 @@ class AuthorizationInterceptors extends QueuedInterceptorsWrapper { case AuthenticationType.none: break; } + log('AuthorizationInterceptors::onRequest(): URL = ${options.uri} | HEADER = ${options.headers} | DATA = ${options.data}'); super.onRequest(options, handler); } + @override + void onResponse(Response response, ResponseInterceptorHandler handler) { + log('AuthorizationInterceptors::response(): STATUS_CODE = ${response.statusCode} | DATA = ${response.data}'); + super.onResponse(response, handler); + } + @override void onError(DioError err, ErrorInterceptorHandler handler) async { - logError('AuthorizationInterceptors::onError(): $err'); + logError('AuthorizationInterceptors::onError(): DIO_ERROR = $err'); try { - final requestOptions = err.requestOptions; - final extraInRequest = requestOptions.extra; - var retries = extraInRequest[_retryKey] ?? 0; + if (validateToRefreshToken(responseStatusCode: err.response?.statusCode)) { + log('AuthorizationInterceptors::onError:_validateToRefreshToken'); + final requestOptions = err.requestOptions; + final extraInRequest = requestOptions.extra; - if (_validateToRefreshToken(err)) { - log('AuthorizationInterceptors::onError:>> _validateToRefreshToken'); + final newTokenOidc = PlatformInfo.isIOS + ? await _handleRefreshTokenOnIOSPlatform() + : await _handleRefreshTokenOnOtherPlatform(); - if (PlatformInfo.isIOS) { - await _handleRefreshTokenOnIOSPlatform(); - } else { - await _handleRefreshTokenOnOtherPlatform(); + if (newTokenOidc.token == _token?.token) { + log('AuthorizationInterceptors::onError: TokenOIDC duplicated'); + return super.onError(err, handler); } + _updateNewToken(newTokenOidc); + if (extraInRequest.containsKey(FileUploader.uploadAttachmentExtraKey)) { + log('AuthorizationInterceptors::onError: Perform upload attachment request'); final uploadExtra = extraInRequest[FileUploader.uploadAttachmentExtraKey]; requestOptions.headers[HttpHeaders.authorizationHeader] = _getTokenAsBearerHeader(_token!.token); @@ -120,26 +129,18 @@ class AuthorizationInterceptors extends QueuedInterceptorsWrapper { return handler.resolve(response); } else { + log('AuthorizationInterceptors::onError: Perform normal request'); requestOptions.headers[HttpHeaders.authorizationHeader] = _getTokenAsBearerHeader(_token!.token); final response = await _dio.fetch(requestOptions); return handler.resolve(response); } - } else if (_validateToRetry(err, retries)) { - log('AuthorizationInterceptors::onError:>> _validateToRetry | retries: $retries'); - retries++; - - requestOptions.headers[HttpHeaders.authorizationHeader] = _getTokenAsBearerHeader(_token!.token); - requestOptions.extra = {_retryKey: retries}; - - final response = await _dio.fetch(requestOptions); - return handler.resolve(response); } else { - super.onError(err, handler); + return super.onError(err, handler); } } catch (e) { logError('AuthorizationInterceptors::onError:Exception: $e'); - super.onError(err.copyWith(error: e), handler); + return super.onError(err.copyWith(error: e), handler); } } @@ -160,9 +161,10 @@ class AuthorizationInterceptors extends QueuedInterceptorsWrapper { bool _isRefreshTokenNotEmpty() => _token?.refreshToken.isNotEmpty == true; - bool _validateToRefreshToken(DioError dioError) { - if (dioError.response?.statusCode == 401 && + bool validateToRefreshToken({int? responseStatusCode}) { + if (responseStatusCode == 401 && _isAuthenticationOidcValid() && + _isTokenNotEmpty() && _isRefreshTokenNotEmpty() && _isTokenExpired() ) { @@ -171,17 +173,6 @@ class AuthorizationInterceptors extends QueuedInterceptorsWrapper { return false; } - bool _validateToRetry(DioError dioError, int retryCount) { - if (dioError.type == DioErrorType.badResponse && - dioError.response?.statusCode == 401 && - _isTokenNotEmpty() && - retryCount < _maxRetryCount - ) { - return true; - } - return false; - } - String _getAuthorizationAsBasicHeader(String? authorization) => 'Basic $authorization'; String _getTokenAsBearerHeader(String token) => 'Bearer $token'; @@ -250,30 +241,24 @@ class AuthorizationInterceptors extends QueuedInterceptorsWrapper { return newToken; } - Future _handleRefreshTokenOnIOSPlatform() async { + Future _handleRefreshTokenOnIOSPlatform() async { final keychainToken = await _getTokenInKeychain(_token!); if (keychainToken == null) { final newToken = await _invokeRefreshTokenFromServer(); - - _updateNewToken(newToken); - final newAccount = await _updateCurrentAccount(tokenOIDC: newToken); - await _iosSharingManager.saveKeyChainSharingSession(newAccount); + return newToken; } else { - _updateNewToken(keychainToken); - await _updateCurrentAccount(tokenOIDC: keychainToken); + return keychainToken; } } - Future _handleRefreshTokenOnOtherPlatform() async { + Future _handleRefreshTokenOnOtherPlatform() async { final newToken = await _invokeRefreshTokenFromServer(); - - _updateNewToken(newToken); - await _updateCurrentAccount(tokenOIDC: newToken); + return newToken; } void clear() { diff --git a/lib/features/offline_mode/work_manager/sending_email_worker.dart b/lib/features/offline_mode/work_manager/sending_email_worker.dart index f6acf9b8c..ba5c212bf 100644 --- a/lib/features/offline_mode/work_manager/sending_email_worker.dart +++ b/lib/features/offline_mode/work_manager/sending_email_worker.dart @@ -20,7 +20,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_i import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart'; -import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; +import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.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_credential_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart'; diff --git a/lib/features/push_notification/presentation/controller/fcm_message_controller.dart b/lib/features/push_notification/presentation/controller/fcm_message_controller.dart index 379a8851a..72c427a4c 100644 --- a/lib/features/push_notification/presentation/controller/fcm_message_controller.dart +++ b/lib/features/push_notification/presentation/controller/fcm_message_controller.dart @@ -20,7 +20,7 @@ import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart'; import 'package:tmail_ui_user/features/home/presentation/home_bindings.dart'; -import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; +import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.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_credential_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart';