diff --git a/packages/backend/src/queue/processors/db/import-custom-emojis.ts b/packages/backend/src/queue/processors/db/import-custom-emojis.ts index f2371429f2..33b68afd48 100644 --- a/packages/backend/src/queue/processors/db/import-custom-emojis.ts +++ b/packages/backend/src/queue/processors/db/import-custom-emojis.ts @@ -11,14 +11,28 @@ import { addFile } from "@/services/drive/add-file.js"; import { genId } from "backend-rs"; import { db } from "@/db/postgre.js"; import probeImageSize from "probe-image-size"; -import * as path from "path"; +import * as path from "node:path"; const logger = queueLogger.createSubLogger("import-custom-emojis"); +// probeImageSize acceptable extensions +// JPG, GIF, PNG, WebP, BMP, TIFF, SVG, PSD. +const acceptableExtensions = [ + ".jpeg", + ".jpg", + ".gif", + ".png", + ".webp", + ".bmp", + // ".tiff", // Cannot be used as emoji + // ".svg", // Disable for secure issues + // ".psd", // Cannot be used as emoji +]; + // TODO: 名前衝突時の動作を選べるようにする export async function importCustomEmojis( job: Bull.Job, - done: any, + done: () => void, ): Promise { logger.info("Importing custom emojis ..."); @@ -62,6 +76,14 @@ export async function importCustomEmojis( if (!record.downloaded) continue; const emojiInfo = record.emoji; const emojiPath = `${outputPath}/${record.fileName}`; + + const extname = path.extname(record.fileName); + + // Skip non-support files + if (!acceptableExtensions.includes(extname.toLowerCase())) { + continue; + } + await Emojis.delete({ name: emojiInfo.name, }); @@ -92,7 +114,7 @@ export async function importCustomEmojis( } else { logger.info("starting emoji import without metadata"); // Since we lack metadata, we import into a randomized category name instead - let categoryName = genId(); + const categoryName = genId(); let containedEmojis = fs.readdirSync(outputPath); @@ -103,7 +125,14 @@ export async function importCustomEmojis( for (const emojiFilename of containedEmojis) { // strip extension and get filename to use as name - const name = path.basename(emojiFilename, path.extname(emojiFilename)); + const extname = path.extname(emojiFilename); + + // Skip non-emoji files, such as LICENSE + if (!acceptableExtensions.includes(extname.toLowerCase())) { + continue; + } + + const name = path.basename(emojiFilename, extname); const emojiPath = `${outputPath}/${emojiFilename}`; logger.info(`importing ${name}`);