Comparing version 1.1.8 to 1.1.9
@@ -314,8 +314,22 @@ var ip = exports; | ||
ip.isPrivate = function (addr) { | ||
return /^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i | ||
.test(addr) | ||
// check loopback addresses first | ||
if (ip.isLoopback(addr)) { | ||
return true; | ||
} | ||
// ensure the ipv4 address is valid | ||
if (!ip.isV6Format(addr)) { | ||
const ipl = ip.normalizeToLong(addr); | ||
if (ipl < 0) { | ||
throw new Error('invalid ipv4 address'); | ||
} | ||
// normalize the address for the private range checks that follow | ||
addr = ip.fromLong(ipl); | ||
} | ||
// check private ranges | ||
return /^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) | ||
|| /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) | ||
|| /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i | ||
.test(addr) | ||
|| /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) | ||
|| /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) | ||
@@ -333,5 +347,12 @@ || /^f[cd][0-9a-f]{2}:/i.test(addr) | ||
ip.isLoopback = function (addr) { | ||
// If addr is an IPv4 address in long integer form (no dots and no colons), convert it | ||
if (!/\./.test(addr) && !/:/.test(addr)) { | ||
addr = ip.fromLong(Number(addr)); | ||
} | ||
return /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/ | ||
.test(addr) | ||
|| /^fe80::1$/.test(addr) | ||
|| /^0177\./.test(addr) | ||
|| /^0x7f\./i.test(addr) | ||
|| /^fe80::1$/i.test(addr) | ||
|| /^::1$/.test(addr) | ||
@@ -430,1 +451,49 @@ || /^::$/.test(addr); | ||
}; | ||
ip.normalizeToLong = function (addr) { | ||
const parts = addr.split('.').map(part => { | ||
// Handle hexadecimal format | ||
if (part.startsWith('0x') || part.startsWith('0X')) { | ||
return parseInt(part, 16); | ||
} | ||
// Handle octal format (strictly digits 0-7 after a leading zero) | ||
else if (part.startsWith('0') && part !== '0' && /^[0-7]+$/.test(part)) { | ||
return parseInt(part, 8); | ||
} | ||
// Handle decimal format, reject invalid leading zeros | ||
else if (/^[1-9]\d*$/.test(part) || part === '0') { | ||
return parseInt(part, 10); | ||
} | ||
// Return NaN for invalid formats to indicate parsing failure | ||
else { | ||
return NaN; | ||
} | ||
}); | ||
if (parts.some(isNaN)) return -1; // Indicate error with -1 | ||
let val = 0; | ||
const n = parts.length; | ||
switch (n) { | ||
case 1: | ||
val = parts[0]; | ||
break; | ||
case 2: | ||
if (parts[0] > 0xff || parts[1] > 0xffffff) return -1; | ||
val = (parts[0] << 24) | (parts[1] & 0xffffff); | ||
break; | ||
case 3: | ||
if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xffff) return -1; | ||
val = (parts[0] << 24) | (parts[1] << 16) | (parts[2] & 0xffff); | ||
break; | ||
case 4: | ||
if (parts.some(part => part > 0xff)) return -1; | ||
val = (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]; | ||
break; | ||
default: | ||
return -1; // Error case | ||
} | ||
return val >>> 0; | ||
}; |
{ | ||
"name": "ip", | ||
"version": "1.1.8", | ||
"version": "1.1.9", | ||
"author": "Fedor Indutny <fedor@indutny.com>", | ||
@@ -5,0 +5,0 @@ "homepage": "https://github.com/indutny/node-ip", |
15451
418