From 7903d012da0e45b1a31d648eceac95a197d6dae8 Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 24 Aug 2022 14:35:45 +0800 Subject: [PATCH] core&utils: remove outdated code --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/entry/cli.ts | 12 ++++++--- packages/hydrooj/src/handler/home.ts | 2 +- packages/hydrooj/src/handler/misc.ts | 3 +-- packages/hydrooj/src/interface.ts | 12 --------- packages/hydrooj/src/lib/avatar.ts | 2 +- packages/hydrooj/src/lib/crypto.ts | 13 --------- packages/hydrooj/src/lib/download.ts | 22 ---------------- packages/hydrooj/src/lib/index.ts | 3 --- packages/hydrooj/src/lib/jwt.ts | 35 ------------------------- packages/hydrooj/src/lib/ui.ts | 35 +++++++++---------------- packages/hydrooj/src/loader.ts | 1 + packages/hydrooj/src/service/storage.ts | 2 +- packages/hydrooj/src/upgrade.ts | 2 +- packages/hydrooj/src/utils.ts | 19 -------------- packages/login-with-google/lib.ts | 25 +++++++++++++++++- packages/login-with-google/package.json | 2 +- packages/migrate/lib.ts | 2 +- packages/migrate/package.json | 2 +- packages/ui-default/build/main.ts | 1 - packages/ui-default/sw.ts | 1 - packages/utils/lib/utils.ts | 5 ++++ packages/utils/package.json | 2 +- 23 files changed, 61 insertions(+), 144 deletions(-) delete mode 100644 packages/hydrooj/src/lib/crypto.ts delete mode 100644 packages/hydrooj/src/lib/download.ts delete mode 100644 packages/hydrooj/src/lib/jwt.ts diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index ae6056ae..5f74ddf2 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.16.1", + "version": "3.16.2", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/entry/cli.ts b/packages/hydrooj/src/entry/cli.ts index 3119bcc1..0885cc53 100644 --- a/packages/hydrooj/src/entry/cli.ts +++ b/packages/hydrooj/src/entry/cli.ts @@ -23,9 +23,15 @@ function parseParameters(fn: Function) { } async function runScript(name: string, arg: any) { - if (!global.Hydro.script[name]) return console.error('Script %s not found.', name); - validate(global.Hydro.script[name].validate, arg); - return await global.Hydro.script[name].run(arg, console.info); + const s = global.Hydro.script[name]; + if (!s) return console.error('Script %s not found.', name); + if (typeof s.validate === 'function') { + arg = s.validate(arg); + } else { + console.warn('You are using the legacy script validation API, which will be dropped in the future.'); + validate(s.validate, arg); + } + return await s.run(arg, console.info); } async function cli() { diff --git a/packages/hydrooj/src/handler/home.ts b/packages/hydrooj/src/handler/home.ts index 6b140afc..ce04b375 100644 --- a/packages/hydrooj/src/handler/home.ts +++ b/packages/hydrooj/src/handler/home.ts @@ -8,7 +8,6 @@ import { } from '../error'; import { DomainDoc, MessageDoc, Setting } from '../interface'; import avatar from '../lib/avatar'; -import { md5 } from '../lib/crypto'; import * as mail from '../lib/mail'; import { isDomainId, isEmail, isPassword } from '../lib/validator'; import BlackListModel from '../model/blacklist'; @@ -27,6 +26,7 @@ import * as bus from '../service/bus'; import { Connection, ConnectionHandler, Handler, param, query, Route, Types, } from '../service/server'; +import { md5 } from '../utils'; const { geoip, useragent } = global.Hydro.lib; diff --git a/packages/hydrooj/src/handler/misc.ts b/packages/hydrooj/src/handler/misc.ts index 725af302..54fc83ba 100644 --- a/packages/hydrooj/src/handler/misc.ts +++ b/packages/hydrooj/src/handler/misc.ts @@ -5,7 +5,6 @@ import { lookup } from 'mime-types'; import { BadRequestError, ForbiddenError, ValidationError, } from '../error'; -import { md5 } from '../lib/crypto'; import { PRIV } from '../model/builtin'; import * as oplog from '../model/oplog'; import storage from '../model/storage'; @@ -16,7 +15,7 @@ import { } from '../service/server'; import { encodeRFC5987ValueChars } from '../service/storage'; import { builtinConfig } from '../settings'; -import { sortFiles } from '../utils'; +import { md5, sortFiles } from '../utils'; class SwitchLanguageHandler extends Handler { @param('lang', Types.Name) diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 995cc0b4..11e6d5c8 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -12,14 +12,6 @@ export interface System { } export interface SystemKeys { - 'file.endPoint': string, - 'file.accessKey': string, - 'file.secretKey': string, - 'file.bucket': string, - 'file.region': string, - 'file.pathStyle': boolean, - 'file.endPointForUser': string, - 'file.endPointForJudge': string, 'smtp.user': string, 'smtp.from': string, 'smtp.pass': string, @@ -657,15 +649,11 @@ export interface ProblemSearchOptions { export type ProblemSearch = (domainId: string, q: string, options?: ProblemSearchOptions) => Promise; export interface Lib extends Record { - download: typeof import('./lib/download'), difficulty: typeof import('./lib/difficulty'), buildContent: typeof import('./lib/content').buildContent, 'hash.hydro': typeof import('./lib/hash.hydro'), i18n: typeof import('./lib/i18n'), - jwt: typeof import('./lib/jwt'), mail: typeof import('./lib/mail'), - md5: typeof import('./lib/crypto').md5, - sha1: typeof import('./lib/crypto').sha1, paginate: typeof import('./lib/paginate'), rank: typeof import('./lib/rank'), rating: typeof import('./lib/rating'), diff --git a/packages/hydrooj/src/lib/avatar.ts b/packages/hydrooj/src/lib/avatar.ts index 3396908b..15b69353 100644 --- a/packages/hydrooj/src/lib/avatar.ts +++ b/packages/hydrooj/src/lib/avatar.ts @@ -1,4 +1,4 @@ -import { md5 } from './crypto'; +import { md5 } from '../utils'; type AvatarProvider = (src: string, size: number) => string; diff --git a/packages/hydrooj/src/lib/crypto.ts b/packages/hydrooj/src/lib/crypto.ts deleted file mode 100644 index 1cd82036..00000000 --- a/packages/hydrooj/src/lib/crypto.ts +++ /dev/null @@ -1,13 +0,0 @@ -import crypto from 'crypto'; - -const encrypt = (algorithm, content) => { - const hash = crypto.createHash(algorithm); - hash.update(content); - return hash.digest('hex'); -}; - -export const sha1 = (content: string) => encrypt('sha1', content); -export const md5 = (content: string) => encrypt('md5', content); - -global.Hydro.lib.md5 = md5; -global.Hydro.lib.sha1 = sha1; diff --git a/packages/hydrooj/src/lib/download.ts b/packages/hydrooj/src/lib/download.ts deleted file mode 100644 index 5104dbcd..00000000 --- a/packages/hydrooj/src/lib/download.ts +++ /dev/null @@ -1,22 +0,0 @@ -import fs from 'fs'; -import superagent, { SuperAgentRequest } from 'superagent'; - -async function _download(url: string, path: string, retry: number) { - const w = fs.createWriteStream(path); - superagent.get(url).retry(retry).pipe(w); - await new Promise((resolve, reject) => { - w.on('finish', resolve); - w.on('error', reject); - }); - return path; -} - -function download(url: string): SuperAgentRequest; -function download(url: string, path?: string, retry = 3) { - if (path) return _download(url, path, retry); - return superagent.get(url).retry(retry); -} - -export = download; - -global.Hydro.lib.download = download; diff --git a/packages/hydrooj/src/lib/index.ts b/packages/hydrooj/src/lib/index.ts index 22955b1d..db563bcc 100644 --- a/packages/hydrooj/src/lib/index.ts +++ b/packages/hydrooj/src/lib/index.ts @@ -1,9 +1,6 @@ -import './jwt'; -import './download'; import './i18n'; import './mail'; import './useragent'; -import './crypto'; import './paginate'; import './hash.hydro'; import './rank'; diff --git a/packages/hydrooj/src/lib/jwt.ts b/packages/hydrooj/src/lib/jwt.ts deleted file mode 100644 index 509b3b99..00000000 --- a/packages/hydrooj/src/lib/jwt.ts +++ /dev/null @@ -1,35 +0,0 @@ -function decodeBase64WithUriEncoding(encodedText: string) { - return Buffer.from(encodedText, 'base64').toString('utf8'); -} - -function unescapedString(escapedString: string) { - escapedString += new Array(5 - (escapedString.length % 4)).join('='); - return escapedString.replace(/-/g, '+').replace(/_/g, '/'); -} - -function decodeJWT(idToken: string) { - const token = idToken.split('.'); - if (token.length !== 3) { - throw new Error('Invalid idToken'); - } - try { - const headerSegment = JSON.parse(decodeBase64WithUriEncoding(token[0])); - const payloadSegment = JSON.parse(decodeBase64WithUriEncoding(token[1])); - const signature = unescapedString(token[2]); - return { - dataToSign: [token[0], token[1]].join('.'), - header: headerSegment, - payload: payloadSegment, - signature, - }; - } catch (e) { - throw new Error('Invalid payload'); - } -} - -export function decode(idToken: string) { - const decodedJWT = decodeJWT(idToken); - return decodedJWT.payload; -} - -global.Hydro.lib.jwt = { decode }; diff --git a/packages/hydrooj/src/lib/ui.ts b/packages/hydrooj/src/lib/ui.ts index 67d2cc77..f1c8b687 100644 --- a/packages/hydrooj/src/lib/ui.ts +++ b/packages/hydrooj/src/lib/ui.ts @@ -1,33 +1,22 @@ -import { Dictionary, isNull } from 'lodash'; import { PERM, PRIV } from '../model/builtin'; const trueChecker = () => true; -const Checker = (perm: bigint, priv: number, checker: Function = trueChecker) => (handler) => ( +const Checker = (perm: bigint | bigint[], priv: number | number[], checker: Function = trueChecker) => (handler) => ( checker(handler) && (perm ? handler.user.hasPerm(perm) : true) && (priv ? handler.user.hasPriv(priv) : true) ); -const buildChecker = (...permPrivChecker: Array) => { - let _priv: number; - let _perm: bigint; +const buildChecker = (...permPrivChecker: Array) => { + let _priv: number | number[]; + let _perm: bigint | bigint[]; let checker: Function = trueChecker; for (const item of permPrivChecker) { - if (item instanceof Object && !isNull(item)) { - if (item instanceof Array) { - if (typeof item[0] === 'number') { - // @ts-ignore - _priv = item; - } else if (typeof item[0] === 'bigint') { - // @ts-ignore - _perm = item; - } - } else if (typeof item.call !== 'undefined') { - checker = item; - } - } else if (typeof item === 'number') { - _priv = item; - } else if (typeof item === 'bigint') { - _perm = item; + if (typeof item === 'function') checker = item; + else if (typeof item === 'number') _priv = item; + else if (typeof item === 'bigint') _perm = item; + else if (item instanceof Array) { + if (typeof item[0] === 'number') _priv = item as number[]; + else _perm = item as bigint[]; } } return Checker(_perm, _priv, checker); @@ -51,7 +40,7 @@ export const Nav = ( }; export const ProblemAdd = ( - name: string, args: Dictionary = {}, icon = 'add', text = 'Create Problem', + name: string, args: Record = {}, icon = 'add', text = 'Create Problem', ) => { global.Hydro.ui.nodes.problem_add.push({ name, args, icon, text, @@ -59,7 +48,7 @@ export const ProblemAdd = ( }; export const UserDropdown = ( - name: string, args: Dictionary = {}, ...permPrivChecker: Array + name: string, args: Record = {}, ...permPrivChecker: Array ) => { global.Hydro.ui.nodes.user_dropdown.push({ name, args: args || {}, checker: buildChecker(...permPrivChecker), diff --git a/packages/hydrooj/src/loader.ts b/packages/hydrooj/src/loader.ts index c83a4110..350f5468 100644 --- a/packages/hydrooj/src/loader.ts +++ b/packages/hydrooj/src/loader.ts @@ -14,6 +14,7 @@ import './ui'; // This is the main entry. So let's re-export some modules. export * from './interface'; export { Schema, Logger }; +export { requestConfig } from './settings'; const argv = cac().parse(); const logger = new Logger('loader'); diff --git a/packages/hydrooj/src/service/storage.ts b/packages/hydrooj/src/service/storage.ts index 9a1fdc2c..78295a88 100644 --- a/packages/hydrooj/src/service/storage.ts +++ b/packages/hydrooj/src/service/storage.ts @@ -7,10 +7,10 @@ import { } from 'fs-extra'; import { lookup } from 'mime-types'; import { BucketItem, Client, ItemBucketMetadata } from 'minio'; -import { md5 } from '../lib/crypto'; import { Logger } from '../logger'; import { builtinConfig } from '../settings'; import { MaybeArray } from '../typeutils'; +import { md5 } from '../utils'; const logger = new Logger('storage'); diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index 4ad3ff86..47370f21 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -810,7 +810,7 @@ const scripts: UpgradeScript[] = [ ] = system.getMany([ 'file.endPoint', 'file.accessKey', 'file.secretKey', 'file.bucket', 'file.region', 'file.pathStyle', 'file.endPointForUser', 'file.endPointForJudge', - ]); + ] as any[]) as any; if ((endPoint && accessKey) || process.env.MINIO_ACCESS_KEY) { await setBuiltinConfig('file', { type: 's3', diff --git a/packages/hydrooj/src/utils.ts b/packages/hydrooj/src/utils.ts index 21a9f17f..c708bf00 100644 --- a/packages/hydrooj/src/utils.ts +++ b/packages/hydrooj/src/utils.ts @@ -1,5 +1,3 @@ -import type { Logger } from './logger'; - export function buildProjection(fields: string[]): Record { const o = {}; for (const k of fields) o[k] = 1; @@ -18,21 +16,4 @@ export function ArgMethod(target: any, funcName: string, obj: any) { return obj; } -export function logAndReturn(logger: Logger) { - return function cb(err: Error) { - logger.error(err); - return err; - }; -} - -const RE_USER = /(?:^|\s)(@)([^ ]{3,255}?)(?=\s|$)/g; - -export function getRelatedUsers(content: string) { - const results = []; - let res: string[]; - // eslint-disable-next-line no-cond-assign - while (res = RE_USER.exec(content)) results.push(res[2]); - return results; -} - export * from '@hydrooj/utils/lib/utils'; diff --git a/packages/login-with-google/lib.ts b/packages/login-with-google/lib.ts index 9afa672e..52557378 100644 --- a/packages/login-with-google/lib.ts +++ b/packages/login-with-google/lib.ts @@ -23,6 +23,29 @@ async function get() { this.response.redirect = `https://accounts.google.com/o/oauth2/v2/auth?client_id=${appid}&response_type=code&redirect_uri=${url}oauth/google/callback&scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile&state=${state}`; } +function unescapedString(escapedString: string) { + escapedString += new Array(5 - (escapedString.length % 4)).join('='); + return escapedString.replace(/-/g, '+').replace(/_/g, '/'); +} + +function decodeJWT(idToken: string) { + const token = idToken.split('.'); + if (token.length !== 3) throw new Error('Invalid idToken'); + try { + const headerSegment = JSON.parse(Buffer.from(token[0], 'base64').toString('utf8')); + const payloadSegment = JSON.parse(Buffer.from(token[1], 'base64').toString('utf8')); + const signature = unescapedString(token[2]); + return { + dataToSign: [token[0], token[1]].join('.'), + header: headerSegment, + payload: payloadSegment, + signature, + }; + } catch (e) { + throw new Error('Invalid payload'); + } +} + async function callback({ state, code, error, }) { @@ -46,7 +69,7 @@ async function callback({ grant_type: 'authorization_code', redirect_uri: `${url}oauth/google/callback`, }); - const payload = global.Hydro.lib.jwt.decode(res.body.id_token); + const payload = decodeJWT(res.body.id_token).payload; await token.del(state, token.TYPE_OAUTH); this.response.redirect = s.redirect; return { diff --git a/packages/login-with-google/package.json b/packages/login-with-google/package.json index a83129dd..58d49678 100644 --- a/packages/login-with-google/package.json +++ b/packages/login-with-google/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/login-with-google", - "version": "0.1.0", + "version": "0.1.1", "main": "package.json", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/migrate/lib.ts b/packages/migrate/lib.ts index 66a87428..a5ff941a 100644 --- a/packages/migrate/lib.ts +++ b/packages/migrate/lib.ts @@ -1,4 +1,4 @@ -import { md5, sha1 } from 'hydrooj/src/lib/crypto'; +import { md5, sha1 } from '@hydrooj/utils/lib/utils'; const RE_MD5 = /^[\da-f]{32}$/; diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 57296b3d..a2ad2424 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/migrate", - "version": "0.1.4", + "version": "0.1.5", "main": "package.json", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/ui-default/build/main.ts b/packages/ui-default/build/main.ts index 47e9af63..a81e9080 100644 --- a/packages/ui-default/build/main.ts +++ b/packages/ui-default/build/main.ts @@ -2,7 +2,6 @@ import { size } from '@hydrooj/utils/lib/utils'; import cac from 'cac'; import chalk from 'chalk'; -import { build } from 'esbuild'; import log from 'fancy-log'; import fs from 'fs-extra'; import gulp from 'gulp'; diff --git a/packages/ui-default/sw.ts b/packages/ui-default/sw.ts index 09571fa1..101930f0 100644 --- a/packages/ui-default/sw.ts +++ b/packages/ui-default/sw.ts @@ -2,7 +2,6 @@ const base = 'https://hydro.ac'; const target = [ 'https://hydro.ac', 'https://us.hydro.ac', - 'https://proxy1.hydro.workers.dev', ]; this.addEventListener('install', () => { diff --git a/packages/utils/lib/utils.ts b/packages/utils/lib/utils.ts index d7e36460..80349cfe 100644 --- a/packages/utils/lib/utils.ts +++ b/packages/utils/lib/utils.ts @@ -1,3 +1,4 @@ +import crypto from 'crypto'; import os from 'os'; import path from 'path'; import { Duplex } from 'stream'; @@ -7,6 +8,10 @@ import type { Moment } from 'moment-timezone'; import { isMoment } from 'moment-timezone'; import { ObjectID } from 'mongodb'; +const encrypt = (algorithm, content) => crypto.createHash(algorithm).update(content).digest('hex'); +export const sha1 = (content: string) => encrypt('sha1', content); +export const md5 = (content: string) => encrypt('md5', content); + export function folderSize(folderPath: string) { // eslint-disable-next-line @typescript-eslint/no-shadow let size = 0; diff --git a/packages/utils/package.json b/packages/utils/package.json index c0bbc467..d6fe27c2 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/utils", - "version": "1.3.5", + "version": "1.3.6", "description": "hydrooj utils", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git",