diff --git a/apps/files/src/services/DropService.ts b/apps/files/src/services/DropService.ts index d1e8dd9ed5a50..a5b761863d3ac 100644 --- a/apps/files/src/services/DropService.ts +++ b/apps/files/src/services/DropService.ts @@ -29,9 +29,12 @@ import { getUploader } from '@nextcloud/upload' import { joinPaths } from '@nextcloud/paths' import { showError } from '@nextcloud/dialogs' import { translate as t } from '@nextcloud/l10n' +import { loadState } from '@nextcloud/initial-state' import logger from '../logger.js' +const forbiddenCharacters = loadState('files', 'forbiddenCharacters', '') + export const handleDrop = async (data: DataTransfer): Promise => { // TODO: Maybe handle `getAsFileSystemHandle()` in the future @@ -67,11 +70,18 @@ export const handleDrop = async (data: DataTransfer): Promise => { const handleFileUpload = async (file: File, path: string = '') => { const uploader = getUploader() - try { - return await uploader.upload(`${path}${file.name}`, file) - } catch (e) { - showError(t('files', 'Uploading "{filename}" failed', { filename: file.name })) - throw e + const forbidden = forbiddenCharacters.split('') + const forbiddenChar = forbidden.find(char => file.name.includes(char)) + + if (forbiddenChar !== undefined) { + showError(t('files', '"{forbiddenChar}" is not allowed inside a file name.', { forbiddenChar })) + } else { + try { + return await uploader.upload(`${path}${file.name}`, file) + } catch (e) { + showError(t('files', 'Uploading "{filename}" failed', { filename: file.name })) + throw e + } } } diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue index 4e80379f632ba..72754659fd09e 100644 --- a/apps/files/src/views/FilesList.vue +++ b/apps/files/src/views/FilesList.vue @@ -56,6 +56,7 @@