From b95d294a3cd7b753ced86cf4cb0b26034b2d2850 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 6 Sep 2022 19:04:57 +0700 Subject: [PATCH] TF-886 Implement StoreAuthenticationInfo in repository and datasource --- .../caching/config/hive_cache_config.dart | 20 +++++++++++++++++++ .../email/presentation/email_bindings.dart | 5 ++++- .../authentication_info_cache_manager.dart | 14 +++++++++++++ .../credential_repository_impl.dart | 13 +++++++++++- .../login/data/utils/login_constant.dart | 7 +++---- .../repository/credential_repository.dart | 7 +++---- .../authentication_user_interactor.dart | 5 +++-- .../login/presentation/login_bindings.dart | 5 ++++- .../presentation/mailbox_bindings.dart | 5 ++++- .../credential/credential_bindings.dart | 5 ++++- lib/main/bindings/local/local_bindings.dart | 5 +++++ 11 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 lib/features/login/data/local/authentication_info_cache_manager.dart diff --git a/lib/features/caching/config/hive_cache_config.dart b/lib/features/caching/config/hive_cache_config.dart index f3b75f1ed..5faef4150 100644 --- a/lib/features/caching/config/hive_cache_config.dart +++ b/lib/features/caching/config/hive_cache_config.dart @@ -1,10 +1,16 @@ +import 'dart:convert'; import 'dart:io'; +import 'dart:typed_data'; +import 'package:core/utils/app_logger.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:path_provider/path_provider.dart' as path_provider; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:tmail_ui_user/features/login/data/model/account_cache.dart'; +import 'package:tmail_ui_user/features/login/data/model/authentication_info_cache.dart'; import 'package:tmail_ui_user/features/login/data/model/token_oidc_cache.dart'; +import 'package:tmail_ui_user/features/login/data/utils/login_constant.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_cache.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_rights_cache.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/state_cache.dart'; @@ -31,6 +37,19 @@ class HiveCacheConfig { } } + static Future getEncryptionKey() async { + final sharedPreference = Get.find(); + final containsEncryptionKey = sharedPreference.containsKey(LoginConstant.keyHiveEncrypt); + if (!containsEncryptionKey) { + final key = Hive.generateSecureKey(); + await sharedPreference.setString(LoginConstant.keyHiveEncrypt, base64UrlEncode(key)); + } + final keyStored = sharedPreference.getString(LoginConstant.keyHiveEncrypt) ?? ''; + final encryptionKey = base64Url.decode(keyStored); + log('HiveCacheConfig::getEncryptionKey(): Encryption key: $encryptionKey'); + return encryptionKey; + } + void registerAdapter() { Hive.registerAdapter(MailboxCacheAdapter()); Hive.registerAdapter(MailboxRightsCacheAdapter()); @@ -41,6 +60,7 @@ class HiveCacheConfig { Hive.registerAdapter(RecentSearchCacheAdapter()); Hive.registerAdapter(TokenOidcCacheAdapter()); Hive.registerAdapter(AccountCacheAdapter()); + Hive.registerAdapter(AuthenticationInfoCacheAdapter()); } Future closeHive() async { diff --git a/lib/features/email/presentation/email_bindings.dart b/lib/features/email/presentation/email_bindings.dart index 6869d914e..a538b4ccf 100644 --- a/lib/features/email/presentation/email_bindings.dart +++ b/lib/features/email/presentation/email_bindings.dart @@ -24,6 +24,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/authentication_info_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/authentication_client/authentication_client_base.dart'; @@ -149,7 +150,9 @@ class EmailBindings extends BaseBindings { Get.find(), Get.find() )); - Get.lazyPut(() => CredentialRepositoryImpl(Get.find())); + Get.lazyPut(() => CredentialRepositoryImpl( + Get.find(), + Get.find(),)); Get.lazyPut(() => AccountRepositoryImpl(Get.find())); Get.lazyPut(() => AuthenticationOIDCRepositoryImpl(Get.find())); } diff --git a/lib/features/login/data/local/authentication_info_cache_manager.dart b/lib/features/login/data/local/authentication_info_cache_manager.dart new file mode 100644 index 000000000..15cc374f3 --- /dev/null +++ b/lib/features/login/data/local/authentication_info_cache_manager.dart @@ -0,0 +1,14 @@ +import 'package:tmail_ui_user/features/caching/authentication_info_cache_client.dart'; +import 'package:tmail_ui_user/features/login/data/model/authentication_info_cache.dart'; + +class AuthenticationInfoCacheManager { + final AuthenticationInfoCacheClient _authenticationInfoCacheClient; + + AuthenticationInfoCacheManager(this._authenticationInfoCacheClient); + + Future storeAuthenticationInfo(AuthenticationInfoCache authenticationInfoCache) { + return _authenticationInfoCacheClient.insertItem( + AuthenticationInfoCache.keyCacheValue, + authenticationInfoCache); + } +} \ No newline at end of file diff --git a/lib/features/login/data/repository/credential_repository_impl.dart b/lib/features/login/data/repository/credential_repository_impl.dart index 158ae927f..10326698a 100644 --- a/lib/features/login/data/repository/credential_repository_impl.dart +++ b/lib/features/login/data/repository/credential_repository_impl.dart @@ -2,14 +2,20 @@ import 'dart:convert'; import 'package:model/model.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tmail_ui_user/features/login/data/local/authentication_info_cache_manager.dart'; +import 'package:tmail_ui_user/features/login/data/model/authentication_info_cache.dart'; import 'package:tmail_ui_user/features/login/data/utils/login_constant.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; class CredentialRepositoryImpl extends CredentialRepository { final SharedPreferences sharedPreferences; + final AuthenticationInfoCacheManager _authenticationInfoCacheManager; - CredentialRepositoryImpl(this.sharedPreferences); + CredentialRepositoryImpl( + this.sharedPreferences, + this._authenticationInfoCacheManager + ); @override Future getBaseUrl() async { @@ -74,4 +80,9 @@ class CredentialRepositoryImpl extends CredentialRepository { final json = jsonEncode(userProfileResponse.toJson()); await sharedPreferences.setString(LoginConstant.keyUserProfile, json); } + + @override + Future storeAuthenticationInfo(AuthenticationInfoCache authenticationInfoCache) { + return _authenticationInfoCacheManager.storeAuthenticationInfo(authenticationInfoCache); + } } \ No newline at end of file diff --git a/lib/features/login/data/utils/login_constant.dart b/lib/features/login/data/utils/login_constant.dart index bd3637feb..27e6268df 100644 --- a/lib/features/login/data/utils/login_constant.dart +++ b/lib/features/login/data/utils/login_constant.dart @@ -1,6 +1,5 @@ + class LoginConstant { - static const keyBaseUrl = 'KEY_BASE_URL'; - static const keyUserName = 'KEY_USER_NAME'; - static const keyPassword = 'KEY_PASSWORD'; - static const keyUserProfile = 'KEY_USER_PROFILE'; + static const String keyBaseUrl = 'KEY_BASE_URL'; + static const String keyHiveEncrypt = 'KEY_HIVE_ENCRYPT'; } \ No newline at end of file diff --git a/lib/features/login/domain/repository/credential_repository.dart b/lib/features/login/domain/repository/credential_repository.dart index abfafd672..b688a62ab 100644 --- a/lib/features/login/domain/repository/credential_repository.dart +++ b/lib/features/login/domain/repository/credential_repository.dart @@ -1,4 +1,5 @@ import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/login/data/model/authentication_info_cache.dart'; abstract class CredentialRepository { Future saveBaseUrl(Uri baseUrl); @@ -7,14 +8,10 @@ abstract class CredentialRepository { Future getBaseUrl(); - Future saveUserName(UserName userName); - Future removeUserName(); Future getUserName(); - Future savePassword(Password password); - Future removePassword(); Future getPassword(); @@ -24,4 +21,6 @@ abstract class CredentialRepository { Future removeUserProfile(); Future getUserProfile(); + + Future storeAuthenticationInfo(AuthenticationInfoCache authenticationInfoCache); } \ No newline at end of file diff --git a/lib/features/login/domain/usecases/authentication_user_interactor.dart b/lib/features/login/domain/usecases/authentication_user_interactor.dart index 607d8e4c7..e1a1ed44f 100644 --- a/lib/features/login/domain/usecases/authentication_user_interactor.dart +++ b/lib/features/login/domain/usecases/authentication_user_interactor.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/login/data/model/authentication_info_cache.dart'; import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/authentication_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; @@ -19,8 +20,8 @@ class AuthenticationInteractor { final user = await authenticationRepository.authenticationUser(baseUrl, userName, password); await Future.wait([ credentialRepository.saveBaseUrl(baseUrl), - credentialRepository.saveUserName(userName), - credentialRepository.savePassword(password), + credentialRepository.storeAuthenticationInfo( + AuthenticationInfoCache(userName.userName, password.value)), credentialRepository.saveUserProfile(user), _accountRepository.setCurrentAccount(Account( userName.userName, diff --git a/lib/features/login/presentation/login_bindings.dart b/lib/features/login/presentation/login_bindings.dart index 39d569b0d..d4ed55c5e 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/authentication_info_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/authentication_client/authentication_client_base.dart'; @@ -110,7 +111,9 @@ class LoginBindings extends BaseBindings { @override void bindingsRepositoryImpl() { - Get.lazyPut(() => CredentialRepositoryImpl(Get.find())); + Get.lazyPut(() => CredentialRepositoryImpl( + Get.find(), + Get.find())); Get.lazyPut(() => AuthenticationRepositoryImpl(Get.find())); Get.lazyPut(() => AuthenticationOIDCRepositoryImpl(Get.find())); Get.lazyPut(() => AccountRepositoryImpl(Get.find())); diff --git a/lib/features/mailbox/presentation/mailbox_bindings.dart b/lib/features/mailbox/presentation/mailbox_bindings.dart index a1428bae5..2ccfcc354 100644 --- a/lib/features/mailbox/presentation/mailbox_bindings.dart +++ b/lib/features/mailbox/presentation/mailbox_bindings.dart @@ -6,6 +6,7 @@ import 'package:tmail_ui_user/features/caching/state_cache_client.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; +import 'package:tmail_ui_user/features/login/data/local/authentication_info_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.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'; @@ -97,7 +98,9 @@ class MailboxBindings extends BaseBindings { @override void bindingsRepositoryImpl() { - Get.lazyPut(() => CredentialRepositoryImpl(Get.find())); + Get.lazyPut(() => CredentialRepositoryImpl( + Get.find(), + Get.find())); Get.lazyPut(() => MailboxRepositoryImpl( { DataSourceType.network: Get.find(), diff --git a/lib/main/bindings/credential/credential_bindings.dart b/lib/main/bindings/credential/credential_bindings.dart index e8e201f4d..f8e6ff0c1 100644 --- a/lib/main/bindings/credential/credential_bindings.dart +++ b/lib/main/bindings/credential/credential_bindings.dart @@ -1,5 +1,6 @@ import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tmail_ui_user/features/login/data/local/authentication_info_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart'; @@ -22,6 +23,8 @@ class CredentialBindings extends Bindings { } void bindingsRepositoryImpl() { - Get.put(CredentialRepositoryImpl(Get.find())); + Get.put(CredentialRepositoryImpl( + Get.find(), + Get.find())); } } \ No newline at end of file diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index d6112bc5d..8903ad095 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -3,6 +3,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/authentication_info_cache_client.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/caching/email_cache_client.dart'; import 'package:tmail_ui_user/features/caching/mailbox_cache_client.dart'; @@ -11,6 +12,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/authentication_info_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'; @@ -40,7 +42,9 @@ class LocalBindings extends Bindings { Get.put(TokenOidcCacheClient()); Get.put(TokenOidcCacheManager(Get.find())); Get.put(AccountCacheClient()); + Get.put(AuthenticationInfoCacheClient()); Get.put(AccountCacheManager(Get.find())); + Get.put(AuthenticationInfoCacheManager(Get.find())); Get.put(OidcConfigurationCacheManager(Get.find())); Get.put(LanguageCacheManager(Get.find())); Get.put(CachingManager( @@ -50,6 +54,7 @@ class LocalBindings extends Bindings { Get.find(), Get.find(), Get.find(), + Get.find(), )); } } \ No newline at end of file