From 02a5fa4b4fa2fde1511953cca68d29168bf53268 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 3 Jun 2022 17:15:39 +0700 Subject: [PATCH] TF-606 Implement store/get authority oidc --- .../home/presentation/home_bindings.dart | 4 ++- .../authentication_oidc_datasource.dart | 4 +++ .../authentication_oidc_datasource_impl.dart | 17 ++++++++++- .../oidc_configuration_cache_manager.dart | 28 +++++++++++++++++++ .../data/network/config/oidc_constant.dart | 1 + .../authentication_oidc_repository_impl.dart | 10 +++++++ .../authentication_oidc_repository.dart | 4 +++ .../state/get_stored_token_oidc_state.dart | 10 ++++--- .../get_stored_token_oidc_interactor.dart | 12 +++++--- .../login/presentation/login_bindings.dart | 4 ++- lib/main/bindings/local/local_bindings.dart | 3 ++ 11 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 lib/features/login/data/local/oidc_configuration_cache_manager.dart diff --git a/lib/features/home/presentation/home_bindings.dart b/lib/features/home/presentation/home_bindings.dart index b12706051..dfc879d91 100644 --- a/lib/features/home/presentation/home_bindings.dart +++ b/lib/features/home/presentation/home_bindings.dart @@ -14,6 +14,7 @@ import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc 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/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; @@ -60,7 +61,8 @@ class HomeBindings extends BaseBindings { )); Get.lazyPut(() => AuthenticationOIDCDataSourceImpl( Get.find(), - Get.find() + Get.find(), + Get.find() )); } diff --git a/lib/features/login/data/datasource/authentication_oidc_datasource.dart b/lib/features/login/data/datasource/authentication_oidc_datasource.dart index 42e0c75b1..4744c7462 100644 --- a/lib/features/login/data/datasource/authentication_oidc_datasource.dart +++ b/lib/features/login/data/datasource/authentication_oidc_datasource.dart @@ -11,4 +11,8 @@ abstract class AuthenticationOIDCDataSource { Future persistTokenOIDC(TokenOIDC tokenOidc); Future getStoredTokenOIDC(String tokenIdHash); + + Future persistAuthorityOidc(String authority); + + Future getStoredOidcConfiguration(); } \ 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 c1fd03c0b..1862f9aff 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 @@ -1,5 +1,6 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.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'; @@ -7,8 +8,12 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { final OIDCHttpClient _oidcHttpClient; final TokenOidcCacheManager _tokenOidcCacheManager; + final OidcConfigurationCacheManager _oidcConfigurationCacheManager; - AuthenticationOIDCDataSourceImpl(this._oidcHttpClient, this._tokenOidcCacheManager); + AuthenticationOIDCDataSourceImpl( + this._oidcHttpClient, + this._tokenOidcCacheManager, + this._oidcConfigurationCacheManager); @override Future checkOIDCIsAvailable(OIDCRequest oidcRequest) { @@ -47,4 +52,14 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { Future persistTokenOIDC(TokenOIDC tokenOidc) async { return _tokenOidcCacheManager.persistOneTokenOidc(tokenOidc); } + + @override + Future getStoredOidcConfiguration() { + return _oidcConfigurationCacheManager.getOidcConfiguration(); + } + + @override + Future persistAuthorityOidc(String authority) { + return _oidcConfigurationCacheManager.persistAuthorityOidc(authority); + } } \ 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 new file mode 100644 index 000000000..90b7dfc14 --- /dev/null +++ b/lib/features/login/data/local/oidc_configuration_cache_manager.dart @@ -0,0 +1,28 @@ +import 'package:core/utils/app_logger.dart'; +import 'package:model/oidc/oidc_configuration.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart'; +import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart'; + +class OidcConfigurationCacheManager { + final SharedPreferences _sharedPreferences; + + OidcConfigurationCacheManager(this._sharedPreferences); + + Future getOidcConfiguration() async { + final authority = _sharedPreferences.getString(OIDCConstant.keyAuthorityOidc); + if (authority == null || authority.isEmpty) { + throw CanNotFoundOIDCAuthority(); + } else { + return OIDCConfiguration( + authority: authority, + clientId: OIDCConstant.mobileOidcClientId, + scopes: OIDCConstant.oidcScope); + } + } + + Future persistAuthorityOidc(String authority) async { + log('OidcConfigurationCacheManager::persistAuthorityOidc(): $authority'); + await _sharedPreferences.setString(OIDCConstant.keyAuthorityOidc, authority); + } +} \ No newline at end of file diff --git a/lib/features/login/data/network/config/oidc_constant.dart b/lib/features/login/data/network/config/oidc_constant.dart index 3c1cfb3fe..373f84c62 100644 --- a/lib/features/login/data/network/config/oidc_constant.dart +++ b/lib/features/login/data/network/config/oidc_constant.dart @@ -1,4 +1,5 @@ class OIDCConstant { static String get mobileOidcClientId => 'teammail-mobile'; static List get oidcScope => ['openid', 'offline_access']; + static const keyAuthorityOidc = 'KEY_AUTHORITY_OIDC'; } \ 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 41dc4cd75..688ea57ba 100644 --- a/lib/features/login/data/repository/authentication_oidc_repository_impl.dart +++ b/lib/features/login/data/repository/authentication_oidc_repository_impl.dart @@ -34,4 +34,14 @@ class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository { Future persistTokenOIDC(TokenOIDC tokenOidc) { return _oidcDataSource.persistTokenOIDC(tokenOidc); } + + @override + Future getStoredOidcConfiguration() { + return _oidcDataSource.getStoredOidcConfiguration(); + } + + @override + Future persistAuthorityOidc(String authority) { + return _oidcDataSource.persistAuthorityOidc(authority); + } } \ 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 ebea5a7b3..5fa3e2037 100644 --- a/lib/features/login/domain/repository/authentication_oidc_repository.dart +++ b/lib/features/login/domain/repository/authentication_oidc_repository.dart @@ -11,4 +11,8 @@ abstract class AuthenticationOIDCRepository { Future persistTokenOIDC(TokenOIDC tokenOidc); Future getStoredTokenOIDC(String tokenIdHash); + + Future persistAuthorityOidc(String authority); + + Future getStoredOidcConfiguration(); } \ No newline at end of file diff --git a/lib/features/login/domain/state/get_stored_token_oidc_state.dart b/lib/features/login/domain/state/get_stored_token_oidc_state.dart index 554301576..958f74d36 100644 --- a/lib/features/login/domain/state/get_stored_token_oidc_state.dart +++ b/lib/features/login/domain/state/get_stored_token_oidc_state.dart @@ -1,19 +1,21 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; +import 'package:model/oidc/oidc_configuration.dart'; import 'package:model/oidc/token_oidc.dart'; class GetStoredTokenOidcSuccess extends UIState { final Uri baseUrl; final TokenOIDC tokenOidc; + final OIDCConfiguration oidcConfiguration; - GetStoredTokenOidcSuccess(this.baseUrl, this.tokenOidc); + GetStoredTokenOidcSuccess(this.baseUrl, this.tokenOidc, this.oidcConfiguration); @override - List get props => [baseUrl, tokenOidc]; + List get props => [baseUrl, tokenOidc, oidcConfiguration]; } class GetStoredTokenOidcFailure extends FeatureFailure { - final exception; + final dynamic exception; GetStoredTokenOidcFailure(this.exception); @@ -22,4 +24,4 @@ class GetStoredTokenOidcFailure extends FeatureFailure { @override List get props => [exception]; -} +} \ No newline at end of file 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 6ab5f1cf9..00c89ef5a 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 @@ -2,6 +2,7 @@ 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/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/extensions/uri_extension.dart'; @@ -20,15 +21,18 @@ class GetStoredTokenOidcInteractor { yield Right(LoadingState()); final futureValue = await Future.wait([ _credentialRepository.getBaseUrl(), - _authenticationOIDCRepository.getStoredTokenOIDC(tokenIdHash) + _authenticationOIDCRepository.getStoredTokenOIDC(tokenIdHash), + _authenticationOIDCRepository.getStoredOidcConfiguration(), ], eagerError: true); - final baseUrl = futureValue.first as Uri; - final tokenOidc = futureValue.last as TokenOIDC; + final baseUrl = futureValue[0] as Uri; + final tokenOidc = futureValue[1] as TokenOIDC; + final oidcConfiguration = futureValue[2] as OIDCConfiguration; log('GetStoredTokenOidcInteractor::execute(): $tokenOidc'); + log('GetStoredTokenOidcInteractor::execute(): oidcConfiguration: $oidcConfiguration'); if (_isCredentialValid(baseUrl)) { - yield Right(GetStoredTokenOidcSuccess(baseUrl, tokenOidc)); + yield Right(GetStoredTokenOidcSuccess(baseUrl, tokenOidc, oidcConfiguration)); } else { yield Left(GetStoredTokenOidcFailure(const InvalidBaseUrl())); } diff --git a/lib/features/login/presentation/login_bindings.dart b/lib/features/login/presentation/login_bindings.dart index 92879409b..896db8907 100644 --- a/lib/features/login/presentation/login_bindings.dart +++ b/lib/features/login/presentation/login_bindings.dart @@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication 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/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; @@ -52,7 +53,8 @@ class LoginBindings extends BaseBindings { Get.lazyPut(() => AuthenticationDataSourceImpl()); Get.lazyPut(() => AuthenticationOIDCDataSourceImpl( Get.find(), - Get.find() + Get.find(), + Get.find() )); Get.lazyPut(() => HiveAccountDatasourceImpl( Get.find() diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index d27c0884a..d249b48b8 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:get/get.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:tmail_ui_user/features/caching/account_cache_client.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/caching/email_cache_client.dart'; @@ -10,6 +11,7 @@ import 'package:tmail_ui_user/features/caching/state_cache_client.dart'; import 'package:tmail_ui_user/features/caching/token_oidc_cache_client.dart'; import 'package:tmail_ui_user/features/cleanup/data/local/recent_search_cache_manager.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/mailbox/data/local/mailbox_cache_manager.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; @@ -38,6 +40,7 @@ class LocalBindings extends Bindings { Get.put(TokenOidcCacheManager(Get.find())); Get.put(AccountCacheClient()); Get.put(AccountCacheManager(Get.find())); + Get.put(OidcConfigurationCacheManager(Get.find())); Get.put(CachingManager( Get.find(), Get.find(),