Handle web finger to get token in HomeController

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-07-02 15:54:29 +07:00
committed by Dat H. Pham
parent fc2265b5e5
commit 9a2f0aa356
26 changed files with 323 additions and 113 deletions
@@ -158,4 +158,24 @@ abstract class ReloadableController extends BaseController {
failure is GetStoredTokenOidcFailure || failure is GetStoredTokenOidcFailure ||
failure is GetAuthenticatedAccountFailure; failure is GetAuthenticatedAccountFailure;
} }
void synchronizeTokenAndGetSession({
required Uri baseUri,
required TokenOIDC tokenOIDC,
required OIDCConfiguration oidcConfiguration,
}) {
final baseUrl = baseUri.toString();
dynamicUrlInterceptors.setJmapUrl(baseUrl);
dynamicUrlInterceptors.changeBaseUrl(baseUrl);
authorizationInterceptors.setTokenAndAuthorityOidc(
newToken: tokenOIDC,
newConfig: oidcConfiguration,
);
authorizationIsolateInterceptors.setTokenAndAuthorityOidc(
newToken: tokenOIDC,
newConfig: oidcConfiguration,
);
getSessionAction();
}
} }
@@ -53,7 +53,7 @@ abstract class HiveCacheClient<T> {
T newObject, { T newObject, {
bool isolated = true, bool isolated = true,
}) { }) {
log('$runtimeType::insertItem:encryption: $encryption - key = $key - isolated'); log('$runtimeType::insertItem:encryption: $encryption - key = $key - isolated = $isolated');
return Future.sync(() async { return Future.sync(() async {
if (isolated) { if (isolated) {
final boxItem = await openIsolatedBox(); final boxItem = await openIsolatedBox();
@@ -5,12 +5,14 @@ import 'package:universal_html/html.dart' as html;
class SessionStorageManager { class SessionStorageManager {
void save(String key, String value) { final html.Storage sessionStorage = html.window.sessionStorage;
html.window.sessionStorage.addAll({key: value});
Future<void> save(String key, String value) async {
return sessionStorage.addAll({key: value});
} }
String get(String key) { Future<String> get(String key) async {
final entry = html.window.sessionStorage final entry = sessionStorage
.entries .entries
.firstWhereOrNull((entry) => entry.key == key); .firstWhereOrNull((entry) => entry.key == key);
@@ -21,7 +23,9 @@ class SessionStorageManager {
} }
} }
void remove(String key) { Future<void> remove(String key) async {
html.window.sessionStorage.remove(key); if (sessionStorage.containsKey(key)) {
sessionStorage.remove(key);
}
} }
} }
@@ -218,7 +218,7 @@ class EmailSessionStorageDatasourceImpl extends EmailDataSource {
@override @override
Future<void> storePreviewEMLContentToSessionStorage(EMLPreviewer emlPreviewer) { Future<void> storePreviewEMLContentToSessionStorage(EMLPreviewer emlPreviewer) {
return Future.sync(() async { return Future.sync(() async {
return _sessionStorageManager.save( return await _sessionStorageManager.save(
emlPreviewer.id, emlPreviewer.id,
jsonEncode(emlPreviewer.toJson()), jsonEncode(emlPreviewer.toJson()),
); );
@@ -233,7 +233,7 @@ class EmailSessionStorageDatasourceImpl extends EmailDataSource {
@override @override
Future<EMLPreviewer> getPreviewEMLContentInMemory(String keyStored) { Future<EMLPreviewer> getPreviewEMLContentInMemory(String keyStored) {
return Future.sync(() async { return Future.sync(() async {
final data = _sessionStorageManager.get(keyStored); final data = await _sessionStorageManager.get(keyStored);
return EMLPreviewer.fromJson(jsonDecode(data)); return EMLPreviewer.fromJson(jsonDecode(data));
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@@ -0,0 +1,69 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/utils/platform_info.dart';
import 'package:dartz/dartz.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:tmail_ui_user/features/home/presentation/home_controller.dart';
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
import 'package:tmail_ui_user/features/login/domain/model/base_url_oidc_response.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_oidc_configuration_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_token_oidc_state.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
extension HandleWebFingerToGetTokenExtension on HomeController {
bool isNotSignInOnWeb(Failure failure) =>
PlatformInfo.isWeb && isNotSignedIn(failure);
void checkOIDCIsAvailable() {
final baseUri = Uri.tryParse(AppConfig.baseUrl);
if (baseUri == null) {
goToLogin();
} else {
consumeState(
checkOIDCIsAvailableInteractor.execute(OIDCRequest.fromUri(baseUri)),
);
}
}
void getOIDCConfiguration(OIDCResponse oidcResponse) {
consumeState(getOIDCConfigurationInteractor.execute(oidcResponse));
}
void handleOIDCConfigurationSuccess(OIDCConfiguration oidcConfig) {
performUserAuthenticationOnWeb(oidcConfig);
}
void performUserAuthenticationOnWeb(OIDCConfiguration oidcConfig) {
_removeAuthDestinationUrl();
consumeState(authenticateOidcOnBrowserInteractor.execute(oidcConfig));
}
void _removeAuthDestinationUrl() {
consumeState(removeAuthDestinationUrlInteractor.execute());
}
void handleCheckOIDCIsAvailableFailure() {
final baseUri = Uri.tryParse(AppConfig.baseUrl);
if (baseUri == null) {
consumeState(
Stream.value(Left(GetOIDCConfigurationFailure(CanNotFoundBaseUrl()))),
);
} else {
tryGetOIDCConfigurationFromBaseUri(baseUri);
}
}
void tryGetOIDCConfigurationFromBaseUri(Uri baseUri) {
getOIDCConfiguration(BaseUrlOidcResponse(baseUri));
}
bool isGetTokenOIDCFailure(Failure? failure) {
return failure is GetOIDCConfigurationFailure ||
failure is GetOIDCConfigurationFromBaseUrlFailure ||
failure is GetTokenOIDCFailure;
}
}
@@ -5,8 +5,10 @@ import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_lo
import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_login_username_interactor.dart'; import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_login_username_interactor.dart';
import 'package:tmail_ui_user/features/cleanup/presentation/cleanup_bindings.dart'; import 'package:tmail_ui_user/features/cleanup/presentation/cleanup_bindings.dart';
import 'package:tmail_ui_user/features/home/presentation/home_controller.dart'; import 'package:tmail_ui_user/features/home/presentation/home_controller.dart';
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/remove_auth_destination_url_interactor.dart';
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
class HomeBindings extends BaseBindings { class HomeBindings extends BaseBindings {
@@ -18,6 +20,10 @@ class HomeBindings extends BaseBindings {
Get.find<EmailReceiveManager>(), Get.find<EmailReceiveManager>(),
Get.find<CleanupRecentLoginUrlCacheInteractor>(), Get.find<CleanupRecentLoginUrlCacheInteractor>(),
Get.find<CleanupRecentLoginUsernameCacheInteractor>(), Get.find<CleanupRecentLoginUsernameCacheInteractor>(),
Get.find<CheckOIDCIsAvailableInteractor>(),
Get.find<GetOIDCConfigurationInteractor>(),
Get.find<AuthenticateOidcOnBrowserInteractor>(),
Get.find<RemoveAuthDestinationUrlInteractor>(),
)); ));
} }
@@ -30,7 +36,6 @@ class HomeBindings extends BaseBindings {
@override @override
void bindingsInteractor() { void bindingsInteractor() {
CleanupBindings().dependencies(); CleanupBindings().dependencies();
Get.lazyPut(() => CheckOIDCIsAvailableInteractor(Get.find<AuthenticationOIDCRepository>()));
} }
@override @override
@@ -20,9 +20,16 @@ import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_lo
import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_login_username_interactor.dart'; import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_login_username_interactor.dart';
import 'package:tmail_ui_user/features/home/domain/state/auto_sign_in_via_deep_link_state.dart'; import 'package:tmail_ui_user/features/home/domain/state/auto_sign_in_via_deep_link_state.dart';
import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart';
import 'package:tmail_ui_user/features/home/presentation/extensions/handle_web_finger_to_get_token_extension.dart';
import 'package:tmail_ui_user/features/login/domain/exceptions/logout_exception.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/logout_exception.dart';
import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_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_credential_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_oidc_configuration_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/remove_auth_destination_url_interactor.dart';
import 'package:tmail_ui_user/features/login/presentation/model/login_navigate_arguments.dart'; import 'package:tmail_ui_user/features/login/presentation/model/login_navigate_arguments.dart';
import 'package:tmail_ui_user/features/login/presentation/model/login_navigate_type.dart'; import 'package:tmail_ui_user/features/login/presentation/model/login_navigate_type.dart';
import 'package:tmail_ui_user/main/deep_links/open_app_deep_link_data.dart'; import 'package:tmail_ui_user/main/deep_links/open_app_deep_link_data.dart';
@@ -39,6 +46,10 @@ class HomeController extends ReloadableController {
final EmailReceiveManager _emailReceiveManager; final EmailReceiveManager _emailReceiveManager;
final CleanupRecentLoginUrlCacheInteractor _cleanupRecentLoginUrlCacheInteractor; final CleanupRecentLoginUrlCacheInteractor _cleanupRecentLoginUrlCacheInteractor;
final CleanupRecentLoginUsernameCacheInteractor _cleanupRecentLoginUsernameCacheInteractor; final CleanupRecentLoginUsernameCacheInteractor _cleanupRecentLoginUsernameCacheInteractor;
final CheckOIDCIsAvailableInteractor checkOIDCIsAvailableInteractor;
final GetOIDCConfigurationInteractor getOIDCConfigurationInteractor;
final AuthenticateOidcOnBrowserInteractor authenticateOidcOnBrowserInteractor;
final RemoveAuthDestinationUrlInteractor removeAuthDestinationUrlInteractor;
IOSNotificationManager? _iosNotificationManager; IOSNotificationManager? _iosNotificationManager;
DeepLinksManager? _deepLinksManager; DeepLinksManager? _deepLinksManager;
@@ -48,6 +59,10 @@ class HomeController extends ReloadableController {
this._emailReceiveManager, this._emailReceiveManager,
this._cleanupRecentLoginUrlCacheInteractor, this._cleanupRecentLoginUrlCacheInteractor,
this._cleanupRecentLoginUsernameCacheInteractor, this._cleanupRecentLoginUsernameCacheInteractor,
this.checkOIDCIsAvailableInteractor,
this.getOIDCConfigurationInteractor,
this.authenticateOidcOnBrowserInteractor,
this.removeAuthDestinationUrlInteractor,
); );
@override @override
@@ -95,7 +110,7 @@ class HomeController extends ReloadableController {
if (arguments is LoginNavigateArguments) { if (arguments is LoginNavigateArguments) {
_handleLoginNavigateArguments(arguments); _handleLoginNavigateArguments(arguments);
} else { } else {
_cleanupCache(); await _cleanupCache();
} }
} }
@@ -283,6 +298,12 @@ class HomeController extends ReloadableController {
}, },
onFailureCallback: goToLogin, onFailureCallback: goToLogin,
); );
} else if (isNotSignInOnWeb(failure)) {
checkOIDCIsAvailable();
} else if (failure is CheckOIDCIsAvailableFailure) {
handleCheckOIDCIsAvailableFailure();
} else if (isGetTokenOIDCFailure(failure)) {
goToLogin();
} else { } else {
super.handleFailureViewState(failure); super.handleFailureViewState(failure);
} }
@@ -313,8 +334,30 @@ class HomeController extends ReloadableController {
}, },
onFailureCallback: () => _continueUsingTheApp(success), onFailureCallback: () => _continueUsingTheApp(success),
); );
} else if (success is CheckOIDCIsAvailableSuccess) {
getOIDCConfiguration(success.oidcResponse);
} else if (success is GetOIDCConfigurationSuccess) {
handleOIDCConfigurationSuccess(success.oidcConfiguration);
} else { } else {
super.handleSuccessViewState(success); super.handleSuccessViewState(success);
} }
} }
@override
void handleUrgentExceptionOnWeb({Failure? failure, Exception? exception}) {
if (failure is CheckOIDCIsAvailableFailure) {
handleCheckOIDCIsAvailableFailure();
} else if (isGetTokenOIDCFailure(failure)) {
goToLogin();
} else {
super.handleUrgentExceptionOnWeb(failure: failure, exception: exception);
}
}
@override
void handleErrorViewState(Object error, StackTrace stackTrace) {
if (PlatformInfo.isWeb) {
goToLogin();
}
}
} }
@@ -38,4 +38,6 @@ abstract class AuthenticationOIDCDataSource {
List<String> scopes); List<String> scopes);
Future<String> getAuthenticationInfo(); Future<String> getAuthenticationInfo();
Future<void> removeAuthDestinationUrl();
} }
@@ -1,9 +1,17 @@
import 'package:model/model.dart'; import 'package:model/oidc/oidc_configuration.dart';
import 'package:model/oidc/request/oidc_request.dart';
import 'package:model/oidc/response/oidc_discovery_response.dart';
import 'package:model/oidc/response/oidc_response.dart';
import 'package:model/oidc/token_id.dart';
import 'package:model/oidc/token_oidc.dart';
import 'package:tmail_ui_user/features/caching/utils/session_storage_manager.dart';
import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.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/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/local/token_oidc_cache_manager.dart';
import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart';
import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart';
import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart';
import 'package:tmail_ui_user/features/login/domain/model/login_constants.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource { class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
@@ -12,6 +20,7 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
final AuthenticationClientBase _authenticationClient; final AuthenticationClientBase _authenticationClient;
final TokenOidcCacheManager _tokenOidcCacheManager; final TokenOidcCacheManager _tokenOidcCacheManager;
final OidcConfigurationCacheManager _oidcConfigurationCacheManager; final OidcConfigurationCacheManager _oidcConfigurationCacheManager;
final SessionStorageManager _sessionStorageManager;
final ExceptionThrower _exceptionThrower; final ExceptionThrower _exceptionThrower;
final ExceptionThrower _cacheExceptionThrower; final ExceptionThrower _cacheExceptionThrower;
@@ -20,6 +29,7 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
this._authenticationClient, this._authenticationClient,
this._tokenOidcCacheManager, this._tokenOidcCacheManager,
this._oidcConfigurationCacheManager, this._oidcConfigurationCacheManager,
this._sessionStorageManager,
this._exceptionThrower, this._exceptionThrower,
this._cacheExceptionThrower this._cacheExceptionThrower
); );
@@ -109,7 +119,7 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
Future<void> deleteOidcConfiguration() { Future<void> deleteOidcConfiguration() {
return Future.sync(() async { return Future.sync(() async {
return await _oidcConfigurationCacheManager.deleteOidcConfiguration(); return await _oidcConfigurationCacheManager.deleteOidcConfiguration();
}).catchError(_exceptionThrower.throwException); }).catchError(_cacheExceptionThrower.throwException);
} }
@override @override
@@ -131,14 +141,25 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
@override @override
Future<String> getAuthenticationInfo() { Future<String> getAuthenticationInfo() {
return Future.sync(() async { return Future.sync(() async {
return await _authenticationClient.getAuthenticationInfo(); return await _sessionStorageManager.get(
}).catchError(_exceptionThrower.throwException); OIDCConstant.authResponseKey,
);
}).catchError(_cacheExceptionThrower.throwException);
} }
@override @override
Future<void> deleteTokenOIDC() { Future<void> deleteTokenOIDC() {
return Future.sync(() async { return Future.sync(() async {
return await _tokenOidcCacheManager.deleteTokenOidc(); return await _tokenOidcCacheManager.deleteTokenOidc();
}).catchError(_exceptionThrower.throwException); }).catchError(_cacheExceptionThrower.throwException);
}
@override
Future<void> removeAuthDestinationUrl() {
return Future.sync(() async {
return await _sessionStorageManager.remove(
LoginConstants.AUTH_DESTINATION_KEY,
);
}).catchError(_cacheExceptionThrower.throwException);
} }
} }
@@ -13,8 +13,6 @@ abstract class AuthenticationClientBase {
String discoveryUrl, String discoveryUrl,
List<String> scopes); List<String> scopes);
Future<String> getAuthenticationInfo();
Future<TokenOIDC> getTokenOIDC( Future<TokenOIDC> getTokenOIDC(
String clientId, String clientId,
String redirectUrl, String redirectUrl,
@@ -95,11 +95,6 @@ class AuthenticationClientMobile implements AuthenticationClientBase {
return Future.value(null); return Future.value(null);
} }
@override
Future<String> getAuthenticationInfo() {
return Future.value('');
}
@override @override
Future<TokenOIDC> signInTwakeWorkplace(OIDCConfiguration oidcConfiguration) async { Future<TokenOIDC> signInTwakeWorkplace(OIDCConfiguration oidcConfiguration) async {
final uri = await FlutterWebAuth2.authenticate( final uri = await FlutterWebAuth2.authenticate(
@@ -9,11 +9,9 @@ import 'package:model/oidc/token_oidc.dart';
import 'package:tmail_ui_user/features/login/data/extensions/authentication_token_extension.dart'; import 'package:tmail_ui_user/features/login/data/extensions/authentication_token_extension.dart';
import 'package:tmail_ui_user/features/login/data/extensions/token_response_extension.dart'; import 'package:tmail_ui_user/features/login/data/extensions/token_response_extension.dart';
import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart';
import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart';
import 'package:tmail_ui_user/features/login/data/utils/library_platform/app_auth_plugin/app_auth_plugin.dart'; import 'package:tmail_ui_user/features/login/data/utils/library_platform/app_auth_plugin/app_auth_plugin.dart';
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.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/extensions/oidc_configuration_extensions.dart';
import 'package:universal_html/html.dart' as html;
class AuthenticationClientWeb implements AuthenticationClientBase { class AuthenticationClientWeb implements AuthenticationClientBase {
@@ -96,17 +94,6 @@ class AuthenticationClientWeb implements AuthenticationClientBase {
scopes: scopes)); scopes: scopes));
} }
@override
Future<String> getAuthenticationInfo() async {
final authUrl = html.window.sessionStorage[OIDCConstant.authResponseKey];
log('AuthenticationClientWeb::getAuthenticationInfo(): authUrl: $authUrl');
if (authUrl != null && authUrl.isNotEmpty) {
return authUrl;
} else {
throw CanNotAuthenticationInfoOnWeb();
}
}
@override @override
Future<TokenOIDC> signUpTwakeWorkplace(OIDCConfiguration oidcConfiguration) { Future<TokenOIDC> signUpTwakeWorkplace(OIDCConfiguration oidcConfiguration) {
throw UnimplementedError(); throw UnimplementedError();
@@ -93,4 +93,9 @@ class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository {
Future<void> deleteTokenOIDC() { Future<void> deleteTokenOIDC() {
return _oidcDataSource.deleteTokenOIDC(); return _oidcDataSource.deleteTokenOIDC();
} }
@override
Future<void> removeAuthDestinationUrl() {
return _oidcDataSource.removeAuthDestinationUrl();
}
} }
@@ -42,8 +42,6 @@ class CanNotFoundUserName implements Exception {}
class CanNotFoundPassword implements Exception {} class CanNotFoundPassword implements Exception {}
class CanNotAuthenticationInfoOnWeb implements Exception {}
class NotFoundAuthenticationInfoCache implements Exception {} class NotFoundAuthenticationInfoCache implements Exception {}
class CanNotFoundSaasServerUrl implements Exception {} class CanNotFoundSaasServerUrl implements Exception {}
@@ -38,4 +38,6 @@ abstract class AuthenticationOIDCRepository {
List<String> scopes); List<String> scopes);
Future<String> getAuthenticationInfo(); Future<String> getAuthenticationInfo();
Future<void> removeAuthDestinationUrl();
} }
@@ -9,11 +9,16 @@ class GetTokenOIDCSuccess extends UIState {
final TokenOIDC tokenOIDC; final TokenOIDC tokenOIDC;
final OIDCConfiguration configuration; final OIDCConfiguration configuration;
final Uri baseUri;
GetTokenOIDCSuccess(this.tokenOIDC, this.configuration); GetTokenOIDCSuccess(
this.tokenOIDC,
this.configuration,
this.baseUri,
);
@override @override
List<Object> get props => [tokenOIDC, configuration]; List<Object> get props => [tokenOIDC, configuration, baseUri];
} }
class GetTokenOIDCFailure extends FeatureFailure { class GetTokenOIDCFailure extends FeatureFailure {
@@ -0,0 +1,11 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
class RemovingAuthDestinationUrl extends LoadingState {}
class RemoveAuthDestinationUrlSuccess extends UIState {}
class RemoveAuthDestinationUrlFailure extends FeatureFailure {
RemoveAuthDestinationUrlFailure(dynamic exception)
: super(exception: exception);
}
@@ -14,7 +14,7 @@ class AuthenticateOidcOnBrowserInteractor {
AuthenticateOidcOnBrowserInteractor(this.authenticationOIDCRepository); AuthenticateOidcOnBrowserInteractor(this.authenticationOIDCRepository);
Stream<Either<Failure, Success>> execute(Uri baseUrl, OIDCConfiguration config) async* { Stream<Either<Failure, Success>> execute(OIDCConfiguration config) async* {
try { try {
yield Right<Failure, Success>(AuthenticateOidcOnBrowserLoading()); yield Right<Failure, Success>(AuthenticateOidcOnBrowserLoading());
await authenticationOIDCRepository.authenticateOidcOnBrowser( await authenticationOIDCRepository.authenticateOidcOnBrowser(
@@ -23,7 +23,7 @@ class GetTokenOIDCInteractor {
GetTokenOIDCInteractor(this._credentialRepository, this.authenticationOIDCRepository, this._accountRepository); GetTokenOIDCInteractor(this._credentialRepository, this.authenticationOIDCRepository, this._accountRepository);
Stream<Either<Failure, Success>> execute(Uri baseUrl, OIDCConfiguration config) async* { Stream<Either<Failure, Success>> execute(Uri baseUri, OIDCConfiguration config) async* {
try { try {
yield Right<Failure, Success>(GetTokenOIDCLoading()); yield Right<Failure, Success>(GetTokenOIDCLoading());
final tokenOIDC = await authenticationOIDCRepository.getTokenOIDC( final tokenOIDC = await authenticationOIDCRepository.getTokenOIDC(
@@ -33,7 +33,7 @@ class GetTokenOIDCInteractor {
config.scopes); config.scopes);
await Future.wait([ await Future.wait([
_credentialRepository.saveBaseUrl(baseUrl), _credentialRepository.saveBaseUrl(baseUri),
authenticationOIDCRepository.persistTokenOIDC(tokenOIDC), authenticationOIDCRepository.persistTokenOIDC(tokenOIDC),
authenticationOIDCRepository.persistOidcConfiguration(config), authenticationOIDCRepository.persistOidcConfiguration(config),
]); ]);
@@ -45,7 +45,11 @@ class GetTokenOIDCInteractor {
isSelected: true isSelected: true
) )
); );
yield Right<Failure, Success>(GetTokenOIDCSuccess(tokenOIDC, config)); yield Right<Failure, Success>(GetTokenOIDCSuccess(
tokenOIDC,
config,
baseUri,
));
} on PlatformException catch (e) { } on PlatformException catch (e) {
logError('GetTokenOIDCInteractor::execute(): PlatformException ${e.message} - ${e.stacktrace}'); logError('GetTokenOIDCInteractor::execute(): PlatformException ${e.message} - ${e.stacktrace}');
if (NoSuitableBrowserForOIDCException.verifyException(e)) { if (NoSuitableBrowserForOIDCException.verifyException(e)) {
@@ -0,0 +1,21 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart';
import 'package:tmail_ui_user/features/login/domain/state/remove_auth_destination_url_state.dart';
class RemoveAuthDestinationUrlInteractor {
final AuthenticationOIDCRepository _authenticationOIDCRepository;
const RemoveAuthDestinationUrlInteractor(this._authenticationOIDCRepository);
Stream<Either<Failure, Success>> execute() async* {
try {
yield Right<Failure, Success>(RemovingAuthDestinationUrl());
await _authenticationOIDCRepository.removeAuthDestinationUrl();
yield Right<Failure, Success>(RemoveAuthDestinationUrlSuccess());
} catch (e) {
yield Left<Failure, Success>(RemoveAuthDestinationUrlFailure(e));
}
}
}
@@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/remove_auth_destination_url_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/try_guessing_web_finger_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/try_guessing_web_finger_interactor.dart';
@@ -54,6 +55,7 @@ class LoginBindings extends BaseBindings {
Get.find<DNSLookupToGetJmapUrlInteractor>(), Get.find<DNSLookupToGetJmapUrlInteractor>(),
Get.find<SignInTwakeWorkplaceInteractor>(), Get.find<SignInTwakeWorkplaceInteractor>(),
Get.find<TryGuessingWebFingerInteractor>(), Get.find<TryGuessingWebFingerInteractor>(),
Get.find<RemoveAuthDestinationUrlInteractor>(),
)); ));
} }
@@ -83,26 +85,6 @@ class LoginBindings extends BaseBindings {
@override @override
void bindingsInteractor() { void bindingsInteractor() {
Get.lazyPut(() => CheckOIDCIsAvailableInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.lazyPut(() => GetOIDCConfigurationInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.lazyPut(() => GetTokenOIDCInteractor(
Get.find<CredentialRepository>(),
Get.find<AuthenticationOIDCRepository>(),
Get.find<AccountRepository>()
));
Get.lazyPut(() => AuthenticateOidcOnBrowserInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.lazyPut(() => GetAuthenticationInfoInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.lazyPut(() => GetStoredOidcConfigurationInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.lazyPut(() => SaveLoginUrlOnMobileInteractor(Get.find<LoginRepository>(),)); Get.lazyPut(() => SaveLoginUrlOnMobileInteractor(Get.find<LoginRepository>(),));
Get.lazyPut(() => GetAllRecentLoginUrlOnMobileInteractor(Get.find<LoginRepository>())); Get.lazyPut(() => GetAllRecentLoginUrlOnMobileInteractor(Get.find<LoginRepository>()));
Get.lazyPut(() => SaveLoginUsernameOnMobileInteractor(Get.find<LoginRepository>(),)); Get.lazyPut(() => SaveLoginUsernameOnMobileInteractor(Get.find<LoginRepository>(),));
@@ -17,17 +17,14 @@ import 'package:model/account/password.dart';
import 'package:model/oidc/oidc_configuration.dart'; import 'package:model/oidc/oidc_configuration.dart';
import 'package:model/oidc/request/oidc_request.dart'; import 'package:model/oidc/request/oidc_request.dart';
import 'package:model/oidc/response/oidc_response.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/base/reloadable/reloadable_controller.dart';
import 'package:tmail_ui_user/features/home/domain/state/auto_sign_in_via_deep_link_state.dart'; import 'package:tmail_ui_user/features/home/domain/state/auto_sign_in_via_deep_link_state.dart';
import 'package:tmail_ui_user/features/home/domain/state/get_session_state.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'; import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart';
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
import 'package:tmail_ui_user/features/login/domain/exceptions/login_exception.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/login_exception.dart';
import 'package:tmail_ui_user/features/login/domain/model/login_constants.dart';
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart'; import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
import 'package:tmail_ui_user/features/login/domain/model/recent_login_username.dart'; import 'package:tmail_ui_user/features/login/domain/model/recent_login_username.dart';
import 'package:tmail_ui_user/features/login/domain/state/authenticate_oidc_on_browser_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/authentication_user_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/authentication_user_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/dns_lookup_to_get_jmap_url_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/dns_lookup_to_get_jmap_url_state.dart';
@@ -49,6 +46,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/remove_auth_destination_url_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/try_guessing_web_finger_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/try_guessing_web_finger_interactor.dart';
@@ -67,7 +65,6 @@ import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:universal_html/html.dart' as html;
class LoginController extends ReloadableController { class LoginController extends ReloadableController {
@@ -85,6 +82,7 @@ class LoginController extends ReloadableController {
final DNSLookupToGetJmapUrlInteractor _dnsLookupToGetJmapUrlInteractor; final DNSLookupToGetJmapUrlInteractor _dnsLookupToGetJmapUrlInteractor;
final SignInTwakeWorkplaceInteractor _signInTwakeWorkplaceInteractor; final SignInTwakeWorkplaceInteractor _signInTwakeWorkplaceInteractor;
final TryGuessingWebFingerInteractor _tryGuessingWebFingerInteractor; final TryGuessingWebFingerInteractor _tryGuessingWebFingerInteractor;
final RemoveAuthDestinationUrlInteractor _removeAuthDestinationUrlInteractor;
final TextEditingController urlInputController = TextEditingController(); final TextEditingController urlInputController = TextEditingController();
final TextEditingController usernameInputController = TextEditingController(); final TextEditingController usernameInputController = TextEditingController();
@@ -117,6 +115,7 @@ class LoginController extends ReloadableController {
this._dnsLookupToGetJmapUrlInteractor, this._dnsLookupToGetJmapUrlInteractor,
this._signInTwakeWorkplaceInteractor, this._signInTwakeWorkplaceInteractor,
this._tryGuessingWebFingerInteractor, this._tryGuessingWebFingerInteractor,
this._removeAuthDestinationUrlInteractor,
); );
@override @override
@@ -131,25 +130,24 @@ class LoginController extends ReloadableController {
void onReady() { void onReady() {
super.onReady(); super.onReady();
final arguments = Get.arguments; final arguments = Get.arguments;
log('LoginController::onReady: arguments = $arguments');
if (arguments is LoginArguments) { if (arguments is LoginArguments) {
if (arguments.loginFormType == LoginFormType.passwordForm) { loginFormType.value =
loginFormType.value = LoginFormType.dnsLookupForm; arguments.loginFormType == LoginFormType.passwordForm
} else { ? LoginFormType.dnsLookupForm
loginFormType.value = arguments.loginFormType; : arguments.loginFormType;
}
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
_checkOIDCIsAvailable(); _checkOIDCIsAvailable();
} }
} else { } else if (PlatformInfo.isWeb) {
if (PlatformInfo.isWeb) { _getAuthenticationInfo();
_getAuthenticationInfo();
}
} }
} }
@override @override
void handleFailureViewState(Failure failure) { void handleFailureViewState(Failure failure) {
log('LoginController::handleFailureViewState(): $failure'); log('$runtimeType::handleFailureViewState():Failure = $failure');
if (failure is GetAuthenticationInfoFailure) { if (failure is GetAuthenticationInfoFailure) {
getAuthenticatedAccountAction(); getAuthenticatedAccountAction();
} else if (failure is CheckOIDCIsAvailableFailure) { } else if (failure is CheckOIDCIsAvailableFailure) {
@@ -182,6 +180,7 @@ class LoginController extends ReloadableController {
@override @override
void handleSuccessViewState(Success success) { void handleSuccessViewState(Success success) {
log('$runtimeType::handleSuccessViewState:Success = ${success.runtimeType}');
if (success is GetAuthenticationInfoSuccess) { if (success is GetAuthenticationInfoSuccess) {
_getStoredOidcConfiguration(); _getStoredOidcConfiguration();
} else if (success is GetStoredOidcConfigurationSuccess) { } else if (success is GetStoredOidcConfigurationSuccess) {
@@ -200,7 +199,7 @@ class LoginController extends ReloadableController {
onBaseUrlChange(success.oidcResponse.subject); onBaseUrlChange(success.oidcResponse.subject);
getOIDCConfiguration(success.oidcResponse); getOIDCConfiguration(success.oidcResponse);
} else if (success is SignInTwakeWorkplaceSuccess) { } else if (success is SignInTwakeWorkplaceSuccess) {
_synchronizeTokenAndGetSession( synchronizeTokenAndGetSession(
baseUri: success.baseUri, baseUri: success.baseUri,
tokenOIDC: success.tokenOIDC, tokenOIDC: success.tokenOIDC,
oidcConfiguration: success.oidcConfiguration, oidcConfiguration: success.oidcConfiguration,
@@ -289,7 +288,7 @@ class LoginController extends ReloadableController {
} }
void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) { void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) {
_synchronizeTokenAndGetSession( synchronizeTokenAndGetSession(
baseUri: success.baseUri, baseUri: success.baseUri,
tokenOIDC: success.tokenOIDC, tokenOIDC: success.tokenOIDC,
oidcConfiguration: success.oidcConfiguration, oidcConfiguration: success.oidcConfiguration,
@@ -438,23 +437,6 @@ class LoginController extends ReloadableController {
} }
} }
void _synchronizeTokenAndGetSession({
required Uri baseUri,
required TokenOIDC tokenOIDC,
required OIDCConfiguration oidcConfiguration,
}) {
dynamicUrlInterceptors.setJmapUrl(baseUri.toString());
dynamicUrlInterceptors.changeBaseUrl(baseUri.toString());
authorizationInterceptors.setTokenAndAuthorityOidc(
newToken: tokenOIDC,
newConfig: oidcConfiguration);
authorizationIsolateInterceptors.setTokenAndAuthorityOidc(
newToken: tokenOIDC,
newConfig: oidcConfiguration);
getSessionAction();
}
void _getTokenOIDCAction(OIDCConfiguration config) { void _getTokenOIDCAction(OIDCConfiguration config) {
if (_currentBaseUrl != null) { if (_currentBaseUrl != null) {
consumeState(_getTokenOIDCInteractor.execute(_currentBaseUrl!, config)); consumeState(_getTokenOIDCInteractor.execute(_currentBaseUrl!, config));
@@ -463,25 +445,18 @@ class LoginController extends ReloadableController {
} }
} }
void _authenticateOidcOnBrowserAction(OIDCConfiguration config) async { void _authenticateOidcOnBrowserAction(OIDCConfiguration config) {
_removeAuthDestinationUrlInSessionStorage(); _removeAuthDestinationUrl();
if (_currentBaseUrl != null) { consumeState(_authenticateOidcOnBrowserInteractor.execute(config));
consumeState(_authenticateOidcOnBrowserInteractor.execute(_currentBaseUrl!, config));
} else {
dispatchState(Left(AuthenticateOidcOnBrowserFailure(CanNotFoundBaseUrl())));
}
} }
void _removeAuthDestinationUrlInSessionStorage() { void _removeAuthDestinationUrl() {
final authDestinationUrlExist = html.window.sessionStorage.containsKey(LoginConstants.AUTH_DESTINATION_KEY); consumeState(_removeAuthDestinationUrlInteractor.execute());
if (authDestinationUrlExist) {
html.window.sessionStorage.remove(LoginConstants.AUTH_DESTINATION_KEY);
}
} }
void _getTokenOIDCSuccess(GetTokenOIDCSuccess success) { void _getTokenOIDCSuccess(GetTokenOIDCSuccess success) {
_synchronizeTokenAndGetSession( synchronizeTokenAndGetSession(
baseUri: _currentBaseUrl!, baseUri: _currentBaseUrl!,
tokenOIDC: success.tokenOIDC, tokenOIDC: success.tokenOIDC,
oidcConfiguration: success.configuration, oidcConfiguration: success.configuration,
@@ -1,6 +1,7 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:tmail_ui_user/features/base/interactors_bindings.dart'; import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
import 'package:tmail_ui_user/features/caching/utils/session_storage_manager.dart';
import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart'; import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart';
import 'package:tmail_ui_user/features/login/data/datasource/authentication_datasource.dart'; import 'package:tmail_ui_user/features/login/data/datasource/authentication_datasource.dart';
import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart'; import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart';
@@ -21,12 +22,19 @@ import 'package:tmail_ui_user/features/login/domain/repository/account_repositor
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart';
import 'package:tmail_ui_user/features/login/domain/repository/authentication_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'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_info_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_token_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/remove_auth_destination_url_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/update_account_cache_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/update_account_cache_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
@@ -62,6 +70,29 @@ class CredentialBindings extends InteractorsBindings {
Get.find<AccountRepository>() Get.find<AccountRepository>()
)); ));
Get.put(UpdateAccountCacheInteractor(Get.find<AccountRepository>())); Get.put(UpdateAccountCacheInteractor(Get.find<AccountRepository>()));
Get.put(CheckOIDCIsAvailableInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.put(GetOIDCConfigurationInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.put(GetTokenOIDCInteractor(
Get.find<CredentialRepository>(),
Get.find<AuthenticationOIDCRepository>(),
Get.find<AccountRepository>(),
));
Get.put(AuthenticateOidcOnBrowserInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.put(GetAuthenticationInfoInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.put(GetStoredOidcConfigurationInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.put(RemoveAuthDestinationUrlInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
} }
@override @override
@@ -77,6 +108,7 @@ class CredentialBindings extends InteractorsBindings {
Get.find<AuthenticationClientBase>(), Get.find<AuthenticationClientBase>(),
Get.find<TokenOidcCacheManager>(), Get.find<TokenOidcCacheManager>(),
Get.find<OidcConfigurationCacheManager>(), Get.find<OidcConfigurationCacheManager>(),
Get.find<SessionStorageManager>(),
Get.find<RemoteExceptionThrower>(), Get.find<RemoteExceptionThrower>(),
Get.find<CacheExceptionThrower>(), Get.find<CacheExceptionThrower>(),
)); ));
+7
View File
@@ -9,6 +9,13 @@ class OIDCRequest with EquatableMixin {
OIDCRequest({required this.baseUrl, required this.resourceUrl}); OIDCRequest({required this.baseUrl, required this.resourceUrl});
factory OIDCRequest.fromUri(Uri uri) {
return OIDCRequest(
baseUrl: uri.toString(),
resourceUrl: uri.origin,
);
}
@override @override
List<Object?> get props => [baseUrl, resourceUrl, relUrl]; List<Object?> get props => [baseUrl, resourceUrl, relUrl];
} }
@@ -19,9 +19,13 @@ import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interact
import 'package:tmail_ui_user/features/home/presentation/home_controller.dart'; import 'package:tmail_ui_user/features/home/presentation/home_controller.dart';
import 'package:tmail_ui_user/features/login/data/network/interceptors/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_stored_token_oidc_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/remove_auth_destination_url_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/update_account_cache_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/update_account_cache_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
@@ -46,6 +50,10 @@ import 'home_controller_test.mocks.dart';
MockSpec<CleanupEmailCacheInteractor>(), MockSpec<CleanupEmailCacheInteractor>(),
MockSpec<CleanupRecentLoginUrlCacheInteractor>(), MockSpec<CleanupRecentLoginUrlCacheInteractor>(),
MockSpec<CleanupRecentLoginUsernameCacheInteractor>(), MockSpec<CleanupRecentLoginUsernameCacheInteractor>(),
MockSpec<CheckOIDCIsAvailableInteractor>(),
MockSpec<GetOIDCConfigurationInteractor>(),
MockSpec<AuthenticateOidcOnBrowserInteractor>(),
MockSpec<RemoveAuthDestinationUrlInteractor>(),
MockSpec<EmailReceiveManager>(), MockSpec<EmailReceiveManager>(),
MockSpec<GetSessionInteractor>(), MockSpec<GetSessionInteractor>(),
MockSpec<GetAuthenticatedAccountInteractor>(), MockSpec<GetAuthenticatedAccountInteractor>(),
@@ -64,6 +72,10 @@ void main() {
late MockEmailReceiveManager emailReceiveManager; late MockEmailReceiveManager emailReceiveManager;
late MockCleanupRecentLoginUrlCacheInteractor cleanupRecentLoginUrlCacheInteractor; late MockCleanupRecentLoginUrlCacheInteractor cleanupRecentLoginUrlCacheInteractor;
late MockCleanupRecentLoginUsernameCacheInteractor cleanupRecentLoginUsernameCacheInteractor; late MockCleanupRecentLoginUsernameCacheInteractor cleanupRecentLoginUsernameCacheInteractor;
late MockCheckOIDCIsAvailableInteractor checkOIDCIsAvailableInteractor;
late MockGetOIDCConfigurationInteractor getOIDCConfigurationInteractor;
late MockAuthenticateOidcOnBrowserInteractor authenticateOidcOnBrowserInteractor;
late MockRemoveAuthDestinationUrlInteractor removeAuthDestinationUrlInteractor;
late MockGetSessionInteractor mockGetSessionInteractor; late MockGetSessionInteractor mockGetSessionInteractor;
late MockGetAuthenticatedAccountInteractor mockGetAuthenticatedAccountInteractor; late MockGetAuthenticatedAccountInteractor mockGetAuthenticatedAccountInteractor;
@@ -89,7 +101,10 @@ void main() {
emailReceiveManager = MockEmailReceiveManager(); emailReceiveManager = MockEmailReceiveManager();
cleanupRecentLoginUrlCacheInteractor = MockCleanupRecentLoginUrlCacheInteractor(); cleanupRecentLoginUrlCacheInteractor = MockCleanupRecentLoginUrlCacheInteractor();
cleanupRecentLoginUsernameCacheInteractor = MockCleanupRecentLoginUsernameCacheInteractor(); cleanupRecentLoginUsernameCacheInteractor = MockCleanupRecentLoginUsernameCacheInteractor();
checkOIDCIsAvailableInteractor = MockCheckOIDCIsAvailableInteractor();
getOIDCConfigurationInteractor = MockGetOIDCConfigurationInteractor();
authenticateOidcOnBrowserInteractor = MockAuthenticateOidcOnBrowserInteractor();
removeAuthDestinationUrlInteractor = MockRemoveAuthDestinationUrlInteractor();
// mock reloadable controller // mock reloadable controller
mockGetSessionInteractor = MockGetSessionInteractor(); mockGetSessionInteractor = MockGetSessionInteractor();
mockGetAuthenticatedAccountInteractor = MockGetAuthenticatedAccountInteractor(); mockGetAuthenticatedAccountInteractor = MockGetAuthenticatedAccountInteractor();
@@ -139,7 +154,11 @@ void main() {
cleanupEmailCacheInteractor, cleanupEmailCacheInteractor,
emailReceiveManager, emailReceiveManager,
cleanupRecentLoginUrlCacheInteractor, cleanupRecentLoginUrlCacheInteractor,
cleanupRecentLoginUsernameCacheInteractor cleanupRecentLoginUsernameCacheInteractor,
checkOIDCIsAvailableInteractor,
getOIDCConfigurationInteractor,
authenticateOidcOnBrowserInteractor,
removeAuthDestinationUrlInteractor,
); );
}); });
@@ -32,6 +32,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/remove_auth_destination_url_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/try_guessing_web_finger_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/try_guessing_web_finger_interactor.dart';
@@ -73,6 +74,7 @@ import 'login_controller_test.mocks.dart';
MockSpec<DNSLookupToGetJmapUrlInteractor>(), MockSpec<DNSLookupToGetJmapUrlInteractor>(),
MockSpec<SignInTwakeWorkplaceInteractor>(), MockSpec<SignInTwakeWorkplaceInteractor>(),
MockSpec<TryGuessingWebFingerInteractor>(), MockSpec<TryGuessingWebFingerInteractor>(),
MockSpec<RemoveAuthDestinationUrlInteractor>(),
MockSpec<GetSessionInteractor>(), MockSpec<GetSessionInteractor>(),
MockSpec<GetAuthenticatedAccountInteractor>(), MockSpec<GetAuthenticatedAccountInteractor>(),
MockSpec<UpdateAccountCacheInteractor>(), MockSpec<UpdateAccountCacheInteractor>(),
@@ -97,6 +99,7 @@ void main() {
late MockDNSLookupToGetJmapUrlInteractor mockDNSLookupToGetJmapUrlInteractor; late MockDNSLookupToGetJmapUrlInteractor mockDNSLookupToGetJmapUrlInteractor;
late MockSignInTwakeWorkplaceInteractor mockSignInTwakeWorkplaceInteractor; late MockSignInTwakeWorkplaceInteractor mockSignInTwakeWorkplaceInteractor;
late MockTryGuessingWebFingerInteractor mockTryGuessingWebFingerInteractor; late MockTryGuessingWebFingerInteractor mockTryGuessingWebFingerInteractor;
late MockRemoveAuthDestinationUrlInteractor mockRemoveAuthDestinationUrlInteractor;
late MockGetSessionInteractor mockGetSessionInteractor; late MockGetSessionInteractor mockGetSessionInteractor;
late MockGetAuthenticatedAccountInteractor mockGetAuthenticatedAccountInteractor; late MockGetAuthenticatedAccountInteractor mockGetAuthenticatedAccountInteractor;
late MockUpdateAccountCacheInteractor mockUpdateAccountCacheInteractor; late MockUpdateAccountCacheInteractor mockUpdateAccountCacheInteractor;
@@ -132,6 +135,7 @@ void main() {
mockDNSLookupToGetJmapUrlInteractor = MockDNSLookupToGetJmapUrlInteractor(); mockDNSLookupToGetJmapUrlInteractor = MockDNSLookupToGetJmapUrlInteractor();
mockSignInTwakeWorkplaceInteractor = MockSignInTwakeWorkplaceInteractor(); mockSignInTwakeWorkplaceInteractor = MockSignInTwakeWorkplaceInteractor();
mockTryGuessingWebFingerInteractor = MockTryGuessingWebFingerInteractor(); mockTryGuessingWebFingerInteractor = MockTryGuessingWebFingerInteractor();
mockRemoveAuthDestinationUrlInteractor = MockRemoveAuthDestinationUrlInteractor();
// mock reloadable controller // mock reloadable controller
mockGetSessionInteractor = MockGetSessionInteractor(); mockGetSessionInteractor = MockGetSessionInteractor();
@@ -196,6 +200,7 @@ void main() {
mockDNSLookupToGetJmapUrlInteractor, mockDNSLookupToGetJmapUrlInteractor,
mockSignInTwakeWorkplaceInteractor, mockSignInTwakeWorkplaceInteractor,
mockTryGuessingWebFingerInteractor, mockTryGuessingWebFingerInteractor,
mockRemoveAuthDestinationUrlInteractor,
); );
}); });