Tons of Solutions Engineering work done today for the rest of the CS team! Headway, Howard Hanna, Engels, Brighton, etc. Also completed Datasnippers auth flow and worked on Anthology's script. Cloned Anthology's courses (900..) and will clone Full Story on Monday.
This commit is contained in:
167
Scripts/node_modules/netmask/lib/netmask.coffee
generated
vendored
Normal file
167
Scripts/node_modules/netmask/lib/netmask.coffee
generated
vendored
Normal file
@ -0,0 +1,167 @@
|
||||
long2ip = (long) ->
|
||||
a = (long & (0xff << 24)) >>> 24;
|
||||
b = (long & (0xff << 16)) >>> 16;
|
||||
c = (long & (0xff << 8)) >>> 8;
|
||||
d = long & 0xff;
|
||||
return [a, b, c, d].join('.')
|
||||
|
||||
ip2long = (ip) ->
|
||||
b = []
|
||||
for i in [0..3]
|
||||
if ip.length == 0
|
||||
break
|
||||
if i > 0
|
||||
if ip[0] != '.'
|
||||
throw new Error('Invalid IP')
|
||||
ip = ip.substring(1)
|
||||
[n, c] = atob(ip)
|
||||
ip = ip.substring(c)
|
||||
b.push(n)
|
||||
if ip.length != 0
|
||||
throw new Error('Invalid IP')
|
||||
switch b.length
|
||||
when 1
|
||||
# Long input notation
|
||||
if b[0] > 0xFFFFFFFF
|
||||
throw new Error('Invalid IP')
|
||||
return b[0] >>> 0
|
||||
when 2
|
||||
# Class A notation
|
||||
if b[0] > 0xFF or b[1] > 0xFFFFFF
|
||||
throw new Error('Invalid IP')
|
||||
return (b[0] << 24 | b[1]) >>> 0
|
||||
when 3
|
||||
# Class B notation
|
||||
if b[0] > 0xFF or b[1] > 0xFF or b[2] > 0xFFFF
|
||||
throw new Error('Invalid IP')
|
||||
return (b[0] << 24 | b[1] << 16 | b[2]) >>> 0
|
||||
when 4
|
||||
# Dotted quad notation
|
||||
if b[0] > 0xFF or b[1] > 0xFF or b[2] > 0xFF or b[3] > 0xFF
|
||||
throw new Error('Invalid IP')
|
||||
return (b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]) >>> 0
|
||||
else
|
||||
throw new Error('Invalid IP')
|
||||
|
||||
chr = (b) ->
|
||||
return b.charCodeAt(0)
|
||||
|
||||
chr0 = chr('0')
|
||||
chra = chr('a')
|
||||
chrA = chr('A')
|
||||
|
||||
atob = (s) ->
|
||||
n = 0
|
||||
base = 10
|
||||
dmax = '9'
|
||||
i = 0
|
||||
if s.length > 1 and s[i] == '0'
|
||||
if s[i+1] == 'x' or s[i+1] == 'X'
|
||||
i += 2
|
||||
base = 16
|
||||
else if '0' <= s[i+1] and s[i+1] <= '9'
|
||||
i++
|
||||
base = 8
|
||||
dmax = '7'
|
||||
start = i
|
||||
while i < s.length
|
||||
if '0' <= s[i] and s[i] <= dmax
|
||||
n = (n*base + (chr(s[i])-chr0)) >>> 0
|
||||
else if base == 16
|
||||
if 'a' <= s[i] and s[i] <= 'f'
|
||||
n = (n*base + (10+chr(s[i])-chra)) >>> 0
|
||||
else if 'A' <= s[i] and s[i] <= 'F'
|
||||
n = (n*base + (10+chr(s[i])-chrA)) >>> 0
|
||||
else
|
||||
break
|
||||
else
|
||||
break
|
||||
if n > 0xFFFFFFFF
|
||||
throw new Error('too large')
|
||||
i++
|
||||
if i == start
|
||||
throw new Error('empty octet')
|
||||
return [n, i]
|
||||
|
||||
class Netmask
|
||||
constructor: (net, mask) ->
|
||||
throw new Error("Missing `net' parameter") unless typeof net is 'string'
|
||||
unless mask
|
||||
# try to find the mask in the net (i.e.: 1.2.3.4/24 or 1.2.3.4/255.255.255.0)
|
||||
[net, mask] = net.split('/', 2)
|
||||
unless mask
|
||||
mask = 32
|
||||
if typeof mask is 'string' and mask.indexOf('.') > -1
|
||||
# Compute bitmask, the netmask as a number of bits in the network portion of the address for this block (eg.: 24)
|
||||
try
|
||||
@maskLong = ip2long(mask)
|
||||
catch error
|
||||
throw new Error("Invalid mask: #{mask}")
|
||||
for i in [32..0]
|
||||
if @maskLong == (0xffffffff << (32 - i)) >>> 0
|
||||
@bitmask = i
|
||||
break
|
||||
else if mask or mask == 0
|
||||
# The mask was passed as bitmask, compute the mask as long from it
|
||||
@bitmask = parseInt(mask, 10)
|
||||
@maskLong = 0
|
||||
if @bitmask > 0
|
||||
@maskLong = (0xffffffff << (32 - @bitmask)) >>> 0
|
||||
else
|
||||
throw new Error("Invalid mask: empty")
|
||||
|
||||
try
|
||||
@netLong = (ip2long(net) & @maskLong) >>> 0
|
||||
catch error
|
||||
throw new Error("Invalid net address: #{net}")
|
||||
|
||||
throw new Error("Invalid mask for ip4: #{mask}") unless @bitmask <= 32
|
||||
|
||||
# The number of IP address in the block (eg.: 254)
|
||||
@size = Math.pow(2, 32 - @bitmask)
|
||||
# The address of the network block as a string (eg.: 216.240.32.0)
|
||||
@base = long2ip(@netLong)
|
||||
# The netmask as a string (eg.: 255.255.255.0)
|
||||
@mask = long2ip(@maskLong)
|
||||
# The host mask, the opposite of the netmask (eg.: 0.0.0.255)
|
||||
@hostmask = long2ip(~@maskLong)
|
||||
# The first usable address of the block
|
||||
@first = if @bitmask <= 30 then long2ip(@netLong + 1) else @base
|
||||
# The last usable address of the block
|
||||
@last = if @bitmask <= 30 then long2ip(@netLong + @size - 2) else long2ip(@netLong + @size - 1)
|
||||
# The block's broadcast address: the last address of the block (eg.: 192.168.1.255)
|
||||
@broadcast = if @bitmask <= 30 then long2ip(@netLong + @size - 1)
|
||||
|
||||
# Returns true if the given ip or netmask is contained in the block
|
||||
contains: (ip) ->
|
||||
if typeof ip is 'string' and (ip.indexOf('/') > 0 or ip.split('.').length isnt 4)
|
||||
ip = new Netmask(ip)
|
||||
|
||||
if ip instanceof Netmask
|
||||
return @contains(ip.base) and @contains((ip.broadcast || ip.last))
|
||||
else
|
||||
return (ip2long(ip) & @maskLong) >>> 0 == ((@netLong & @maskLong)) >>> 0
|
||||
|
||||
# Returns the Netmask object for the block which follow this one
|
||||
next: (count=1) ->
|
||||
return new Netmask(long2ip(@netLong + (@size * count)), @mask)
|
||||
|
||||
forEach: (fn) ->
|
||||
# this implementation is not idiomatic but avoids large memory allocations (2 arrays, one for range and one for the results) in cases when then netmask is large
|
||||
long = ip2long(@first)
|
||||
lastLong = ip2long(@last)
|
||||
index = 0
|
||||
while long <= lastLong
|
||||
fn long2ip(long), long, index
|
||||
index++
|
||||
long++
|
||||
return
|
||||
|
||||
# Returns the complete netmask formatted as `base/bitmask`
|
||||
toString: ->
|
||||
return @base + "/" + @bitmask
|
||||
|
||||
|
||||
exports.ip2long = ip2long
|
||||
exports.long2ip = long2ip
|
||||
exports.Netmask = Netmask
|
||||
208
Scripts/node_modules/netmask/lib/netmask.js
generated
vendored
Normal file
208
Scripts/node_modules/netmask/lib/netmask.js
generated
vendored
Normal file
@ -0,0 +1,208 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var Netmask, atob, chr, chr0, chrA, chra, ip2long, long2ip;
|
||||
|
||||
long2ip = function(long) {
|
||||
var a, b, c, d;
|
||||
a = (long & (0xff << 24)) >>> 24;
|
||||
b = (long & (0xff << 16)) >>> 16;
|
||||
c = (long & (0xff << 8)) >>> 8;
|
||||
d = long & 0xff;
|
||||
return [a, b, c, d].join('.');
|
||||
};
|
||||
|
||||
ip2long = function(ip) {
|
||||
var b, c, i, j, n, ref;
|
||||
b = [];
|
||||
for (i = j = 0; j <= 3; i = ++j) {
|
||||
if (ip.length === 0) {
|
||||
break;
|
||||
}
|
||||
if (i > 0) {
|
||||
if (ip[0] !== '.') {
|
||||
throw new Error('Invalid IP');
|
||||
}
|
||||
ip = ip.substring(1);
|
||||
}
|
||||
ref = atob(ip), n = ref[0], c = ref[1];
|
||||
ip = ip.substring(c);
|
||||
b.push(n);
|
||||
}
|
||||
if (ip.length !== 0) {
|
||||
throw new Error('Invalid IP');
|
||||
}
|
||||
switch (b.length) {
|
||||
case 1:
|
||||
if (b[0] > 0xFFFFFFFF) {
|
||||
throw new Error('Invalid IP');
|
||||
}
|
||||
return b[0] >>> 0;
|
||||
case 2:
|
||||
if (b[0] > 0xFF || b[1] > 0xFFFFFF) {
|
||||
throw new Error('Invalid IP');
|
||||
}
|
||||
return (b[0] << 24 | b[1]) >>> 0;
|
||||
case 3:
|
||||
if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFFFF) {
|
||||
throw new Error('Invalid IP');
|
||||
}
|
||||
return (b[0] << 24 | b[1] << 16 | b[2]) >>> 0;
|
||||
case 4:
|
||||
if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFF || b[3] > 0xFF) {
|
||||
throw new Error('Invalid IP');
|
||||
}
|
||||
return (b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]) >>> 0;
|
||||
default:
|
||||
throw new Error('Invalid IP');
|
||||
}
|
||||
};
|
||||
|
||||
chr = function(b) {
|
||||
return b.charCodeAt(0);
|
||||
};
|
||||
|
||||
chr0 = chr('0');
|
||||
|
||||
chra = chr('a');
|
||||
|
||||
chrA = chr('A');
|
||||
|
||||
atob = function(s) {
|
||||
var base, dmax, i, n, start;
|
||||
n = 0;
|
||||
base = 10;
|
||||
dmax = '9';
|
||||
i = 0;
|
||||
if (s.length > 1 && s[i] === '0') {
|
||||
if (s[i + 1] === 'x' || s[i + 1] === 'X') {
|
||||
i += 2;
|
||||
base = 16;
|
||||
} else if ('0' <= s[i + 1] && s[i + 1] <= '9') {
|
||||
i++;
|
||||
base = 8;
|
||||
dmax = '7';
|
||||
}
|
||||
}
|
||||
start = i;
|
||||
while (i < s.length) {
|
||||
if ('0' <= s[i] && s[i] <= dmax) {
|
||||
n = (n * base + (chr(s[i]) - chr0)) >>> 0;
|
||||
} else if (base === 16) {
|
||||
if ('a' <= s[i] && s[i] <= 'f') {
|
||||
n = (n * base + (10 + chr(s[i]) - chra)) >>> 0;
|
||||
} else if ('A' <= s[i] && s[i] <= 'F') {
|
||||
n = (n * base + (10 + chr(s[i]) - chrA)) >>> 0;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
if (n > 0xFFFFFFFF) {
|
||||
throw new Error('too large');
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (i === start) {
|
||||
throw new Error('empty octet');
|
||||
}
|
||||
return [n, i];
|
||||
};
|
||||
|
||||
Netmask = (function() {
|
||||
function Netmask(net, mask) {
|
||||
var error, i, j, ref;
|
||||
if (typeof net !== 'string') {
|
||||
throw new Error("Missing `net' parameter");
|
||||
}
|
||||
if (!mask) {
|
||||
ref = net.split('/', 2), net = ref[0], mask = ref[1];
|
||||
}
|
||||
if (!mask) {
|
||||
mask = 32;
|
||||
}
|
||||
if (typeof mask === 'string' && mask.indexOf('.') > -1) {
|
||||
try {
|
||||
this.maskLong = ip2long(mask);
|
||||
} catch (error1) {
|
||||
error = error1;
|
||||
throw new Error("Invalid mask: " + mask);
|
||||
}
|
||||
for (i = j = 32; j >= 0; i = --j) {
|
||||
if (this.maskLong === (0xffffffff << (32 - i)) >>> 0) {
|
||||
this.bitmask = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (mask || mask === 0) {
|
||||
this.bitmask = parseInt(mask, 10);
|
||||
this.maskLong = 0;
|
||||
if (this.bitmask > 0) {
|
||||
this.maskLong = (0xffffffff << (32 - this.bitmask)) >>> 0;
|
||||
}
|
||||
} else {
|
||||
throw new Error("Invalid mask: empty");
|
||||
}
|
||||
try {
|
||||
this.netLong = (ip2long(net) & this.maskLong) >>> 0;
|
||||
} catch (error1) {
|
||||
error = error1;
|
||||
throw new Error("Invalid net address: " + net);
|
||||
}
|
||||
if (!(this.bitmask <= 32)) {
|
||||
throw new Error("Invalid mask for ip4: " + mask);
|
||||
}
|
||||
this.size = Math.pow(2, 32 - this.bitmask);
|
||||
this.base = long2ip(this.netLong);
|
||||
this.mask = long2ip(this.maskLong);
|
||||
this.hostmask = long2ip(~this.maskLong);
|
||||
this.first = this.bitmask <= 30 ? long2ip(this.netLong + 1) : this.base;
|
||||
this.last = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 2) : long2ip(this.netLong + this.size - 1);
|
||||
this.broadcast = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 1) : void 0;
|
||||
}
|
||||
|
||||
Netmask.prototype.contains = function(ip) {
|
||||
if (typeof ip === 'string' && (ip.indexOf('/') > 0 || ip.split('.').length !== 4)) {
|
||||
ip = new Netmask(ip);
|
||||
}
|
||||
if (ip instanceof Netmask) {
|
||||
return this.contains(ip.base) && this.contains(ip.broadcast || ip.last);
|
||||
} else {
|
||||
return (ip2long(ip) & this.maskLong) >>> 0 === (this.netLong & this.maskLong) >>> 0;
|
||||
}
|
||||
};
|
||||
|
||||
Netmask.prototype.next = function(count) {
|
||||
if (count == null) {
|
||||
count = 1;
|
||||
}
|
||||
return new Netmask(long2ip(this.netLong + (this.size * count)), this.mask);
|
||||
};
|
||||
|
||||
Netmask.prototype.forEach = function(fn) {
|
||||
var index, lastLong, long;
|
||||
long = ip2long(this.first);
|
||||
lastLong = ip2long(this.last);
|
||||
index = 0;
|
||||
while (long <= lastLong) {
|
||||
fn(long2ip(long), long, index);
|
||||
index++;
|
||||
long++;
|
||||
}
|
||||
};
|
||||
|
||||
Netmask.prototype.toString = function() {
|
||||
return this.base + "/" + this.bitmask;
|
||||
};
|
||||
|
||||
return Netmask;
|
||||
|
||||
})();
|
||||
|
||||
exports.ip2long = ip2long;
|
||||
|
||||
exports.long2ip = long2ip;
|
||||
|
||||
exports.Netmask = Netmask;
|
||||
|
||||
}).call(this);
|
||||
Reference in New Issue
Block a user