From 33696f9af3ee816cd3c65735069ef2b2f7893248 Mon Sep 17 00:00:00 2001 From: Christina Toegl <toegl@tugraz.at> Date: Thu, 14 Apr 2022 14:34:38 +0200 Subject: [PATCH] Add mimetype restrictions to recent files --- .../src/nextcloud-file-picker.js | 257 +++++++++++------- 1 file changed, 163 insertions(+), 94 deletions(-) diff --git a/packages/file-handling/src/nextcloud-file-picker.js b/packages/file-handling/src/nextcloud-file-picker.js index 0c01dd46..44ddb88d 100644 --- a/packages/file-handling/src/nextcloud-file-picker.js +++ b/packages/file-handling/src/nextcloud-file-picker.js @@ -942,53 +942,59 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) { headers: {'Content-Type': 'text/xml'}, details: true, data: - '<?xml version="1.0" encoding=\'UTF-8\'?>' + - ' <d:searchrequest xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">' + - ' <d:basicsearch>' + - ' <d:select>' + - ' <d:prop>' + - ' <d:getlastmodified />' + - ' <d:resourcetype />' + - ' <d:getcontenttype />' + - ' <d:getcontentlength />' + - ' <d:getetag />' + - ' <oc:permissions />' + - ' <oc:size/>' + - ' <oc:owner-id/>' + - ' <oc:owner-display-name/>' + - ' </d:prop>' + - ' </d:select>' + - ' <d:from>' + - ' <d:scope>' + - ' <d:href>' + - this.fullWebDavUrl + - '</d:href>' + - ' <d:depth>infinity</d:depth>' + - ' </d:scope>' + - ' </d:from>' + - ' <d:where> ' + - ' <d:gte>' + - ' <d:prop>' + - ' <d:getlastmodified/>' + - ' </d:prop>' + - ' <d:literal>' + - searchDate + - '</d:literal>' + - ' </d:gte>' + - ' </d:where>' + - ' <d:orderby>' + - ' <d:order>' + - ' <d:prop>' + - ' <d:getlastmodified/>' + - ' </d:prop>' + - ' <d:descending/>' + - ' </d:order>' + - ' </d:orderby>' + - ' <d:limit>' + - ' <d:nresults>15</d:nresults>' + - ' </d:limit>' + - ' </d:basicsearch>' + - ' </d:searchrequest>', + '<?xml version="1.0" encoding=\'UTF-8\'?>' + + ' <d:searchrequest xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">' + + ' <d:basicsearch>' + + ' <d:select>' + + ' <d:prop>' + + ' <d:getlastmodified />' + + ' <d:resourcetype />' + + ' <d:getcontenttype />' + + ' <d:getcontentlength />' + + ' <d:getetag />' + + ' <oc:permissions />' + + ' <oc:size/>' + + ' <oc:owner-id/>' + + ' <oc:owner-display-name/>' + + ' </d:prop>' + + ' </d:select>' + + ' <d:from>' + + ' <d:scope>' + + ' <d:href>' + + this.fullWebDavUrl + + '</d:href>' + + ' <d:depth>infinity</d:depth>' + + ' </d:scope>' + + ' </d:from>' + + ' <d:where> ' + + ' <d:gte>' + + ' <d:prop>' + + ' <d:getlastmodified/>' + + ' </d:prop>' + + ' <d:literal>' + + searchDate + + '</d:literal>' + + ' </d:gte>' + + ' </d:where>' + + ' <d:where>' + + ' <d:or>' + + this.getMimeTypes() + + ' </d:or>' + + ' </d:where>' + + ' <d:orderby>' + + ' <d:order>' + + ' <d:prop>' + + ' <d:getlastmodified/>' + + ' </d:prop>' + + ' <d:descending/>' + + ' </d:order>' + + ' </d:orderby>' + + ' <d:limit>' + + ' <d:nresults>15</d:nresults>' + + ' </d:limit>' + + ' </d:basicsearch>' + + ' </d:searchrequest>', + }) .then((contents) => { parseXML(contents.data).then((davResp) => { @@ -1051,6 +1057,64 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) { }); } + getMimeTypes() { + let mimePart = ''; + + if (this.allowedMimeTypes && this.allowedMimeTypes !== 0 && this.allowedMimeTypes !== '*/*') { + const mimeTypes = this.allowedMimeTypes.split(','); + + mimeTypes.forEach((str) => { + mimePart += + ' <d:like>' + ' <d:prop>' + + ' <d:getcontenttype/>' + + ' </d:prop>' + + ' <d:literal>' + str + '</d:literal>' + + ' </d:like>'; + }); + } else { + mimePart = + ' <d:like>' + + ' <d:prop>' + + ' <d:getcontenttype/>' + + ' </d:prop>' + + ' <d:literal>application/%</d:literal>' + + ' </d:like>' + + ' <d:like>' + + ' <d:prop>' + + ' <d:getcontenttype/>' + + ' </d:prop>' + + ' <d:literal>text/%</d:literal>' + + ' </d:like>' + + ' <d:like>' + + ' <d:prop>' + + ' <d:getcontenttype/>' + + ' </d:prop>' + + ' <d:literal>image/%</d:literal>' + + ' </d:like>' + + ' <d:like>' + + ' <d:prop>' + + ' <d:getcontenttype/>' + + ' </d:prop>' + + ' <d:literal>video/%</d:literal>' + + ' </d:like>' + + ' <d:like>' + + ' <d:prop>' + + ' <d:getcontenttype/>' + + ' </d:prop>' + + ' <d:literal>audio/%</d:literal>' + + ' </d:like>' + + ' <d:like>' + + ' <d:prop>' + + ' <d:getcontenttype/>' + + ' </d:prop>' + + ' <d:literal>font/%</d:literal>' + + ' </d:like>'; + } + + return mimePart; + } + /** * Loads recent files and folders from WebDAV * @@ -1105,53 +1169,58 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) { headers: {'Content-Type': 'text/xml'}, details: true, data: - '<?xml version="1.0" encoding=\'UTF-8\'?>' + - ' <d:searchrequest xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">' + - ' <d:basicsearch>' + - ' <d:select>' + - ' <d:prop>' + - ' <d:getlastmodified />' + - ' <d:resourcetype />' + - ' <d:getcontenttype />' + - ' <d:getcontentlength />' + - ' <d:getetag />' + - ' <oc:permissions />' + - ' <oc:size/>' + - ' <oc:owner-id/>' + - ' <oc:owner-display-name/>' + - ' </d:prop>' + - ' </d:select>' + - ' <d:from>' + - ' <d:scope>' + - ' <d:href>' + - this.fullWebDavUrl + - '</d:href>' + - ' <d:depth>infinity</d:depth>' + - ' </d:scope>' + - ' </d:from>' + - ' <d:where> ' + - ' <d:gte>' + - ' <d:prop>' + - ' <d:getlastmodified/>' + - ' </d:prop>' + - ' <d:literal>' + - searchDate + - '</d:literal>' + - ' </d:gte>' + - ' </d:where>' + - ' <d:orderby>' + - ' <d:order>' + - ' <d:prop>' + - ' <d:getlastmodified/>' + - ' </d:prop>' + - ' <d:descending/>' + - ' </d:order>' + - ' </d:orderby>' + - ' <d:limit>' + - ' <d:nresults>15</d:nresults>' + - ' </d:limit>' + - ' </d:basicsearch>' + - ' </d:searchrequest>', + '<?xml version="1.0" encoding=\'UTF-8\'?>' + + ' <d:searchrequest xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">' + + ' <d:basicsearch>' + + ' <d:select>' + + ' <d:prop>' + + ' <d:getlastmodified />' + + ' <d:resourcetype />' + + ' <d:getcontenttype />' + + ' <d:getcontentlength />' + + ' <d:getetag />' + + ' <oc:permissions />' + + ' <oc:size/>' + + ' <oc:owner-id/>' + + ' <oc:owner-display-name/>' + + ' </d:prop>' + + ' </d:select>' + + ' <d:from>' + + ' <d:scope>' + + ' <d:href>' + + this.fullWebDavUrl + + '</d:href>' + + ' <d:depth>infinity</d:depth>' + + ' </d:scope>' + + ' </d:from>' + + ' <d:where> ' + + ' <d:gte>' + + ' <d:prop>' + + ' <d:getlastmodified/>' + + ' </d:prop>' + + ' <d:literal>' + + searchDate + + '</d:literal>' + + ' </d:gte>' + + ' </d:where>' + + ' <d:where>' + + ' <d:or>' + + this.getMimeTypes() + + ' </d:or>' + + ' </d:where>' + + ' <d:orderby>' + + ' <d:order>' + + ' <d:prop>' + + ' <d:getlastmodified/>' + + ' </d:prop>' + + ' <d:descending/>' + + ' </d:order>' + + ' </d:orderby>' + + ' <d:limit>' + + ' <d:nresults>15</d:nresults>' + + ' </d:limit>' + + ' </d:basicsearch>' + + ' </d:searchrequest>', }) .then((contents) => { parseXML(contents.data).then((davResp) => { -- GitLab