diff --git a/.changeset/hip-seahorses-wash.md b/.changeset/hip-seahorses-wash.md new file mode 100644 index 0000000000..e2a4dc87d9 --- /dev/null +++ b/.changeset/hip-seahorses-wash.md @@ -0,0 +1,8 @@ +--- +"@comet/cms-admin": minor +"@comet/cms-api": minor +--- + +Validate filename length for uploads to DAM or FileUploads + +The filename can't exceed 255 characters. diff --git a/packages/admin/cms-admin/src/dam/DataGrid/fileUpload/fileUploadErrorMessages.tsx b/packages/admin/cms-admin/src/dam/DataGrid/fileUpload/fileUploadErrorMessages.tsx index e931007646..409a2ab1af 100644 --- a/packages/admin/cms-admin/src/dam/DataGrid/fileUpload/fileUploadErrorMessages.tsx +++ b/packages/admin/cms-admin/src/dam/DataGrid/fileUpload/fileUploadErrorMessages.tsx @@ -85,3 +85,13 @@ export const SvgContainsJavaScriptError = (): React.ReactElement => ( }} /> ); + +export const FilenameTooLongError = () => ( + +); diff --git a/packages/admin/cms-admin/src/dam/DataGrid/fileUpload/useDamFileUpload.tsx b/packages/admin/cms-admin/src/dam/DataGrid/fileUpload/useDamFileUpload.tsx index 8a50d104ae..09cb06a5b5 100644 --- a/packages/admin/cms-admin/src/dam/DataGrid/fileUpload/useDamFileUpload.tsx +++ b/packages/admin/cms-admin/src/dam/DataGrid/fileUpload/useDamFileUpload.tsx @@ -15,6 +15,7 @@ import { NewlyUploadedItem, useFileUploadContext } from "./FileUploadContext"; import { FileUploadErrorDialog } from "./FileUploadErrorDialog"; import { FileExtensionTypeMismatchError, + FilenameTooLongError, FileSizeError, MaxResolutionError, MissingFileExtensionError, @@ -445,6 +446,8 @@ export const useDamFileUpload = (options: UploadDamFileOptions): FileUploadApi = addValidationError(file, ); } else if (message.includes("File type and extension mismatch")) { addValidationError(file, ); + } else if (message.includes("Filename is too long")) { + addValidationError(file, ); } else { addValidationError(file, ); } diff --git a/packages/api/cms-api/src/dam/files/dam-upload-file.interceptor.ts b/packages/api/cms-api/src/dam/files/dam-upload-file.interceptor.ts index 7648eee149..ce81e881b4 100644 --- a/packages/api/cms-api/src/dam/files/dam-upload-file.interceptor.ts +++ b/packages/api/cms-api/src/dam/files/dam-upload-file.interceptor.ts @@ -35,20 +35,20 @@ export function DamUploadFileInterceptor(fieldName: string): Type { - this.fileValidationService.validateFileMetadata(file).then((result) => { - if (result === undefined) { - return cb(null, true); - } else { - return cb(new CometValidationException(result), false); - } - }); + const errorMessage = this.fileValidationService.validateFileMetadata(file); + + if (errorMessage === undefined) { + cb(null, true); + } else { + cb(new CometValidationException(errorMessage), false); + } }, }; diff --git a/packages/api/cms-api/src/dam/files/file-validation.service.ts b/packages/api/cms-api/src/dam/files/file-validation.service.ts index 70e7ce18b7..bbc71373c7 100644 --- a/packages/api/cms-api/src/dam/files/file-validation.service.ts +++ b/packages/api/cms-api/src/dam/files/file-validation.service.ts @@ -7,7 +7,7 @@ export class FileValidationService { constructor(public config: { maxFileSize: number; acceptedMimeTypes: string[] }) {} async validateFile(file: FileUploadInput): Promise { - let error = await this.validateFileMetadata(file); + let error = this.validateFileMetadata(file); if (error === undefined) { error = await this.validateFileContents(file); @@ -16,10 +16,10 @@ export class FileValidationService { return error; } - async validateFileMetadata(file: FileUploadInput): Promise { - //maximum file size - if (file.size > this.config.maxFileSize * 1024 * 1024) { - return "File is too large"; + validateFileMetadata(file: Pick): undefined | string { + //maximum filename length + if (file.originalname.length > 255) { + return "Filename is too long"; } //mime type in an accepted mime type @@ -30,7 +30,7 @@ export class FileValidationService { //extension matched mime type const extension = file.originalname.split(".").pop()?.toLowerCase(); if (extension === undefined) { - return `Invalid file name: Missing file extension`; + return "Invalid file name: Missing file extension"; } const supportedExtensions = getValidExtensionsForMimetype(file.mimetype); diff --git a/packages/api/cms-api/src/public-upload/public-upload-file.interceptor.ts b/packages/api/cms-api/src/public-upload/public-upload-file.interceptor.ts index 3d56fb1ffd..19f706a1aa 100644 --- a/packages/api/cms-api/src/public-upload/public-upload-file.interceptor.ts +++ b/packages/api/cms-api/src/public-upload/public-upload-file.interceptor.ts @@ -35,20 +35,20 @@ export function PublicUploadFileInterceptor(fieldName: string): Type { - this.fileValidationService.validateFileMetadata(file).then((result) => { - if (result === undefined) { - return cb(null, true); - } else { - return cb(new CometValidationException(result), false); - } - }); + const errorMessage = this.fileValidationService.validateFileMetadata(file); + + if (errorMessage === undefined) { + cb(null, true); + } else { + cb(new CometValidationException(errorMessage), false); + } }, };