From 9cdd47d256abe89d49be053386a0178d36b622fe Mon Sep 17 00:00:00 2001 From: undefined Date: Sat, 1 May 2021 12:17:25 +0800 Subject: [PATCH 1/3] judge: detail setting (#78) --- packages/hydrojudge/package.json | 2 +- packages/hydrojudge/src/hosts/hydro.ts | 2 +- packages/hydrojudge/src/hosts/vj4.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index c33c8e84c..0ae84b500 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "2.5.16", + "version": "2.5.17", "main": "package.json", "author": "undefined ", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrojudge/src/hosts/hydro.ts b/packages/hydrojudge/src/hosts/hydro.ts index 4b77dfcf4..f9e87de13 100644 --- a/packages/hydrojudge/src/hosts/hydro.ts +++ b/packages/hydrojudge/src/hosts/hydro.ts @@ -167,7 +167,7 @@ export default class Hydro { constructor(config) { this.config = config; - this.config.detail = this.config.detail || true; + this.config.detail = this.config.detail ?? true; 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}`; diff --git a/packages/hydrojudge/src/hosts/vj4.ts b/packages/hydrojudge/src/hosts/vj4.ts index 6d8333606..c770f1980 100644 --- a/packages/hydrojudge/src/hosts/vj4.ts +++ b/packages/hydrojudge/src/hosts/vj4.ts @@ -173,7 +173,7 @@ export default class VJ4 { constructor(config) { this.config = config; - this.config.detail = this.config.detail || true; + this.config.detail = this.config.detail ?? true; 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}`; From cc0fc9e5b31eb0c166f1b573a25b8b275078ede5 Mon Sep 17 00:00:00 2001 From: undefined Date: Sat, 1 May 2021 12:35:17 +0800 Subject: [PATCH 2/3] judge: better read_cases (#111) --- packages/hydrojudge/package.json | 4 ++-- packages/hydrojudge/src/cases.ts | 15 ++++++++++----- packages/utils/lib/cases.ts | 2 +- packages/utils/package.json | 2 +- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index 0ae84b500..12a9cbcd8 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,12 +1,12 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "2.5.17", + "version": "2.5.18", "main": "package.json", "author": "undefined ", "repository": "https://github.com/hydro-dev/Hydro.git", "dependencies": { - "@hydrooj/utils": "^1.0.8", + "@hydrooj/utils": "^1.0.9", "adm-zip": "^0.5.5", "axios": "^0.21.1", "bson": "^4.3.0", diff --git a/packages/hydrojudge/src/cases.ts b/packages/hydrojudge/src/cases.ts index 3467b2479..276760932 100644 --- a/packages/hydrojudge/src/cases.ts +++ b/packages/hydrojudge/src/cases.ts @@ -104,8 +104,9 @@ async function read0(folder: string, files: string[], checkFile, cfg) { return config; } -async function read1(folder: string, files: string[], checkFile, cfg) { +async function read1(folder: string, files: string[], checkFile, cfg, rst) { const subtask = {}; + for (const s of rst.subtasks) if (s.id) subtask[s.id] = s; const subtasks = []; for (const file of files) { for (const REG of RE1) { @@ -150,7 +151,7 @@ async function read1(folder: string, files: string[], checkFile, cfg) { return config; } -async function readAutoCases(folder, { next }, cfg) { +async function readAutoCases(folder, { next }, cfg, rst) { const config = { checker_type: 'default', count: 0, @@ -170,7 +171,7 @@ async function readAutoCases(folder, { next }, cfg) { files.push(...outputs.map((i) => `output/${i}`)); } let result = await read0(folder, files, checkFile, cfg); - if (!result.count) result = await read1(folder, files, checkFile, cfg); + if (!result.count) result = await read1(folder, files, checkFile, cfg, rst); Object.assign(config, result); next({ message: { message: 'Found {0} testcases.', params: [config.count] } }); } catch (e) { @@ -214,8 +215,12 @@ export default async function readCases(folder: string, cfg: Record } catch (e) { throw changeErrorType(e, FormatError); } - if (!(result.outputs?.length || result.subtasks.length)) { - const c = await readAutoCases(folder, args, config); + let auto = !result.outputs?.length; + if (!result.subtasks.length) { + auto = !Math.sum(result.subtasks.map((subtask) => subtask.cases.length)); + } + if (auto) { + const c = await readAutoCases(folder, args, config, result); result.subtasks = c.subtasks; result.count = c.count; } diff --git a/packages/utils/lib/cases.ts b/packages/utils/lib/cases.ts index bd5845c1b..71c1607bd 100644 --- a/packages/utils/lib/cases.ts +++ b/packages/utils/lib/cases.ts @@ -51,7 +51,7 @@ export default async function readYamlCases(cfg: Record = {}, check } else if (cfg.subtasks) { for (const subtask of cfg.subtasks) { const cases = []; - for (const c of subtask.cases) { + for (const c of subtask.cases || []) { config.count++; cases.push({ input: c.input ? checkFile(c.input, 'Cannot find input file {0}.') : '/dev/null', diff --git a/packages/utils/package.json b/packages/utils/package.json index 0968a23b8..0e596ce8f 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/utils", - "version": "1.0.8", + "version": "1.0.9", "description": "hydrooj utils", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git", From 90579a81ed642e45bf393c406614e75304017d04 Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 2 May 2021 14:30:53 +0800 Subject: [PATCH 3/3] core: use domain.host for default --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/domain.ts | 2 +- packages/hydrooj/src/handler/home.ts | 2 +- packages/hydrooj/src/handler/user.ts | 4 ++-- packages/hydrooj/src/interface.ts | 2 +- packages/hydrooj/src/pipelineUtils.ts | 2 +- packages/hydrooj/src/upgrade.ts | 6 ++++++ 7 files changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 39f86a6ee..3d1916b83 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.23.30", + "version": "2.23.31", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/domain.ts b/packages/hydrooj/src/handler/domain.ts index ee65f4e8d..298592968 100644 --- a/packages/hydrooj/src/handler/domain.ts +++ b/packages/hydrooj/src/handler/domain.ts @@ -219,7 +219,7 @@ class DomainJoinApplicationsHandler extends ManageHandler { if (!this.response.body.joinSettings) { delete this.response.body.expirations[domain.JOIN_EXPIRATION_KEEP_CURRENT]; } - this.response.body.url_prefix = system.get('server.url'); + this.response.body.url_prefix = (this.domain.host || [])[0] || system.get('server.url'); this.response.body.path = [ ['Hydro', 'homepage'], ['domain', null], diff --git a/packages/hydrooj/src/handler/home.ts b/packages/hydrooj/src/handler/home.ts index 27d821136..0ceb6aa6b 100644 --- a/packages/hydrooj/src/handler/home.ts +++ b/packages/hydrooj/src/handler/home.ts @@ -168,7 +168,7 @@ class HomeSecurityHandler extends Handler { const m = await this.renderHTML('user_changemail_mail.html', { path: `home/changeMail/${code}`, uname: this.user.uname, - url_prefix: system.get('server.url'), + url_prefix: (this.domain.host || [])[0] || system.get('server.url'), }); await mail.sendMail(email, 'Change Email', 'user_changemail_mail', m); this.response.template = 'user_changemail_mail_sent.html'; diff --git a/packages/hydrooj/src/handler/user.ts b/packages/hydrooj/src/handler/user.ts index 429f97544..be59efe11 100644 --- a/packages/hydrooj/src/handler/user.ts +++ b/packages/hydrooj/src/handler/user.ts @@ -79,7 +79,7 @@ export class UserRegisterHandler extends Handler { if (system.get('smtp.user')) { const m = await this.renderHTML('user_register_mail.html', { path: `register/${t[0]}`, - url_prefix: system.get('server.url'), + url_prefix: (this.domain.host || [])[0] || system.get('server.url'), }); await sendMail(mail, 'Sign Up', 'user_register_mail', m); this.response.template = 'user_register_mail_sent.html'; @@ -146,7 +146,7 @@ class UserLostPassHandler extends Handler { ); const m = await this.renderHTML('user_lostpass_mail.html', { url: `lostpass/${tid}`, - url_prefix: system.get('server.url'), + url_prefix: this.domain.host || system.get('server.url'), uname: udoc.uname, }); await sendMail(mail, 'Lost Password', 'user_lostpass_mail', m); diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 3105ac2bb..9cd3d205e 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -305,7 +305,7 @@ export interface DomainDoc extends Record { avatar: string, bulletin: string, _join?: any, - host?: string, + host?: string[], } // Message diff --git a/packages/hydrooj/src/pipelineUtils.ts b/packages/hydrooj/src/pipelineUtils.ts index 989eb0574..ab73029c6 100644 --- a/packages/hydrooj/src/pipelineUtils.ts +++ b/packages/hydrooj/src/pipelineUtils.ts @@ -5,7 +5,7 @@ import user from './model/user'; import problem, { Field, Pdoc } from './model/problem'; export async function iterateAllDomain(cb: (ddoc: DomainDoc, current?: number, total?: number) => Promise) { - const ddocs = await domain.getMulti().project({ _id: 1, owner: 1 }).toArray(); + const ddocs = await domain.getMulti().toArray(); for (const i in ddocs) await cb(ddocs[i], +i, ddocs.length); } diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index 3f944074a..5af15f988 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -311,6 +311,12 @@ const scripts: UpgradeScript[] = [ await db.collection('oplog').updateMany({}, { $set: { type: 'delete', operateIp: '127.0.0.1' } }); return true; }, + async function _24_25() { + await iterateAllDomain(async (ddoc) => { + if (typeof ddoc.host === 'string') await domain.edit(ddoc._id, { host: [ddoc.host] }); + }); + return true; + }, ]; export default scripts;