TF-2387 Handle logout twake workplace

This commit is contained in:
dab246
2024-11-05 14:51:17 +07:00
committed by Dat H. Pham
parent e13f86a037
commit 623826d29f
7 changed files with 46 additions and 27 deletions
+17
View File
@@ -9,6 +9,7 @@ PODS:
- AppAuth/Core - AppAuth/Core
- better_open_file (0.0.1): - better_open_file (0.0.1):
- Flutter - Flutter
- CocoaAsyncSocket (7.6.5)
- connectivity_plus (0.0.1): - connectivity_plus (0.0.1):
- Flutter - Flutter
- ReachabilitySwift - ReachabilitySwift
@@ -116,6 +117,8 @@ PODS:
- Flutter - Flutter
- flutter_secure_storage (6.0.0): - flutter_secure_storage (6.0.0):
- Flutter - Flutter
- flutter_web_auth_2 (3.0.0):
- Flutter
- GoogleDataTransport (9.3.0): - GoogleDataTransport (9.3.0):
- GoogleUtilities/Environment (~> 7.7) - GoogleUtilities/Environment (~> 7.7)
- nanopb (< 2.30910.0, >= 2.30908.0) - nanopb (< 2.30910.0, >= 2.30908.0)
@@ -163,6 +166,10 @@ PODS:
- path_provider_foundation (0.0.1): - path_provider_foundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
- patrol (0.0.1):
- CocoaAsyncSocket (~> 7.6)
- Flutter
- FlutterMacOS
- pdf_render (0.0.1): - pdf_render (0.0.1):
- Flutter - Flutter
- permission_handler_apple (9.1.1): - permission_handler_apple (9.1.1):
@@ -217,8 +224,10 @@ DEPENDENCIES:
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
- flutter_web_auth_2 (from `.symlinks/plugins/flutter_web_auth_2/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- patrol (from `.symlinks/plugins/patrol/darwin`)
- pdf_render (from `.symlinks/plugins/pdf_render/ios`) - pdf_render (from `.symlinks/plugins/pdf_render/ios`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- photo_manager (from `.symlinks/plugins/photo_manager/ios`) - photo_manager (from `.symlinks/plugins/photo_manager/ios`)
@@ -233,6 +242,7 @@ DEPENDENCIES:
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- AppAuth - AppAuth
- CocoaAsyncSocket
- DKImagePickerController - DKImagePickerController
- DKPhotoGallery - DKPhotoGallery
- Firebase - Firebase
@@ -294,10 +304,14 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_native_splash/ios" :path: ".symlinks/plugins/flutter_native_splash/ios"
flutter_secure_storage: flutter_secure_storage:
:path: ".symlinks/plugins/flutter_secure_storage/ios" :path: ".symlinks/plugins/flutter_secure_storage/ios"
flutter_web_auth_2:
:path: ".symlinks/plugins/flutter_web_auth_2/ios"
package_info_plus: package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios" :path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation: path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin" :path: ".symlinks/plugins/path_provider_foundation/darwin"
patrol:
:path: ".symlinks/plugins/patrol/darwin"
pdf_render: pdf_render:
:path: ".symlinks/plugins/pdf_render/ios" :path: ".symlinks/plugins/pdf_render/ios"
permission_handler_apple: permission_handler_apple:
@@ -323,6 +337,7 @@ SPEC CHECKSUMS:
app_settings: 017320c6a680cdc94c799949d95b84cb69389ebc app_settings: 017320c6a680cdc94c799949d95b84cb69389ebc
AppAuth: 182c5b88630569df5acb672720534756c29b3358 AppAuth: 182c5b88630569df5acb672720534756c29b3358
better_open_file: 03cf320415d4d3f46b6e00adc4a567d76c1a399d better_open_file: 03cf320415d4d3f46b6e00adc4a567d76c1a399d
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e
contacts_service: 849e1f84281804c8bfbec1b4c3eedcb23c5d3eca contacts_service: 849e1f84281804c8bfbec1b4c3eedcb23c5d3eca
device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed
@@ -348,6 +363,7 @@ SPEC CHECKSUMS:
flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
flutter_web_auth_2: 051cf9f5dc366f31b5dcc4e2952c2b954767be8a
GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe
GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
@@ -356,6 +372,7 @@ SPEC CHECKSUMS:
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
patrol: 0564cee315ff6c86fb802b3647db05cc2d3d0624
pdf_render: 0b4e1a615aab83ce88b26c57753049424908a755 pdf_render: 0b4e1a615aab83ce88b26c57753049424908a755
permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6
photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a
@@ -102,7 +102,7 @@ class AuthenticationClientMobile implements AuthenticationClientBase {
@override @override
Future<TokenOIDC> signInTwakeWorkplace(OIDCConfiguration oidcConfiguration) async { Future<TokenOIDC> signInTwakeWorkplace(OIDCConfiguration oidcConfiguration) async {
final uri = await FlutterWebAuth2.authenticate( final uri = await FlutterWebAuth2.authenticate(
url: oidcConfiguration.singInUrl, url: oidcConfiguration.signInTWPUrl,
callbackUrlScheme: OIDCConstant.twakeWorkplaceUrlScheme, callbackUrlScheme: OIDCConstant.twakeWorkplaceUrlScheme,
options: const FlutterWebAuth2Options( options: const FlutterWebAuth2Options(
intentFlags: ephemeralIntentFlags, intentFlags: ephemeralIntentFlags,
@@ -115,7 +115,7 @@ class AuthenticationClientMobile implements AuthenticationClientBase {
@override @override
Future<TokenOIDC> signUpTwakeWorkplace(OIDCConfiguration oidcConfiguration) async { Future<TokenOIDC> signUpTwakeWorkplace(OIDCConfiguration oidcConfiguration) async {
final uri = await FlutterWebAuth2.authenticate( final uri = await FlutterWebAuth2.authenticate(
url: oidcConfiguration.signUpUrl, url: oidcConfiguration.signUpTWPUrl,
callbackUrlScheme: OIDCConstant.twakeWorkplaceUrlScheme, callbackUrlScheme: OIDCConstant.twakeWorkplaceUrlScheme,
options: const FlutterWebAuth2Options( options: const FlutterWebAuth2Options(
intentFlags: ephemeralIntentFlags, intentFlags: ephemeralIntentFlags,
@@ -11,13 +11,13 @@ extension OidcConfigurationExtensions on OIDCConfiguration {
String get redirectUrl { String get redirectUrl {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
if (AppConfig.domainRedirectUrl.endsWith('/')) { return AppConfig.domainRedirectUrl.endsWith('/')
return AppConfig.domainRedirectUrl + loginRedirectOidcWeb; ? AppConfig.domainRedirectUrl + loginRedirectOidcWeb
} else { : '${AppConfig.domainRedirectUrl}/$loginRedirectOidcWeb';
return '${AppConfig.domainRedirectUrl}/$loginRedirectOidcWeb';
}
} else { } else {
return redirectOidcMobile; return authority == AppConfig.saasRegistrationUrl
? OIDCConstant.twakeWorkplaceRedirectUrl
: redirectOidcMobile;
} }
} }
@@ -29,11 +29,13 @@ extension OidcConfigurationExtensions on OIDCConfiguration {
return '${AppConfig.domainRedirectUrl}/$logoutRedirectOidcWeb'; return '${AppConfig.domainRedirectUrl}/$logoutRedirectOidcWeb';
} }
} else { } else {
return redirectOidcMobile; return authority == AppConfig.saasRegistrationUrl
} ? OIDCConstant.twakeWorkplaceRedirectUrl
: redirectOidcMobile;
}
} }
String get singInUrl => ServicePath(authority) String get signInTWPUrl => ServicePath(authority)
.withQueryParameters([ .withQueryParameters([
StringQueryParameter( StringQueryParameter(
OIDCConstant.postLoginRedirectUrlPathParams, OIDCConstant.postLoginRedirectUrlPathParams,
@@ -43,7 +45,7 @@ extension OidcConfigurationExtensions on OIDCConfiguration {
]) ])
.generateEndpointPath(); .generateEndpointPath();
String get signUpUrl => ServicePath(authority) String get signUpTWPUrl => ServicePath(authority)
.withQueryParameters([ .withQueryParameters([
StringQueryParameter( StringQueryParameter(
OIDCConstant.postRegisteredRedirectUrlPathParams, OIDCConstant.postRegisteredRedirectUrlPathParams,
@@ -46,12 +46,12 @@ class TwakeWelcomeController extends ReloadableController {
void onClickSignIn(BuildContext context) { void onClickSignIn(BuildContext context) {
TipDialogHelper.loading(AppLocalizations.of(context).loadingPleaseWait); TipDialogHelper.loading(AppLocalizations.of(context).loadingPleaseWait);
if (AppConfig.saasServerUrl.isEmpty) { if (AppConfig.saasJmapServerUrl.isEmpty) {
consumeState(Stream.value(Left(SignInTwakeWorkplaceFailure(CanNotFoundSaasServerUrl())))); consumeState(Stream.value(Left(SignInTwakeWorkplaceFailure(CanNotFoundSaasServerUrl()))));
return; return;
} }
final baseUri = Uri.tryParse(AppConfig.saasServerUrl); final baseUri = Uri.tryParse(AppConfig.saasJmapServerUrl);
if (baseUri == null) { if (baseUri == null) {
consumeState(Stream.value(Left(SignInTwakeWorkplaceFailure(SaasServerUriIsNull())))); consumeState(Stream.value(Left(SignInTwakeWorkplaceFailure(SaasServerUriIsNull()))));
@@ -61,7 +61,7 @@ class TwakeWelcomeController extends ReloadableController {
consumeState(_signInTwakeWorkplaceInteractor.execute( consumeState(_signInTwakeWorkplaceInteractor.execute(
baseUri: baseUri, baseUri: baseUri,
oidcConfiguration: OIDCConfiguration( oidcConfiguration: OIDCConfiguration(
authority: AppConfig.registrationUrl, authority: AppConfig.saasRegistrationUrl,
clientId: OIDCConstant.clientId, clientId: OIDCConstant.clientId,
scopes: AppConfig.oidcScopes scopes: AppConfig.oidcScopes
) )
@@ -71,12 +71,12 @@ class TwakeWelcomeController extends ReloadableController {
void onSignUpTwakeWorkplace(BuildContext context) { void onSignUpTwakeWorkplace(BuildContext context) {
TipDialogHelper.loading(AppLocalizations.of(context).loadingPleaseWait); TipDialogHelper.loading(AppLocalizations.of(context).loadingPleaseWait);
if (AppConfig.saasServerUrl.isEmpty) { if (AppConfig.saasJmapServerUrl.isEmpty) {
consumeState(Stream.value(Left(SignUpTwakeWorkplaceFailure(CanNotFoundSaasServerUrl())))); consumeState(Stream.value(Left(SignUpTwakeWorkplaceFailure(CanNotFoundSaasServerUrl()))));
return; return;
} }
final baseUri = Uri.tryParse(AppConfig.saasServerUrl); final baseUri = Uri.tryParse(AppConfig.saasJmapServerUrl);
if (baseUri == null) { if (baseUri == null) {
consumeState(Stream.value(Left(SignUpTwakeWorkplaceFailure(SaasServerUriIsNull())))); consumeState(Stream.value(Left(SignUpTwakeWorkplaceFailure(SaasServerUriIsNull()))));
@@ -86,7 +86,7 @@ class TwakeWelcomeController extends ReloadableController {
consumeState(_signUpTwakeWorkplaceInteractor.execute( consumeState(_signUpTwakeWorkplaceInteractor.execute(
baseUri: baseUri, baseUri: baseUri,
oidcConfiguration: OIDCConfiguration( oidcConfiguration: OIDCConfiguration(
authority: AppConfig.registrationUrl, authority: AppConfig.saasRegistrationUrl,
clientId: OIDCConstant.clientId, clientId: OIDCConstant.clientId,
scopes: AppConfig.oidcScopes scopes: AppConfig.oidcScopes
) )
@@ -7,7 +7,6 @@ import 'package:tip_dialog/tip_dialog.dart';
import 'package:tmail_ui_user/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart'; import 'package:tmail_ui_user/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart';
import 'package:tmail_ui_user/features/starting_page/presentation/twake_welcome/twake_welcome_view_style.dart'; import 'package:tmail_ui_user/features/starting_page/presentation/twake_welcome/twake_welcome_view_style.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
class TwakeWelcomeView extends GetWidget<TwakeWelcomeController> { class TwakeWelcomeView extends GetWidget<TwakeWelcomeController> {
@@ -34,14 +33,10 @@ class TwakeWelcomeView extends GetWidget<TwakeWelcomeController> {
hoverColor: Colors.transparent, hoverColor: Colors.transparent,
highlightColor: Colors.transparent, highlightColor: Colors.transparent,
overlayColor: WidgetStateProperty.all(Colors.transparent), overlayColor: WidgetStateProperty.all(Colors.transparent),
signInTitle: AppConfig.isSaasPlatForm signInTitle: AppLocalizations.of(context).signIn.capitalizeFirst ?? '',
? AppLocalizations.of(context).signIn.capitalizeFirst ?? ''
: null,
onSignInOnTap: () => controller.onClickSignIn(context), onSignInOnTap: () => controller.onClickSignIn(context),
onCreateTwakeIdOnTap: () => controller.onSignUpTwakeWorkplace(context), onCreateTwakeIdOnTap: () => controller.onSignUpTwakeWorkplace(context),
createTwakeIdTitle: AppConfig.isSaasPlatForm createTwakeIdTitle: AppLocalizations.of(context).createTwakeId,
? AppLocalizations.of(context).createTwakeId
: null,
useCompanyServerTitle: AppLocalizations.of(context).useCompanyServer, useCompanyServerTitle: AppLocalizations.of(context).useCompanyServer,
description: AppLocalizations.of(context).descriptionWelcomeTo, description: AppLocalizations.of(context).descriptionWelcomeTo,
descriptionTextStyle: TwakeWelcomeViewStyle.descriptionTextStyle, descriptionTextStyle: TwakeWelcomeViewStyle.descriptionTextStyle,
+2 -2
View File
@@ -67,7 +67,7 @@ class AppConfig {
static bool get isSaasPlatForm => _platformEnv.toLowerCase() == saasPlatform; static bool get isSaasPlatForm => _platformEnv.toLowerCase() == saasPlatform;
static String get registrationUrl => dotenv.get('REGISTRATION_URL', fallback: ''); static String get saasRegistrationUrl => dotenv.get('SAAS_REGISTRATION_URL', fallback: '');
static String get saasServerUrl => dotenv.get('SAAS_SERVER_URL', fallback: ''); static String get saasJmapServerUrl => dotenv.get('SAAS_JMAP_SERVER_URL', fallback: '');
} }
@@ -4,6 +4,7 @@ import 'dart:io';
import 'package:core/data/constants/constant.dart'; import 'package:core/data/constants/constant.dart';
import 'package:core/data/network/dio_client.dart'; import 'package:core/data/network/dio_client.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:http_mock_adapter/http_mock_adapter.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart';
import 'package:mockito/annotations.dart'; import 'package:mockito/annotations.dart';
@@ -76,6 +77,10 @@ void main() {
dio.interceptors.add(authorizationInterceptors); dio.interceptors.add(authorizationInterceptors);
dioAdapter = DioAdapter(dio: dio); dioAdapter = DioAdapter(dio: dio);
dotenv.testLoad(mergeWith: {
'PLATFORM': 'other'
});
}); });
group('AuthorizationInterceptor test', () { group('AuthorizationInterceptor test', () {