From 4e1745e38b5b917afbb9cb897412767d42ba2ea6 Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 1 Jun 2022 19:22:31 +0800 Subject: [PATCH] core: update submission limit (by user) --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/problem.ts | 1 + packages/hydrooj/src/model/setting.ts | 3 ++- packages/hydrooj/src/service/server.ts | 6 ++++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 61c9bc623..c1efedd2f 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.13.12", + "version": "3.13.13", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 00760623b..696e71a8b 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -501,6 +501,7 @@ export class ProblemSubmitHandler extends ProblemDetailHandler { code = await readFile(file.filepath, 'utf-8'); } } else if (code.startsWith('@@hydro_submission_file@@')) throw new ValidationError('code'); + await this.limitRate('add_record', 60, system.get('limit.submission_user'), true); await this.limitRate('add_record', 60, system.get('limit.submission')); const rid = await record.add(domainId, this.pdoc.docId, this.user._id, lang, code, true, pretest ? input : tid, tid && !pretest); const rdoc = await record.get(domainId, rid); diff --git a/packages/hydrooj/src/model/setting.ts b/packages/hydrooj/src/model/setting.ts index 5fe104569..fe2d28f74 100644 --- a/packages/hydrooj/src/model/setting.ts +++ b/packages/hydrooj/src/model/setting.ts @@ -212,7 +212,8 @@ SystemSetting( Setting('setting_limits', 'limit.problem_files_max_size', 256 * 1024 * 1024, 'number', 'limit.problem_files_max_size', 'Max files size per problem'), Setting('setting_limits', 'limit.user_files', 100, 'number', 'limit.user_files', 'Max files for user'), Setting('setting_limits', 'limit.user_files_size', 128 * 1024 * 1024, 'number', 'limit.user_files_size', 'Max total file size for user'), - Setting('setting_limits', 'limit.submission', 30, 'number', 'limit.submission', 'Max submission count per minute'), + Setting('setting_limits', 'limit.submission', 60, 'number', 'limit.submission', 'Max submission count per minute'), + Setting('setting_limits', 'limit.submission_user', 15, 'number', 'limit.submission_user', 'Max submission count per user per minute'), Setting('setting_limits', 'limit.pretest', 60, 'number', 'limit.pretest', 'Max pretest count per minute'), Setting('setting_basic', 'avatar.gravatar_url', '//cn.gravatar.com/avatar/', 'text', 'avatar.gravatar_url', 'Gravatar URL Prefix'), Setting('setting_basic', 'default.priv', builtin.PRIV.PRIV_DEFAULT, 'number', 'default.priv', 'Default Privilege', FLAG_PRO), diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index 417ed376c..d89bb5521 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -172,12 +172,14 @@ export class HandlerCommon { this.domainId = args.domainId; } - async limitRate(op: string, periodSecs: number, maxOperations: number) { + async limitRate(op: string, periodSecs: number, maxOperations: number, withUserId = false) { if (ignoredLimit.includes(op)) return; if (this.user && this.user.hasPriv(PRIV.PRIV_UNLIMITED_ACCESS)) return; const overrideLimit = system.get(`limit.${op}`); if (overrideLimit) maxOperations = overrideLimit; - await opcount.inc(op, this.request.ip, periodSecs, maxOperations); + let id = this.request.ip; + if (withUserId) id += `@${this.user._id}`; + await opcount.inc(op, id, periodSecs, maxOperations); } renderTitle(str: string) {