MOBILE-4303 iframe: Support auto-login in core-iframe component

main
Dani Palou 2023-04-04 09:37:54 +02:00
parent 9211b350dc
commit 0309e7a8c1
5 changed files with 13 additions and 36 deletions

View File

@ -18,7 +18,6 @@ import { CoreError } from '@classes/errors/error';
import { CoreCourseModuleMainResourceComponent } from '@features/course/classes/main-resource-component';
import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
import { CoreCourse } from '@features/course/services/course';
import { CoreSites } from '@services/sites';
import { CoreMimetypeUtils } from '@services/utils/mimetype';
import { CoreTextUtils } from '@services/utils/text';
import { AddonModUrl, AddonModUrlDisplayOptions, AddonModUrlProvider, AddonModUrlUrl } from '../../services/url';
@ -109,8 +108,7 @@ export class AddonModUrlIndexComponent extends CoreCourseModuleMainResourceCompo
} catch {
// Fallback in case is not prefetched.
const mod =
await CoreCourse.getModule(this.module.id, this.courseId, undefined, false, false, undefined, 'url');
const mod = await CoreCourse.getModule(this.module.id, this.courseId, undefined, false, false, undefined, 'url');
this.name = mod.name;
this.description = mod.description;
@ -146,16 +144,6 @@ export class AddonModUrlIndexComponent extends CoreCourseModuleMainResourceCompo
this.isVideo = CoreMimetypeUtils.isExtensionInGroup(extension, ['web_video']);
this.isOther = !this.isImage && !this.isAudio && !this.isVideo;
}
if (this.shouldIframe || (this.shouldEmbed && !this.isImage && !this.isAudio && !this.isVideo)) {
// Will be displayed in an iframe. Check if we need to auto-login.
const currentSite = CoreSites.getCurrentSite();
if (currentSite && this.url) {
// Format the URL to add auto-login if needed.
this.url = await currentSite.getAutoLoginUrl(this.url, false);
}
}
}
/**

View File

@ -28,6 +28,7 @@ import { CoreScreen, CoreScreenOrientation } from '@services/screen';
import { Subscription } from 'rxjs';
import { filter } from 'rxjs/operators';
import { NavigationStart } from '@angular/router';
import { CoreSites } from '@services/sites';
@Component({
selector: 'core-iframe',
@ -45,6 +46,7 @@ export class CoreIframeComponent implements OnChanges, OnDestroy {
@Input() allowFullscreen?: boolean | string;
@Input() showFullscreenOnToolbar?: boolean | string;
@Input() autoFullscreenOnRotate?: boolean | string;
@Input() allowAutoLogin = true;
@Output() loaded: EventEmitter<HTMLIFrameElement> = new EventEmitter<HTMLIFrameElement>();
loading?: boolean;
@ -154,9 +156,15 @@ export class CoreIframeComponent implements OnChanges, OnDestroy {
*/
async ngOnChanges(changes: {[name: string]: SimpleChange }): Promise<void> {
if (changes.src) {
const url = CoreUrlUtils.getYoutubeEmbedUrl(changes.src.currentValue) || changes.src.currentValue;
let url = CoreUrlUtils.getYoutubeEmbedUrl(changes.src.currentValue) || changes.src.currentValue;
this.displayHelp = CoreIframeUtils.shouldDisplayHelpForUrl(url);
const currentSite = CoreSites.getCurrentSite();
if (this.allowAutoLogin && currentSite) {
// Format the URL to add auto-login if needed.
url = await currentSite.getAutoLoginUrl(url, false);
}
await CoreIframeUtils.fixIframeCookies(url);
this.safeUrl = DomSanitizer.bypassSecurityTrustResourceUrl(CoreFile.convertFileSrc(url));

View File

@ -131,11 +131,8 @@ export class CoreH5PIframeComponent implements OnChanges, OnDestroy {
CoreH5PCore.DISPLAY_OPTION_DOWNLOAD + '=0',
);
// Get auto-login URL so the user is automatically authenticated if needed.
const url = await this.site.getAutoLoginUrl(src, false);
// Add the preventredirect param so the user can authenticate.
this.iframeSrc = CoreUrlUtils.addParamsToUrl(url, { preventredirect: false });
this.iframeSrc = CoreUrlUtils.addParamsToUrl(src, { preventredirect: false });
}
} catch (error) {
CoreDomUtils.showErrorModalDefault(error, 'Error loading H5P package.', true);

View File

@ -9,7 +9,7 @@
</ion-toolbar>
</ion-header>
<ion-content>
<core-loading [hideUntil]="finalUrl">
<core-iframe *ngIf="finalUrl" [src]="finalUrl"></core-iframe>
<core-loading [hideUntil]="url">
<core-iframe *ngIf="url" [src]="url" [allowAutoLogin]="autoLogin"></core-iframe>
</core-loading>
</ion-content>

View File

@ -15,8 +15,6 @@
import { Component, OnInit } from '@angular/core';
import { CoreNavigator } from '@services/navigator';
import { CoreSites } from '@services/sites';
/**
* Page to display a URL in an iframe.
*/
@ -29,7 +27,6 @@ export class CoreViewerIframePage implements OnInit {
title?: string; // Page title.
url?: string; // Iframe URL.
autoLogin?: boolean; // Whether to try to use auto-login.
finalUrl?: string;
async ngOnInit(): Promise<void> {
this.title = CoreNavigator.getRouteParam('title');
@ -38,19 +35,6 @@ export class CoreViewerIframePage implements OnInit {
this.autoLogin = typeof autoLoginParam === 'boolean' ?
autoLoginParam :
autoLoginParam !== 'no'; // Support deprecated values yes/no/check.
if (!this.url) {
return;
}
const currentSite = CoreSites.getCurrentSite();
if (currentSite && this.autoLogin) {
// Format the URL to add auto-login.
this.finalUrl = await currentSite.getAutoLoginUrl(this.url, false);
} else {
this.finalUrl = this.url;
}
}
}