diff --git a/lib/features/login/data/datasource/authentication_oidc_datasource.dart b/lib/features/login/data/datasource/authentication_oidc_datasource.dart index c801ab3ea..d64a64243 100644 --- a/lib/features/login/data/datasource/authentication_oidc_datasource.dart +++ b/lib/features/login/data/datasource/authentication_oidc_datasource.dart @@ -37,5 +37,5 @@ abstract class AuthenticationOIDCDataSource { String discoveryUrl, List scopes); - Future getAuthenticationInfo(); + Future getAuthenticationInfo(); } \ 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 a979314c1..dbaa6e016 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 @@ -25,8 +25,7 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { @override Future checkOIDCIsAvailable(OIDCRequest oidcRequest) { return Future.sync(() async { - final oidcResponse = await _oidcHttpClient.checkOIDCIsAvailable(oidcRequest); - return oidcResponse!; + return await _oidcHttpClient.checkOIDCIsAvailable(oidcRequest); }).catchError(_exceptionThrower.throwException); } @@ -128,7 +127,7 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { } @override - Future getAuthenticationInfo() { + Future getAuthenticationInfo() { return Future.sync(() async { return await _authenticationClient.getAuthenticationInfo(); }).catchError(_exceptionThrower.throwException); diff --git a/lib/features/login/data/network/authentication_client/authentication_client_base.dart b/lib/features/login/data/network/authentication_client/authentication_client_base.dart index a129bb993..4ecc390f9 100644 --- a/lib/features/login/data/network/authentication_client/authentication_client_base.dart +++ b/lib/features/login/data/network/authentication_client/authentication_client_base.dart @@ -13,7 +13,7 @@ abstract class AuthenticationClientBase { String discoveryUrl, List scopes); - Future getAuthenticationInfo(); + Future getAuthenticationInfo(); Future getTokenOIDC( String clientId, diff --git a/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart b/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart index db4f90c04..2f20337af 100644 --- a/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart +++ b/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart @@ -93,8 +93,8 @@ class AuthenticationClientMobile implements AuthenticationClientBase { } @override - Future getAuthenticationInfo() { - return Future.value(null); + Future getAuthenticationInfo() { + return Future.value(''); } } diff --git a/lib/features/login/data/network/authentication_client/authentication_client_web.dart b/lib/features/login/data/network/authentication_client/authentication_client_web.dart index 919014ad0..ae134abcc 100644 --- a/lib/features/login/data/network/authentication_client/authentication_client_web.dart +++ b/lib/features/login/data/network/authentication_client/authentication_client_web.dart @@ -97,10 +97,14 @@ class AuthenticationClientWeb implements AuthenticationClientBase { } @override - Future getAuthenticationInfo() async { + Future getAuthenticationInfo() async { final authUrl = html.window.sessionStorage[OIDCConstant.authResponseKey]; log('AuthenticationClientWeb::getAuthenticationInfo(): authUrl: $authUrl'); - return authUrl; + if (authUrl != null && authUrl.isNotEmpty) { + return authUrl; + } else { + throw CanNotAuthenticationInfoOnWeb(); + } } } diff --git a/lib/features/login/data/network/oidc_error.dart b/lib/features/login/data/network/oidc_error.dart index 7e4464081..b18abf6c8 100644 --- a/lib/features/login/data/network/oidc_error.dart +++ b/lib/features/login/data/network/oidc_error.dart @@ -1 +1,5 @@ -class CanNotFoundOIDCAuthority implements Exception {} \ No newline at end of file +class CanNotFoundOIDCAuthority implements Exception {} + +class CanNotFoundOIDCLinks implements Exception {} + +class CanNotFoundToken implements Exception {} \ No newline at end of file diff --git a/lib/features/login/data/network/oidc_http_client.dart b/lib/features/login/data/network/oidc_http_client.dart index db372d8e7..808940c68 100644 --- a/lib/features/login/data/network/oidc_http_client.dart +++ b/lib/features/login/data/network/oidc_http_client.dart @@ -20,7 +20,7 @@ class OIDCHttpClient { OIDCHttpClient(this._dioClient); - Future checkOIDCIsAvailable(OIDCRequest oidcRequest) async { + Future checkOIDCIsAvailable(OIDCRequest oidcRequest) async { final result = await _dioClient.get( Endpoint.webFinger .generateOIDCPath(Uri.parse(oidcRequest.baseUrl)) @@ -31,10 +31,14 @@ class OIDCHttpClient { .generateEndpointPath() ); log('OIDCHttpClient::checkOIDCIsAvailable(): RESULT: $result'); - if (result is Map) { - return OIDCResponse.fromJson(result); + if (result != null) { + if (result is Map) { + return OIDCResponse.fromJson(result); + } else { + return OIDCResponse.fromJson(jsonDecode(result)); + } } else { - return OIDCResponse.fromJson(jsonDecode(result)); + throw CanNotFoundOIDCLinks(); } } 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 8e709a240..1d79b8cfb 100644 --- a/lib/features/login/data/repository/authentication_oidc_repository_impl.dart +++ b/lib/features/login/data/repository/authentication_oidc_repository_impl.dart @@ -86,7 +86,7 @@ class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository { } @override - Future getAuthenticationInfo() { + Future getAuthenticationInfo() { return _oidcDataSource.getAuthenticationInfo(); } diff --git a/lib/features/login/domain/exceptions/authentication_exception.dart b/lib/features/login/domain/exceptions/authentication_exception.dart index 87ff5b2c7..35604d7aa 100644 --- a/lib/features/login/domain/exceptions/authentication_exception.dart +++ b/lib/features/login/domain/exceptions/authentication_exception.dart @@ -23,13 +23,9 @@ class BadGateway extends AuthenticationException { List get props => [message]; } -class NotFoundAuthenticatedAccountException implements Exception { - NotFoundAuthenticatedAccountException(); -} +class NotFoundAuthenticatedAccountException implements Exception {} -class NotFoundStoredTokenException implements Exception { - NotFoundStoredTokenException(); -} +class NotFoundStoredTokenException implements Exception {} class InvalidBaseUrl extends AuthenticationException { InvalidBaseUrl() : super(AuthenticationException.invalidBaseUrl); @@ -38,17 +34,21 @@ class InvalidBaseUrl extends AuthenticationException { List get props => [message]; } -class NotFoundAccessTokenException implements Exception { - NotFoundAccessTokenException(); -} +class NotFoundAccessTokenException implements Exception {} -class AccessTokenInvalidException implements Exception { - AccessTokenInvalidException(); -} +class AccessTokenInvalidException implements Exception {} class DownloadAttachmentHasTokenExpiredException implements Exception { final String refreshToken; DownloadAttachmentHasTokenExpiredException(this.refreshToken); -} \ No newline at end of file +} + +class CanNotFoundBaseUrl implements Exception {} + +class CanNotFoundUserName implements Exception {} + +class CanNotFoundPassword implements Exception {} + +class CanNotAuthenticationInfoOnWeb implements Exception {} \ 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 dd6eafa9c..11fa3fee3 100644 --- a/lib/features/login/domain/repository/authentication_oidc_repository.dart +++ b/lib/features/login/domain/repository/authentication_oidc_repository.dart @@ -37,5 +37,5 @@ abstract class AuthenticationOIDCRepository { String discoveryUrl, List scopes); - Future getAuthenticationInfo(); + Future getAuthenticationInfo(); } \ No newline at end of file diff --git a/lib/features/login/domain/state/authentication_user_state.dart b/lib/features/login/domain/state/authentication_user_state.dart index 22f29ff6d..36c739a35 100644 --- a/lib/features/login/domain/state/authentication_user_state.dart +++ b/lib/features/login/domain/state/authentication_user_state.dart @@ -18,9 +18,8 @@ class AuthenticationUserSuccess extends UIState { } class AuthenticationUserFailure extends FeatureFailure { - final dynamic exception; - AuthenticationUserFailure(this.exception); + AuthenticationUserFailure(dynamic exception) : super(exception: exception); @override List get props => [exception]; diff --git a/lib/features/login/domain/state/check_oidc_is_available_state.dart b/lib/features/login/domain/state/check_oidc_is_available_state.dart index 8518d9e65..a2e6bb419 100644 --- a/lib/features/login/domain/state/check_oidc_is_available_state.dart +++ b/lib/features/login/domain/state/check_oidc_is_available_state.dart @@ -20,9 +20,8 @@ class CheckOIDCIsAvailableSuccess extends UIState { } class CheckOIDCIsAvailableFailure extends FeatureFailure { - final dynamic exception; - CheckOIDCIsAvailableFailure(this.exception); + CheckOIDCIsAvailableFailure(dynamic exception) : super(exception: exception); @override List get props => [exception]; diff --git a/lib/features/login/domain/state/get_authentication_info_state.dart b/lib/features/login/domain/state/get_authentication_info_state.dart index 15eb83517..880614df3 100644 --- a/lib/features/login/domain/state/get_authentication_info_state.dart +++ b/lib/features/login/domain/state/get_authentication_info_state.dart @@ -19,9 +19,8 @@ class GetAuthenticationInfoSuccess extends UIState { } class GetAuthenticationInfoFailure extends FeatureFailure { - final dynamic exception; - GetAuthenticationInfoFailure(this.exception); + GetAuthenticationInfoFailure(dynamic exception) : super(exception: exception); @override List get props => [exception]; diff --git a/lib/features/login/domain/state/get_oidc_configuration_state.dart b/lib/features/login/domain/state/get_oidc_configuration_state.dart index 771328f00..9ce7f5bba 100644 --- a/lib/features/login/domain/state/get_oidc_configuration_state.dart +++ b/lib/features/login/domain/state/get_oidc_configuration_state.dart @@ -20,9 +20,8 @@ class GetOIDCConfigurationSuccess extends UIState { } class GetOIDCConfigurationFailure extends FeatureFailure { - final dynamic exception; - GetOIDCConfigurationFailure(this.exception); + GetOIDCConfigurationFailure(dynamic exception) : super(exception: exception); @override List get props => [exception]; diff --git a/lib/features/login/domain/state/get_oidc_is_available_state.dart b/lib/features/login/domain/state/get_oidc_is_available_state.dart index 5ec421d78..67136cd7c 100644 --- a/lib/features/login/domain/state/get_oidc_is_available_state.dart +++ b/lib/features/login/domain/state/get_oidc_is_available_state.dart @@ -20,9 +20,8 @@ class GetOIDCIsAvailableSuccess extends UIState { } class GetOIDCIsAvailableFailure extends FeatureFailure { - final dynamic exception; - GetOIDCIsAvailableFailure(this.exception); + GetOIDCIsAvailableFailure(dynamic exception) : super(exception: exception); @override List get props => [exception]; diff --git a/lib/features/login/domain/state/get_token_oidc_state.dart b/lib/features/login/domain/state/get_token_oidc_state.dart index 2d2d11ff3..ea1f187d9 100644 --- a/lib/features/login/domain/state/get_token_oidc_state.dart +++ b/lib/features/login/domain/state/get_token_oidc_state.dart @@ -21,9 +21,8 @@ class GetTokenOIDCSuccess extends UIState { } class GetTokenOIDCFailure extends FeatureFailure { - final dynamic exception; - GetTokenOIDCFailure(this.exception); + GetTokenOIDCFailure(dynamic exception) : super(exception: exception); @override List get props => [exception]; diff --git a/lib/features/login/domain/usecases/authentication_user_interactor.dart b/lib/features/login/domain/usecases/authentication_user_interactor.dart index 3277c6407..5e698e41b 100644 --- a/lib/features/login/domain/usecases/authentication_user_interactor.dart +++ b/lib/features/login/domain/usecases/authentication_user_interactor.dart @@ -7,6 +7,7 @@ import 'package:model/account/authentication_type.dart'; import 'package:model/account/password.dart'; import 'package:model/account/personal_account.dart'; import 'package:tmail_ui_user/features/login/data/model/authentication_info_cache.dart'; +import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.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'; @@ -23,20 +24,31 @@ class AuthenticationInteractor { this._accountRepository ); - Stream> execute(Uri baseUrl, UserName userName, Password password) async* { + Stream> execute({Uri? baseUrl, UserName? userName, Password? password}) async* { try { yield Right(AuthenticationUserLoading()); - final user = await authenticationRepository.authenticationUser(baseUrl, userName, password); - await Future.wait([ - credentialRepository.saveBaseUrl(baseUrl), - credentialRepository.storeAuthenticationInfo(AuthenticationInfoCache(userName.value, password.value)), - _accountRepository.setCurrentAccount(PersonalAccount( - userName.value, - AuthenticationType.basic, - isSelected: true - )) - ]); - yield Right(AuthenticationUserSuccess(user)); + + if (baseUrl != null && userName != null && password != null) { + final user = await authenticationRepository.authenticationUser(baseUrl, userName, password); + await Future.wait([ + credentialRepository.saveBaseUrl(baseUrl), + credentialRepository.storeAuthenticationInfo(AuthenticationInfoCache(userName.value, password.value)), + _accountRepository.setCurrentAccount(PersonalAccount( + userName.value, + AuthenticationType.basic, + isSelected: true + )) + ]); + yield Right(AuthenticationUserSuccess(user)); + } else if (baseUrl == null) { + yield Left(AuthenticationUserFailure(CanNotFoundBaseUrl())); + } else if (userName == null) { + yield Left(AuthenticationUserFailure(CanNotFoundUserName())); + } else if (password == null) { + yield Left(AuthenticationUserFailure(CanNotFoundPassword())); + } else { + yield Left(AuthenticationUserFailure(null)); + } } catch (e) { logError('AuthenticationInteractor::execute(): $e'); yield Left(AuthenticationUserFailure(e)); diff --git a/lib/features/login/domain/usecases/get_authentication_info_interactor.dart b/lib/features/login/domain/usecases/get_authentication_info_interactor.dart index e33c8d707..75286c640 100644 --- a/lib/features/login/domain/usecases/get_authentication_info_interactor.dart +++ b/lib/features/login/domain/usecases/get_authentication_info_interactor.dart @@ -15,11 +15,7 @@ class GetAuthenticationInfoInteractor { yield Right(GetAuthenticationInfoLoading()); final result = await _oidcRepository.getAuthenticationInfo(); log('GetAuthenticationInfoInteractor::execute(): result: $result'); - if (result?.isNotEmpty == true) { - yield Right(GetAuthenticationInfoSuccess()); - } else { - yield Left(GetAuthenticationInfoFailure(null)); - } + yield Right(GetAuthenticationInfoSuccess()); } catch (e) { log('GetAuthenticationInfoInteractor::execute(): ERROR: $e'); yield Left(GetAuthenticationInfoFailure(e)); diff --git a/lib/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart b/lib/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart index 9655a1e1a..235f366a7 100644 --- a/lib/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart +++ b/lib/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart @@ -10,12 +10,12 @@ class SaveLoginUrlOnMobileInteractor { SaveLoginUrlOnMobileInteractor(this.loginUrlRepository); - Stream> execute(RecentLoginUrl recentLoginUrl) async* { + Future> execute(RecentLoginUrl recentLoginUrl) async { try{ await loginUrlRepository.saveRecentLoginUrl(recentLoginUrl); - yield Right(SaveRecentLoginUrlSuccess()); + return Right(SaveRecentLoginUrlSuccess()); } catch(e) { - yield Left(SaveRecentLoginUrlFailed(e)); + return Left(SaveRecentLoginUrlFailed(e)); } } } \ No newline at end of file diff --git a/lib/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart b/lib/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart index dc29054f0..41597ba25 100644 --- a/lib/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart +++ b/lib/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart @@ -9,12 +9,12 @@ class SaveLoginUsernameOnMobileInteractor { SaveLoginUsernameOnMobileInteractor(this.loginUsernameRepository); - Stream> execute(RecentLoginUsername recentLoginUsername) async* { + Future> execute(RecentLoginUsername recentLoginUsername) async { try { await loginUsernameRepository.saveLoginUsername(recentLoginUsername); - yield Right(SaveRecentLoginUsernameSuccess()); + return Right(SaveRecentLoginUsernameSuccess()); } catch(exception) { - yield Left(SaveRecentLoginUsernameFailed(exception)); + return Left(SaveRecentLoginUsernameFailed(exception)); } } } \ No newline at end of file