From e3e89ca43fb42798c5f6bd1eee53e0f561611dd0 Mon Sep 17 00:00:00 2001 From: undefined Date: Sat, 17 Dec 2022 20:04:43 +0800 Subject: [PATCH] core: add problem config validity check before rejudge --- packages/hydrooj/src/handler/problem.ts | 1 + packages/hydrooj/src/handler/record.ts | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index f20c95e78..d204a31fd 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -444,6 +444,7 @@ export class ProblemDetailHandler extends ContestDetailBaseHandler { contest: { $ne: new ObjectID('0'.repeat(24)) }, 'files.hack': { $exists: false }, }).project({ _id: 1, contest: 1 }).toArray(); + if (!this.pdoc.config || typeof this.pdoc.config === 'string') throw new ProblemConfigError(); const priority = await record.submissionPriority(this.user._id, -10000 - rdocs.length * 5 - 50); await record.reset(domainId, rdocs.map((rdoc) => rdoc._id), true); await Promise.all([ diff --git a/packages/hydrooj/src/handler/record.ts b/packages/hydrooj/src/handler/record.ts index 9b74379bc..effd3568b 100644 --- a/packages/hydrooj/src/handler/record.ts +++ b/packages/hydrooj/src/handler/record.ts @@ -1,7 +1,8 @@ import { omit, pick, throttle } from 'lodash'; import { FilterQuery, ObjectID } from 'mongodb'; import { - ContestNotAttendedError, ContestNotFoundError, HackRejudgeFailedError, PermissionError, + ContestNotAttendedError, ContestNotFoundError, HackRejudgeFailedError, + PermissionError, ProblemConfigError, ProblemNotFoundError, RecordNotFoundError, UserNotFoundError, } from '../error'; import { RecordDoc, Tdoc } from '../interface'; @@ -191,6 +192,8 @@ class RecordDetailHandler extends ContestDetailBaseHandler { @param('rid', Types.ObjectID) async postRejudge(domainId: string, rid: ObjectID) { + const pdoc = await problem.get(domainId, this.rdoc.pid); + if (!pdoc?.config || typeof pdoc.config === 'string') throw new ProblemConfigError(); const priority = await record.submissionPriority(this.user._id, -20); const isContest = this.rdoc.contest && this.rdoc.contest.toString() !== '000000000000000000000000'; await record.reset(domainId, rid, true);