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 { CoreCourseModuleMainResourceComponent } from '@features/course/classes/main-resource-component';
import { CoreCourseContentsPage } from '@features/course/pages/contents/contents'; import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
import { CoreCourse } from '@features/course/services/course'; import { CoreCourse } from '@features/course/services/course';
import { CoreSites } from '@services/sites';
import { CoreMimetypeUtils } from '@services/utils/mimetype'; import { CoreMimetypeUtils } from '@services/utils/mimetype';
import { CoreTextUtils } from '@services/utils/text'; import { CoreTextUtils } from '@services/utils/text';
import { AddonModUrl, AddonModUrlDisplayOptions, AddonModUrlProvider, AddonModUrlUrl } from '../../services/url'; import { AddonModUrl, AddonModUrlDisplayOptions, AddonModUrlProvider, AddonModUrlUrl } from '../../services/url';
@ -109,8 +108,7 @@ export class AddonModUrlIndexComponent extends CoreCourseModuleMainResourceCompo
} catch { } catch {
// Fallback in case is not prefetched. // Fallback in case is not prefetched.
const mod = const mod = await CoreCourse.getModule(this.module.id, this.courseId, undefined, false, false, undefined, 'url');
await CoreCourse.getModule(this.module.id, this.courseId, undefined, false, false, undefined, 'url');
this.name = mod.name; this.name = mod.name;
this.description = mod.description; this.description = mod.description;
@ -146,16 +144,6 @@ export class AddonModUrlIndexComponent extends CoreCourseModuleMainResourceCompo
this.isVideo = CoreMimetypeUtils.isExtensionInGroup(extension, ['web_video']); this.isVideo = CoreMimetypeUtils.isExtensionInGroup(extension, ['web_video']);
this.isOther = !this.isImage && !this.isAudio && !this.isVideo; 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 { Subscription } from 'rxjs';
import { filter } from 'rxjs/operators'; import { filter } from 'rxjs/operators';
import { NavigationStart } from '@angular/router'; import { NavigationStart } from '@angular/router';
import { CoreSites } from '@services/sites';
@Component({ @Component({
selector: 'core-iframe', selector: 'core-iframe',
@ -45,6 +46,7 @@ export class CoreIframeComponent implements OnChanges, OnDestroy {
@Input() allowFullscreen?: boolean | string; @Input() allowFullscreen?: boolean | string;
@Input() showFullscreenOnToolbar?: boolean | string; @Input() showFullscreenOnToolbar?: boolean | string;
@Input() autoFullscreenOnRotate?: boolean | string; @Input() autoFullscreenOnRotate?: boolean | string;
@Input() allowAutoLogin = true;
@Output() loaded: EventEmitter<HTMLIFrameElement> = new EventEmitter<HTMLIFrameElement>(); @Output() loaded: EventEmitter<HTMLIFrameElement> = new EventEmitter<HTMLIFrameElement>();
loading?: boolean; loading?: boolean;
@ -154,9 +156,15 @@ export class CoreIframeComponent implements OnChanges, OnDestroy {
*/ */
async ngOnChanges(changes: {[name: string]: SimpleChange }): Promise<void> { async ngOnChanges(changes: {[name: string]: SimpleChange }): Promise<void> {
if (changes.src) { 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); 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); await CoreIframeUtils.fixIframeCookies(url);
this.safeUrl = DomSanitizer.bypassSecurityTrustResourceUrl(CoreFile.convertFileSrc(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', 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. // 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) { } catch (error) {
CoreDomUtils.showErrorModalDefault(error, 'Error loading H5P package.', true); CoreDomUtils.showErrorModalDefault(error, 'Error loading H5P package.', true);

View File

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

View File

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