fix: validate signatures and restore report metrics

This commit is contained in:
hectorzhao
2026-07-27 20:51:14 +08:00
parent 04a497c791
commit 94aeacd3a2
19 changed files with 438 additions and 42 deletions
+32
View File
@@ -0,0 +1,32 @@
export function createUuid() {
const webCrypto = globalThis.crypto;
if (typeof webCrypto?.randomUUID === 'function') {
return webCrypto.randomUUID();
}
const bytes = createRandomBytes(16);
bytes[6] = (bytes[6] & 0x0f) | 0x40;
bytes[8] = (bytes[8] & 0x3f) | 0x80;
const hex = Array.from(bytes, (value) => value.toString(16).padStart(2, '0'));
return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10).join('')}`;
}
export function createRandomHex(length: number) {
const normalizedLength = Math.max(0, Math.floor(length));
return Array.from(createRandomBytes(Math.ceil(normalizedLength / 2)), (value) => value.toString(16).padStart(2, '0'))
.join('')
.slice(0, normalizedLength);
}
function createRandomBytes(length: number) {
const bytes = new Uint8Array(length);
const webCrypto = globalThis.crypto;
if (typeof webCrypto?.getRandomValues === 'function') {
webCrypto.getRandomValues(bytes);
return bytes;
}
for (let index = 0; index < bytes.length; index += 1) {
bytes[index] = Math.floor(Math.random() * 256);
}
return bytes;
}
+19 -2
View File
@@ -1,4 +1,7 @@
const LEADING_SMS_SIGNATURE = /^【[^】]+】/;
const FORBIDDEN_SMS_SIGNATURE_CHARACTER = /[\p{White_Space}\p{Cc}\p{Default_Ignorable_Code_Point}]/u;
export const SMS_SIGNATURE_CHARACTER_ERROR = '短信签名不能包含空格、换行或不可见字符';
export const SMS_SIGNATURE_FORMAT_ERROR = '必须填写完整中文黑括号签名,例如:【某某科技】';
export function formatSmsSignature(name?: string | null) {
const innerName = (name ?? '').trim().replace(/^[【\[]+|[】\]]+$/g, '').trim();
@@ -6,9 +9,23 @@ export function formatSmsSignature(name?: string | null) {
}
export function isCompleteSmsSignature(name?: string | null) {
const value = (name ?? '').trim();
return getSmsSignatureValidationError(name) === undefined;
}
export function hasForbiddenSmsSignatureCharacter(name?: string | null) {
return FORBIDDEN_SMS_SIGNATURE_CHARACTER.test(name ?? '');
}
export function getSmsSignatureValidationError(name?: string | null) {
const value = name ?? '';
if (!value) {
return SMS_SIGNATURE_FORMAT_ERROR;
}
if (hasForbiddenSmsSignatureCharacter(value)) {
return SMS_SIGNATURE_CHARACTER_ERROR;
}
const match = value.match(/^【([^【】]+)】$/);
return Boolean(match && match[1] === match[1].trim());
return match ? undefined : SMS_SIGNATURE_FORMAT_ERROR;
}
export function replaceLeadingSmsSignature(content: string, signatureName?: string | null) {