Handle web finger to get token in HomeController
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
+69
@@ -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,
|
||||||
|
|||||||
-5
@@ -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>(),
|
||||||
));
|
));
|
||||||
|
|||||||
@@ -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,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user