From 1e286b069f657e0e33ff71a1e871a8f247b3853d Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 12 May 2022 00:32:35 +0800 Subject: [PATCH] core: fix formidable types --- packages/fps-importer/handler.ts | 6 +++--- packages/fps-importer/package.json | 2 +- packages/hydrooj/src/handler/import.ts | 2 +- packages/hydrooj/src/handler/misc.ts | 9 +++++---- packages/hydrooj/src/handler/problem.ts | 16 ++++++++-------- packages/import-qduoj/handler.ts | 4 ++-- packages/import-qduoj/package.json | 2 +- 7 files changed, 21 insertions(+), 20 deletions(-) diff --git a/packages/fps-importer/handler.ts b/packages/fps-importer/handler.ts index 3278192de..f6569802e 100644 --- a/packages/fps-importer/handler.ts +++ b/packages/fps-importer/handler.ts @@ -104,15 +104,15 @@ class FpsProblemImportHandler extends Handler { if (!this.request.files.file) throw new ValidationError('file'); const tasks = []; try { - const file = await fs.stat(this.request.files.file.path); + const file = await fs.stat(this.request.files.file.filepath); if (file.size > 64 * 1024 * 1024) throw new FileTooLargeError('64m'); - const content = fs.readFileSync(this.request.files.file.path, 'utf-8'); + const content = fs.readFileSync(this.request.files.file.filepath, 'utf-8'); const result = await xml2js.parseStringPromise(content); tasks.push(result); } catch (e) { if (e instanceof FileTooLargeError) throw e; console.log(e); - const zip = new AdmZip(this.request.files.file.path); + const zip = new AdmZip(this.request.files.file.filepath); for (const entry of zip.getEntries()) { try { const buf = entry.getData(); diff --git a/packages/fps-importer/package.json b/packages/fps-importer/package.json index 88220fb23..96cf8473d 100644 --- a/packages/fps-importer/package.json +++ b/packages/fps-importer/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/fps-importer", - "version": "1.3.3", + "version": "1.3.4", "description": "Import FPS problems", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrooj/src/handler/import.ts b/packages/hydrooj/src/handler/import.ts index 73b4d3cf1..b59d092ab 100644 --- a/packages/hydrooj/src/handler/import.ts +++ b/packages/hydrooj/src/handler/import.ts @@ -37,7 +37,7 @@ class ProblemImportHydroHandler extends Handler { if (keepUser) this.checkPriv(PRIV.PRIV_EDIT_SYSTEM); if (!this.request.files.file) throw new ValidationError('file'); const tmpdir = path.join(os.tmpdir(), 'hydro', `${Math.random()}.import`); - const zip = new AdmZip(this.request.files.file.path); + const zip = new AdmZip(this.request.files.file.filepath); await new Promise((resolve, reject) => { zip.extractAllToAsync(tmpdir, true, (err) => { if (err) reject(err); diff --git a/packages/hydrooj/src/handler/misc.ts b/packages/hydrooj/src/handler/misc.ts index 5c1a98d00..7f09ad5fd 100644 --- a/packages/hydrooj/src/handler/misc.ts +++ b/packages/hydrooj/src/handler/misc.ts @@ -49,16 +49,17 @@ export class FilesHandler extends Handler { if ((this.user._files?.length || 0) >= system.get('limit.user_files')) { throw new ForbiddenError('File limit exceeded.'); } - if (!this.request.files.file) throw new ValidationError('file'); - const f = statSync(this.request.files.file.path); + const file = this.request.files?.file; + if (!file) throw new ValidationError('file'); + const f = statSync(file.filepath); const size = Math.sum((this.user._files || []).map((i) => i.size)) + f.size; if (size >= system.get('limit.user_files_size')) { throw new ForbiddenError('File size limit exceeded.'); } - if (!filename) filename = this.request.files.file.name || String.random(16); + if (!filename) filename = file.originalFilename || String.random(16); if (filename.includes('/') || filename.includes('..')) throw new ValidationError('filename', null, 'Bad filename'); if (this.user._files.filter((i) => i.name === filename).length) throw new BadRequestError('file exists'); - await storage.put(`user/${this.user._id}/${filename}`, this.request.files.file.path, this.user._id); + await storage.put(`user/${this.user._id}/${filename}`, file.filepath, this.user._id); const meta = await storage.getMeta(`user/${this.user._id}/${filename}`); const payload = { name: filename, ...pick(meta, ['size', 'lastModified', 'etag']) }; if (!meta) throw new Error('Upload failed'); diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 6110cef7c..dffa7dded 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -493,13 +493,13 @@ export class ProblemSubmitHandler extends ProblemDetailHandler { if (typeof config !== 'object' || config === null) throw new BadRequestError('Incorrect problem config'); const sizeLimit = config.type === 'submit_answer' ? 128 * 1024 * 1024 : 65535; if (file.size > sizeLimit) throw new ValidationError('file'); - if (file.size > 65535 || await isBinaryFile(file.path, file.size)) { + if (file.size > 65535 || await isBinaryFile(file.filepath, file.size)) { const id = nanoid(); - await storage.put(`submission/${this.user._id}/${id}`, file.path, this.user._id); - code = `@@hydro_submission_file@@${this.user._id}/${id}#${file.name}`; + await storage.put(`submission/${this.user._id}/${id}`, file.filepath, this.user._id); + code = `@@hydro_submission_file@@${this.user._id}/${id}#${file.originalFilename}`; } else { // TODO auto detect & convert encoding - code = await readFile(file.path, 'utf-8'); + code = await readFile(file.filepath, 'utf-8'); } } else if (code.startsWith('@@hydro_submission_file@@')) throw new ValidationError('code'); await this.limitRate('add_record', 60, system.get('limit.submission')); @@ -633,12 +633,12 @@ export class ProblemFilesHandler extends ProblemDetailHandler { async postUploadFile(domainId: string, filename: string, type = 'testdata') { if (this.pdoc.reference) throw new ForbiddenError('Cannot edit files of a referenced problem.'); if (!this.request.files.file) throw new ValidationError('file'); - if (!filename) filename = this.request.files.file.name || String.random(16); + if (!filename) filename = this.request.files.file.originalFilename || String.random(16); if (filename.includes('/') || filename.includes('..')) throw new ValidationError('filename', null, 'Bad filename'); if (!this.user.own(this.pdoc, PERM.PERM_EDIT_PROBLEM_SELF)) this.checkPerm(PERM.PERM_EDIT_PROBLEM); const files = []; if (filename.endsWith('.zip')) { - const zip = new AdmZip(this.request.files.file.path); + const zip = new AdmZip(this.request.files.file.filepath); const entries = zip.getEntries(); for (const entry of entries) { if (!entry.name) continue; @@ -653,8 +653,8 @@ export class ProblemFilesHandler extends ProblemDetailHandler { files.push({ type, name: filename, - size: statSync(this.request.files.file.path).size, - data: () => this.request.files.file.path, + size: statSync(this.request.files.file.filepath).size, + data: () => this.request.files.file.filepath, }); } if (!this.user.hasPriv(PRIV.PRIV_EDIT_SYSTEM)) { diff --git a/packages/import-qduoj/handler.ts b/packages/import-qduoj/handler.ts index d34319add..44758be22 100644 --- a/packages/import-qduoj/handler.ts +++ b/packages/import-qduoj/handler.ts @@ -119,9 +119,9 @@ class ImportQduojHandler extends Handler { async post({ domainId }) { if (!this.request.files.file) throw new ValidationError('file'); - const stat = await fs.stat(this.request.files.file.path); + const stat = await fs.stat(this.request.files.file.filepath); if (stat.size > 128 * 1024 * 1024) throw new ValidationError('file', 'File too large'); - await this.fromFile(domainId, this.request.files.file.path); + await this.fromFile(domainId, this.request.files.file.filepath); this.response.redirect = this.url('problem_main'); } } diff --git a/packages/import-qduoj/package.json b/packages/import-qduoj/package.json index cfaca9770..35ab4d7cb 100644 --- a/packages/import-qduoj/package.json +++ b/packages/import-qduoj/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/import-qduoj", - "version": "1.3.3", + "version": "1.3.4", "description": "Import QDUOJ problem export", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git",