Handle web finger to get token in HomeController
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
+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/presentation/cleanup_bindings.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/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';
|
||||
|
||||
class HomeBindings extends BaseBindings {
|
||||
@@ -18,6 +20,10 @@ class HomeBindings extends BaseBindings {
|
||||
Get.find<EmailReceiveManager>(),
|
||||
Get.find<CleanupRecentLoginUrlCacheInteractor>(),
|
||||
Get.find<CleanupRecentLoginUsernameCacheInteractor>(),
|
||||
Get.find<CheckOIDCIsAvailableInteractor>(),
|
||||
Get.find<GetOIDCConfigurationInteractor>(),
|
||||
Get.find<AuthenticateOidcOnBrowserInteractor>(),
|
||||
Get.find<RemoveAuthDestinationUrlInteractor>(),
|
||||
));
|
||||
}
|
||||
|
||||
@@ -30,7 +36,6 @@ class HomeBindings extends BaseBindings {
|
||||
@override
|
||||
void bindingsInteractor() {
|
||||
CleanupBindings().dependencies();
|
||||
Get.lazyPut(() => CheckOIDCIsAvailableInteractor(Get.find<AuthenticationOIDCRepository>()));
|
||||
}
|
||||
|
||||
@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/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/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/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_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/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_type.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 CleanupRecentLoginUrlCacheInteractor _cleanupRecentLoginUrlCacheInteractor;
|
||||
final CleanupRecentLoginUsernameCacheInteractor _cleanupRecentLoginUsernameCacheInteractor;
|
||||
final CheckOIDCIsAvailableInteractor checkOIDCIsAvailableInteractor;
|
||||
final GetOIDCConfigurationInteractor getOIDCConfigurationInteractor;
|
||||
final AuthenticateOidcOnBrowserInteractor authenticateOidcOnBrowserInteractor;
|
||||
final RemoveAuthDestinationUrlInteractor removeAuthDestinationUrlInteractor;
|
||||
|
||||
IOSNotificationManager? _iosNotificationManager;
|
||||
DeepLinksManager? _deepLinksManager;
|
||||
@@ -48,6 +59,10 @@ class HomeController extends ReloadableController {
|
||||
this._emailReceiveManager,
|
||||
this._cleanupRecentLoginUrlCacheInteractor,
|
||||
this._cleanupRecentLoginUsernameCacheInteractor,
|
||||
this.checkOIDCIsAvailableInteractor,
|
||||
this.getOIDCConfigurationInteractor,
|
||||
this.authenticateOidcOnBrowserInteractor,
|
||||
this.removeAuthDestinationUrlInteractor,
|
||||
);
|
||||
|
||||
@override
|
||||
@@ -95,7 +110,7 @@ class HomeController extends ReloadableController {
|
||||
if (arguments is LoginNavigateArguments) {
|
||||
_handleLoginNavigateArguments(arguments);
|
||||
} else {
|
||||
_cleanupCache();
|
||||
await _cleanupCache();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,6 +298,12 @@ class HomeController extends ReloadableController {
|
||||
},
|
||||
onFailureCallback: goToLogin,
|
||||
);
|
||||
} else if (isNotSignInOnWeb(failure)) {
|
||||
checkOIDCIsAvailable();
|
||||
} else if (failure is CheckOIDCIsAvailableFailure) {
|
||||
handleCheckOIDCIsAvailableFailure();
|
||||
} else if (isGetTokenOIDCFailure(failure)) {
|
||||
goToLogin();
|
||||
} else {
|
||||
super.handleFailureViewState(failure);
|
||||
}
|
||||
@@ -313,8 +334,30 @@ class HomeController extends ReloadableController {
|
||||
},
|
||||
onFailureCallback: () => _continueUsingTheApp(success),
|
||||
);
|
||||
} else if (success is CheckOIDCIsAvailableSuccess) {
|
||||
getOIDCConfiguration(success.oidcResponse);
|
||||
} else if (success is GetOIDCConfigurationSuccess) {
|
||||
handleOIDCConfigurationSuccess(success.oidcConfiguration);
|
||||
} else {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user