From 85e57efcca9be6d23ecf8ad736abea2957f2b83e Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Mon, 3 Dec 2018 17:04:39 +0100 Subject: [PATCH] MOBILE-2701 resource: Don't allow downloading Nextcloud files --- src/addon/mod/resource/components/index/index.ts | 12 ++++++++++-- src/addon/mod/resource/providers/helper.ts | 12 +++++++++++- .../mod/resource/providers/prefetch-handler.ts | 14 ++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/addon/mod/resource/components/index/index.ts b/src/addon/mod/resource/components/index/index.ts index cd5b50e72..2304a319e 100644 --- a/src/addon/mod/resource/components/index/index.ts +++ b/src/addon/mod/resource/components/index/index.ts @@ -14,6 +14,7 @@ import { Component, Injector } from '@angular/core'; import { CoreAppProvider } from '@providers/app'; +import { CoreSitesProvider } from '@providers/sites'; import { CoreCourseProvider } from '@core/course/providers/course'; import { CoreCourseModuleMainResourceComponent } from '@core/course/classes/main-resource-component'; import { AddonModResourceProvider } from '../../providers/resource'; @@ -37,7 +38,7 @@ export class AddonModResourceIndexComponent extends CoreCourseModuleMainResource constructor(injector: Injector, private resourceProvider: AddonModResourceProvider, private courseProvider: CoreCourseProvider, private appProvider: CoreAppProvider, private prefetchHandler: AddonModResourcePrefetchHandler, - private resourceHelper: AddonModResourceHelperProvider) { + private resourceHelper: AddonModResourceHelperProvider, private sitesProvider: CoreSitesProvider) { super(injector); } @@ -142,6 +143,13 @@ export class AddonModResourceIndexComponent extends CoreCourseModuleMainResource * Opens a file. */ open(): void { - this.resourceHelper.openModuleFile(this.module, this.courseId); + this.prefetchHandler.isDownloadable(this.module, this.courseId).then((downloadable) => { + if (downloadable) { + this.resourceHelper.openModuleFile(this.module, this.courseId); + } else { + // The resource cannot be downloaded, open the activity in browser. + return this.sitesProvider.getCurrentSite().openInBrowserWithAutoLoginIfSameSite(this.module.url); + } + }); } } diff --git a/src/addon/mod/resource/providers/helper.ts b/src/addon/mod/resource/providers/helper.ts index 05c62f5aa..b6d0f3aa6 100644 --- a/src/addon/mod/resource/providers/helper.ts +++ b/src/addon/mod/resource/providers/helper.ts @@ -113,7 +113,7 @@ export class AddonModResourceHelperProvider { * @return {boolean} Whether the resource should be displayed embeded. */ isDisplayedEmbedded(module: any, display: number): boolean { - if (!module.contents.length || !this.fileProvider.isAvailable()) { + if (!module.contents.length || !this.fileProvider.isAvailable() || this.isNextcloudFile(module)) { return false; } @@ -139,6 +139,16 @@ export class AddonModResourceHelperProvider { return mimetype == 'text/html'; } + /** + * Check if the resource is a Nextcloud file. + * + * @param {any} module Module to check. + * @return {boolean} Whether it's a Nextcloud file. + */ + isNextcloudFile(module: any): boolean { + return module.contents && module.contents[0] && module.contents[0].repositorytype == 'nextcloud'; + } + /** * Opens a file of the resource activity. * diff --git a/src/addon/mod/resource/providers/prefetch-handler.ts b/src/addon/mod/resource/providers/prefetch-handler.ts index 842687717..7c05f8fbc 100644 --- a/src/addon/mod/resource/providers/prefetch-handler.ts +++ b/src/addon/mod/resource/providers/prefetch-handler.ts @@ -122,6 +122,20 @@ export class AddonModResourcePrefetchHandler extends CoreCourseResourcePrefetchH return Promise.all(promises); } + /** + * Check if a resource is downloadable. + * + * @param {any} module Module to check. + * @param {number} courseId Course ID the module belongs to. + * @return {Promise} Promise resolved with true if downloadable, resolved with false otherwise. + */ + isDownloadable(module: any, courseId: number): Promise { + // Don't allow downloading Nextcloud files for now. + return this.loadContents(module, courseId, false).then(() => { + return !this.resourceHelper.isNextcloudFile(module); + }); + } + /** * Whether or not the handler is enabled on a site level. *