| export function formatAllowFromLowercase(params: { |
| allowFrom: Array<string | number>; |
| stripPrefixRe?: RegExp; |
| }): string[] { |
| return params.allowFrom |
| .map((entry) => String(entry).trim()) |
| .filter(Boolean) |
| .map((entry) => (params.stripPrefixRe ? entry.replace(params.stripPrefixRe, "") : entry)) |
| .map((entry) => entry.toLowerCase()); |
| } |
|
|
| export function formatNormalizedAllowFromEntries(params: { |
| allowFrom: Array<string | number>; |
| normalizeEntry: (entry: string) => string | undefined | null; |
| }): string[] { |
| return params.allowFrom |
| .map((entry) => String(entry).trim()) |
| .filter(Boolean) |
| .map((entry) => params.normalizeEntry(entry)) |
| .filter((entry): entry is string => Boolean(entry)); |
| } |
|
|
| export function isNormalizedSenderAllowed(params: { |
| senderId: string | number; |
| allowFrom: Array<string | number>; |
| stripPrefixRe?: RegExp; |
| }): boolean { |
| const normalizedAllow = formatAllowFromLowercase({ |
| allowFrom: params.allowFrom, |
| stripPrefixRe: params.stripPrefixRe, |
| }); |
| if (normalizedAllow.length === 0) { |
| return false; |
| } |
| if (normalizedAllow.includes("*")) { |
| return true; |
| } |
| const sender = String(params.senderId).trim().toLowerCase(); |
| return normalizedAllow.includes(sender); |
| } |
|
|
| type ParsedChatAllowTarget = |
| | { kind: "chat_id"; chatId: number } |
| | { kind: "chat_guid"; chatGuid: string } |
| | { kind: "chat_identifier"; chatIdentifier: string } |
| | { kind: "handle"; handle: string }; |
|
|
| export function isAllowedParsedChatSender<TParsed extends ParsedChatAllowTarget>(params: { |
| allowFrom: Array<string | number>; |
| sender: string; |
| chatId?: number | null; |
| chatGuid?: string | null; |
| chatIdentifier?: string | null; |
| normalizeSender: (sender: string) => string; |
| parseAllowTarget: (entry: string) => TParsed; |
| }): boolean { |
| const allowFrom = params.allowFrom.map((entry) => String(entry).trim()); |
| if (allowFrom.length === 0) { |
| return false; |
| } |
| if (allowFrom.includes("*")) { |
| return true; |
| } |
|
|
| const senderNormalized = params.normalizeSender(params.sender); |
| const chatId = params.chatId ?? undefined; |
| const chatGuid = params.chatGuid?.trim(); |
| const chatIdentifier = params.chatIdentifier?.trim(); |
|
|
| for (const entry of allowFrom) { |
| if (!entry) { |
| continue; |
| } |
| const parsed = params.parseAllowTarget(entry); |
| if (parsed.kind === "chat_id" && chatId !== undefined) { |
| if (parsed.chatId === chatId) { |
| return true; |
| } |
| } else if (parsed.kind === "chat_guid" && chatGuid) { |
| if (parsed.chatGuid === chatGuid) { |
| return true; |
| } |
| } else if (parsed.kind === "chat_identifier" && chatIdentifier) { |
| if (parsed.chatIdentifier === chatIdentifier) { |
| return true; |
| } |
| } else if (parsed.kind === "handle" && senderNormalized) { |
| if (parsed.handle === senderNormalized) { |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
|
|