From 1f03b61edc835a6e87651f8ce7276aafded4e026 Mon Sep 17 00:00:00 2001 From: jj Date: Fri, 23 May 2025 07:11:28 +0000 Subject: [PATCH] api/create-filename: relax sanitizeString and use fullwidth replacements --- api/src/processing/create-filename.js | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/api/src/processing/create-filename.js b/api/src/processing/create-filename.js index 911b5603..9254ab32 100644 --- a/api/src/processing/create-filename.js +++ b/api/src/processing/create-filename.js @@ -1,10 +1,24 @@ -const illegalCharacters = ['}', '{', '%', '>', '<', '^', ';', ':', '`', '$', '"', "@", '=', '?', '|', '*']; +// Characters that are disallowed on Windows: +// https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions +const characterMap = { + '<': '<', + '>': '>', + ':': ':', + '"': '"', + '/': '/', + '\\': '\', + '|': '|', + '?': '?', + '*': '*' +}; -const sanitizeString = (string) => { - for (const i in illegalCharacters) { - string = string.replaceAll("/", "_").replaceAll("\\", "_") - .replaceAll(illegalCharacters[i], '') +export const sanitizeString = (string) => { + string = string.replace(/[\u0000-\u001F\u007F-\u009F]/g, ""); + + for (const [ char, replacement ] of Object.entries(characterMap)) { + string = string.replaceAll(char, replacement); } + return string; }