From f82444f2124cad8bccead01a33cbc9f51d126acf Mon Sep 17 00:00:00 2001 From: Cafe137 <77121044+Cafe137@users.noreply.github.com> Date: Tue, 26 Jul 2022 13:13:25 +0200 Subject: [PATCH] fix: handle unicode filename and website uploads (#491) * fix: print meaningful error message for invalid filenames * fix: handle unicode dirnames and filenames * chore: revert custom error message --- src/pages/files/Upload.tsx | 2 +- src/utils/file.ts | 19 +++++++-- .../test-unicode-websiteβ€”π–†π–†πŸ™‡\\π–ˆπ–ˆ/index.html" | 10 +++++ .../β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt" | 40 +++++++++++++++++++ "test-data/β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt" | 40 +++++++++++++++++++ ui-test/helpers.js | 2 +- ui-test/index.js | 12 +++++- ui-test/test-case/UnicodeFileUpload.js | 33 +++++++++++++++ ui-test/test-case/UnicodeWebsiteUpload.js | 16 ++++++++ 9 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 "test-data/test-unicode-websiteβ€”π–†π–†πŸ™‡\\π–ˆπ–ˆ/index.html" create mode 100644 "test-data/test-unicode-websiteβ€”π–†π–†πŸ™‡\\π–ˆπ–ˆ/β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt" create mode 100644 "test-data/β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt" create mode 100644 ui-test/test-case/UnicodeFileUpload.js create mode 100644 ui-test/test-case/UnicodeWebsiteUpload.js diff --git a/src/pages/files/Upload.tsx b/src/pages/files/Upload.tsx index a2e9ef3..3bb163c 100644 --- a/src/pages/files/Upload.tsx +++ b/src/pages/files/Upload.tsx @@ -77,7 +77,7 @@ export function Upload(): ReactElement { let fls: FilePath[] = files.map(f => packageFile(f)) // Apart from packaging, this is needed to not modify the original files array as it can trigger effects let indexDocument: string | undefined = undefined // This means we assume it's folder - if (files.length === 1) indexDocument = files[0].name + if (files.length === 1) indexDocument = unescape(encodeURIComponent(files[0].name)) else if (files.length > 1) { const idx = detectIndexHtml(files) diff --git a/src/utils/file.ts b/src/utils/file.ts index 7e8a742..9f6ea2f 100644 --- a/src/utils/file.ts +++ b/src/utils/file.ts @@ -18,15 +18,26 @@ export function detectIndexHtml(files: FilePath[]): DetectedIndex | false { return { indexPath: exactMatch } } - const prefix = paths[0].split('/')[0] + '/' + const sortedPaths = paths.sort((a, b) => a.localeCompare(b)) + const firstSegments = sortedPaths[0].split('/') + const lastSegments = sortedPaths[sortedPaths.length - 1].split('/') + let matchingSegments = 0 - const allStartWithSamePrefix = paths.every(x => x.startsWith(prefix)) + for (; matchingSegments < firstSegments.length; matchingSegments++) { + if (firstSegments[matchingSegments] !== lastSegments[matchingSegments]) { + break + } + } + + const commonPrefix = firstSegments.slice(0, matchingSegments).join('/') + '/' + + const allStartWithSamePrefix = paths.every(x => x.startsWith(commonPrefix)) if (allStartWithSamePrefix) { - const match = paths.find(x => indexHtmls.map(y => prefix + y).includes(x)) + const match = paths.find(x => indexHtmls.map(y => commonPrefix + y).includes(x)) if (match) { - return { indexPath: match, commonPrefix: prefix } + return { indexPath: match, commonPrefix } } } diff --git "a/test-data/test-unicode-websiteβ€”π–†π–†πŸ™‡\\π–ˆπ–ˆ/index.html" "b/test-data/test-unicode-websiteβ€”π–†π–†πŸ™‡\\π–ˆπ–ˆ/index.html" new file mode 100644 index 0000000..0b6b5bc --- /dev/null +++ "b/test-data/test-unicode-websiteβ€”π–†π–†πŸ™‡\\π–ˆπ–ˆ/index.html" @@ -0,0 +1,10 @@ + + + + + + + Document + + + diff --git "a/test-data/test-unicode-websiteβ€”π–†π–†πŸ™‡\\π–ˆπ–ˆ/β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt" "b/test-data/test-unicode-websiteβ€”π–†π–†πŸ™‡\\π–ˆπ–ˆ/β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt" new file mode 100644 index 0000000..31b0ef9 --- /dev/null +++ "b/test-data/test-unicode-websiteβ€”π–†π–†πŸ™‡\\π–ˆπ–ˆ/β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt" @@ -0,0 +1,40 @@ +πŸ™…π–†πŸ‘Ύ\ιƒ½ιƒ½π–‡πŸ™…π–†π–ˆ\π–‡β€”πŸ™‡\π–†πŸ’πŸ™‡ζ±ιƒ½ζ±πŸ™‡\πŸ’πŸ‘Ύπ–†π–†π–†π–‡β€”ζ±ζ±δΊ¬πŸ™‡π–†π–ˆπŸ’πŸ™‡πŸ™…πŸ™… +ιƒ½π–†πŸ™…\πŸ‘Ύπ–ˆπ–ˆζ±πŸ™‡\都東𝖇𝖆東都\πŸ‘ΎπŸ‘Ύζ±ζ±ιƒ½πŸ‘ΎπŸ‘Ύ\πŸ’\π–‡π–ˆπ–†πŸ™‡ζ±ιƒ½ιƒ½\ιƒ½πŸ‘ΎπŸ’πŸ™‡π–ˆ +πŸ‘Ύ\πŸ™…ζ±ζ±δΊ¬ζ±ιƒ½πŸ™…β€”π–‡δΊ¬δΊ¬πŸ™‡πŸ’β€”πŸ‘Ύπ–‡π–‡π–‡ιƒ½πŸ‘Ύζ±π–†δΊ¬πŸ‘ΎδΊ¬πŸ‘ΎπŸ™‡ιƒ½\π–†β€”ζ±ζ±β€”δΊ¬πŸ‘ΎδΊ¬ζ± +β€”πŸ™…ιƒ½β€”π–ˆπ–‡β€”\\π–†ιƒ½πŸ’πŸ’πŸ™‡π–ˆπ–ˆπŸ™…β€”ιƒ½\πŸ™‡π–‡πŸ’π–ˆπ–‡\πŸ™‡π–†πŸ’πŸ‘ΎδΊ¬π–†ιƒ½ιƒ½πŸ™…β€”π–ˆπ–‡ιƒ½π–‡ +𝖇都\π–ˆιƒ½πŸ‘ΎπŸ’π–ˆπŸ™‡δΊ¬πŸ‘ΎδΊ¬β€”π–†π–†πŸ™…δΊ¬π–ˆ\π–‡β€”δΊ¬πŸ™…πŸ’π–ˆβ€”ιƒ½\δΊ¬ιƒ½ζ±ζ±π–†π–‡π–‡πŸ™…\πŸ‘ΎδΊ¬πŸ™… +ζ±πŸ™…\ιƒ½π–†β€”πŸ‘ΎπŸ’π–ˆιƒ½πŸ™…ζ±β€”π–†πŸ™‡π–†πŸ™‡π–ˆπŸ™…δΊ¬ζ±π–‡π–‡πŸ™…ιƒ½π–ˆζ±πŸ‘Ύζ±πŸ™‡πŸ™‡πŸ™‡πŸ‘Ύπ–†πŸ™‡πŸ‘Ύβ€”ζ±β€”ζ± +π–†δΊ¬ιƒ½ζ±πŸ™…ιƒ½π–ˆπŸ™‡ιƒ½\ζ±πŸ™…πŸ™…πŸ‘Ύπ–‡π–‡πŸ‘Ύπ–‡πŸ‘ΎπŸ‘ΎπŸ‘ΎδΊ¬\β€”π–‡β€”πŸ™…\π–†π–†δΊ¬π–†πŸ’πŸ™…δΊ¬ζ±π–†πŸ™‡β€”πŸ’ +ιƒ½ζ±ζ±πŸ™‡ιƒ½πŸ‘Ύπ–ˆπ–ˆπ–†π–ˆπŸ‘Ύζ±ιƒ½πŸ’δΊ¬β€”π–ˆιƒ½ζ±πŸ™‡π–ˆβ€”πŸ™‡π–ˆιƒ½\\ζ±δΊ¬πŸ™…π–‡β€”π–ˆπŸ™‡ζ±π–†π–ˆζ±δΊ¬πŸ‘Ύ +β€”π–‡β€”πŸ’πŸ‘Ύιƒ½πŸ‘Ύπ–‡β€”π–ˆζ±δΊ¬π–‡\都𝖆\\πŸ‘Ύιƒ½πŸ™…π–ˆβ€”π–ˆδΊ¬π–ˆιƒ½πŸ‘ΎπŸ‘ΎπŸ’π–‡ιƒ½πŸ™…πŸ’ζ±δΊ¬πŸ‘Ύιƒ½ζ±ζ± +πŸ‘Ύβ€”ζ±πŸ™‡ζ±πŸ™‡ζ±π–‡πŸ’πŸ’ζ±δΊ¬β€”\δΊ¬π–‡ζ±β€”β€”π–†δΊ¬δΊ¬πŸ™…πŸ’πŸ™‡πŸ’ζ±πŸ™…π–†π–ˆζ±πŸ™…ζ±π–‡πŸ’πŸ‘Ύζ±\\𝖆 +ιƒ½πŸ™…πŸ’β€”πŸ™…π–ˆπŸ™‡π–ˆπŸ‘Ύπ–†πŸ™‡πŸ‘Ύπ–†\ζ±π–†πŸ™‡π–†π–†πŸ™‡ιƒ½πŸ™‡ιƒ½δΊ¬π–ˆπŸ™…β€”ιƒ½πŸ‘ΎπŸ‘Ύπ–‡πŸ’πŸ™‡πŸ™…\\πŸ™…π–‡πŸ™…πŸ‘Ύ +β€”\δΊ¬ζ±π–‡ζ±δΊ¬π–ˆπ–†\δΊ¬ζ±πŸ‘ΎπŸ™…π–†πŸ’ζ±π–‡ιƒ½π–ˆβ€”ζ±ιƒ½πŸ™‡πŸ™‡β€”π–ˆπŸ’πŸ‘Ύ\πŸ’β€”πŸ™…πŸ’\π–‡δΊ¬π–ˆπŸ™…πŸ’ +\πŸ™‡π–‡πŸ’ιƒ½πŸ™‡δΊ¬\πŸ™‡π–ˆπŸ™…ιƒ½β€”π–†πŸ™‡π–‡π–ˆπ–‡π–‡πŸ™…πŸ™…π–‡πŸ‘Ύ\ζ±β€”πŸ™…πŸ™‡πŸ’δΊ¬π–‡ζ±ζ±\π–‡πŸ’π–ˆιƒ½π–†πŸ‘Ύ +ζ±πŸ™‡\πŸ‘Ύπ–‡πŸ‘ΎπŸ’ιƒ½π–†\πŸ™‡πŸ‘Ύπ–ˆπŸ‘ΎπŸ‘Ύζ±π–†δΊ¬πŸ‘Ύζ±ιƒ½πŸ’πŸ™‡πŸ’β€”β€”β€”δΊ¬ιƒ½δΊ¬ζ±δΊ¬πŸ’πŸ‘Ύπ–ˆδΊ¬πŸ’πŸ™‡πŸ™…π–ˆ +π–ˆ\π–†πŸ‘Ύζ±πŸ‘Ύπ–‡β€”δΊ¬ζ±δΊ¬πŸ‘ΎδΊ¬πŸ’ζ±δΊ¬πŸ™…ιƒ½δΊ¬πŸ‘ΎπŸ™…π–ˆδΊ¬β€”ζ±πŸ™‡ζ±πŸ™…ιƒ½π–‡π–‡δΊ¬ιƒ½π–‡β€”\π–‡ιƒ½πŸ™…π–† +π–ˆπŸ‘Ύβ€”ιƒ½ζ±πŸ‘Ύ\β€”πŸ™…π–ˆ\β€”πŸ‘ΎπŸ™…π–†πŸ‘Ύβ€”πŸ™‡πŸ‘Ύζ±ιƒ½πŸ™…β€”πŸ’β€”β€”δΊ¬π–‡β€”π–†πŸ™‡πŸ™…πŸ‘ΎπŸ’π–†ιƒ½πŸ™‡πŸ™…\𝖆 +𝖇—東\π–‡π–ˆπ–‡π–†ιƒ½πŸ‘ΎπŸ™‡δΊ¬ιƒ½πŸ™‡πŸ™‡\πŸ™…β€”\πŸ™‡πŸ‘Ύπ–‡ζ±β€”πŸ‘ΎπŸ™…π–ˆπŸ™‡β€”ζ±πŸ’π–ˆπ–ˆιƒ½ιƒ½ζ±πŸ™…\πŸ™‡\ +πŸ™…ιƒ½δΊ¬δΊ¬πŸ‘Ύβ€”πŸ‘ΎπŸ™…π–ˆπŸ‘Ύπ–ˆιƒ½ζ±πŸ’πŸ™…ζ±πŸ™…πŸ‘ΎπŸ™‡π–‡π–‡ζ±π–ˆπ–‡π–‡πŸ‘Ύβ€”δΊ¬π–ˆζ±π–ˆπŸ™…δΊ¬π–‡\πŸ™…π–‡πŸ™‡β€”\ +δΊ¬πŸ’β€”\\πŸ’πŸ’δΊ¬β€”πŸ™‡πŸ‘ΎπŸ’π–†πŸ‘ΎπŸ™‡π–‡π–ˆπŸ™‡δΊ¬π–†πŸ™‡π–ˆπŸ™‡π–‡πŸ™…π–‡π–ˆπ–ˆιƒ½π–ˆπŸ™‡π–†π–ˆβ€”π–ˆιƒ½π–‡δΊ¬ιƒ½πŸ’ +πŸ™‡\π–ˆβ€”π–†ζ±δΊ¬ιƒ½πŸ™‡\\β€”δΊ¬π–‡π–ˆπ–ˆπŸ™‡πŸ‘Ύζ±πŸ™…πŸ™…β€”π–†β€”δΊ¬π–ˆζ±\ιƒ½π–†πŸ™…π–†β€”π–‡πŸ™‡ιƒ½β€”πŸ™…ζ±πŸ‘Ύ +\π–ˆπŸ™…πŸ™‡ζ±\πŸ‘ΎδΊ¬β€”ζ±πŸ‘Ύπ–ˆπ–ˆπŸ’π–ˆπŸ’π–ˆπ–†β€”\\ιƒ½ζ±π–†πŸ’ζ±π–†π–†ιƒ½ιƒ½π–ˆπŸ™‡π–‡π–†ζ±ιƒ½πŸ™…β€”ιƒ½π–† +\πŸ™‡πŸ™…π–‡πŸ™…πŸ™…π–‡πŸ‘Ύβ€”ιƒ½\π–‡πŸ‘ΎπŸ™…δΊ¬πŸ™…π–‡πŸ’π–‡ιƒ½πŸ™‡\πŸ™‡πŸ™…δΊ¬ιƒ½π–ˆ\β€”π–†π–‡πŸ’πŸ™…πŸ™…π–ˆπŸ™…ιƒ½πŸ™‡\東 +π–†π–ˆπ–ˆπ–†\𝖇都𝖆都\π–ˆδΊ¬π–†π–ˆπ–‡π–‡π–‡πŸ’πŸ‘ΎπŸ™…πŸ‘Ύιƒ½πŸ‘Ύ\π–ˆπ–‡π–ˆ\\ζ±πŸ‘Ύιƒ½π–ˆπ–‡πŸ™‡πŸ‘ΎδΊ¬πŸ’δΊ¬πŸ™… +π–ˆζ±ιƒ½πŸ™…πŸ™‡β€”β€”\πŸ‘Ύπ–ˆπ–ˆζ±\β€”πŸ’π–‡π–ˆπŸ™‡πŸ‘Ύβ€”ιƒ½πŸ™…π–ˆβ€”π–†πŸ’πŸ™…πŸ’ζ±πŸ‘Ύπ–‡π–‡π–ˆιƒ½π–†ζ±π–ˆπ–ˆδΊ¬πŸ™… +δΊ¬πŸ™‡πŸ’πŸ‘ΎπŸ™…πŸ‘Ύπ–†π–†π–†ιƒ½\\πŸ™‡πŸ™‡π–ˆιƒ½πŸ‘Ύιƒ½πŸ‘Ύζ±π–ˆπŸ™‡πŸ’β€”πŸ™‡πŸ‘Ύβ€”β€”π–ˆπ–‡πŸ™…δΊ¬β€”πŸ‘Ύιƒ½πŸ’πŸ™‡πŸ™‡π–ˆ\ +π–‡ιƒ½πŸ‘ΎπŸ’ζ±δΊ¬πŸ’πŸ’πŸ™‡πŸ™‡δΊ¬πŸ™…ιƒ½πŸ‘ΎπŸ‘ΎπŸ‘Ύπ–‡π–†π–ˆβ€”π–†π–†\π–ˆπŸ’β€”πŸ™‡πŸ™…ιƒ½π–†π–‡π–†β€”πŸ™‡π–‡π–‡ζ±πŸ™…\\ +\ζ±π–ˆπŸ™‡π–ˆπ–†π–†π–‡πŸ’πŸ‘Ύβ€”ζ±π–†β€”\π–ˆ\\\東\πŸ™‡πŸ™‡πŸ™…π–ˆιƒ½β€”π–†πŸ‘Ύβ€”π–‡β€”πŸ™‡\π–‡ιƒ½δΊ¬π–ˆζ±πŸ™‡ +πŸ™‡δΊ¬\β€”β€”π–†πŸ’πŸ™…β€”ζ±πŸ’π–‡π–†π–†π–†π–ˆπŸ™‡ζ±πŸ™‡πŸ’δΊ¬πŸ’π–‡π–‡β€”ιƒ½ιƒ½π–‡πŸ’πŸ™…\πŸ™…π–†ζ±πŸ‘ΎδΊ¬δΊ¬π–†ζ±\ +πŸ‘Ύζ±π–†π–‡ζ±β€”ζ±ιƒ½πŸ’ιƒ½π–†\ζ±π–†δΊ¬πŸ‘Ύιƒ½πŸ™…\π–ˆπ–‡β€”ιƒ½πŸ‘Ύιƒ½π–‡\ζ±πŸ’πŸ™‡πŸ’β€”πŸ™…ιƒ½π–†π–†π–†ζ±\β€” +δΊ¬πŸ™‡δΊ¬δΊ¬δΊ¬ζ±β€”πŸ’\πŸ’πŸ™‡π–‡δΊ¬πŸ’πŸ’ιƒ½ιƒ½πŸ‘Ύ\δΊ¬π–ˆπŸ™…δΊ¬δΊ¬δΊ¬πŸ‘ΎπŸ™…πŸ‘ΎπŸ‘ΎδΊ¬β€”β€”πŸ‘ΎδΊ¬π–ˆπ–‡πŸ™…π–†π–†πŸ‘Ύ +π–ˆ\東𝖆\πŸ™‡π–‡π–†πŸ’π–ˆπ–ˆ\πŸ™‡π–ˆπŸ‘ΎδΊ¬π–ˆπ–ˆπ–†πŸ™…πŸ™‡πŸ™…ιƒ½πŸ™…δΊ¬π–‡ζ±πŸ‘ΎπŸ™‡πŸ™‡πŸ™‡πŸ’πŸ™‡δΊ¬δΊ¬πŸ™‡β€”πŸ‘Ύιƒ½πŸ‘Ύ +π–†δΊ¬π–ˆιƒ½δΊ¬πŸ‘Ύβ€”πŸ’π–†ζ±π–†\π–†πŸ’δΊ¬πŸ‘Ύ\ιƒ½πŸ’ιƒ½πŸ’πŸ™…ζ±πŸ™‡π–ˆδΊ¬δΊ¬πŸ™‡ιƒ½πŸ™…π–†π–ˆβ€”β€”β€”πŸ’πŸ‘ΎπŸ™…πŸ™…π–‡ +πŸ™‡πŸ’π–†π–‡π–ˆπ–‡πŸ‘Ύιƒ½ιƒ½δΊ¬β€”π–†πŸ’πŸ™‡β€”\δΊ¬ιƒ½π–†π–‡πŸ™‡\東東\πŸ™‡πŸ‘Ύβ€”π–ˆπ–ˆπŸ™…δΊ¬ζ±π–†π–‡πŸ’πŸ’π–‡πŸ™…π–† +πŸ‘ΎπŸ’π–†β€”πŸ‘ΎπŸ™…πŸ™…π–‡\π–ˆβ€”πŸ™…\πŸ™‡π–ˆπŸ™…π–‡ζ±πŸ™‡πŸ‘ΎπŸ‘Ύπ–ˆπŸ‘Ύπ–ˆ\京東\\δΊ¬π–ˆπŸ™…πŸ™…πŸ™‡π–‡δΊ¬π–ˆπ–ˆ\都 +ζ±π–‡πŸ’\πŸ™…β€”πŸ™‡ζ±π–†\πŸ’πŸ’π–†π–ˆπŸ’β€”ζ±δΊ¬\\πŸ™…\π–ˆπŸ‘ΎπŸ‘ΎδΊ¬δΊ¬\πŸ‘Ύ\ζ±π–‡π–‡π–‡πŸ‘Ύβ€”π–‡π–†π–ˆζ± +πŸ™…ζ±π–ˆ\πŸ‘Ύπ–ˆπŸ’π–ˆπ–†β€”β€”ιƒ½\都—\πŸ™‡π–‡π–ˆπŸ‘Ύπ–‡δΊ¬δΊ¬πŸ’ιƒ½π–ˆπŸ™‡πŸ‘Ύπ–ˆδΊ¬π–ˆπŸ™…β€”ιƒ½πŸ’\πŸ™‡ιƒ½πŸ‘ΎδΊ¬ +πŸ™‡πŸ™‡π–‡π–†πŸ’πŸ™‡πŸ™…πŸ‘Ύιƒ½πŸ‘Ύ\πŸ‘Ύπ–ˆπŸ’πŸ’πŸ’β€”πŸ‘Ύβ€”β€”π–†\πŸ’πŸ’ιƒ½δΊ¬ζ±π–‡δΊ¬π–†β€”πŸ™‡δΊ¬\πŸ‘Ύπ–‡π–ˆπ–†πŸ’δΊ¬ +β€”πŸ™…ιƒ½ζ±δΊ¬β€”ζ±πŸ™…β€”π–ˆ\δΊ¬πŸ™‡π–‡πŸ™‡π–ˆπŸ’π–†π–‡πŸ‘Ύπ–‡πŸ™‡π–‡π–‡πŸ‘ΎπŸ™‡π–ˆπŸ™‡πŸ’ιƒ½πŸ‘ΎπŸ’ζ±πŸ™‡ζ±π–†ιƒ½π–†δΊ¬π–‡ +π–†ζ±πŸ™‡ζ±β€”π–ˆπ–†β€”δΊ¬ιƒ½πŸ’π–ˆπŸ’π–†πŸ™‡ζ±πŸ™…δΊ¬ιƒ½ιƒ½πŸ‘ΎπŸ‘ΎπŸ™‡\ιƒ½πŸ™…\𝖆\πŸ™‡β€”π–†πŸ™‡β€”πŸ™‡δΊ¬δΊ¬π–ˆδΊ¬ιƒ½ +ζ±π–†ζ±πŸ™‡πŸ™‡π–‡πŸ™‡πŸ’πŸ™…πŸ‘Ύπ–‡πŸ’ζ±πŸ’πŸ™‡πŸ™…πŸ’π–ˆπŸ’π–†π–ˆδΊ¬πŸ’πŸ™‡π–†ζ±ιƒ½πŸ™‡ιƒ½πŸ™…π–†β€”πŸ™‡π–‡πŸ™‡ζ±δΊ¬πŸ’\πŸ™… \ No newline at end of file diff --git "a/test-data/β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt" "b/test-data/β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt" new file mode 100644 index 0000000..31b0ef9 --- /dev/null +++ "b/test-data/β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt" @@ -0,0 +1,40 @@ +πŸ™…π–†πŸ‘Ύ\ιƒ½ιƒ½π–‡πŸ™…π–†π–ˆ\π–‡β€”πŸ™‡\π–†πŸ’πŸ™‡ζ±ιƒ½ζ±πŸ™‡\πŸ’πŸ‘Ύπ–†π–†π–†π–‡β€”ζ±ζ±δΊ¬πŸ™‡π–†π–ˆπŸ’πŸ™‡πŸ™…πŸ™… +ιƒ½π–†πŸ™…\πŸ‘Ύπ–ˆπ–ˆζ±πŸ™‡\都東𝖇𝖆東都\πŸ‘ΎπŸ‘Ύζ±ζ±ιƒ½πŸ‘ΎπŸ‘Ύ\πŸ’\π–‡π–ˆπ–†πŸ™‡ζ±ιƒ½ιƒ½\ιƒ½πŸ‘ΎπŸ’πŸ™‡π–ˆ +πŸ‘Ύ\πŸ™…ζ±ζ±δΊ¬ζ±ιƒ½πŸ™…β€”π–‡δΊ¬δΊ¬πŸ™‡πŸ’β€”πŸ‘Ύπ–‡π–‡π–‡ιƒ½πŸ‘Ύζ±π–†δΊ¬πŸ‘ΎδΊ¬πŸ‘ΎπŸ™‡ιƒ½\π–†β€”ζ±ζ±β€”δΊ¬πŸ‘ΎδΊ¬ζ± +β€”πŸ™…ιƒ½β€”π–ˆπ–‡β€”\\π–†ιƒ½πŸ’πŸ’πŸ™‡π–ˆπ–ˆπŸ™…β€”ιƒ½\πŸ™‡π–‡πŸ’π–ˆπ–‡\πŸ™‡π–†πŸ’πŸ‘ΎδΊ¬π–†ιƒ½ιƒ½πŸ™…β€”π–ˆπ–‡ιƒ½π–‡ +𝖇都\π–ˆιƒ½πŸ‘ΎπŸ’π–ˆπŸ™‡δΊ¬πŸ‘ΎδΊ¬β€”π–†π–†πŸ™…δΊ¬π–ˆ\π–‡β€”δΊ¬πŸ™…πŸ’π–ˆβ€”ιƒ½\δΊ¬ιƒ½ζ±ζ±π–†π–‡π–‡πŸ™…\πŸ‘ΎδΊ¬πŸ™… +ζ±πŸ™…\ιƒ½π–†β€”πŸ‘ΎπŸ’π–ˆιƒ½πŸ™…ζ±β€”π–†πŸ™‡π–†πŸ™‡π–ˆπŸ™…δΊ¬ζ±π–‡π–‡πŸ™…ιƒ½π–ˆζ±πŸ‘Ύζ±πŸ™‡πŸ™‡πŸ™‡πŸ‘Ύπ–†πŸ™‡πŸ‘Ύβ€”ζ±β€”ζ± +π–†δΊ¬ιƒ½ζ±πŸ™…ιƒ½π–ˆπŸ™‡ιƒ½\ζ±πŸ™…πŸ™…πŸ‘Ύπ–‡π–‡πŸ‘Ύπ–‡πŸ‘ΎπŸ‘ΎπŸ‘ΎδΊ¬\β€”π–‡β€”πŸ™…\π–†π–†δΊ¬π–†πŸ’πŸ™…δΊ¬ζ±π–†πŸ™‡β€”πŸ’ +ιƒ½ζ±ζ±πŸ™‡ιƒ½πŸ‘Ύπ–ˆπ–ˆπ–†π–ˆπŸ‘Ύζ±ιƒ½πŸ’δΊ¬β€”π–ˆιƒ½ζ±πŸ™‡π–ˆβ€”πŸ™‡π–ˆιƒ½\\ζ±δΊ¬πŸ™…π–‡β€”π–ˆπŸ™‡ζ±π–†π–ˆζ±δΊ¬πŸ‘Ύ +β€”π–‡β€”πŸ’πŸ‘Ύιƒ½πŸ‘Ύπ–‡β€”π–ˆζ±δΊ¬π–‡\都𝖆\\πŸ‘Ύιƒ½πŸ™…π–ˆβ€”π–ˆδΊ¬π–ˆιƒ½πŸ‘ΎπŸ‘ΎπŸ’π–‡ιƒ½πŸ™…πŸ’ζ±δΊ¬πŸ‘Ύιƒ½ζ±ζ± +πŸ‘Ύβ€”ζ±πŸ™‡ζ±πŸ™‡ζ±π–‡πŸ’πŸ’ζ±δΊ¬β€”\δΊ¬π–‡ζ±β€”β€”π–†δΊ¬δΊ¬πŸ™…πŸ’πŸ™‡πŸ’ζ±πŸ™…π–†π–ˆζ±πŸ™…ζ±π–‡πŸ’πŸ‘Ύζ±\\𝖆 +ιƒ½πŸ™…πŸ’β€”πŸ™…π–ˆπŸ™‡π–ˆπŸ‘Ύπ–†πŸ™‡πŸ‘Ύπ–†\ζ±π–†πŸ™‡π–†π–†πŸ™‡ιƒ½πŸ™‡ιƒ½δΊ¬π–ˆπŸ™…β€”ιƒ½πŸ‘ΎπŸ‘Ύπ–‡πŸ’πŸ™‡πŸ™…\\πŸ™…π–‡πŸ™…πŸ‘Ύ +β€”\δΊ¬ζ±π–‡ζ±δΊ¬π–ˆπ–†\δΊ¬ζ±πŸ‘ΎπŸ™…π–†πŸ’ζ±π–‡ιƒ½π–ˆβ€”ζ±ιƒ½πŸ™‡πŸ™‡β€”π–ˆπŸ’πŸ‘Ύ\πŸ’β€”πŸ™…πŸ’\π–‡δΊ¬π–ˆπŸ™…πŸ’ +\πŸ™‡π–‡πŸ’ιƒ½πŸ™‡δΊ¬\πŸ™‡π–ˆπŸ™…ιƒ½β€”π–†πŸ™‡π–‡π–ˆπ–‡π–‡πŸ™…πŸ™…π–‡πŸ‘Ύ\ζ±β€”πŸ™…πŸ™‡πŸ’δΊ¬π–‡ζ±ζ±\π–‡πŸ’π–ˆιƒ½π–†πŸ‘Ύ +ζ±πŸ™‡\πŸ‘Ύπ–‡πŸ‘ΎπŸ’ιƒ½π–†\πŸ™‡πŸ‘Ύπ–ˆπŸ‘ΎπŸ‘Ύζ±π–†δΊ¬πŸ‘Ύζ±ιƒ½πŸ’πŸ™‡πŸ’β€”β€”β€”δΊ¬ιƒ½δΊ¬ζ±δΊ¬πŸ’πŸ‘Ύπ–ˆδΊ¬πŸ’πŸ™‡πŸ™…π–ˆ +π–ˆ\π–†πŸ‘Ύζ±πŸ‘Ύπ–‡β€”δΊ¬ζ±δΊ¬πŸ‘ΎδΊ¬πŸ’ζ±δΊ¬πŸ™…ιƒ½δΊ¬πŸ‘ΎπŸ™…π–ˆδΊ¬β€”ζ±πŸ™‡ζ±πŸ™…ιƒ½π–‡π–‡δΊ¬ιƒ½π–‡β€”\π–‡ιƒ½πŸ™…π–† +π–ˆπŸ‘Ύβ€”ιƒ½ζ±πŸ‘Ύ\β€”πŸ™…π–ˆ\β€”πŸ‘ΎπŸ™…π–†πŸ‘Ύβ€”πŸ™‡πŸ‘Ύζ±ιƒ½πŸ™…β€”πŸ’β€”β€”δΊ¬π–‡β€”π–†πŸ™‡πŸ™…πŸ‘ΎπŸ’π–†ιƒ½πŸ™‡πŸ™…\𝖆 +𝖇—東\π–‡π–ˆπ–‡π–†ιƒ½πŸ‘ΎπŸ™‡δΊ¬ιƒ½πŸ™‡πŸ™‡\πŸ™…β€”\πŸ™‡πŸ‘Ύπ–‡ζ±β€”πŸ‘ΎπŸ™…π–ˆπŸ™‡β€”ζ±πŸ’π–ˆπ–ˆιƒ½ιƒ½ζ±πŸ™…\πŸ™‡\ +πŸ™…ιƒ½δΊ¬δΊ¬πŸ‘Ύβ€”πŸ‘ΎπŸ™…π–ˆπŸ‘Ύπ–ˆιƒ½ζ±πŸ’πŸ™…ζ±πŸ™…πŸ‘ΎπŸ™‡π–‡π–‡ζ±π–ˆπ–‡π–‡πŸ‘Ύβ€”δΊ¬π–ˆζ±π–ˆπŸ™…δΊ¬π–‡\πŸ™…π–‡πŸ™‡β€”\ +δΊ¬πŸ’β€”\\πŸ’πŸ’δΊ¬β€”πŸ™‡πŸ‘ΎπŸ’π–†πŸ‘ΎπŸ™‡π–‡π–ˆπŸ™‡δΊ¬π–†πŸ™‡π–ˆπŸ™‡π–‡πŸ™…π–‡π–ˆπ–ˆιƒ½π–ˆπŸ™‡π–†π–ˆβ€”π–ˆιƒ½π–‡δΊ¬ιƒ½πŸ’ +πŸ™‡\π–ˆβ€”π–†ζ±δΊ¬ιƒ½πŸ™‡\\β€”δΊ¬π–‡π–ˆπ–ˆπŸ™‡πŸ‘Ύζ±πŸ™…πŸ™…β€”π–†β€”δΊ¬π–ˆζ±\ιƒ½π–†πŸ™…π–†β€”π–‡πŸ™‡ιƒ½β€”πŸ™…ζ±πŸ‘Ύ +\π–ˆπŸ™…πŸ™‡ζ±\πŸ‘ΎδΊ¬β€”ζ±πŸ‘Ύπ–ˆπ–ˆπŸ’π–ˆπŸ’π–ˆπ–†β€”\\ιƒ½ζ±π–†πŸ’ζ±π–†π–†ιƒ½ιƒ½π–ˆπŸ™‡π–‡π–†ζ±ιƒ½πŸ™…β€”ιƒ½π–† +\πŸ™‡πŸ™…π–‡πŸ™…πŸ™…π–‡πŸ‘Ύβ€”ιƒ½\π–‡πŸ‘ΎπŸ™…δΊ¬πŸ™…π–‡πŸ’π–‡ιƒ½πŸ™‡\πŸ™‡πŸ™…δΊ¬ιƒ½π–ˆ\β€”π–†π–‡πŸ’πŸ™…πŸ™…π–ˆπŸ™…ιƒ½πŸ™‡\東 +π–†π–ˆπ–ˆπ–†\𝖇都𝖆都\π–ˆδΊ¬π–†π–ˆπ–‡π–‡π–‡πŸ’πŸ‘ΎπŸ™…πŸ‘Ύιƒ½πŸ‘Ύ\π–ˆπ–‡π–ˆ\\ζ±πŸ‘Ύιƒ½π–ˆπ–‡πŸ™‡πŸ‘ΎδΊ¬πŸ’δΊ¬πŸ™… +π–ˆζ±ιƒ½πŸ™…πŸ™‡β€”β€”\πŸ‘Ύπ–ˆπ–ˆζ±\β€”πŸ’π–‡π–ˆπŸ™‡πŸ‘Ύβ€”ιƒ½πŸ™…π–ˆβ€”π–†πŸ’πŸ™…πŸ’ζ±πŸ‘Ύπ–‡π–‡π–ˆιƒ½π–†ζ±π–ˆπ–ˆδΊ¬πŸ™… +δΊ¬πŸ™‡πŸ’πŸ‘ΎπŸ™…πŸ‘Ύπ–†π–†π–†ιƒ½\\πŸ™‡πŸ™‡π–ˆιƒ½πŸ‘Ύιƒ½πŸ‘Ύζ±π–ˆπŸ™‡πŸ’β€”πŸ™‡πŸ‘Ύβ€”β€”π–ˆπ–‡πŸ™…δΊ¬β€”πŸ‘Ύιƒ½πŸ’πŸ™‡πŸ™‡π–ˆ\ +π–‡ιƒ½πŸ‘ΎπŸ’ζ±δΊ¬πŸ’πŸ’πŸ™‡πŸ™‡δΊ¬πŸ™…ιƒ½πŸ‘ΎπŸ‘ΎπŸ‘Ύπ–‡π–†π–ˆβ€”π–†π–†\π–ˆπŸ’β€”πŸ™‡πŸ™…ιƒ½π–†π–‡π–†β€”πŸ™‡π–‡π–‡ζ±πŸ™…\\ +\ζ±π–ˆπŸ™‡π–ˆπ–†π–†π–‡πŸ’πŸ‘Ύβ€”ζ±π–†β€”\π–ˆ\\\東\πŸ™‡πŸ™‡πŸ™…π–ˆιƒ½β€”π–†πŸ‘Ύβ€”π–‡β€”πŸ™‡\π–‡ιƒ½δΊ¬π–ˆζ±πŸ™‡ +πŸ™‡δΊ¬\β€”β€”π–†πŸ’πŸ™…β€”ζ±πŸ’π–‡π–†π–†π–†π–ˆπŸ™‡ζ±πŸ™‡πŸ’δΊ¬πŸ’π–‡π–‡β€”ιƒ½ιƒ½π–‡πŸ’πŸ™…\πŸ™…π–†ζ±πŸ‘ΎδΊ¬δΊ¬π–†ζ±\ +πŸ‘Ύζ±π–†π–‡ζ±β€”ζ±ιƒ½πŸ’ιƒ½π–†\ζ±π–†δΊ¬πŸ‘Ύιƒ½πŸ™…\π–ˆπ–‡β€”ιƒ½πŸ‘Ύιƒ½π–‡\ζ±πŸ’πŸ™‡πŸ’β€”πŸ™…ιƒ½π–†π–†π–†ζ±\β€” +δΊ¬πŸ™‡δΊ¬δΊ¬δΊ¬ζ±β€”πŸ’\πŸ’πŸ™‡π–‡δΊ¬πŸ’πŸ’ιƒ½ιƒ½πŸ‘Ύ\δΊ¬π–ˆπŸ™…δΊ¬δΊ¬δΊ¬πŸ‘ΎπŸ™…πŸ‘ΎπŸ‘ΎδΊ¬β€”β€”πŸ‘ΎδΊ¬π–ˆπ–‡πŸ™…π–†π–†πŸ‘Ύ +π–ˆ\東𝖆\πŸ™‡π–‡π–†πŸ’π–ˆπ–ˆ\πŸ™‡π–ˆπŸ‘ΎδΊ¬π–ˆπ–ˆπ–†πŸ™…πŸ™‡πŸ™…ιƒ½πŸ™…δΊ¬π–‡ζ±πŸ‘ΎπŸ™‡πŸ™‡πŸ™‡πŸ’πŸ™‡δΊ¬δΊ¬πŸ™‡β€”πŸ‘Ύιƒ½πŸ‘Ύ +π–†δΊ¬π–ˆιƒ½δΊ¬πŸ‘Ύβ€”πŸ’π–†ζ±π–†\π–†πŸ’δΊ¬πŸ‘Ύ\ιƒ½πŸ’ιƒ½πŸ’πŸ™…ζ±πŸ™‡π–ˆδΊ¬δΊ¬πŸ™‡ιƒ½πŸ™…π–†π–ˆβ€”β€”β€”πŸ’πŸ‘ΎπŸ™…πŸ™…π–‡ +πŸ™‡πŸ’π–†π–‡π–ˆπ–‡πŸ‘Ύιƒ½ιƒ½δΊ¬β€”π–†πŸ’πŸ™‡β€”\δΊ¬ιƒ½π–†π–‡πŸ™‡\東東\πŸ™‡πŸ‘Ύβ€”π–ˆπ–ˆπŸ™…δΊ¬ζ±π–†π–‡πŸ’πŸ’π–‡πŸ™…π–† +πŸ‘ΎπŸ’π–†β€”πŸ‘ΎπŸ™…πŸ™…π–‡\π–ˆβ€”πŸ™…\πŸ™‡π–ˆπŸ™…π–‡ζ±πŸ™‡πŸ‘ΎπŸ‘Ύπ–ˆπŸ‘Ύπ–ˆ\京東\\δΊ¬π–ˆπŸ™…πŸ™…πŸ™‡π–‡δΊ¬π–ˆπ–ˆ\都 +ζ±π–‡πŸ’\πŸ™…β€”πŸ™‡ζ±π–†\πŸ’πŸ’π–†π–ˆπŸ’β€”ζ±δΊ¬\\πŸ™…\π–ˆπŸ‘ΎπŸ‘ΎδΊ¬δΊ¬\πŸ‘Ύ\ζ±π–‡π–‡π–‡πŸ‘Ύβ€”π–‡π–†π–ˆζ± +πŸ™…ζ±π–ˆ\πŸ‘Ύπ–ˆπŸ’π–ˆπ–†β€”β€”ιƒ½\都—\πŸ™‡π–‡π–ˆπŸ‘Ύπ–‡δΊ¬δΊ¬πŸ’ιƒ½π–ˆπŸ™‡πŸ‘Ύπ–ˆδΊ¬π–ˆπŸ™…β€”ιƒ½πŸ’\πŸ™‡ιƒ½πŸ‘ΎδΊ¬ +πŸ™‡πŸ™‡π–‡π–†πŸ’πŸ™‡πŸ™…πŸ‘Ύιƒ½πŸ‘Ύ\πŸ‘Ύπ–ˆπŸ’πŸ’πŸ’β€”πŸ‘Ύβ€”β€”π–†\πŸ’πŸ’ιƒ½δΊ¬ζ±π–‡δΊ¬π–†β€”πŸ™‡δΊ¬\πŸ‘Ύπ–‡π–ˆπ–†πŸ’δΊ¬ +β€”πŸ™…ιƒ½ζ±δΊ¬β€”ζ±πŸ™…β€”π–ˆ\δΊ¬πŸ™‡π–‡πŸ™‡π–ˆπŸ’π–†π–‡πŸ‘Ύπ–‡πŸ™‡π–‡π–‡πŸ‘ΎπŸ™‡π–ˆπŸ™‡πŸ’ιƒ½πŸ‘ΎπŸ’ζ±πŸ™‡ζ±π–†ιƒ½π–†δΊ¬π–‡ +π–†ζ±πŸ™‡ζ±β€”π–ˆπ–†β€”δΊ¬ιƒ½πŸ’π–ˆπŸ’π–†πŸ™‡ζ±πŸ™…δΊ¬ιƒ½ιƒ½πŸ‘ΎπŸ‘ΎπŸ™‡\ιƒ½πŸ™…\𝖆\πŸ™‡β€”π–†πŸ™‡β€”πŸ™‡δΊ¬δΊ¬π–ˆδΊ¬ιƒ½ +ζ±π–†ζ±πŸ™‡πŸ™‡π–‡πŸ™‡πŸ’πŸ™…πŸ‘Ύπ–‡πŸ’ζ±πŸ’πŸ™‡πŸ™…πŸ’π–ˆπŸ’π–†π–ˆδΊ¬πŸ’πŸ™‡π–†ζ±ιƒ½πŸ™‡ιƒ½πŸ™…π–†β€”πŸ™‡π–‡πŸ™‡ζ±δΊ¬πŸ’\πŸ™… \ No newline at end of file diff --git a/ui-test/helpers.js b/ui-test/helpers.js index 1f1cd24..9f788b3 100644 --- a/ui-test/helpers.js +++ b/ui-test/helpers.js @@ -25,7 +25,7 @@ async function selectStampAndUpload(page) { } async function assertUploadedContentAtPath(swarmHash, path, contentType) { - const response = await axios.get(`http://localhost:1633/bzz/${swarmHash}/${path}`) + const response = await axios.get(`http://localhost:1633/bzz/${swarmHash}/${encodeURI(path)}`) if (response.status !== 200) { throw new Error(`Expected 200 OK, got ${response.status}`) diff --git a/ui-test/index.js b/ui-test/index.js index 49d3d40..c1c6ca5 100644 --- a/ui-test/index.js +++ b/ui-test/index.js @@ -7,10 +7,20 @@ const { testImageFileUpload } = require('./test-case/ImageFileUpload') const { testTextFileUpload } = require('./test-case/TextFileUpload') const { testWebsiteUpload } = require('./test-case/WebsiteUpload') const { testReactWebsiteUpload } = require('./test-case/ReactWebsiteUpload') +const { testUnicodeFileUpload } = require('./test-case/UnicodeFileUpload') +const { testUnicodeWebsiteUpload } = require('./test-case/UnicodeWebsiteUpload') const VIEWPORT = { width: 1366, height: 768 } -const testCases = [testTextFileUpload, testImageFileUpload, testFolderUpload, testWebsiteUpload, testReactWebsiteUpload] +const testCases = [ + testUnicodeFileUpload, + testUnicodeWebsiteUpload, + testTextFileUpload, + testImageFileUpload, + testFolderUpload, + testWebsiteUpload, + testReactWebsiteUpload, +] async function main() { const server = prepareServer() diff --git a/ui-test/test-case/UnicodeFileUpload.js b/ui-test/test-case/UnicodeFileUpload.js new file mode 100644 index 0000000..805314c --- /dev/null +++ b/ui-test/test-case/UnicodeFileUpload.js @@ -0,0 +1,33 @@ +const puppeteer = require('puppeteer') +const { selectStampAndUpload } = require('../helpers') +const { Assert, Click } = require('../library') + +/** + * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()` + */ +async function testUnicodeFileUpload(page) { + await Click.elementWithText(page, 'a', 'Files') + await Click.elementWithTextAndUpload(page, 'button', 'Add File', 'test-data/β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt') + await assertUploadPreview(page) + await selectStampAndUpload(page) + await assertDownloadPreview(page) +} + +/** + * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()` + */ +async function assertUploadPreview(page) { + await Assert.elementWithTextExists(page, 'p', 'Filename: β€”π–†π–†πŸ™‡\\π–ˆπ–ˆ.txt') + await Assert.elementWithTextExists(page, 'p', 'Kind: text/plain') + await Assert.elementWithTextExists(page, 'p', 'Size: 5.51 kB') +} + +/** + * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()` + */ +async function assertDownloadPreview(page) { + assertUploadPreview(page) + await Assert.elementWithTextExists(page, 'p', 'Swarm Hash: 30fbf1d2[…]ba400e86') +} + +module.exports = { testUnicodeFileUpload } diff --git a/ui-test/test-case/UnicodeWebsiteUpload.js b/ui-test/test-case/UnicodeWebsiteUpload.js new file mode 100644 index 0000000..7130476 --- /dev/null +++ b/ui-test/test-case/UnicodeWebsiteUpload.js @@ -0,0 +1,16 @@ +const puppeteer = require('puppeteer') +const { selectStampAndUpload, assertUploadedContentAtPath } = require('../helpers') +const { Click } = require('../library') + +/** + * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()` + */ +async function testUnicodeWebsiteUpload(page) { + await Click.elementWithText(page, 'a', 'Files') + await Click.elementWithTextAndUpload(page, 'button', 'Add Website', 'test-data/test-unicode-websiteβ€”π–†π–†πŸ™‡\\π–ˆπ–ˆ') + const swarmHash = await selectStampAndUpload(page) + await assertUploadedContentAtPath(swarmHash, 'index.html', 'text/html; charset=utf-8') + await assertUploadedContentAtPath(swarmHash, 'β€”π–†π–†πŸ™‡/π–ˆπ–ˆ.txt', 'text/plain; charset=utf-8') +} + +module.exports = { testUnicodeWebsiteUpload }