| | |
| | |
| | |
| | |
| | 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; |
| | } |
| |
|