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:
Norm Rasmussen
2024-01-05 17:07:59 -05:00
parent ce261975ca
commit a5fe4bd2c8
3157 changed files with 554269 additions and 16 deletions

167
Scripts/node_modules/netmask/lib/netmask.coffee generated vendored Normal file
View 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
View 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);