From 4d7fa024e7763f39253a676bf2e3f9f6ef34ce53 Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 3 Nov 2024 18:27:41 +0800 Subject: [PATCH] core&judge: add isTrusted option --- packages/hydrojudge/src/cases.ts | 3 ++- packages/hydrojudge/src/task.ts | 1 + packages/hydrooj/src/interface.ts | 1 + packages/hydrooj/src/model/record.ts | 11 ++++++++--- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/hydrojudge/src/cases.ts b/packages/hydrojudge/src/cases.ts index 305e29712..940bd6d35 100644 --- a/packages/hydrojudge/src/cases.ts +++ b/packages/hydrojudge/src/cases.ts @@ -41,6 +41,7 @@ interface Args { next: NextFunction; key: string; isSelfSubmission: boolean; + trusted: boolean; lang: string; langConfig?: LangConfig; } @@ -85,6 +86,6 @@ export default async function readCases(folder: string, cfg: ProblemConfigFile = } result.subtasks = normalizeSubtasks(result.subtasks || [], checkFile, config.time, config.memory, false, timeRate, memoryRate); if (result.key && args.key !== result.key) throw new FormatError('Incorrect secret key'); - if (!result.key) isValidConfig(result); + if (!result.key && !args.trusted) isValidConfig(result); return result; } diff --git a/packages/hydrojudge/src/task.ts b/packages/hydrojudge/src/task.ts index 1a2cbbc30..4dc3d0e30 100644 --- a/packages/hydrojudge/src/task.ts +++ b/packages/hydrojudge/src/task.ts @@ -112,6 +112,7 @@ export class JudgeTask { next: this.next, isSelfSubmission: this.meta.problemOwner === this.request.uid, key: md5(`${this.source}/${getConfig('secret')}`), + trusted: this.request.trusted, lang: this.lang, langConfig: (this.request.type === 'generate' || ['objective', 'submit_answer'].includes(this.request.config.type)) ? null : this.session.getLang(this.lang), diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 7feedcc25..de0ecc5ce 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -348,6 +348,7 @@ export interface JudgeRequest extends Omit { meta: JudgeMeta; data: FileInfo[]; source: string; + trusted: boolean; } export interface ScoreboardNode { diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index 087b1bccc..3b4174590 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -14,6 +14,7 @@ import db from '../service/db'; import { MaybeArray, NumberKeys } from '../typeutils'; import { ArgMethod, buildProjection, Time } from '../utils'; import { STATUS } from './builtin'; +import DomainModel from './domain'; import problem from './problem'; import task from './task'; @@ -80,11 +81,13 @@ export default class RecordModel { static async judge(domainId: string, rids: MaybeArray, priority = 0, config: ProblemConfigFile = {}, meta: Partial = {}) { rids = rids instanceof Array ? rids : [rids]; if (!rids.length) return null; - const rdocs = (await Promise.all(rids.map((rid) => RecordModel.get(domainId, rid)))).filter((i) => i); + const rdocs = await RecordModel.getMulti(domainId, { _id: { $in: rids } }).toArray(); if (!rdocs.length) return null; let source = `${domainId}/${rdocs[0].pid}`; - await task.deleteMany({ rid: { $in: rids } }); - let pdoc = await problem.get(domainId, rdocs[0].pid); + let [pdoc] = await Promise.all([ + problem.get(domainId, rdocs[0].pid), + task.deleteMany({ rid: { $in: rids } }), + ]); if (!pdoc) throw new ProblemNotFoundError(domainId, rdocs[0].pid); if (pdoc.reference) { pdoc = await problem.get(pdoc.reference.domainId, pdoc.reference.pid); @@ -92,6 +95,7 @@ export default class RecordModel { source = `${pdoc.domainId}/${pdoc.docId}`; } meta = { ...meta, problemOwner: pdoc.owner }; + const ddoc = await DomainModel.get(pdoc.domainId); return await task.addMany(rdocs.map((rdoc) => { let type = 'judge'; if (typeof pdoc.config === 'string') throw new Error(pdoc.config); @@ -110,6 +114,7 @@ export default class RecordModel { }, data: pdoc.data, source, + trusted: ddoc.isTrusted, meta, } as any); }));