Merge pull request #1483 from dpalou/MOBILE-2533
MOBILE-2533 core: Apply auto-login to embedded iframesmain
commit
5e4e951352
|
@ -1434,24 +1434,31 @@ export class CoreSite {
|
||||||
* Given a URL, convert it to a URL that will auto-login if supported.
|
* Given a URL, convert it to a URL that will auto-login if supported.
|
||||||
*
|
*
|
||||||
* @param {string} url The URL to convert.
|
* @param {string} url The URL to convert.
|
||||||
|
* @param {boolean} [showModal=true] Whether to show a loading modal.
|
||||||
* @return {Promise<string>} Promise resolved with the converted URL.
|
* @return {Promise<string>} Promise resolved with the converted URL.
|
||||||
*/
|
*/
|
||||||
getAutoLoginUrl(url: string): Promise<string> {
|
getAutoLoginUrl(url: string, showModal: boolean = true): Promise<string> {
|
||||||
|
|
||||||
if (!this.privateToken || !this.wsAvailable('tool_mobile_get_autologin_key') ||
|
if (!this.privateToken || !this.wsAvailable('tool_mobile_get_autologin_key') ||
|
||||||
(this.lastAutoLogin && this.timeUtils.timestamp() - this.lastAutoLogin < CoreConstants.SECONDS_MINUTE * 6)) {
|
(this.lastAutoLogin && this.timeUtils.timestamp() - this.lastAutoLogin < CoreConstants.SECONDS_MINUTE * 6)) {
|
||||||
// No private token, WS not available or last auto-login was less than 6 minutes ago. Don't change the URL.
|
// No private token, WS not available or last auto-login was less than 6 minutes ago. Don't change the URL.
|
||||||
|
|
||||||
return Promise.resolve(url);
|
return Promise.resolve(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
const userId = this.getUserId(),
|
const userId = this.getUserId(),
|
||||||
params = {
|
params = {
|
||||||
privatetoken: this.privateToken
|
privatetoken: this.privateToken
|
||||||
},
|
};
|
||||||
|
let modal;
|
||||||
|
|
||||||
|
if (showModal) {
|
||||||
modal = this.domUtils.showModalLoading();
|
modal = this.domUtils.showModalLoading();
|
||||||
|
}
|
||||||
|
|
||||||
// Use write to not use cache.
|
// Use write to not use cache.
|
||||||
return this.write('tool_mobile_get_autologin_key', params).then((data) => {
|
return this.write('tool_mobile_get_autologin_key', params).then((data) => {
|
||||||
|
|
||||||
if (!data.autologinurl || !data.key) {
|
if (!data.autologinurl || !data.key) {
|
||||||
// Not valid data, return the same URL.
|
// Not valid data, return the same URL.
|
||||||
return url;
|
return url;
|
||||||
|
@ -1461,10 +1468,11 @@ export class CoreSite {
|
||||||
|
|
||||||
return data.autologinurl + '?userid=' + userId + '&key=' + data.key + '&urltogo=' + url;
|
return data.autologinurl + '?userid=' + userId + '&key=' + data.key + '&urltogo=' + url;
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
|
|
||||||
// Couldn't get autologin key, return the same URL.
|
// Couldn't get autologin key, return the same URL.
|
||||||
return url;
|
return url;
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
modal.dismiss();
|
modal && modal.dismiss();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ export class CoreViewerIframePage {
|
||||||
|
|
||||||
if (currentSite && (this.autoLogin == 'yes' || (this.autoLogin == 'check' && currentSite.containsUrl(url)))) {
|
if (currentSite && (this.autoLogin == 'yes' || (this.autoLogin == 'check' && currentSite.containsUrl(url)))) {
|
||||||
// Format the URL to add auto-login.
|
// Format the URL to add auto-login.
|
||||||
currentSite.getAutoLoginUrl(url).then((url) => {
|
currentSite.getAutoLoginUrl(url, false).then((url) => {
|
||||||
this.url = url;
|
this.url = url;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -334,7 +334,7 @@ export class CoreFormatTextDirective implements OnChanges {
|
||||||
buttons = Array.from(div.querySelectorAll('.button'));
|
buttons = Array.from(div.querySelectorAll('.button'));
|
||||||
elementsWithInlineStyles = Array.from(div.querySelectorAll('*[style]'));
|
elementsWithInlineStyles = Array.from(div.querySelectorAll('*[style]'));
|
||||||
stopClicksElements = Array.from(div.querySelectorAll('button,input,select,textarea'));
|
stopClicksElements = Array.from(div.querySelectorAll('button,input,select,textarea'));
|
||||||
frames = Array.from(div.querySelectorAll(CoreIframeUtilsProvider.FRAME_TAGS.join(',')));
|
frames = Array.from(div.querySelectorAll(CoreIframeUtilsProvider.FRAME_TAGS.join(',').replace(/iframe,?/, '')));
|
||||||
|
|
||||||
// Walk through the content to find the links and add our directive to it.
|
// Walk through the content to find the links and add our directive to it.
|
||||||
// Important: We need to look for links first because in 'img' we add new links without core-link.
|
// Important: We need to look for links first because in 'img' we add new links without core-link.
|
||||||
|
@ -531,9 +531,22 @@ export class CoreFormatTextDirective implements OnChanges {
|
||||||
* @param {Boolean} canTreatVimeo Whether Vimeo videos can be treated in the site.
|
* @param {Boolean} canTreatVimeo Whether Vimeo videos can be treated in the site.
|
||||||
*/
|
*/
|
||||||
protected treatIframe(iframe: HTMLIFrameElement, site: CoreSite, canTreatVimeo: boolean): void {
|
protected treatIframe(iframe: HTMLIFrameElement, site: CoreSite, canTreatVimeo: boolean): void {
|
||||||
|
const src = iframe.src,
|
||||||
|
currentSite = this.sitesProvider.getCurrentSite();
|
||||||
|
|
||||||
this.addMediaAdaptClass(iframe);
|
this.addMediaAdaptClass(iframe);
|
||||||
|
|
||||||
if (iframe.src && canTreatVimeo) {
|
if (currentSite && currentSite.containsUrl(src)) {
|
||||||
|
// URL points to current site, try to use auto-login.
|
||||||
|
currentSite.getAutoLoginUrl(src, false).then((finalUrl) => {
|
||||||
|
iframe.src = finalUrl;
|
||||||
|
|
||||||
|
this.iframeUtils.treatFrame(iframe);
|
||||||
|
});
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
} else if (src && canTreatVimeo) {
|
||||||
// Check if it's a Vimeo video. If it is, use the wsplayer script instead to make restricted videos work.
|
// Check if it's a Vimeo video. If it is, use the wsplayer script instead to make restricted videos work.
|
||||||
const matches = iframe.src.match(/https?:\/\/player\.vimeo\.com\/video\/([0-9]+)/);
|
const matches = iframe.src.match(/https?:\/\/player\.vimeo\.com\/video\/([0-9]+)/);
|
||||||
if (matches && matches[1]) {
|
if (matches && matches[1]) {
|
||||||
|
@ -581,8 +594,12 @@ export class CoreFormatTextDirective implements OnChanges {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.iframeUtils.treatFrame(iframe);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -46,7 +46,13 @@ export class CoreIframeUtilsProvider {
|
||||||
*/
|
*/
|
||||||
getContentWindowAndDocument(element: any): { window: Window, document: Document } {
|
getContentWindowAndDocument(element: any): { window: Window, document: Document } {
|
||||||
let contentWindow: Window = element.contentWindow,
|
let contentWindow: Window = element.contentWindow,
|
||||||
contentDocument: Document = element.contentDocument || (contentWindow && contentWindow.document);
|
contentDocument: Document;
|
||||||
|
|
||||||
|
try {
|
||||||
|
contentDocument = element.contentDocument || (contentWindow && contentWindow.document);
|
||||||
|
} catch (ex) {
|
||||||
|
// Ignore errors.
|
||||||
|
}
|
||||||
|
|
||||||
if (!contentWindow && contentDocument) {
|
if (!contentWindow && contentDocument) {
|
||||||
// It's probably an <object>. Try to get the window.
|
// It's probably an <object>. Try to get the window.
|
||||||
|
|
Loading…
Reference in New Issue