diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b8f463f26..da9d4a111 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -9,6 +9,7 @@ PODS: - AppAuth/Core - better_open_file (0.0.1): - Flutter + - CocoaAsyncSocket (7.6.5) - connectivity_plus (0.0.1): - Flutter - ReachabilitySwift @@ -116,6 +117,8 @@ PODS: - Flutter - flutter_secure_storage (6.0.0): - Flutter + - flutter_web_auth_2 (3.0.0): + - Flutter - GoogleDataTransport (9.3.0): - GoogleUtilities/Environment (~> 7.7) - nanopb (< 2.30910.0, >= 2.30908.0) @@ -163,6 +166,10 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS + - patrol (0.0.1): + - CocoaAsyncSocket (~> 7.6) + - Flutter + - FlutterMacOS - pdf_render (0.0.1): - Flutter - permission_handler_apple (9.1.1): @@ -217,8 +224,10 @@ DEPENDENCIES: - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/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`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - patrol (from `.symlinks/plugins/patrol/darwin`) - pdf_render (from `.symlinks/plugins/pdf_render/ios`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - photo_manager (from `.symlinks/plugins/photo_manager/ios`) @@ -233,6 +242,7 @@ DEPENDENCIES: SPEC REPOS: trunk: - AppAuth + - CocoaAsyncSocket - DKImagePickerController - DKPhotoGallery - Firebase @@ -294,10 +304,14 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_native_splash/ios" flutter_secure_storage: :path: ".symlinks/plugins/flutter_secure_storage/ios" + flutter_web_auth_2: + :path: ".symlinks/plugins/flutter_web_auth_2/ios" package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" + patrol: + :path: ".symlinks/plugins/patrol/darwin" pdf_render: :path: ".symlinks/plugins/pdf_render/ios" permission_handler_apple: @@ -323,6 +337,7 @@ SPEC CHECKSUMS: app_settings: 017320c6a680cdc94c799949d95b84cb69389ebc AppAuth: 182c5b88630569df5acb672720534756c29b3358 better_open_file: 03cf320415d4d3f46b6e00adc4a567d76c1a399d + CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e contacts_service: 849e1f84281804c8bfbec1b4c3eedcb23c5d3eca device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed @@ -348,6 +363,7 @@ SPEC CHECKSUMS: flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be + flutter_web_auth_2: 051cf9f5dc366f31b5dcc4e2952c2b954767be8a GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 @@ -356,6 +372,7 @@ SPEC CHECKSUMS: OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + patrol: 0564cee315ff6c86fb802b3647db05cc2d3d0624 pdf_render: 0b4e1a615aab83ce88b26c57753049424908a755 permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a diff --git a/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart b/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart index d0c25b1e4..e307810b5 100644 --- a/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart +++ b/lib/features/login/data/network/authentication_client/authentication_client_mobile.dart @@ -102,7 +102,7 @@ class AuthenticationClientMobile implements AuthenticationClientBase { @override Future signInTwakeWorkplace(OIDCConfiguration oidcConfiguration) async { final uri = await FlutterWebAuth2.authenticate( - url: oidcConfiguration.singInUrl, + url: oidcConfiguration.signInTWPUrl, callbackUrlScheme: OIDCConstant.twakeWorkplaceUrlScheme, options: const FlutterWebAuth2Options( intentFlags: ephemeralIntentFlags, @@ -115,7 +115,7 @@ class AuthenticationClientMobile implements AuthenticationClientBase { @override Future signUpTwakeWorkplace(OIDCConfiguration oidcConfiguration) async { final uri = await FlutterWebAuth2.authenticate( - url: oidcConfiguration.signUpUrl, + url: oidcConfiguration.signUpTWPUrl, callbackUrlScheme: OIDCConstant.twakeWorkplaceUrlScheme, options: const FlutterWebAuth2Options( intentFlags: ephemeralIntentFlags, diff --git a/lib/features/login/domain/extensions/oidc_configuration_extensions.dart b/lib/features/login/domain/extensions/oidc_configuration_extensions.dart index 3a0312f7c..de92bdffa 100644 --- a/lib/features/login/domain/extensions/oidc_configuration_extensions.dart +++ b/lib/features/login/domain/extensions/oidc_configuration_extensions.dart @@ -11,13 +11,13 @@ extension OidcConfigurationExtensions on OIDCConfiguration { String get redirectUrl { if (PlatformInfo.isWeb) { - if (AppConfig.domainRedirectUrl.endsWith('/')) { - return AppConfig.domainRedirectUrl + loginRedirectOidcWeb; - } else { - return '${AppConfig.domainRedirectUrl}/$loginRedirectOidcWeb'; - } + return AppConfig.domainRedirectUrl.endsWith('/') + ? AppConfig.domainRedirectUrl + loginRedirectOidcWeb + : '${AppConfig.domainRedirectUrl}/$loginRedirectOidcWeb'; } else { - return redirectOidcMobile; + return authority == AppConfig.saasRegistrationUrl + ? OIDCConstant.twakeWorkplaceRedirectUrl + : redirectOidcMobile; } } @@ -29,11 +29,13 @@ extension OidcConfigurationExtensions on OIDCConfiguration { return '${AppConfig.domainRedirectUrl}/$logoutRedirectOidcWeb'; } } else { - return redirectOidcMobile; - } + return authority == AppConfig.saasRegistrationUrl + ? OIDCConstant.twakeWorkplaceRedirectUrl + : redirectOidcMobile; + } } - String get singInUrl => ServicePath(authority) + String get signInTWPUrl => ServicePath(authority) .withQueryParameters([ StringQueryParameter( OIDCConstant.postLoginRedirectUrlPathParams, @@ -43,7 +45,7 @@ extension OidcConfigurationExtensions on OIDCConfiguration { ]) .generateEndpointPath(); - String get signUpUrl => ServicePath(authority) + String get signUpTWPUrl => ServicePath(authority) .withQueryParameters([ StringQueryParameter( OIDCConstant.postRegisteredRedirectUrlPathParams, diff --git a/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart b/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart index 83cc4bfbc..55347ba9c 100644 --- a/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart +++ b/lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart @@ -46,12 +46,12 @@ class TwakeWelcomeController extends ReloadableController { void onClickSignIn(BuildContext context) { TipDialogHelper.loading(AppLocalizations.of(context).loadingPleaseWait); - if (AppConfig.saasServerUrl.isEmpty) { + if (AppConfig.saasJmapServerUrl.isEmpty) { consumeState(Stream.value(Left(SignInTwakeWorkplaceFailure(CanNotFoundSaasServerUrl())))); return; } - final baseUri = Uri.tryParse(AppConfig.saasServerUrl); + final baseUri = Uri.tryParse(AppConfig.saasJmapServerUrl); if (baseUri == null) { consumeState(Stream.value(Left(SignInTwakeWorkplaceFailure(SaasServerUriIsNull())))); @@ -61,7 +61,7 @@ class TwakeWelcomeController extends ReloadableController { consumeState(_signInTwakeWorkplaceInteractor.execute( baseUri: baseUri, oidcConfiguration: OIDCConfiguration( - authority: AppConfig.registrationUrl, + authority: AppConfig.saasRegistrationUrl, clientId: OIDCConstant.clientId, scopes: AppConfig.oidcScopes ) @@ -71,12 +71,12 @@ class TwakeWelcomeController extends ReloadableController { void onSignUpTwakeWorkplace(BuildContext context) { TipDialogHelper.loading(AppLocalizations.of(context).loadingPleaseWait); - if (AppConfig.saasServerUrl.isEmpty) { + if (AppConfig.saasJmapServerUrl.isEmpty) { consumeState(Stream.value(Left(SignUpTwakeWorkplaceFailure(CanNotFoundSaasServerUrl())))); return; } - final baseUri = Uri.tryParse(AppConfig.saasServerUrl); + final baseUri = Uri.tryParse(AppConfig.saasJmapServerUrl); if (baseUri == null) { consumeState(Stream.value(Left(SignUpTwakeWorkplaceFailure(SaasServerUriIsNull())))); @@ -86,7 +86,7 @@ class TwakeWelcomeController extends ReloadableController { consumeState(_signUpTwakeWorkplaceInteractor.execute( baseUri: baseUri, oidcConfiguration: OIDCConfiguration( - authority: AppConfig.registrationUrl, + authority: AppConfig.saasRegistrationUrl, clientId: OIDCConstant.clientId, scopes: AppConfig.oidcScopes ) diff --git a/lib/features/starting_page/presentation/twake_welcome/twake_welcome_view.dart b/lib/features/starting_page/presentation/twake_welcome/twake_welcome_view.dart index 33266720f..c16bc67a9 100644 --- a/lib/features/starting_page/presentation/twake_welcome/twake_welcome_view.dart +++ b/lib/features/starting_page/presentation/twake_welcome/twake_welcome_view.dart @@ -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_view_style.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 { @@ -34,14 +33,10 @@ class TwakeWelcomeView extends GetWidget { hoverColor: Colors.transparent, highlightColor: Colors.transparent, overlayColor: WidgetStateProperty.all(Colors.transparent), - signInTitle: AppConfig.isSaasPlatForm - ? AppLocalizations.of(context).signIn.capitalizeFirst ?? '' - : null, + signInTitle: AppLocalizations.of(context).signIn.capitalizeFirst ?? '', onSignInOnTap: () => controller.onClickSignIn(context), onCreateTwakeIdOnTap: () => controller.onSignUpTwakeWorkplace(context), - createTwakeIdTitle: AppConfig.isSaasPlatForm - ? AppLocalizations.of(context).createTwakeId - : null, + createTwakeIdTitle: AppLocalizations.of(context).createTwakeId, useCompanyServerTitle: AppLocalizations.of(context).useCompanyServer, description: AppLocalizations.of(context).descriptionWelcomeTo, descriptionTextStyle: TwakeWelcomeViewStyle.descriptionTextStyle, diff --git a/lib/main/utils/app_config.dart b/lib/main/utils/app_config.dart index fdb99d350..be4dcd9a4 100644 --- a/lib/main/utils/app_config.dart +++ b/lib/main/utils/app_config.dart @@ -67,7 +67,7 @@ class AppConfig { 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: ''); } \ No newline at end of file diff --git a/test/features/interceptor/authorization_interceptor_test.dart b/test/features/interceptor/authorization_interceptor_test.dart index fcc70b1cc..63c4c1e2a 100644 --- a/test/features/interceptor/authorization_interceptor_test.dart +++ b/test/features/interceptor/authorization_interceptor_test.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:core/data/constants/constant.dart'; import 'package:core/data/network/dio_client.dart'; import 'package:dio/dio.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; import 'package:mockito/annotations.dart'; @@ -76,6 +77,10 @@ void main() { dio.interceptors.add(authorizationInterceptors); dioAdapter = DioAdapter(dio: dio); + + dotenv.testLoad(mergeWith: { + 'PLATFORM': 'other' + }); }); group('AuthorizationInterceptor test', () {