From 8f30975dc9baa1c584ce1073da72e772324c49dd Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 1 May 2023 21:44:02 +0800 Subject: [PATCH] core: storage: avoid special chars in filename --- packages/hydrooj/src/model/storage.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/hydrooj/src/model/storage.ts b/packages/hydrooj/src/model/storage.ts index f069f015..125d0473 100644 --- a/packages/hydrooj/src/model/storage.ts +++ b/packages/hydrooj/src/model/storage.ts @@ -13,16 +13,20 @@ import * as system from './system'; export class StorageModel { static coll = db.collection('storage'); + static generateId(ext: string) { + return `${nanoid(3).replace(/[_-]/g, '0')}/${nanoid().replace(/[_-]/g, '0')}${ext}`; + } + static async put(path: string, file: string | Buffer | Readable, owner?: number) { const meta = {}; await StorageModel.del([path]); meta['Content-Type'] = (path.endsWith('.ans') || path.endsWith('.out')) ? 'text/plain' : lookup(path) || 'application/octet-stream'; - let _id = `${nanoid(3)}/${nanoid()}${extname(path)}`; + let _id = StorageModel.generateId(extname(path)); // Make sure id is not used // eslint-disable-next-line no-await-in-loop - while (await StorageModel.coll.findOne({ _id })) _id = `${nanoid(3)}/${nanoid()}${extname(path)}`; + while (await StorageModel.coll.findOne({ _id })) _id = StorageModel.generateId(extname(path)); await storage.put(_id, file, meta); const { metaData, size, etag } = await storage.getMeta(_id); await StorageModel.coll.insertOne({