From 35a263aacd88902972cf88f471c6474bd2466da0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Tue, 11 Jul 2023 19:36:24 +0200 Subject: [PATCH] fix: Encode individual parts of the dav url as uri components MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- src/services/AttachmentResolver.js | 2 +- src/tests/services/AttachmentResolver.spec.js | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/services/AttachmentResolver.js b/src/services/AttachmentResolver.js index 5dfaae033c8..ab8bb06eefd 100644 --- a/src/services/AttachmentResolver.js +++ b/src/services/AttachmentResolver.js @@ -232,7 +232,7 @@ export default class AttachmentResolver { #davUrl(src) { if (this.#user) { const uid = this.#user.uid - const encoded = encodeURI(this.#filePath(src)) + const encoded = this.#filePath(src).split('/').map(encodeURIComponent).join('/') return generateRemoteUrl(`dav/files/${uid}${encoded}`) } diff --git a/src/tests/services/AttachmentResolver.spec.js b/src/tests/services/AttachmentResolver.spec.js index 3027e6a184d..504b7deab2e 100644 --- a/src/tests/services/AttachmentResolver.spec.js +++ b/src/tests/services/AttachmentResolver.spec.js @@ -121,6 +121,15 @@ describe('Image resolver', () => { expect(candidate.url).toBe('/nc-webroot/apps/files_sharing/publicpreview/SHARE_TOKEN?file=%2FMedia%2Fphoto.jpeg&x=1024&y=1024&a=true') }) + it('handles .attachments urls with special characters', async () => { + const src = `.attachments.${session.documentId + 1}/group #1/test #2.jpg` + const resolver = new AttachmentResolver({ session, user, currentDirectory: '/myCurrentDir #1' }) + const [candidate, fallbackCandidate, secondFallback] = await resolver.resolve(src) + + expect(candidate.type).toBe('image') + expect(candidate.url).toBe('http://localhost/nc-webroot/remote.php/dav/files/user-uid/myCurrentDir%20%231/.attachments.4174/group%20%231/test%20%232.jpg') + }) + it('handles .attachments urls to different fileId via webdav with text API fallback', async () => { const src = `.attachments.${session.documentId + 1}/group%20pic.jpg` const resolver = new AttachmentResolver({ session, user, currentDirectory })