From caf6ce058f30fa0691c2b1d34bfe803d106fa83f Mon Sep 17 00:00:00 2001 From: undefined Date: Sat, 28 Jan 2023 19:26:07 +0800 Subject: [PATCH] core: fix validator --- packages/hydrooj/src/handler/problem.ts | 4 ++-- packages/hydrooj/src/model/user.ts | 2 ++ packages/hydrooj/src/service/decorators.ts | 4 ++-- packages/ui-default/components/omnisearch/index.page.tsx | 1 + .../components/scratchpad/ScratchpadToolbarContainer.jsx | 4 ++-- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 70bc9cc9..a79b5490 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -629,7 +629,7 @@ export class ProblemEditHandler extends ProblemManageHandler { @route('pid', Types.ProblemId) @post('title', Types.Title) @post('content', Types.Content) - @post('pid', Types.ProblemId, true) + @post('pid', Types.ProblemId, true, (i) => /^[a-zA-Z]+[a-zA-Z0-9]*$/i.test(i)) @post('hidden', Types.Boolean) @post('tag', Types.Content, true, null, parseCategory) @post('difficulty', Types.PositiveInt, (i) => +i <= 10, true) @@ -965,7 +965,7 @@ export class ProblemCreateHandler extends Handler { @post('title', Types.Title) @post('content', Types.Content) - @post('pid', Types.ProblemId, true) + @post('pid', Types.ProblemId, true, (i) => /^[a-zA-Z]+[a-zA-Z0-9]*$/i.test(i)) @post('hidden', Types.Boolean) @post('difficulty', Types.PositiveInt, (i) => +i <= 10, true) @post('tag', Types.Content, true, null, parseCategory) diff --git a/packages/hydrooj/src/model/user.ts b/packages/hydrooj/src/model/user.ts index 78b9fca7..a2809f02 100644 --- a/packages/hydrooj/src/model/user.ts +++ b/packages/hydrooj/src/model/user.ts @@ -37,6 +37,7 @@ export function deleteUserCache(udoc: User | Udoc | string | true | undefined | for (const key of [...cache.keys()].filter((i) => i.endsWith(`/${udoc}`))) cache.delete(key); return true; } + if (!udoc.uname) global.sendMessage?.(`user/delcache: ${JSON.stringify(udoc)}`); const id = [`id/${udoc._id.toString()}`, `name/${udoc.uname.toLowerCase()}`, `mail/${udoc.mail.toLowerCase()}`]; for (const key of [...cache.keys()].filter((k) => id.includes(`${k.split('/')[0]}/${k.split('/')[1]}`))) { cache.delete(key); @@ -163,6 +164,7 @@ function handleMailLower(mail: string) { async function initAndCache(udoc: Udoc, dudoc, scope: bigint = PERM.PERM_ALL) { const res = await new User(udoc, dudoc, scope).init(); + if (!dudoc) global.sendMessage?.(new Error().stack); cache.set(`id/${udoc._id}/${dudoc.domainId}`, res); cache.set(`name/${udoc.unameLower}/${dudoc.domainId}`, res); cache.set(`mail/${udoc.mailLower}/${dudoc.domainId}`, res); diff --git a/packages/hydrooj/src/service/decorators.ts b/packages/hydrooj/src/service/decorators.ts index 8fcbecf1..69f9791e 100644 --- a/packages/hydrooj/src/service/decorators.ts +++ b/packages/hydrooj/src/service/decorators.ts @@ -81,11 +81,11 @@ export const Types: Types = { Key: saslprepString(/^[a-zA-Z0-9-_]+$/), /** @deprecated */ Name: saslprepString(/^.{1,255}$/), - Filename: saslprepString(/^[^.\\/?#~]{1,255}$/, (i) => !['con', '.', '..'].includes(i)), + 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}$/), - ProblemId: saslprepString(/^[a-zA-Z]+[a-zA-Z0-9]*$/i, () => true, (s) => (Number.isSafeInteger(+s) ? +s : s)), + 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), diff --git a/packages/ui-default/components/omnisearch/index.page.tsx b/packages/ui-default/components/omnisearch/index.page.tsx index eb2447b7..2617bfca 100644 --- a/packages/ui-default/components/omnisearch/index.page.tsx +++ b/packages/ui-default/components/omnisearch/index.page.tsx @@ -8,6 +8,7 @@ import { } from 'vj/utils'; export default new AutoloadPage('omnibar', () => { + if (document.documentElement.dataset.layout !== 'basic') return; const $search = $(`