diff --git a/src/core/features/login/components/login-methods/login-methods.ts b/src/core/features/login/components/login-methods/login-methods.ts index ce0df2c19..b7f252a34 100644 --- a/src/core/features/login/components/login-methods/login-methods.ts +++ b/src/core/features/login/components/login-methods/login-methods.ts @@ -92,8 +92,8 @@ export class CoreLoginMethodsComponent implements OnInit { * * @param provider The provider that was clicked. */ - oauthClicked(provider: CoreSiteIdentityProvider): void { - const result = CoreLoginHelper.openBrowserForOAuthLogin( + async oauthClicked(provider: CoreSiteIdentityProvider): Promise { + const result = await CoreLoginHelper.openBrowserForOAuthLogin( this.siteUrl, provider, this.siteConfig?.launchurl, diff --git a/src/core/features/login/pages/credentials/credentials.ts b/src/core/features/login/pages/credentials/credentials.ts index 35221ad9b..2bef573d0 100644 --- a/src/core/features/login/pages/credentials/credentials.ts +++ b/src/core/features/login/pages/credentials/credentials.ts @@ -34,6 +34,7 @@ import { SafeHtml } from '@angular/platform-browser'; import { CorePlatform } from '@services/platform'; import { CoreSitesFactory } from '@services/sites-factory'; import { EMAIL_SIGNUP_FEATURE_NAME, FORGOTTEN_PASSWORD_FEATURE_NAME } from '@features/login/constants'; +import { CoreCustomURLSchemes } from '@services/urlschemes'; /** * Page to enter the user credentials. @@ -107,7 +108,10 @@ export class CoreLoginCredentialsPage implements OnInit, OnDestroy { await this.checkSite(); if (this.isBrowserSSO && CoreLoginHelper.shouldSkipCredentialsScreenOnSSO()) { - this.openBrowserSSO(); + const launchedWithTokenURL = await CoreCustomURLSchemes.appLaunchedWithTokenURL(); + if (!launchedWithTokenURL) { + this.openBrowserSSO(); + } } if (CorePlatform.isIOS() && !this.isBrowserSSO) { diff --git a/src/core/features/login/pages/email-signup/email-signup.ts b/src/core/features/login/pages/email-signup/email-signup.ts index 5a05c71b2..6851ebe72 100644 --- a/src/core/features/login/pages/email-signup/email-signup.ts +++ b/src/core/features/login/pages/email-signup/email-signup.ts @@ -318,7 +318,7 @@ export class CoreLoginEmailSignupPage implements OnInit { }; if (this.siteConfig?.launchurl) { - params.redirect = CoreLoginHelper.prepareForSSOLogin(this.site.getURL(), undefined, this.siteConfig.launchurl); + params.redirect = await CoreLoginHelper.prepareForSSOLogin(this.site.getURL(), undefined, this.siteConfig.launchurl); } // Get the recaptcha response (if needed). diff --git a/src/core/features/login/services/login-helper.ts b/src/core/features/login/services/login-helper.ts index 7f7bbfb4b..22bb66755 100644 --- a/src/core/features/login/services/login-helper.ts +++ b/src/core/features/login/services/login-helper.ts @@ -613,12 +613,12 @@ export class CoreLoginHelperProvider { * @param redirectData Data of the path/url to open once authenticated. If not defined, site initial page. * @returns True if success, false if error. */ - openBrowserForOAuthLogin( + async openBrowserForOAuthLogin( siteUrl: string, provider: CoreSiteIdentityProvider, launchUrl?: string, redirectData?: CoreRedirectPayload, - ): boolean { + ): Promise { launchUrl = launchUrl || siteUrl + '/admin/tool/mobile/launch.php'; this.logger.debug('openBrowserForOAuthLogin launchUrl:', launchUrl); @@ -633,15 +633,25 @@ export class CoreLoginHelperProvider { return false; } - const loginUrl = this.prepareForSSOLogin(siteUrl, undefined, launchUrl, redirectData, { - oauthsso: params.id, - }); + const modal = await CoreDomUtils.showModalLoading(); - // Always open it in browser because the user might have the session stored in there. - CoreUtils.openInBrowser(loginUrl, { showBrowserWarning: false }); - CoreApp.closeApp(); + try { + const loginUrl = await this.prepareForSSOLogin(siteUrl, undefined, launchUrl, redirectData, { + oauthsso: params.id, + }); - return true; + // Always open it in browser because the user might have the session stored in there. + CoreUtils.openInBrowser(loginUrl, { showBrowserWarning: false }); + CoreApp.closeApp(); + + return true; + } catch (error) { + CoreDomUtils.showErrorModalDefault(error, 'Error opening browser'); + } finally { + modal.dismiss(); + } + + return false; } /** @@ -653,25 +663,33 @@ export class CoreLoginHelperProvider { * @param launchUrl The URL to open for SSO. If not defined, default tool mobile launch URL will be used. * @param redirectData Data of the path/url to open once authenticated. If not defined, site initial page. */ - openBrowserForSSOLogin( + async openBrowserForSSOLogin( siteUrl: string, typeOfLogin: TypeOfLogin, service?: string, launchUrl?: string, redirectData?: CoreRedirectPayload, - ): void { - const loginUrl = this.prepareForSSOLogin(siteUrl, service, launchUrl, redirectData); + ): Promise { + const modal = await CoreDomUtils.showModalLoading(); - this.logger.debug('openBrowserForSSOLogin loginUrl:', loginUrl); + try { + const loginUrl = await this.prepareForSSOLogin(siteUrl, service, launchUrl, redirectData); - if (this.isSSOEmbeddedBrowser(typeOfLogin)) { - CoreUtils.openInApp(loginUrl, { - clearsessioncache: 'yes', // Clear the session cache to allow for multiple logins. - closebuttoncaption: Translate.instant('core.login.cancel'), - }); - } else { - CoreUtils.openInBrowser(loginUrl, { showBrowserWarning: false }); - CoreApp.closeApp(); + this.logger.debug('openBrowserForSSOLogin loginUrl:', loginUrl); + + if (this.isSSOEmbeddedBrowser(typeOfLogin)) { + CoreUtils.openInApp(loginUrl, { + clearsessioncache: 'yes', // Clear the session cache to allow for multiple logins. + closebuttoncaption: Translate.instant('core.login.cancel'), + }); + } else { + CoreUtils.openInBrowser(loginUrl, { showBrowserWarning: false }); + CoreApp.closeApp(); + } + } catch (error) { + CoreDomUtils.showErrorModalDefault(error, 'Error opening browser'); + } finally { + modal.dismiss(); } } @@ -779,13 +797,13 @@ export class CoreLoginHelperProvider { * @param urlParams Other params to add to the URL. * @returns Login Url. */ - prepareForSSOLogin( + async prepareForSSOLogin( siteUrl: string, service?: string, launchUrl?: string, redirectData: CoreRedirectPayload = {}, urlParams?: CoreUrlParams, - ): string { + ): Promise { service = service || CoreConstants.CONFIG.wsservice; launchUrl = launchUrl || siteUrl + '/admin/tool/mobile/launch.php'; @@ -802,7 +820,7 @@ export class CoreLoginHelperProvider { // Store the siteurl and passport in CoreConfigProvider for persistence. // We are "configuring" the app to wait for an SSO. CoreConfigProvider shouldn't be used as a temporary storage. - CoreConfig.set(CoreConstants.LOGIN_LAUNCH_DATA, JSON.stringify( { + await CoreConfig.set(CoreConstants.LOGIN_LAUNCH_DATA, JSON.stringify( { siteUrl: siteUrl, passport: passport, ...redirectData, diff --git a/src/core/services/urlschemes.ts b/src/core/services/urlschemes.ts index fd79c93f9..780739f3e 100644 --- a/src/core/services/urlschemes.ts +++ b/src/core/services/urlschemes.ts @@ -502,6 +502,29 @@ export class CoreCustomURLSchemesProvider { } } + /** + * Get the last URL used to open the app using a URL scheme. + * + * @returns URL. + */ + getLastLaunchURL(): Promise { + return new Promise((resolve) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ( window).plugins.launchmyapp.getLastIntent(intent => resolve(intent), () => resolve(undefined)); + }); + } + + /** + * Check if the last URL used to open the app was a token URL. + * + * @returns Whether was launched with token URL. + */ + async appLaunchedWithTokenURL(): Promise { + const launchUrl = await this.getLastLaunchURL(); + + return !!launchUrl && this.isCustomURLToken(launchUrl); + } + } /**