From e0425379f1753e4cb0672bfbf1e86869e9ff9efc Mon Sep 17 00:00:00 2001 From: Nawias Date: Fri, 29 Mar 2024 13:53:19 +0100 Subject: [PATCH] Added a safeguard for too small images (#14) --- .../converters/ImageMediaConverter.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/services/converters/ImageMediaConverter.ts b/src/services/converters/ImageMediaConverter.ts index 9ba3365..f019de4 100644 --- a/src/services/converters/ImageMediaConverter.ts +++ b/src/services/converters/ImageMediaConverter.ts @@ -1,8 +1,9 @@ import MediaConverter, { MediaFile } from "./MediaConverter"; const MAX_IMAGE_DIM = 1024; - -type ImageErrorReason = "invalid" | "too large"; +const MIN_IMAGE_DIM = 3; +type ImageSizeErrorReason = "too large" | "too small"; +type ImageErrorReason = "invalid" | ImageSizeErrorReason; class ImageError extends Error { public readonly reason: ImageErrorReason; @@ -14,10 +15,17 @@ class ImageError extends Error { } } +type ImageCheckResult = "ok" | ImageSizeErrorReason; export default class ImageMediaConverter extends MediaConverter { - async checkImage(file: Blob): Promise { + async checkImage(file: Blob): Promise { const image = await createImageBitmap(file); - return image.width <= MAX_IMAGE_DIM && image.height <= MAX_IMAGE_DIM; + if (image.width > MAX_IMAGE_DIM || image.height > MAX_IMAGE_DIM) + return "too large"; + + if (image.width < MIN_IMAGE_DIM || image.height < MIN_IMAGE_DIM) + return "too small"; + + return "ok"; } async convert(files: MediaFile[]): Promise { @@ -25,8 +33,8 @@ export default class ImageMediaConverter extends MediaConverter { for (const file of files) { try { - if (!(await this.checkImage(file.data))) - throw new ImageError("too large"); + const checkResult = await this.checkImage(file.data); + if (checkResult !== "ok") throw new ImageError(checkResult); body.append(file.filepath, file.data); } catch (error) {