Skip to content

Commit

Permalink
Merge pull request #4005 from dpalou/MOBILE-4572
Browse files Browse the repository at this point in the history
Mobile 4572
  • Loading branch information
crazyserver authored Apr 11, 2024
2 parents 7142177 + 02d3ccf commit bf9d5a5
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<void> {
const result = await CoreLoginHelper.openBrowserForOAuthLogin(
this.siteUrl,
provider,
this.siteConfig?.launchurl,
Expand Down
6 changes: 5 additions & 1 deletion src/core/features/login/pages/credentials/credentials.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion src/core/features/login/pages/email-signup/email-signup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
66 changes: 42 additions & 24 deletions src/core/features/login/services/login-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<boolean> {
launchUrl = launchUrl || siteUrl + '/admin/tool/mobile/launch.php';

this.logger.debug('openBrowserForOAuthLogin launchUrl:', launchUrl);
Expand All @@ -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();

try {
const loginUrl = await this.prepareForSSOLogin(siteUrl, undefined, launchUrl, redirectData, {
oauthsso: params.id,
});

// Always open it in browser because the user might have the session stored in there.
CoreUtils.openInBrowser(loginUrl, { showBrowserWarning: false });
CoreApp.closeApp();

// 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 true;
return false;
}

/**
Expand All @@ -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<void> {
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();
}
}

Expand Down Expand Up @@ -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<string> {

service = service || CoreConstants.CONFIG.wsservice;
launchUrl = launchUrl || siteUrl + '/admin/tool/mobile/launch.php';
Expand All @@ -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(<StoredLoginLaunchData> {
await CoreConfig.set(CoreConstants.LOGIN_LAUNCH_DATA, JSON.stringify(<StoredLoginLaunchData> {
siteUrl: siteUrl,
passport: passport,
...redirectData,
Expand Down
23 changes: 23 additions & 0 deletions src/core/services/urlschemes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,29 @@ export class CoreCustomURLSchemesProvider {
}
}

/**
* Get the last URL used to open the app using a URL scheme.
*
* @returns URL.
*/
getLastLaunchURL(): Promise<string | undefined> {
return new Promise((resolve) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(<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<boolean> {
const launchUrl = await this.getLastLaunchURL();

return !!launchUrl && this.isCustomURLToken(launchUrl);
}

}

/**
Expand Down

0 comments on commit bf9d5a5

Please sign in to comment.