558 lines
16 KiB
JavaScript
558 lines
16 KiB
JavaScript
(function () {
|
|
var r, t, n, e, i, o, a, s;
|
|
(t = {}),
|
|
(s = this),
|
|
'undefined' != typeof module && null !== module && module.exports ?
|
|
(module.exports = t)
|
|
: (s.ipaddr = t),
|
|
(a = function (r, t, n, e) {
|
|
var i, o;
|
|
if (r.length !== t.length)
|
|
throw new Error(
|
|
'ipaddr: cannot match CIDR for objects with different lengths'
|
|
);
|
|
for (i = 0; e > 0; ) {
|
|
if (((o = n - e) < 0 && (o = 0), r[i] >> o != t[i] >> o)) return !1;
|
|
(e -= n), (i += 1);
|
|
}
|
|
return !0;
|
|
}),
|
|
(t.subnetMatch = function (r, t, n) {
|
|
var e, i, o, a, s;
|
|
null == n && (n = 'unicast');
|
|
for (o in t)
|
|
for (
|
|
!(a = t[o])[0] || a[0] instanceof Array || (a = [a]),
|
|
e = 0,
|
|
i = a.length;
|
|
e < i;
|
|
e++
|
|
)
|
|
if (((s = a[e]), r.kind() === s[0].kind() && r.match.apply(r, s)))
|
|
return o;
|
|
return n;
|
|
}),
|
|
(t.IPv4 = (function () {
|
|
function r(r) {
|
|
var t, n, e;
|
|
if (4 !== r.length)
|
|
throw new Error('ipaddr: ipv4 octet count should be 4');
|
|
for (t = 0, n = r.length; t < n; t++)
|
|
if (!(0 <= (e = r[t]) && e <= 255))
|
|
throw new Error('ipaddr: ipv4 octet should fit in 8 bits');
|
|
this.octets = r;
|
|
}
|
|
return (
|
|
(r.prototype.kind = function () {
|
|
return 'ipv4';
|
|
}),
|
|
(r.prototype.toString = function () {
|
|
return this.octets.join('.');
|
|
}),
|
|
(r.prototype.toNormalizedString = function () {
|
|
return this.toString();
|
|
}),
|
|
(r.prototype.toByteArray = function () {
|
|
return this.octets.slice(0);
|
|
}),
|
|
(r.prototype.match = function (r, t) {
|
|
var n;
|
|
if (
|
|
(void 0 === t && ((r = (n = r)[0]), (t = n[1])),
|
|
'ipv4' !== r.kind())
|
|
)
|
|
throw new Error(
|
|
'ipaddr: cannot match ipv4 address with non-ipv4 one'
|
|
);
|
|
return a(this.octets, r.octets, 8, t);
|
|
}),
|
|
(r.prototype.SpecialRanges = {
|
|
unspecified: [[new r([0, 0, 0, 0]), 8]],
|
|
broadcast: [[new r([255, 255, 255, 255]), 32]],
|
|
multicast: [[new r([224, 0, 0, 0]), 4]],
|
|
linkLocal: [[new r([169, 254, 0, 0]), 16]],
|
|
loopback: [[new r([127, 0, 0, 0]), 8]],
|
|
carrierGradeNat: [[new r([100, 64, 0, 0]), 10]],
|
|
private: [
|
|
[new r([10, 0, 0, 0]), 8],
|
|
[new r([172, 16, 0, 0]), 12],
|
|
[new r([192, 168, 0, 0]), 16],
|
|
],
|
|
reserved: [
|
|
[new r([192, 0, 0, 0]), 24],
|
|
[new r([192, 0, 2, 0]), 24],
|
|
[new r([192, 88, 99, 0]), 24],
|
|
[new r([198, 51, 100, 0]), 24],
|
|
[new r([203, 0, 113, 0]), 24],
|
|
[new r([240, 0, 0, 0]), 4],
|
|
],
|
|
}),
|
|
(r.prototype.range = function () {
|
|
return t.subnetMatch(this, this.SpecialRanges);
|
|
}),
|
|
(r.prototype.toIPv4MappedAddress = function () {
|
|
return t.IPv6.parse('::ffff:' + this.toString());
|
|
}),
|
|
(r.prototype.prefixLengthFromSubnetMask = function () {
|
|
var r, t, n, e, i, o, a;
|
|
for (
|
|
a = {
|
|
0: 8,
|
|
128: 7,
|
|
192: 6,
|
|
224: 5,
|
|
240: 4,
|
|
248: 3,
|
|
252: 2,
|
|
254: 1,
|
|
255: 0,
|
|
},
|
|
r = 0,
|
|
i = !1,
|
|
t = n = 3;
|
|
n >= 0;
|
|
t = n += -1
|
|
) {
|
|
if (!((e = this.octets[t]) in a)) return null;
|
|
if (((o = a[e]), i && 0 !== o)) return null;
|
|
8 !== o && (i = !0), (r += o);
|
|
}
|
|
return 32 - r;
|
|
}),
|
|
r
|
|
);
|
|
})()),
|
|
(n = '(0?\\d+|0x[a-f0-9]+)'),
|
|
(e = {
|
|
fourOctet: new RegExp(
|
|
'^' + n + '\\.' + n + '\\.' + n + '\\.' + n + '$',
|
|
'i'
|
|
),
|
|
longValue: new RegExp('^' + n + '$', 'i'),
|
|
}),
|
|
(t.IPv4.parser = function (r) {
|
|
var t, n, i, o, a;
|
|
if (
|
|
((n = function (r) {
|
|
return '0' === r[0] && 'x' !== r[1] ? parseInt(r, 8) : parseInt(r);
|
|
}),
|
|
(t = r.match(e.fourOctet)))
|
|
)
|
|
return (function () {
|
|
var r, e, o, a;
|
|
for (a = [], r = 0, e = (o = t.slice(1, 6)).length; r < e; r++)
|
|
(i = o[r]), a.push(n(i));
|
|
return a;
|
|
})();
|
|
if ((t = r.match(e.longValue))) {
|
|
if ((a = n(t[1])) > 4294967295 || a < 0)
|
|
throw new Error('ipaddr: address outside defined range');
|
|
return (function () {
|
|
var r, t;
|
|
for (t = [], o = r = 0; r <= 24; o = r += 8) t.push((a >> o) & 255);
|
|
return t;
|
|
})().reverse();
|
|
}
|
|
return null;
|
|
}),
|
|
(t.IPv6 = (function () {
|
|
function r(r, t) {
|
|
var n, e, i, o, a, s;
|
|
if (16 === r.length)
|
|
for (this.parts = [], n = e = 0; e <= 14; n = e += 2)
|
|
this.parts.push((r[n] << 8) | r[n + 1]);
|
|
else {
|
|
if (8 !== r.length)
|
|
throw new Error('ipaddr: ipv6 part count should be 8 or 16');
|
|
this.parts = r;
|
|
}
|
|
for (i = 0, o = (s = this.parts).length; i < o; i++)
|
|
if (!(0 <= (a = s[i]) && a <= 65535))
|
|
throw new Error('ipaddr: ipv6 part should fit in 16 bits');
|
|
t && (this.zoneId = t);
|
|
}
|
|
return (
|
|
(r.prototype.kind = function () {
|
|
return 'ipv6';
|
|
}),
|
|
(r.prototype.toString = function () {
|
|
return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');
|
|
}),
|
|
(r.prototype.toRFC5952String = function () {
|
|
var r, t, n, e, i;
|
|
for (
|
|
e = /((^|:)(0(:|$)){2,})/g,
|
|
i = this.toNormalizedString(),
|
|
r = 0,
|
|
t = -1;
|
|
(n = e.exec(i));
|
|
|
|
)
|
|
n[0].length > t && ((r = n.index), (t = n[0].length));
|
|
return t < 0 ? i : i.substring(0, r) + '::' + i.substring(r + t);
|
|
}),
|
|
(r.prototype.toByteArray = function () {
|
|
var r, t, n, e, i;
|
|
for (r = [], t = 0, n = (i = this.parts).length; t < n; t++)
|
|
(e = i[t]), r.push(e >> 8), r.push(255 & e);
|
|
return r;
|
|
}),
|
|
(r.prototype.toNormalizedString = function () {
|
|
var r, t, n;
|
|
return (
|
|
(r = function () {
|
|
var r, n, e, i;
|
|
for (i = [], r = 0, n = (e = this.parts).length; r < n; r++)
|
|
(t = e[r]), i.push(t.toString(16));
|
|
return i;
|
|
}
|
|
.call(this)
|
|
.join(':')),
|
|
(n = ''),
|
|
this.zoneId && (n = '%' + this.zoneId),
|
|
r + n
|
|
);
|
|
}),
|
|
(r.prototype.toFixedLengthString = function () {
|
|
var r, t, n;
|
|
return (
|
|
(r = function () {
|
|
var r, n, e, i;
|
|
for (i = [], r = 0, n = (e = this.parts).length; r < n; r++)
|
|
(t = e[r]), i.push(t.toString(16).padStart(4, '0'));
|
|
return i;
|
|
}
|
|
.call(this)
|
|
.join(':')),
|
|
(n = ''),
|
|
this.zoneId && (n = '%' + this.zoneId),
|
|
r + n
|
|
);
|
|
}),
|
|
(r.prototype.match = function (r, t) {
|
|
var n;
|
|
if (
|
|
(void 0 === t && ((r = (n = r)[0]), (t = n[1])),
|
|
'ipv6' !== r.kind())
|
|
)
|
|
throw new Error(
|
|
'ipaddr: cannot match ipv6 address with non-ipv6 one'
|
|
);
|
|
return a(this.parts, r.parts, 16, t);
|
|
}),
|
|
(r.prototype.SpecialRanges = {
|
|
unspecified: [new r([0, 0, 0, 0, 0, 0, 0, 0]), 128],
|
|
linkLocal: [new r([65152, 0, 0, 0, 0, 0, 0, 0]), 10],
|
|
multicast: [new r([65280, 0, 0, 0, 0, 0, 0, 0]), 8],
|
|
loopback: [new r([0, 0, 0, 0, 0, 0, 0, 1]), 128],
|
|
uniqueLocal: [new r([64512, 0, 0, 0, 0, 0, 0, 0]), 7],
|
|
ipv4Mapped: [new r([0, 0, 0, 0, 0, 65535, 0, 0]), 96],
|
|
rfc6145: [new r([0, 0, 0, 0, 65535, 0, 0, 0]), 96],
|
|
rfc6052: [new r([100, 65435, 0, 0, 0, 0, 0, 0]), 96],
|
|
'6to4': [new r([8194, 0, 0, 0, 0, 0, 0, 0]), 16],
|
|
teredo: [new r([8193, 0, 0, 0, 0, 0, 0, 0]), 32],
|
|
reserved: [[new r([8193, 3512, 0, 0, 0, 0, 0, 0]), 32]],
|
|
}),
|
|
(r.prototype.range = function () {
|
|
return t.subnetMatch(this, this.SpecialRanges);
|
|
}),
|
|
(r.prototype.isIPv4MappedAddress = function () {
|
|
return 'ipv4Mapped' === this.range();
|
|
}),
|
|
(r.prototype.toIPv4Address = function () {
|
|
var r, n, e;
|
|
if (!this.isIPv4MappedAddress())
|
|
throw new Error(
|
|
'ipaddr: trying to convert a generic ipv6 address to ipv4'
|
|
);
|
|
return (
|
|
(e = this.parts.slice(-2)),
|
|
(r = e[0]),
|
|
(n = e[1]),
|
|
new t.IPv4([r >> 8, 255 & r, n >> 8, 255 & n])
|
|
);
|
|
}),
|
|
(r.prototype.prefixLengthFromSubnetMask = function () {
|
|
var r, t, n, e, i, o, a;
|
|
for (
|
|
a = {
|
|
0: 16,
|
|
32768: 15,
|
|
49152: 14,
|
|
57344: 13,
|
|
61440: 12,
|
|
63488: 11,
|
|
64512: 10,
|
|
65024: 9,
|
|
65280: 8,
|
|
65408: 7,
|
|
65472: 6,
|
|
65504: 5,
|
|
65520: 4,
|
|
65528: 3,
|
|
65532: 2,
|
|
65534: 1,
|
|
65535: 0,
|
|
},
|
|
r = 0,
|
|
i = !1,
|
|
t = n = 7;
|
|
n >= 0;
|
|
t = n += -1
|
|
) {
|
|
if (!((e = this.parts[t]) in a)) return null;
|
|
if (((o = a[e]), i && 0 !== o)) return null;
|
|
16 !== o && (i = !0), (r += o);
|
|
}
|
|
return 128 - r;
|
|
}),
|
|
r
|
|
);
|
|
})()),
|
|
(i = '(?:[0-9a-f]+::?)+'),
|
|
(o = {
|
|
zoneIndex: new RegExp('%[0-9a-z]{1,}', 'i'),
|
|
native: new RegExp(
|
|
'^(::)?(' + i + ')?([0-9a-f]+)?(::)?(%[0-9a-z]{1,})?$',
|
|
'i'
|
|
),
|
|
transitional: new RegExp(
|
|
'^((?:' +
|
|
i +
|
|
')|(?:::)(?:' +
|
|
i +
|
|
')?)' +
|
|
n +
|
|
'\\.' +
|
|
n +
|
|
'\\.' +
|
|
n +
|
|
'\\.' +
|
|
n +
|
|
'(%[0-9a-z]{1,})?$',
|
|
'i'
|
|
),
|
|
}),
|
|
(r = function (r, t) {
|
|
var n, e, i, a, s, p;
|
|
if (r.indexOf('::') !== r.lastIndexOf('::')) return null;
|
|
for (
|
|
(p = (r.match(o.zoneIndex) || [])[0]) &&
|
|
((p = p.substring(1)), (r = r.replace(/%.+$/, ''))),
|
|
n = 0,
|
|
e = -1;
|
|
(e = r.indexOf(':', e + 1)) >= 0;
|
|
|
|
)
|
|
n++;
|
|
if (
|
|
('::' === r.substr(0, 2) && n--, '::' === r.substr(-2, 2) && n--, n > t)
|
|
)
|
|
return null;
|
|
for (s = t - n, a = ':'; s--; ) a += '0:';
|
|
return (
|
|
':' === (r = r.replace('::', a))[0] && (r = r.slice(1)),
|
|
':' === r[r.length - 1] && (r = r.slice(0, -1)),
|
|
(t = (function () {
|
|
var t, n, e, o;
|
|
for (o = [], t = 0, n = (e = r.split(':')).length; t < n; t++)
|
|
(i = e[t]), o.push(parseInt(i, 16));
|
|
return o;
|
|
})()),
|
|
{ parts: t, zoneId: p }
|
|
);
|
|
}),
|
|
(t.IPv6.parser = function (t) {
|
|
var n, e, i, a, s, p, u;
|
|
if (o.native.test(t)) return r(t, 8);
|
|
if (
|
|
(a = t.match(o.transitional)) &&
|
|
((u = a[6] || ''), (n = r(a[1].slice(0, -1) + u, 6)).parts)
|
|
) {
|
|
for (
|
|
e = 0,
|
|
i = (p = [
|
|
parseInt(a[2]),
|
|
parseInt(a[3]),
|
|
parseInt(a[4]),
|
|
parseInt(a[5]),
|
|
]).length;
|
|
e < i;
|
|
e++
|
|
)
|
|
if (!(0 <= (s = p[e]) && s <= 255)) return null;
|
|
return (
|
|
n.parts.push((p[0] << 8) | p[1]),
|
|
n.parts.push((p[2] << 8) | p[3]),
|
|
{ parts: n.parts, zoneId: n.zoneId }
|
|
);
|
|
}
|
|
return null;
|
|
}),
|
|
(t.IPv4.isIPv4 = t.IPv6.isIPv6 =
|
|
function (r) {
|
|
return null !== this.parser(r);
|
|
}),
|
|
(t.IPv4.isValid = function (r) {
|
|
try {
|
|
return new this(this.parser(r)), !0;
|
|
} catch (r) {
|
|
return r, !1;
|
|
}
|
|
}),
|
|
(t.IPv4.isValidFourPartDecimal = function (r) {
|
|
return !(
|
|
!t.IPv4.isValid(r) || !r.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/)
|
|
);
|
|
}),
|
|
(t.IPv6.isValid = function (r) {
|
|
var t;
|
|
if ('string' == typeof r && -1 === r.indexOf(':')) return !1;
|
|
try {
|
|
return (t = this.parser(r)), new this(t.parts, t.zoneId), !0;
|
|
} catch (r) {
|
|
return r, !1;
|
|
}
|
|
}),
|
|
(t.IPv4.parse = function (r) {
|
|
var t;
|
|
if (null === (t = this.parser(r)))
|
|
throw new Error('ipaddr: string is not formatted like ip address');
|
|
return new this(t);
|
|
}),
|
|
(t.IPv6.parse = function (r) {
|
|
var t;
|
|
if (null === (t = this.parser(r)).parts)
|
|
throw new Error('ipaddr: string is not formatted like ip address');
|
|
return new this(t.parts, t.zoneId);
|
|
}),
|
|
(t.IPv4.parseCIDR = function (r) {
|
|
var t, n, e;
|
|
if (
|
|
(n = r.match(/^(.+)\/(\d+)$/)) &&
|
|
(t = parseInt(n[2])) >= 0 &&
|
|
t <= 32
|
|
)
|
|
return (
|
|
(e = [this.parse(n[1]), t]),
|
|
Object.defineProperty(e, 'toString', {
|
|
value: function () {
|
|
return this.join('/');
|
|
},
|
|
}),
|
|
e
|
|
);
|
|
throw new Error(
|
|
'ipaddr: string is not formatted like an IPv4 CIDR range'
|
|
);
|
|
}),
|
|
(t.IPv4.subnetMaskFromPrefixLength = function (r) {
|
|
var t, n, e;
|
|
if ((r = parseInt(r)) < 0 || r > 32)
|
|
throw new Error('ipaddr: invalid IPv4 prefix length');
|
|
for (e = [0, 0, 0, 0], n = 0, t = Math.floor(r / 8); n < t; )
|
|
(e[n] = 255), n++;
|
|
return (
|
|
t < 4 && (e[t] = (Math.pow(2, r % 8) - 1) << (8 - (r % 8))), new this(e)
|
|
);
|
|
}),
|
|
(t.IPv4.broadcastAddressFromCIDR = function (r) {
|
|
var t, n, e, i, o;
|
|
try {
|
|
for (
|
|
e = (t = this.parseCIDR(r))[0].toByteArray(),
|
|
o = this.subnetMaskFromPrefixLength(t[1]).toByteArray(),
|
|
i = [],
|
|
n = 0;
|
|
n < 4;
|
|
|
|
)
|
|
i.push(parseInt(e[n], 10) | (255 ^ parseInt(o[n], 10))), n++;
|
|
return new this(i);
|
|
} catch (r) {
|
|
throw (
|
|
(r, new Error('ipaddr: the address does not have IPv4 CIDR format'))
|
|
);
|
|
}
|
|
}),
|
|
(t.IPv4.networkAddressFromCIDR = function (r) {
|
|
var t, n, e, i, o;
|
|
try {
|
|
for (
|
|
e = (t = this.parseCIDR(r))[0].toByteArray(),
|
|
o = this.subnetMaskFromPrefixLength(t[1]).toByteArray(),
|
|
i = [],
|
|
n = 0;
|
|
n < 4;
|
|
|
|
)
|
|
i.push(parseInt(e[n], 10) & parseInt(o[n], 10)), n++;
|
|
return new this(i);
|
|
} catch (r) {
|
|
throw (
|
|
(r, new Error('ipaddr: the address does not have IPv4 CIDR format'))
|
|
);
|
|
}
|
|
}),
|
|
(t.IPv6.parseCIDR = function (r) {
|
|
var t, n, e;
|
|
if (
|
|
(n = r.match(/^(.+)\/(\d+)$/)) &&
|
|
(t = parseInt(n[2])) >= 0 &&
|
|
t <= 128
|
|
)
|
|
return (
|
|
(e = [this.parse(n[1]), t]),
|
|
Object.defineProperty(e, 'toString', {
|
|
value: function () {
|
|
return this.join('/');
|
|
},
|
|
}),
|
|
e
|
|
);
|
|
throw new Error(
|
|
'ipaddr: string is not formatted like an IPv6 CIDR range'
|
|
);
|
|
}),
|
|
(t.isValid = function (r) {
|
|
return t.IPv6.isValid(r) || t.IPv4.isValid(r);
|
|
}),
|
|
(t.parse = function (r) {
|
|
if (t.IPv6.isValid(r)) return t.IPv6.parse(r);
|
|
if (t.IPv4.isValid(r)) return t.IPv4.parse(r);
|
|
throw new Error('ipaddr: the address has neither IPv6 nor IPv4 format');
|
|
}),
|
|
(t.parseCIDR = function (r) {
|
|
try {
|
|
return t.IPv6.parseCIDR(r);
|
|
} catch (n) {
|
|
n;
|
|
try {
|
|
return t.IPv4.parseCIDR(r);
|
|
} catch (r) {
|
|
throw (
|
|
(r,
|
|
new Error(
|
|
'ipaddr: the address has neither IPv6 nor IPv4 CIDR format'
|
|
))
|
|
);
|
|
}
|
|
}
|
|
}),
|
|
(t.fromByteArray = function (r) {
|
|
var n;
|
|
if (4 === (n = r.length)) return new t.IPv4(r);
|
|
if (16 === n) return new t.IPv6(r);
|
|
throw new Error(
|
|
'ipaddr: the binary input is neither an IPv6 nor IPv4 address'
|
|
);
|
|
}),
|
|
(t.process = function (r) {
|
|
var t;
|
|
return (
|
|
(t = this.parse(r)),
|
|
'ipv6' === t.kind() && t.isIPv4MappedAddress() ? t.toIPv4Address() : t
|
|
);
|
|
});
|
|
}).call(this);
|