From 499141cdaa316b8d67223efa502bdd792c484907 Mon Sep 17 00:00:00 2001 From: dab246 Date: Sun, 24 Dec 2023 18:57:34 +0700 Subject: [PATCH] TF-2384 Merge `Token` with `TokenOIDC` to avoid confusion Signed-off-by: dab246 (cherry picked from commit 9951d47a11bef36362cd2a5ad679a8a1fcaf022c) --- .../reloadable/reloadable_controller.dart | 5 ++- .../email/data/network/email_api.dart | 4 +-- ...ownload_attachment_for_web_interactor.dart | 3 +- .../download_attachments_interactor.dart | 22 +++++++------ .../export_attachment_interactor.dart | 2 +- .../data/local/account_cache_manager.dart | 1 - .../login/presentation/login_controller.dart | 5 ++- .../work_manager/sending_email_worker.dart | 4 +-- model/lib/account/account_request.dart | 6 ++-- .../oidc/converter/token_id_converter.dart | 13 ++++++++ model/lib/oidc/token.dart | 33 ------------------- model/lib/oidc/token_oidc.dart | 26 ++++++++++++--- 12 files changed, 59 insertions(+), 65 deletions(-) create mode 100644 model/lib/oidc/converter/token_id_converter.dart delete mode 100644 model/lib/oidc/token.dart diff --git a/lib/features/base/reloadable/reloadable_controller.dart b/lib/features/base/reloadable/reloadable_controller.dart index cee16def9..37bb8f37b 100644 --- a/lib/features/base/reloadable/reloadable_controller.dart +++ b/lib/features/base/reloadable/reloadable_controller.dart @@ -8,7 +8,6 @@ import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:model/extensions/session_extension.dart'; -import 'package:model/oidc/token_oidc.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; 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'; @@ -130,10 +129,10 @@ abstract class ReloadableController extends BaseController { dynamicUrlInterceptors.setJmapUrl(tokenOidcSuccess.baseUrl.toString()); dynamicUrlInterceptors.changeBaseUrl(tokenOidcSuccess.baseUrl.toString()); authorizationInterceptors.setTokenAndAuthorityOidc( - newToken: tokenOidcSuccess.tokenOidc.toToken(), + newToken: tokenOidcSuccess.tokenOidc, newConfig: tokenOidcSuccess.oidcConfiguration); authorizationIsolateInterceptors.setTokenAndAuthorityOidc( - newToken: tokenOidcSuccess.tokenOidc.toToken(), + newToken: tokenOidcSuccess.tokenOidc, newConfig: tokenOidcSuccess.oidcConfiguration); } diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 79db600cd..3f4655437 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -11,7 +11,6 @@ import 'package:jmap_dart_client/http/http_client.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart'; -import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/patch_object.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; @@ -19,6 +18,7 @@ import 'package:jmap_dart_client/jmap/core/reference_id.dart'; import 'package:jmap_dart_client/jmap/core/reference_prefix.dart'; import 'package:jmap_dart_client/jmap/core/request/request_invocation.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/jmap_request.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/get/get_email_method.dart'; @@ -49,7 +49,7 @@ import 'package:model/extensions/list_email_extension.dart'; import 'package:model/extensions/list_email_id_extension.dart'; import 'package:model/extensions/mailbox_id_extension.dart'; import 'package:model/extensions/session_extension.dart'; -import 'package:model/oidc/token.dart'; +import 'package:model/oidc/token_oidc.dart'; import 'package:path_provider/path_provider.dart'; import 'package:tmail_ui_user/features/base/mixin/handle_error_mixin.dart'; import 'package:tmail_ui_user/features/composer/domain/exceptions/set_method_exception.dart'; diff --git a/lib/features/email/domain/usecases/download_attachment_for_web_interactor.dart b/lib/features/email/domain/usecases/download_attachment_for_web_interactor.dart index 9ae6b8c50..b560205b9 100644 --- a/lib/features/email/domain/usecases/download_attachment_for_web_interactor.dart +++ b/lib/features/email/domain/usecases/download_attachment_for_web_interactor.dart @@ -10,7 +10,6 @@ import 'package:model/account/authentication_type.dart'; import 'package:model/account/password.dart'; import 'package:model/download/download_task_id.dart'; 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_attachment_for_web_state.dart'; import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; @@ -45,7 +44,7 @@ class DownloadAttachmentForWebInteractor { if (currentAccount.authenticationType == AuthenticationType.oidc) { final tokenOidc = await _authenticationOIDCRepository.getStoredTokenOIDC(currentAccount.id); - accountRequest = AccountRequest.withOidc(token: tokenOidc.toToken()); + accountRequest = AccountRequest.withOidc(token: tokenOidc); } else { final authenticationInfoCache = await credentialRepository.getAuthenticationInfoStored(); accountRequest = AccountRequest.withBasic( diff --git a/lib/features/email/domain/usecases/download_attachments_interactor.dart b/lib/features/email/domain/usecases/download_attachments_interactor.dart index 955102457..447d75cc9 100644 --- a/lib/features/email/domain/usecases/download_attachments_interactor.dart +++ b/lib/features/email/domain/usecases/download_attachments_interactor.dart @@ -1,9 +1,9 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:core/utils/app_logger.dart'; -import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:model/account/account_request.dart'; import 'package:model/account/authentication_type.dart'; import 'package:model/account/password.dart'; @@ -12,9 +12,9 @@ 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/domain/extensions/oidc_configuration_extensions.dart'; import 'package:tmail_ui_user/features/login/data/network/config/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'; 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'; @@ -46,7 +46,7 @@ class DownloadAttachmentsInteractor { if (currentAccount.authenticationType == AuthenticationType.oidc) { final tokenOidc = await _authenticationOIDCRepository.getStoredTokenOIDC(currentAccount.id); - accountRequest = AccountRequest.withOidc(token: tokenOidc.toToken()); + accountRequest = AccountRequest.withOidc(token: tokenOidc); } else { final authenticationInfoCache = await credentialRepository.getAuthenticationInfoStored(); accountRequest = AccountRequest.withBasic( @@ -96,22 +96,24 @@ class DownloadAttachmentsInteractor { await _accountRepository.deleteCurrentAccount(accountCurrent.id); - await Future.wait([ - _authenticationOIDCRepository.persistTokenOIDC(newTokenOIDC), - _accountRepository.setCurrentAccount(PersonalAccount( + await _authenticationOIDCRepository.persistTokenOIDC(newTokenOIDC); + + await _accountRepository.setCurrentAccount( + PersonalAccount( newTokenOIDC.tokenIdHash, AuthenticationType.oidc, isSelected: true, accountId: accountId, apiUrl: accountCurrent.apiUrl, - userName: accountCurrent.userName)) - ]); + userName: accountCurrent.userName + ) + ); _authorizationInterceptors.setTokenAndAuthorityOidc( - newToken: newTokenOIDC.toToken(), + newToken: newTokenOIDC, newConfig: oidcConfig); - final accountRequest = AccountRequest.withOidc(token: newTokenOIDC.toToken()); + final accountRequest = AccountRequest.withOidc(token: newTokenOIDC); final taskIds = await emailRepository.downloadAttachments( attachments, diff --git a/lib/features/email/domain/usecases/export_attachment_interactor.dart b/lib/features/email/domain/usecases/export_attachment_interactor.dart index 20192f8f9..1dc8d86f5 100644 --- a/lib/features/email/domain/usecases/export_attachment_interactor.dart +++ b/lib/features/email/domain/usecases/export_attachment_interactor.dart @@ -38,7 +38,7 @@ class ExportAttachmentInteractor { if (currentAccount.authenticationType == AuthenticationType.oidc) { final tokenOidc = await _authenticationOIDCRepository.getStoredTokenOIDC(currentAccount.id); - accountRequest = AccountRequest.withOidc(token: tokenOidc.toToken()); + accountRequest = AccountRequest.withOidc(token: tokenOidc); } else { final authenticationInfoCache = await credentialRepository.getAuthenticationInfoStored(); accountRequest = AccountRequest.withBasic( diff --git a/lib/features/login/data/local/account_cache_manager.dart b/lib/features/login/data/local/account_cache_manager.dart index 3448272f1..3d3d6a43e 100644 --- a/lib/features/login/data/local/account_cache_manager.dart +++ b/lib/features/login/data/local/account_cache_manager.dart @@ -43,7 +43,6 @@ class AccountCacheManager { return _accountCacheClient.insertItem(newAccountCache.id, newAccountCache); } - Future deleteCurrentAccount(String hashId) { log('AccountCacheManager::deleteCurrentAccount(): $hashId'); return _accountCacheClient.deleteItem(hashId); diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index c7e286e24..7072f95e9 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -13,7 +13,6 @@ 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/home/domain/state/get_session_state.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart'; @@ -331,10 +330,10 @@ class LoginController extends ReloadableController { dynamicUrlInterceptors.setJmapUrl(_currentBaseUrl?.toString()); dynamicUrlInterceptors.changeBaseUrl(_currentBaseUrl?.toString()); authorizationInterceptors.setTokenAndAuthorityOidc( - newToken: success.tokenOIDC.toToken(), + newToken: success.tokenOIDC, newConfig: success.configuration); authorizationIsolateInterceptors.setTokenAndAuthorityOidc( - newToken: success.tokenOIDC.toToken(), + newToken: success.tokenOIDC, newConfig: success.configuration); getSessionAction(); } 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 6b3c2a581..f6acf9b8c 100644 --- a/lib/features/offline_mode/work_manager/sending_email_worker.dart +++ b/lib/features/offline_mode/work_manager/sending_email_worker.dart @@ -1,4 +1,5 @@ import 'dart:async'; + import 'package:core/data/network/config/dynamic_url_interceptors.dart'; import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; @@ -10,7 +11,6 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/extensions/account_id_extensions.dart'; import 'package:model/extensions/session_extension.dart'; -import 'package:model/oidc/token_oidc.dart'; import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; @@ -206,7 +206,7 @@ class SendingEmailWorker extends Worker { void _handleGetAccountByOidcSuccess(GetStoredTokenOidcSuccess storedTokenOidcSuccess) { _dynamicUrlInterceptors?.setJmapUrl(storedTokenOidcSuccess.baseUrl.toString()); _authorizationInterceptors?.setTokenAndAuthorityOidc( - newToken: storedTokenOidcSuccess.tokenOidc.toToken(), + newToken: storedTokenOidcSuccess.tokenOidc, newConfig: storedTokenOidcSuccess.oidcConfiguration ); _dynamicUrlInterceptors?.changeBaseUrl(storedTokenOidcSuccess.baseUrl.toString()); diff --git a/model/lib/account/account_request.dart b/model/lib/account/account_request.dart index 86c9bb558..b8b994fc2 100644 --- a/model/lib/account/account_request.dart +++ b/model/lib/account/account_request.dart @@ -4,12 +4,12 @@ import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:model/account/authentication_type.dart'; import 'package:model/account/password.dart'; -import 'package:model/oidc/token.dart'; +import 'package:model/oidc/token_oidc.dart'; class AccountRequest with EquatableMixin { final UserName? userName; final Password? password; - final Token? token; + final TokenOIDC? token; final AuthenticationType authenticationType; AccountRequest({ @@ -19,7 +19,7 @@ class AccountRequest with EquatableMixin { this.authenticationType = AuthenticationType.none, }); - factory AccountRequest.withOidc({required Token token}) { + factory AccountRequest.withOidc({required TokenOIDC token}) { return AccountRequest( token: token, authenticationType: AuthenticationType.oidc diff --git a/model/lib/oidc/converter/token_id_converter.dart b/model/lib/oidc/converter/token_id_converter.dart new file mode 100644 index 000000000..42e87482c --- /dev/null +++ b/model/lib/oidc/converter/token_id_converter.dart @@ -0,0 +1,13 @@ + +import 'package:json_annotation/json_annotation.dart'; +import 'package:model/oidc/token_id.dart'; + +class TokenIdConverter implements JsonConverter { + const TokenIdConverter(); + + @override + TokenId fromJson(String json) => TokenId(json); + + @override + String toJson(TokenId tokenId) => tokenId.uuid; +} \ No newline at end of file diff --git a/model/lib/oidc/token.dart b/model/lib/oidc/token.dart deleted file mode 100644 index 4481d13d9..000000000 --- a/model/lib/oidc/token.dart +++ /dev/null @@ -1,33 +0,0 @@ - -import 'package:core/utils/app_logger.dart'; -import 'package:equatable/equatable.dart'; -import 'package:model/oidc/token_id.dart'; - -class Token with EquatableMixin { - - final String token; - final TokenId tokenId; - final String refreshToken; - final DateTime? expiredTime; - - const Token(this.token, this.tokenId, this.refreshToken, {this.expiredTime}); - - @override - List get props => [token, tokenId, refreshToken, expiredTime]; -} - -extension TokenExtension on Token { - bool isTokenValid() => token.isNotEmpty && tokenId.uuid.isNotEmpty; - - bool get isExpired { - if (expiredTime != null) { - final now = DateTime.now(); - log('TokenExtension::isExpired(): TIME_NOW: $now'); - log('TokenExtension::isExpired(): EXPIRED_DATE: $expiredTime'); - return expiredTime!.isBefore(now); - } - return false; - } - - String get tokenIdHash => tokenId.uuid.hashCode.toString(); -} \ No newline at end of file diff --git a/model/lib/oidc/token_oidc.dart b/model/lib/oidc/token_oidc.dart index b9dc0253b..05afa3448 100644 --- a/model/lib/oidc/token_oidc.dart +++ b/model/lib/oidc/token_oidc.dart @@ -1,8 +1,14 @@ +import 'package:core/utils/app_logger.dart'; import 'package:equatable/equatable.dart'; -import 'package:model/oidc/token.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:model/oidc/converter/token_id_converter.dart'; import 'package:model/oidc/token_id.dart'; +part 'token_oidc.g.dart'; + +@TokenIdConverter() +@JsonSerializable(includeIfNull: false, explicitToJson: true) class TokenOIDC with EquatableMixin { final String token; @@ -17,6 +23,10 @@ class TokenOIDC with EquatableMixin { {this.expiredTime} ); + factory TokenOIDC.fromJson(Map json) => _$TokenOIDCFromJson(json); + + Map toJson() => _$TokenOIDCToJson(this); + @override List get props => [token, tokenId, expiredTime, refreshToken]; } @@ -25,9 +35,15 @@ extension TokenOIDCExtension on TokenOIDC { bool isTokenValid() => token.isNotEmpty && tokenId.uuid.isNotEmpty; - Token toToken() { - return Token(token, tokenId, refreshToken, expiredTime: expiredTime); - } - String get tokenIdHash => tokenId.uuid.hashCode.toString(); + + bool get isExpired { + if (expiredTime != null) { + final now = DateTime.now(); + log('TokenOIDC::isExpired(): TIME_NOW: $now'); + log('TokenOIDC::isExpired(): EXPIRED_DATE: $expiredTime'); + return expiredTime!.isBefore(now); + } + return false; + } } \ No newline at end of file