From 9d8f165c4056e50fdec70ad70afe2b9bf2d151af Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 1 Feb 2023 21:38:36 +0800 Subject: [PATCH] core: validator: use basicString for title and password --- packages/hydrooj/src/lib/validator.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/hydrooj/src/lib/validator.ts b/packages/hydrooj/src/lib/validator.ts index 1e7d79878..5b0ddd837 100644 --- a/packages/hydrooj/src/lib/validator.ts +++ b/packages/hydrooj/src/lib/validator.ts @@ -50,6 +50,15 @@ export interface Types { AnyOf: >(...type: T[]) => (T extends Type ? Type : never); } +const basicString = (regex?: RegExp, cb?: (i: string) => boolean, convert?: (i: string) => T) => [ + convert || ((v) => v.toString().trim()), + (v) => { + const res = v.toString().trim(); + if (regex && !regex.test(res)) return false; + if (cb && !cb(res)) return false; + return !!res.length; + }, +] as [(v) => string, (v) => boolean]; const saslprepString = (regex?: RegExp, cb?: (i: string) => boolean, convert?: (i: string) => T) => [ convert || ((v) => saslprep(v.toString().trim())), (v) => { @@ -65,20 +74,20 @@ const saslprepString = (regex?: RegExp, cb?: (i: string) => boolean, ] as [(v) => string, (v) => boolean]; export const Types: Types = { - Content: [(v) => v.toString().trim(), (v) => v && v.toString().trim().length < 65536], + Content: [(v) => v.toString().trim(), (v) => v?.toString()?.trim() && v.toString().trim().length < 65536], Key: saslprepString(/^[a-zA-Z0-9-_]+$/), /** @deprecated */ Name: saslprepString(/^.{1,255}$/), Filename: saslprepString(/^[^\\/?#~!|*]{1,255}$/, (i) => !['con', '.', '..'].includes(i)), UidOrName: saslprepString(/^(.{3,31}|[\u4e00-\u9fa5]{2}|-?[0-9]+)$/), Username: saslprepString(/^(.{3,31}|[\u4e00-\u9fa5]{2})$/), - Password: saslprepString(/^.{6,255}$/), + Password: basicString(/^.{6,255}$/), ProblemId: saslprepString(/^[a-zA-Z0-9]+$/i, () => true, (s) => (Number.isSafeInteger(+s) ? +s : s)), Email: saslprepString(/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+$/i), DomainId: saslprepString(/^[a-zA-Z][a-zA-Z0-9_]{3,31}$/), Role: saslprepString(/^[_0-9A-Za-z\u4e00-\u9fa5]{1,31}$/i), - Title: saslprepString(/^.{1,64}$/), - String: [(v) => v.toString(), null], + Title: basicString(/^.{1,64}$/), + String: basicString(), Int: [(v) => +v, (v) => /^[+-]?[0-9]+$/.test(v.toString().trim()) && isSafeInteger(+v)], UnsignedInt: [(v) => +v, (v) => /^(-0|\+?[0-9]+)$/.test(v.toString().trim()) && isSafeInteger(+v)],