mirror of
https://github.com/skidoodle/hostinfo
synced 2026-04-28 01:27:36 +02:00
34 lines
1.7 KiB
TypeScript
34 lines
1.7 KiB
TypeScript
const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
const ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,2}(:[0-9a-fA-F]{1,4}){1,5})|([0-9a-fA-F]{1,4}:)((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;
|
|
|
|
export const IpUtils = {
|
|
isValidIP(ip: string): boolean {
|
|
const clean = ip.replace(/^\[|\]$/g, '');
|
|
return ipv4Regex.test(clean) || ipv6Regex.test(clean);
|
|
},
|
|
|
|
isLocalOrBogon(ip: string): boolean {
|
|
const clean = ip.replace(/^\[|\]$/g, '');
|
|
|
|
// IPv6 Local/Bogon
|
|
if (clean === '::1' || clean === '::') return true;
|
|
if (clean.toLowerCase().startsWith('fe80:')) return true;
|
|
if (clean.toLowerCase().startsWith('fc00:')) return true;
|
|
if (clean.toLowerCase().startsWith('fd00:')) return true;
|
|
|
|
if (!clean.includes('.')) return false;
|
|
|
|
// IPv4 Local/Bogon
|
|
const parts = clean.split('.').map(Number);
|
|
if (parts.length !== 4) return false;
|
|
|
|
if (parts[0] === 10) return true;
|
|
if (parts[0] === 192 && parts[1] === 168) return true;
|
|
if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) return true;
|
|
if (parts[0] === 127) return true;
|
|
if (parts[0] === 169 && parts[1] === 254) return true;
|
|
|
|
return false;
|
|
}
|
|
};
|