mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-18 09:36:08 +08:00
core&utils: remove outdated code
This commit is contained in:
1 parent
5ae8258b8a
commit
7903d012da
23 files changed
+61
-144
No files matched your search
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "hydrooj",
|
||||
"version": "3.16.1",
|
||||
"version": "3.16.2",
|
||||
"bin": "bin/hydrooj.js",
|
||||
"main": "src/loader",
|
||||
"module": "src/loader",
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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<ProblemSearchResponse>;
|
||||
|
||||
export interface Lib extends Record<string, any> {
|
||||
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'),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { md5 } from './crypto';
|
||||
import { md5 } from '../utils';
|
||||
|
||||
type AvatarProvider = (src: string, size: number) => string;
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -1,9 +1,6 @@
|
||||
import './jwt';
|
||||
import './download';
|
||||
import './i18n';
|
||||
import './mail';
|
||||
import './useragent';
|
||||
import './crypto';
|
||||
import './paginate';
|
||||
import './hash.hydro';
|
||||
import './rank';
|
||||
|
||||
@@ -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 };
|
||||
@@ -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<number | bigint | Function>) => {
|
||||
let _priv: number;
|
||||
let _perm: bigint;
|
||||
const buildChecker = (...permPrivChecker: Array<number | bigint | Function | number[] | bigint[]>) => {
|
||||
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<any> = {}, icon = 'add', text = 'Create Problem',
|
||||
name: string, args: Record<string, any> = {}, 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<any> = {}, ...permPrivChecker: Array<number | bigint | Function>
|
||||
name: string, args: Record<string, any> = {}, ...permPrivChecker: Array<number | bigint | Function>
|
||||
) => {
|
||||
global.Hydro.ui.nodes.user_dropdown.push({
|
||||
name, args: args || {}, checker: buildChecker(...permPrivChecker),
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import type { Logger } from './logger';
|
||||
|
||||
export function buildProjection(fields: string[]): Record<string, 1> {
|
||||
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';
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 <i@undefined.moe>",
|
||||
|
||||
@@ -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}$/;
|
||||
|
||||
|
||||
@@ -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 <i@undefined.moe>",
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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', () => {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in new issue
Block a user