From 895d50530a0f7ea9794fce0f6fc16de4237ca813 Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 27 Sep 2022 02:43:19 +0800 Subject: [PATCH] core: import: handle error message for invalid zip --- packages/fps-importer/handler.ts | 7 ++++++- packages/hydrooj/src/handler/import.ts | 7 ++++++- packages/hydrooj/src/handler/problem.ts | 7 ++++++- packages/import-qduoj/handler.ts | 7 ++++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/packages/fps-importer/handler.ts b/packages/fps-importer/handler.ts index 001e4aa9..78a72690 100644 --- a/packages/fps-importer/handler.ts +++ b/packages/fps-importer/handler.ts @@ -111,7 +111,12 @@ class FpsProblemImportHandler extends Handler { } catch (e) { if (e instanceof FileTooLargeError) throw e; console.log(e); - const zip = new AdmZip(this.request.files.file.filepath); + let zip: AdmZip; + try { + zip = new AdmZip(this.request.files.file.filepath); + } catch (e) { + throw new ValidationError('zip', null, e.message); + } for (const entry of zip.getEntries()) { try { const buf = entry.getData(); diff --git a/packages/hydrooj/src/handler/import.ts b/packages/hydrooj/src/handler/import.ts index 92ede7ba..a3fe9144 100644 --- a/packages/hydrooj/src/handler/import.ts +++ b/packages/hydrooj/src/handler/import.ts @@ -37,7 +37,12 @@ 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.filepath); + let zip: AdmZip; + try { + zip = new AdmZip(this.request.files.file.filepath); + } catch (e) { + throw new ValidationError('zip', null, e.message); + } await new Promise((resolve, reject) => { zip.extractAllToAsync(tmpdir, true, (err) => { if (err) reject(err); diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index f0d5a159..26086050 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -727,7 +727,12 @@ export class ProblemFilesHandler extends ProblemDetailHandler { if (!this.user.own(this.pdoc, PERM.PERM_EDIT_PROBLEM_SELF)) this.checkPerm(PERM.PERM_EDIT_PROBLEM); const files = []; if (filename.endsWith('.zip') && type === 'testdata') { - const zip = new AdmZip(this.request.files.file.filepath); + let zip: AdmZip; + try { + zip = new AdmZip(this.request.files.file.filepath); + } catch (e) { + throw new ValidationError('zip', null, e.message); + } const entries = zip.getEntries(); for (const entry of entries) { if (!entry.name) continue; diff --git a/packages/import-qduoj/handler.ts b/packages/import-qduoj/handler.ts index 770614cd..ef05679a 100644 --- a/packages/import-qduoj/handler.ts +++ b/packages/import-qduoj/handler.ts @@ -15,7 +15,12 @@ fs.ensureDirSync('/tmp/hydro/import-qduoj'); class ImportQduojHandler extends Handler { async fromFile(domainId: string, zipfile: string) { - const zip = new AdmZip(zipfile); + let zip: AdmZip; + try { + zip = new AdmZip(zipfile); + } catch (e) { + throw new ValidationError('zip', null, e.message); + } const tmp = path.resolve(os.tmpdir(), 'hydro', 'import-qduoj', String.random(32)); await new Promise((resolve, reject) => { zip.extractAllToAsync(tmp, true, (err) => (err ? reject(err) : resolve(null)));