| |
| |
| |
| |
| export function isEmailDomainAllowed(email: string, allowedDomains?: string[] | null): boolean { |
| |
| if (!allowedDomains || !Array.isArray(allowedDomains) || !allowedDomains.length) { |
| return true; |
| } |
|
|
| |
| if (!email) { |
| return false; |
| } |
|
|
| const domain = email.split('@')[1]?.toLowerCase(); |
|
|
| if (!domain) { |
| return false; |
| } |
|
|
| return allowedDomains.some((allowedDomain) => allowedDomain?.toLowerCase() === domain); |
| } |
|
|
| |
| |
| |
| |
| |
| function normalizeDomain(domain: string): string | null { |
| try { |
| let normalizedDomain = domain.toLowerCase().trim(); |
|
|
| |
| if (normalizedDomain === 'http://' || normalizedDomain === 'https://') { |
| return null; |
| } |
|
|
| |
| if (!normalizedDomain.startsWith('http://') && !normalizedDomain.startsWith('https://')) { |
| normalizedDomain = `https://${normalizedDomain}`; |
| } |
|
|
| const url = new URL(normalizedDomain); |
| |
| if (!url.hostname || url.hostname === 'http:' || url.hostname === 'https:') { |
| return null; |
| } |
|
|
| return url.hostname.replace(/^www\./i, ''); |
| } catch { |
| return null; |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| export async function isActionDomainAllowed( |
| domain?: string | null, |
| allowedDomains?: string[] | null, |
| ): Promise<boolean> { |
| if (!domain || typeof domain !== 'string') { |
| return false; |
| } |
|
|
| if (!Array.isArray(allowedDomains) || !allowedDomains.length) { |
| return true; |
| } |
|
|
| const normalizedInputDomain = normalizeDomain(domain); |
| if (!normalizedInputDomain) { |
| return false; |
| } |
|
|
| for (const allowedDomain of allowedDomains) { |
| const normalizedAllowedDomain = normalizeDomain(allowedDomain); |
| if (!normalizedAllowedDomain) { |
| continue; |
| } |
|
|
| if (normalizedAllowedDomain.startsWith('*.')) { |
| const baseDomain = normalizedAllowedDomain.slice(2); |
| if ( |
| normalizedInputDomain === baseDomain || |
| normalizedInputDomain.endsWith(`.${baseDomain}`) |
| ) { |
| return true; |
| } |
| } else if (normalizedInputDomain === normalizedAllowedDomain) { |
| return true; |
| } |
| } |
|
|
| return false; |
| } |
|
|