diff --git a/client/shared/manager/__tests__/buildRegFn.spec.ts b/client/shared/manager/__tests__/buildReg.spec.ts similarity index 97% rename from client/shared/manager/__tests__/buildRegFn.spec.ts rename to client/shared/manager/__tests__/buildReg.spec.ts index 8be0ea31..757f8117 100644 --- a/client/shared/manager/__tests__/buildRegFn.spec.ts +++ b/client/shared/manager/__tests__/buildReg.spec.ts @@ -1,4 +1,4 @@ -import { buildCachedRegFn, buildRegFn } from '../buildRegFn'; +import { buildCachedRegFn, buildRegFn } from '../buildReg'; describe('buildRegFn should be ok', () => { test('normal', () => { diff --git a/client/shared/model/user.ts b/client/shared/model/user.ts index dce6879b..0d54d1df 100644 --- a/client/shared/model/user.ts +++ b/client/shared/model/user.ts @@ -12,6 +12,7 @@ import _flatten from 'lodash/flatten'; import _zipObject from 'lodash/zipObject'; import { t } from '../i18n'; import type { UserBaseInfo } from 'tailchat-types'; +import { isObjectId } from '../utils/string-helper'; export type { UserBaseInfo }; @@ -288,6 +289,10 @@ export async function fetchUserInfo(userId: string): Promise { return builtinUserInfo[userId](); } + if (!isObjectId(userId)) { + throw new Error(`Invalid userId: ${userId}`); + } + const userInfo = await _fetchUserInfo(userId); return userInfo; diff --git a/client/shared/utils/__tests__/string-helper.spec.ts b/client/shared/utils/__tests__/string-helper.spec.ts index 1beba681..4b0f79bd 100644 --- a/client/shared/utils/__tests__/string-helper.spec.ts +++ b/client/shared/utils/__tests__/string-helper.spec.ts @@ -1,4 +1,4 @@ -import { isAvailableString, isUrl } from '../string-helper'; +import { isAvailableString, isObjectId, isUrl } from '../string-helper'; describe('string-helper', () => { describe('isAvailableString', () => { @@ -28,4 +28,14 @@ describe('string-helper', () => { expect(isUrl(url)).toBe(res); }); }); + + describe('isObjectId', () => { + test.each<[string, boolean]>([ + ['1', false], + ['unknown', false], + ['64b4a473a44c273805b25da5', true], + ])('%s => %p', (input, res) => { + expect(isObjectId(input)).toBe(res); + }); + }); }); diff --git a/client/shared/utils/string-helper.ts b/client/shared/utils/string-helper.ts index a80f83d8..960fae8d 100644 --- a/client/shared/utils/string-helper.ts +++ b/client/shared/utils/string-helper.ts @@ -55,3 +55,18 @@ export function isLocalMessageId(str: unknown): boolean { return str.startsWith('localMessage_'); } + +/** + * 是一个MongoDB的objectId + */ +export function isObjectId(str: any): boolean { + if (typeof str === 'string' && str.length === 12) { + return true; + } + + if (typeof str === 'string' && /^[0-9A-Fa-f]{24}$/.test(str)) { + return true; + } + + return false; +}