fix: validate signatures and restore report metrics
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user