MOBILE-4693 core: Add more debugging to invalid site errors
parent
3cfd550b58
commit
c14646b7e2
|
@ -181,7 +181,7 @@ export class CoreLoginCredentialsPage implements OnInit, OnDestroy {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!this.siteCheck) {
|
if (!this.siteCheck) {
|
||||||
this.siteCheck = await CoreSites.checkSite(this.site.siteUrl, protocol);
|
this.siteCheck = await CoreSites.checkSite(this.site.siteUrl, protocol, 'Credentials page');
|
||||||
this.siteCheck.config && this.site.setPublicConfig(this.siteCheck.config);
|
this.siteCheck.config && this.site.setPublicConfig(this.siteCheck.config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -333,14 +333,14 @@ export class CoreLoginSitePage implements OnInit {
|
||||||
let checkResult: CoreSiteCheckResponse;
|
let checkResult: CoreSiteCheckResponse;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
checkResult = await CoreSites.checkSite(url);
|
checkResult = await CoreSites.checkSite(url, undefined, 'Site URL page');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Attempt guessing the domain if the initial check failed
|
// Attempt guessing the domain if the initial check failed
|
||||||
const domain = CoreUrl.guessMoodleDomain(url);
|
const domain = CoreUrl.guessMoodleDomain(url);
|
||||||
|
|
||||||
if (domain && domain != url) {
|
if (domain && domain != url) {
|
||||||
try {
|
try {
|
||||||
checkResult = await CoreSites.checkSite(domain);
|
checkResult = await CoreSites.checkSite(domain, undefined, 'Site URL page');
|
||||||
} catch (secondError) {
|
} catch (secondError) {
|
||||||
// Try to use the first error.
|
// Try to use the first error.
|
||||||
modal.dismiss();
|
modal.dismiss();
|
||||||
|
@ -608,7 +608,7 @@ export class CoreLoginSitePage implements OnInit {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Check if site uses SSO.
|
// Check if site uses SSO.
|
||||||
const siteCheck = await CoreSites.checkSite(siteUrl);
|
const siteCheck = await CoreSites.checkSite(siteUrl, undefined, 'Site URL page');
|
||||||
|
|
||||||
await CoreSites.checkApplication(siteCheck.config);
|
await CoreSites.checkApplication(siteCheck.config);
|
||||||
|
|
||||||
|
|
|
@ -286,14 +286,18 @@ export class CoreSitesProvider {
|
||||||
*
|
*
|
||||||
* @param siteUrl URL of the site to check.
|
* @param siteUrl URL of the site to check.
|
||||||
* @param protocol Protocol to use first.
|
* @param protocol Protocol to use first.
|
||||||
|
* @param origin Origin of this check site call.
|
||||||
* @returns A promise resolved when the site is checked.
|
* @returns A promise resolved when the site is checked.
|
||||||
*/
|
*/
|
||||||
async checkSite(siteUrl: string, protocol: string = 'https://'): Promise<CoreSiteCheckResponse> {
|
async checkSite(siteUrl: string, protocol: string = 'https://', origin = 'unknown'): Promise<CoreSiteCheckResponse> {
|
||||||
// The formatURL function adds the protocol if is missing.
|
// The formatURL function adds the protocol if is missing.
|
||||||
siteUrl = CoreUrl.formatURL(siteUrl);
|
siteUrl = CoreUrl.formatURL(siteUrl);
|
||||||
|
|
||||||
if (!CoreUrl.isHttpURL(siteUrl)) {
|
if (!CoreUrl.isHttpURL(siteUrl)) {
|
||||||
throw new CoreError(Translate.instant('core.login.invalidsite'));
|
throw new CoreError(Translate.instant('core.login.invalidsite'), {
|
||||||
|
code: 'invalidprotocol',
|
||||||
|
details: `URL contains an invalid protocol when checking site.<br><br>Origin: ${origin}.<br><br>URL: ${siteUrl}.`,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CoreNetwork.isOnline()) {
|
if (!CoreNetwork.isOnline()) {
|
||||||
|
|
|
@ -44,6 +44,22 @@ export class CoreCustomURLSchemesProvider {
|
||||||
this.logger = CoreLogger.getInstance('CoreCustomURLSchemesProvider');
|
this.logger = CoreLogger.getInstance('CoreCustomURLSchemesProvider');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a CoreCustomURLSchemesHandleError to be used when treating a URL that doesn't have a valid scheme.
|
||||||
|
*
|
||||||
|
* @param url URL that caused the error.
|
||||||
|
* @param data Data obtained from the URL (if any).
|
||||||
|
* @returns Error.
|
||||||
|
*/
|
||||||
|
protected createInvalidSchemeError(url: string, data?: CoreCustomURLSchemesParams): CoreCustomURLSchemesHandleError {
|
||||||
|
const defaultError = new CoreError(Translate.instant('core.login.invalidsite'), {
|
||||||
|
code: 'invalidurlscheme',
|
||||||
|
details: `Error when treating a URL scheme, it seems the URL is not valid.<br><br>URL: ${url}`,
|
||||||
|
});
|
||||||
|
|
||||||
|
return new CoreCustomURLSchemesHandleError(defaultError, data);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given some data of a custom URL with a token, create a site if it needs to be created.
|
* Given some data of a custom URL with a token, create a site if it needs to be created.
|
||||||
*
|
*
|
||||||
|
@ -62,7 +78,7 @@ export class CoreCustomURLSchemesProvider {
|
||||||
|
|
||||||
if (!data.siteUrl.match(/^https?:\/\//)) {
|
if (!data.siteUrl.match(/^https?:\/\//)) {
|
||||||
// URL doesn't have a protocol and it's required to be able to create the site. Check which one to use.
|
// URL doesn't have a protocol and it's required to be able to create the site. Check which one to use.
|
||||||
const result = await CoreSites.checkSite(data.siteUrl);
|
const result = await CoreSites.checkSite(data.siteUrl, undefined, 'URL scheme create site');
|
||||||
|
|
||||||
data.siteUrl = result.siteUrl;
|
data.siteUrl = result.siteUrl;
|
||||||
|
|
||||||
|
@ -90,7 +106,13 @@ export class CoreCustomURLSchemesProvider {
|
||||||
*/
|
*/
|
||||||
async handleCustomURL(url: string): Promise<void> {
|
async handleCustomURL(url: string): Promise<void> {
|
||||||
if (!this.isCustomURL(url)) {
|
if (!this.isCustomURL(url)) {
|
||||||
throw new CoreCustomURLSchemesHandleError(null);
|
throw this.createInvalidSchemeError(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if there is nothing valid after the URL scheme.
|
||||||
|
const urlWithoutScheme = this.removeCustomURLScheme(url).trim();
|
||||||
|
if (!urlWithoutScheme || urlWithoutScheme.match(/^\/?(#.*)?\/?$/)) {
|
||||||
|
throw this.createInvalidSchemeError(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* First check that this URL hasn't been treated a few seconds ago. The function that handles custom URL schemes already
|
/* First check that this URL hasn't been treated a few seconds ago. The function that handles custom URL schemes already
|
||||||
|
@ -202,7 +224,7 @@ export class CoreCustomURLSchemesProvider {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Site not stored. Try to add the site.
|
// Site not stored. Try to add the site.
|
||||||
const result = await CoreSites.checkSite(data.siteUrl);
|
const result = await CoreSites.checkSite(data.siteUrl, undefined, `URL scheme redirect: ${url}`);
|
||||||
|
|
||||||
// Site exists. We'll allow to add it.
|
// Site exists. We'll allow to add it.
|
||||||
modal.dismiss(); // Dismiss modal so it doesn't collide with confirms.
|
modal.dismiss(); // Dismiss modal so it doesn't collide with confirms.
|
||||||
|
@ -211,7 +233,12 @@ export class CoreCustomURLSchemesProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new CoreCustomURLSchemesHandleError(error, data);
|
if (!error || !CoreErrorHelper.getErrorMessageFromError(error)) {
|
||||||
|
// Use a default error.
|
||||||
|
this.createInvalidSchemeError(url, data);
|
||||||
|
} else {
|
||||||
|
throw new CoreCustomURLSchemesHandleError(error, data);
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
modal.dismiss();
|
modal.dismiss();
|
||||||
|
|
||||||
|
@ -230,7 +257,7 @@ export class CoreCustomURLSchemesProvider {
|
||||||
*/
|
*/
|
||||||
protected async getCustomURLData(url: string): Promise<CoreCustomURLSchemesParams> {
|
protected async getCustomURLData(url: string): Promise<CoreCustomURLSchemesParams> {
|
||||||
if (!this.isCustomURL(url)) {
|
if (!this.isCustomURL(url)) {
|
||||||
throw new CoreCustomURLSchemesHandleError(null);
|
throw this.createInvalidSchemeError(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
// App opened using custom URL scheme.
|
// App opened using custom URL scheme.
|
||||||
|
@ -283,7 +310,7 @@ export class CoreCustomURLSchemesProvider {
|
||||||
*/
|
*/
|
||||||
protected async getCustomURLLinkData(url: string): Promise<CoreCustomURLSchemesParams> {
|
protected async getCustomURLLinkData(url: string): Promise<CoreCustomURLSchemesParams> {
|
||||||
if (!this.isCustomURLLink(url)) {
|
if (!this.isCustomURLLink(url)) {
|
||||||
throw new CoreCustomURLSchemesHandleError(null);
|
throw this.createInvalidSchemeError(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
// App opened using custom URL scheme.
|
// App opened using custom URL scheme.
|
||||||
|
@ -345,7 +372,7 @@ export class CoreCustomURLSchemesProvider {
|
||||||
*/
|
*/
|
||||||
protected async getCustomURLTokenData(url: string): Promise<CoreCustomURLSchemesParams> {
|
protected async getCustomURLTokenData(url: string): Promise<CoreCustomURLSchemesParams> {
|
||||||
if (!this.isCustomURLToken(url)) {
|
if (!this.isCustomURLToken(url)) {
|
||||||
throw new CoreCustomURLSchemesHandleError(null);
|
throw this.createInvalidSchemeError(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CoreSSO.isSSOAuthenticationOngoing()) {
|
if (CoreSSO.isSSOAuthenticationOngoing()) {
|
||||||
|
@ -358,6 +385,7 @@ export class CoreCustomURLSchemesProvider {
|
||||||
this.logger.debug('App launched by URL with an SSO');
|
this.logger.debug('App launched by URL with an SSO');
|
||||||
|
|
||||||
// Delete the sso scheme from the URL.
|
// Delete the sso scheme from the URL.
|
||||||
|
const originalUrl = url;
|
||||||
url = this.removeCustomURLTokenScheme(url);
|
url = this.removeCustomURLTokenScheme(url);
|
||||||
|
|
||||||
// Some platforms like Windows add a slash at the end. Remove it.
|
// Some platforms like Windows add a slash at the end. Remove it.
|
||||||
|
@ -371,7 +399,11 @@ export class CoreCustomURLSchemesProvider {
|
||||||
// Error decoding the parameter.
|
// Error decoding the parameter.
|
||||||
this.logger.error('Error decoding parameter received for login SSO');
|
this.logger.error('Error decoding parameter received for login SSO');
|
||||||
|
|
||||||
throw new CoreCustomURLSchemesHandleError(null);
|
throw new CoreCustomURLSchemesHandleError(new CoreError(Translate.instant('core.login.invalidsite'), {
|
||||||
|
code: 'errordecodingparameter',
|
||||||
|
details: `Error when trying to decode base 64 string.<br><br>URL: ${originalUrl}<br><br>Text to decode: ${url}` +
|
||||||
|
`<br><br>Error: ${CoreErrorHelper.getErrorMessageFromError(err)}`,
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
const data: CoreCustomURLSchemesParams = await CoreLoginHelper.validateBrowserSSOLogin(url);
|
const data: CoreCustomURLSchemesParams = await CoreLoginHelper.validateBrowserSSOLogin(url);
|
||||||
|
@ -491,14 +523,17 @@ export class CoreCustomURLSchemesProvider {
|
||||||
* @param error Error data.
|
* @param error Error data.
|
||||||
*/
|
*/
|
||||||
treatHandleCustomURLError(error: CoreCustomURLSchemesHandleError): void {
|
treatHandleCustomURLError(error: CoreCustomURLSchemesHandleError): void {
|
||||||
if (error.error == 'Duplicated') {
|
if (error.error === 'Duplicated') {
|
||||||
// Duplicated request
|
// Duplicated request
|
||||||
} else if (CoreWSError.isWebServiceError(error.error) && error.data && error.data.isSSOToken) {
|
} else if (CoreWSError.isWebServiceError(error.error) && error.data && error.data.isSSOToken) {
|
||||||
// An error occurred, display the error and logout the user.
|
// An error occurred, display the error and logout the user.
|
||||||
CoreLoginHelper.treatUserTokenError(error.data.siteUrl, <CoreWSError> error.error);
|
CoreLoginHelper.treatUserTokenError(error.data.siteUrl, <CoreWSError> error.error);
|
||||||
CoreSites.logout();
|
CoreSites.logout();
|
||||||
} else {
|
} else {
|
||||||
CoreDomUtils.showErrorModalDefault(error.error, Translate.instant('core.login.invalidsite'));
|
CoreDomUtils.showErrorModal(error.error ?? new CoreError(Translate.instant('core.login.invalidsite'), {
|
||||||
|
code: 'unknownerror',
|
||||||
|
details: 'Unknown error when treating a URL scheme.',
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue