From c61c875bee7fe1167a3e2ea703181c96ff3cafaa Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 30 Sep 2022 16:25:35 +0800 Subject: [PATCH] core: fix saslprep error type --- packages/hydrooj/src/service/decorators.ts | 12 ++++++++++-- packages/login-with-github/{lib.ts => index.ts} | 10 +++++----- 2 files changed, 15 insertions(+), 7 deletions(-) rename packages/login-with-github/{lib.ts => index.ts} (90%) diff --git a/packages/hydrooj/src/service/decorators.ts b/packages/hydrooj/src/service/decorators.ts index 332b115f5..afae77956 100644 --- a/packages/hydrooj/src/service/decorators.ts +++ b/packages/hydrooj/src/service/decorators.ts @@ -43,10 +43,18 @@ export interface Types { Emoji: Type, } +const safeSaslprep = (v) => { + try { + return saslprep(v.toString().trim()); + } catch (e) { + return ''; + } +}; + export const Types: Types = { Content: [(v) => v.toString().trim(), isContent], - Name: [(v) => saslprep(v.toString().trim()), (v) => /^.{1,255}$/.test(saslprep(v.toString().trim()))], - Username: [(v) => saslprep(v.toString().trim()), (v) => /^.{3,31}$/.test(saslprep(v.toString().trim()))], + Name: [(v) => saslprep(v.toString().trim()), (v) => /^.{1,255}$/.test(safeSaslprep(v))], + Username: [(v) => saslprep(v.toString().trim()), (v) => /^.{3,31}$/.test(safeSaslprep(v))], Title: [(v) => v.toString().trim(), isTitle], String: [(v) => v.toString(), null], Int: [(v) => parseInt(v, 10), (v) => isSafeInteger(parseInt(v, 10))], diff --git a/packages/login-with-github/lib.ts b/packages/login-with-github/index.ts similarity index 90% rename from packages/login-with-github/lib.ts rename to packages/login-with-github/index.ts index 0797260b6..4a8f18f62 100644 --- a/packages/login-with-github/lib.ts +++ b/packages/login-with-github/index.ts @@ -1,6 +1,8 @@ import superagent from 'superagent'; import { PluginContext } from 'hydrooj'; -import { ForbiddenError } from 'hydrooj/src/error'; +import { ForbiddenError, UserFacingError, ValidationError } from 'hydrooj/src/error'; +import * as system from 'hydrooj/src/model/system'; +import token from 'hydrooj/src/model/token'; declare module 'hydrooj' { interface SystemKeys { @@ -11,7 +13,6 @@ declare module 'hydrooj' { } async function get() { - const { system, token } = global.Hydro.model; const [appid, [state]] = await Promise.all([ system.get('login-with-github.id'), token.add(token.TYPE_OAUTH, 600, { redirect: this.request.referer }), @@ -20,8 +21,6 @@ async function get() { } async function callback({ state, code }) { - const { system, token } = global.Hydro.model; - const { UserFacingError } = global.Hydro.error; const [[appid, secret, endpoint, url], s] = await Promise.all([ system.getMany([ 'login-with-github.id', @@ -31,6 +30,7 @@ async function callback({ state, code }) { ]), token.get(state, token.TYPE_OAUTH), ]); + if (!s) throw new ValidationError('token'); const res = await superagent.post(`${endpoint || 'https://github.com'}/login/oauth/access_token`) .send({ client_id: appid, @@ -71,7 +71,7 @@ async function callback({ state, code }) { return ret; } -export function apply(ctx:PluginContext) { +export function apply(ctx: PluginContext) { ctx.provideModule('oauth', 'github', { text: 'Login with Github', callback,