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
@@ -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_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/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_username_on_mobile_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<SignInTwakeWorkplaceInteractor>(),
Get.find<TryGuessingWebFingerInteractor>(),
Get.find<RemoveAuthDestinationUrlInteractor>(),
));
}
@@ -83,26 +85,6 @@ class LoginBindings extends BaseBindings {
@override
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(() => GetAllRecentLoginUrlOnMobileInteractor(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/request/oidc_request.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/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/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/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_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/check_oidc_is_available_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_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/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_username_on_mobile_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_utils.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:universal_html/html.dart' as html;
class LoginController extends ReloadableController {
@@ -85,6 +82,7 @@ class LoginController extends ReloadableController {
final DNSLookupToGetJmapUrlInteractor _dnsLookupToGetJmapUrlInteractor;
final SignInTwakeWorkplaceInteractor _signInTwakeWorkplaceInteractor;
final TryGuessingWebFingerInteractor _tryGuessingWebFingerInteractor;
final RemoveAuthDestinationUrlInteractor _removeAuthDestinationUrlInteractor;
final TextEditingController urlInputController = TextEditingController();
final TextEditingController usernameInputController = TextEditingController();
@@ -117,6 +115,7 @@ class LoginController extends ReloadableController {
this._dnsLookupToGetJmapUrlInteractor,
this._signInTwakeWorkplaceInteractor,
this._tryGuessingWebFingerInteractor,
this._removeAuthDestinationUrlInteractor,
);
@override
@@ -131,25 +130,24 @@ class LoginController extends ReloadableController {
void onReady() {
super.onReady();
final arguments = Get.arguments;
log('LoginController::onReady: arguments = $arguments');
if (arguments is LoginArguments) {
if (arguments.loginFormType == LoginFormType.passwordForm) {
loginFormType.value = LoginFormType.dnsLookupForm;
} else {
loginFormType.value = arguments.loginFormType;
}
loginFormType.value =
arguments.loginFormType == LoginFormType.passwordForm
? LoginFormType.dnsLookupForm
: arguments.loginFormType;
if (PlatformInfo.isWeb) {
_checkOIDCIsAvailable();
}
} else {
if (PlatformInfo.isWeb) {
_getAuthenticationInfo();
}
} else if (PlatformInfo.isWeb) {
_getAuthenticationInfo();
}
}
@override
void handleFailureViewState(Failure failure) {
log('LoginController::handleFailureViewState(): $failure');
log('$runtimeType::handleFailureViewState():Failure = $failure');
if (failure is GetAuthenticationInfoFailure) {
getAuthenticatedAccountAction();
} else if (failure is CheckOIDCIsAvailableFailure) {
@@ -182,6 +180,7 @@ class LoginController extends ReloadableController {
@override
void handleSuccessViewState(Success success) {
log('$runtimeType::handleSuccessViewState:Success = ${success.runtimeType}');
if (success is GetAuthenticationInfoSuccess) {
_getStoredOidcConfiguration();
} else if (success is GetStoredOidcConfigurationSuccess) {
@@ -200,7 +199,7 @@ class LoginController extends ReloadableController {
onBaseUrlChange(success.oidcResponse.subject);
getOIDCConfiguration(success.oidcResponse);
} else if (success is SignInTwakeWorkplaceSuccess) {
_synchronizeTokenAndGetSession(
synchronizeTokenAndGetSession(
baseUri: success.baseUri,
tokenOIDC: success.tokenOIDC,
oidcConfiguration: success.oidcConfiguration,
@@ -289,7 +288,7 @@ class LoginController extends ReloadableController {
}
void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) {
_synchronizeTokenAndGetSession(
synchronizeTokenAndGetSession(
baseUri: success.baseUri,
tokenOIDC: success.tokenOIDC,
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) {
if (_currentBaseUrl != null) {
consumeState(_getTokenOIDCInteractor.execute(_currentBaseUrl!, config));
@@ -463,25 +445,18 @@ class LoginController extends ReloadableController {
}
}
void _authenticateOidcOnBrowserAction(OIDCConfiguration config) async {
_removeAuthDestinationUrlInSessionStorage();
void _authenticateOidcOnBrowserAction(OIDCConfiguration config) {
_removeAuthDestinationUrl();
if (_currentBaseUrl != null) {
consumeState(_authenticateOidcOnBrowserInteractor.execute(_currentBaseUrl!, config));
} else {
dispatchState(Left(AuthenticateOidcOnBrowserFailure(CanNotFoundBaseUrl())));
}
consumeState(_authenticateOidcOnBrowserInteractor.execute(config));
}
void _removeAuthDestinationUrlInSessionStorage() {
final authDestinationUrlExist = html.window.sessionStorage.containsKey(LoginConstants.AUTH_DESTINATION_KEY);
if (authDestinationUrlExist) {
html.window.sessionStorage.remove(LoginConstants.AUTH_DESTINATION_KEY);
}
void _removeAuthDestinationUrl() {
consumeState(_removeAuthDestinationUrlInteractor.execute());
}
void _getTokenOIDCSuccess(GetTokenOIDCSuccess success) {
_synchronizeTokenAndGetSession(
synchronizeTokenAndGetSession(
baseUri: _currentBaseUrl!,
tokenOIDC: success.tokenOIDC,
oidcConfiguration: success.configuration,