From 5d0676a5d905b7bbf15a282c0de2e53db7392b6d Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 6 Sep 2022 01:54:14 +0800 Subject: [PATCH] judge: bug fixes --- packages/hydrojudge/src/flow.ts | 4 ++-- packages/hydrojudge/src/hosts/hydro.ts | 19 ++++++++++--------- packages/hydrojudge/src/task.ts | 2 +- packages/hydrooj/src/handler/judge.ts | 2 +- packages/hydrooj/src/handler/problem.ts | 3 +-- packages/hydrooj/src/handler/record.ts | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/hydrojudge/src/flow.ts b/packages/hydrojudge/src/flow.ts index c6771cb50..699b3e858 100644 --- a/packages/hydrojudge/src/flow.ts +++ b/packages/hydrojudge/src/flow.ts @@ -88,8 +88,8 @@ export const runFlow = async (ctx: Context, task: Task) => { }; const runner = task.judgeCase(subtask.cases.find((i) => i.input.endsWith(ctx.meta.hackRejudge))); const res = await runner(ctx, ctxSubtask, runner); - if (res) ctx.next(res); - if (res.status !== STATUS.STATUS_ACCEPTED) { + if (res) ctx.next({ case: res }); + if (res?.status !== STATUS.STATUS_ACCEPTED) { const totalScore = Math.sum(ctx.config.subtasks.map((i) => i.score)); ctx.end({ status: STATUS.STATUS_HACKED, diff --git a/packages/hydrojudge/src/hosts/hydro.ts b/packages/hydrojudge/src/hosts/hydro.ts index 67b1b5f01..f8d62a60d 100644 --- a/packages/hydrojudge/src/hosts/hydro.ts +++ b/packages/hydrojudge/src/hosts/hydro.ts @@ -28,16 +28,17 @@ export default class Hydro { this.config.cookie = this.config.cookie || ''; this.config.last_update_at = this.config.last_update_at || 0; if (!this.config.server_url.startsWith('http')) this.config.server_url = `http://${this.config.server_url}`; - if (!this.config.server_url.endsWith('/')) this.config.server_url = `${this.config.server_url}/`; this.getLang = this.getLang.bind(this); } - get(url) { - return superagent.get(this.config.server_url + url).set('Cookie', this.config.cookie); + get(url: string) { + url = new URL(url, this.config.server_url).toString(); + return superagent.get(url).set('Cookie', this.config.cookie); } - post(url, data) { - return superagent.post(this.config.server_url + url).send(data) + post(url: string, data: any) { + url = new URL(url, this.config.server_url).toString(); + return superagent.post(url).send(data) .set('Cookie', this.config.cookie) .set('Accept', 'application/json'); } @@ -51,7 +52,7 @@ export default class Hydro { async cacheOpen(source: string, files: any[], next?) { await Lock.acquire(`${this.config.host}/${source}`); try { - return this._cacheOpen(source, files, next); + return await this._cacheOpen(source, files, next); } finally { Lock.release(`${this.config.host}/${source}`); } @@ -79,7 +80,7 @@ export default class Hydro { } if (filenames.length) { log.info(`Getting problem data: ${this.config.host}/${source}`); - if (next) next({ message: 'Syncing testdata, please wait...' }); + next?.({ message: 'Syncing testdata, please wait...' }); await this.ensureLogin(); const res = await this.post(`/d/${domainId}/judge/files`, { pid: +pid, @@ -140,7 +141,7 @@ export default class Hydro { getNext(t: JudgeTask) { return (data: Partial) => { - log.debug('Next: %d %o', data); + log.debug('Next: %o', data); this.send(t.request.rid, 'next', data); }; } @@ -207,7 +208,7 @@ export default class Hydro { async ensureLogin() { try { - const res = await this.get('judge/files'); + const res = await this.get('judge/files').set('Accept', 'application/json'); // Redirected to /login if (res.body.url) await this.login(); } catch (e) { diff --git a/packages/hydrojudge/src/task.ts b/packages/hydrojudge/src/task.ts index c584537d9..25dc15dfd 100644 --- a/packages/hydrojudge/src/task.ts +++ b/packages/hydrojudge/src/task.ts @@ -6,12 +6,12 @@ import { STATUS } from '@hydrooj/utils/lib/status'; import type { FileInfo, JudgeMeta, JudgeRequest, JudgeResultBody, } from 'hydrooj'; -import { Logger } from 'hydrooj/src/logger'; import readCases from './cases'; import { getConfig } from './config'; import { CompileError, FormatError } from './error'; import { NextFunction, ParsedConfig } from './interface'; import judge from './judge'; +import { Logger } from './log'; import { CopyInFile } from './sandbox'; import * as tmpfs from './tmpfs'; import { compilerText, Lock, md5 } from './utils'; diff --git a/packages/hydrooj/src/handler/judge.ts b/packages/hydrooj/src/handler/judge.ts index ffabe20dc..e531ad7a8 100644 --- a/packages/hydrooj/src/handler/judge.ts +++ b/packages/hydrooj/src/handler/judge.ts @@ -223,7 +223,7 @@ class JudgeConnectionHandler extends ConnectionHandler { } async cleanup() { - logger.info('Judge daemon disconnected from ', this.ip); + logger.info('Judge daemon disconnected from ', this.request.ip); bus.off('system/setting', this.sendLanguageConfig); if (this.processing) { await record.reset(this.processing.domainId, this.processing.rid, false); diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 0aa7cd9c1..42e15ff6b 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -435,8 +435,7 @@ export class ProblemDetailHandler extends ContestDetailBaseHandler { pid, contest: { $ne: new ObjectID('0'.repeat(24)) }, status: { $ne: [STATUS.STATUS_HACK_SUCCESSFUL, STATUS.STATUS_HACK_UNSUCCESSFUL] }, - }) - .project({ _id: 1, contest: 1 }).toArray(); + }).project({ _id: 1, contest: 1 }).toArray(); const priority = await record.submissionPriority(this.user._id, -rdocs.length * 5 - 50); await Promise.all(rdocs.map( (doc) => record.reset(domainId, doc._id, true) diff --git a/packages/hydrooj/src/handler/record.ts b/packages/hydrooj/src/handler/record.ts index ce0d33e3f..b7de7ed63 100644 --- a/packages/hydrooj/src/handler/record.ts +++ b/packages/hydrooj/src/handler/record.ts @@ -173,8 +173,8 @@ class RecordDetailHandler extends Handler { @param('rid', Types.ObjectID) async postRejudge(domainId: string, rid: ObjectID) { this.checkPerm(PERM.PERM_REJUDGE); - if ([STATUS.STATUS_HACK_SUCCESSFUL, STATUS.STATUS_HACK_UNSUCCESSFUL].find((i) => i === this.rdoc.status)) { - throw new ForbiddenError('Cannot rejudge hack record.'); + if ([STATUS.STATUS_HACK_SUCCESSFUL, STATUS.STATUS_HACK_UNSUCCESSFUL].includes(this.rdoc.status)) { + throw new ForbiddenError('Cannot rejudge a hack record.'); } const priority = await record.submissionPriority(this.user._id, -20); const isContest = this.rdoc.contest && this.rdoc.contest.toString() !== '000000000000000000000000';