From f2fbbb8af9e04222a7a0ac348a794a5d0684f702 Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 28 Feb 2021 13:28:01 +0800 Subject: [PATCH] =?UTF-8?q?core:=20send:=20=E5=8C=BA=E5=88=86=E8=BF=9C?= =?UTF-8?q?=E7=AB=AF=E9=94=99=E8=AF=AF=E4=B8=8E=E6=9C=AC=E5=9C=B0=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/hydrooj/package.json | 4 ++-- packages/hydrooj/src/handler/remote.ts | 20 +++++++++++++++----- packages/hydrooj/src/logger.ts | 5 +++-- packages/hydrooj/src/utils.ts | 10 +++++++++- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index aca0bd8b2..07f21b2cd 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.18.1", + "version": "2.18.2", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", @@ -61,4 +61,4 @@ "build": "tsc", "build:watch": "tsc --watch" } -} +} \ No newline at end of file diff --git a/packages/hydrooj/src/handler/remote.ts b/packages/hydrooj/src/handler/remote.ts index 9850c5555..bea990597 100644 --- a/packages/hydrooj/src/handler/remote.ts +++ b/packages/hydrooj/src/handler/remote.ts @@ -1,7 +1,8 @@ /* eslint-disable no-await-in-loop */ import superagent from 'superagent'; import { PassThrough } from 'stream'; -import { PermissionError, InvalidTokenError } from '../error'; +import { PermissionError, InvalidTokenError, RemoteOnlineJudgeError } from '../error'; +import { Logger } from '../logger'; import { ProblemAdd } from '../lib/ui'; import { PERM } from '../model/builtin'; import * as token from '../model/token'; @@ -11,6 +12,9 @@ import { Handler, Types, Route, post, } from '../service/server'; import storage from '../service/storage'; +import { logAndReturn } from '../utils'; + +const logger = new Logger('remote'); export class ProblemSendHandler extends Handler { async get() { @@ -23,10 +27,13 @@ export class ProblemSendHandler extends Handler { target = target.split('@'); const getHidden = this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN); const getData = this.user.hasPerm(PERM.PERM_READ_PROBLEM_DATA); - const pdocs = await problem.getList(domainId, _pids, getHidden, true, ['docId', 'owner']); + const pdocs = await problem.getList(domainId, _pids, true, true, ['docId', 'owner', 'hidden']); const pids = new Set(); for (const key in pdocs) { pids.add(pdocs[key].docId); + if (pdocs[key].hidden && !getHidden && pdocs[key].owner !== this.user._id) { + throw new PermissionError(PERM.PERM_VIEW_PROBLEM_HIDDEN); + } if (!getData && pdocs[key].owner !== this.user._id) { throw new PermissionError(PERM.PERM_READ_PROBLEM_DATA); } @@ -36,7 +43,7 @@ export class ProblemSendHandler extends Handler { await superagent.post(`${target[1]}/d/${target[0]}/problem/receive`) .send({ operation: 'request', url: `${url}d/${domainId}/problem/send`, tokenId, expire, - }); + }).catch(logAndReturn(logger)); this.back(); } @@ -87,7 +94,9 @@ export class ProblemReceiveHandler extends Handler { @post('expire', Types.UnsignedInt) async postRequest(domainId: string, url: string, tokenId: string, expire: number) { const res = await superagent.post(url) - .send({ operation: 'info', token: tokenId }); + .send({ operation: 'info', token: tokenId }) + .catch(logAndReturn(logger)); + if (res instanceof Error) throw new RemoteOnlineJudgeError(res.message); const [id] = await token.add(token.TYPE_IMPORT, expire, { domainId, tokenId, source: url, pdocs: res.body.pdocs, pids: res.body.pids, }); @@ -117,7 +126,8 @@ export class ProblemReceiveHandler extends Handler { operation: 'fetch', token: data.tokenId, pids: filterPid.length ? filterPid.map((i) => (+i ? +i : i)) : data.pids, - }); + }).catch(logAndReturn(logger)); + if (res instanceof Error) throw new RemoteOnlineJudgeError(res.message); const tasks = []; const pids = []; const { pdocs } = res.body; diff --git a/packages/hydrooj/src/logger.ts b/packages/hydrooj/src/logger.ts index 9d23c805b..77d46dd27 100644 --- a/packages/hydrooj/src/logger.ts +++ b/packages/hydrooj/src/logger.ts @@ -3,7 +3,7 @@ import { argv } from 'yargs'; import { Time } from './utils'; const instances: Record = {}; -type LogFunction = (format: any, ...param: any[]) => void; +type LogFunction = (format: any, ...param: any[]) => boolean; type LogType = 'success' | 'error' | 'info' | 'warn' | 'debug'; export interface Logger extends Record { } export class Logger { @@ -37,10 +37,11 @@ export class Logger { private createMethod(name: LogType, prefix: string, minLevel: number) { this[name] = (...args: [any, ...any[]]) => { - if (this.level < minLevel) return; + if (this.level < minLevel) return false; const msg = `${prefix} ${this.name} ${this.format(...args)}`; if (process.send) process.send({ event: 'message/log', payload: [msg] }); else global.Hydro.service.bus.parallel('message/log', msg); + return true; }; } diff --git a/packages/hydrooj/src/utils.ts b/packages/hydrooj/src/utils.ts index c8d38e805..21c178d6a 100644 --- a/packages/hydrooj/src/utils.ts +++ b/packages/hydrooj/src/utils.ts @@ -6,7 +6,8 @@ import serialize from 'serialize-javascript'; import Lru from 'lru-cache'; import { ObjectID } from 'mongodb'; import { isMoment } from 'moment'; -import { Moment } from 'moment-timezone'; +import type { Moment } from 'moment-timezone'; +import type { Logger } from './logger'; declare global { interface StringConstructor { @@ -220,6 +221,13 @@ function deepen(modifyString: (source: string) => string) { }; } +export function logAndReturn(logger: Logger) { + return function cb(err: Error) { + logger.error(err); + return err; + }; +} + export const camelCase = deepen((source) => source.replace(/[_-][a-z]/g, (str) => str.slice(1).toUpperCase())); export const paramCase = deepen((source) => source.replace(/_/g, '-').replace(/(? `-${str.toLowerCase()}`)); export const snakeCase = deepen((source) => source.replace(/-/g, '_').replace(/(? `_${str.toLowerCase()}`));