@aikidosec/firewall
Version:
Zen by Aikido is an embedded Web Application Firewall that autonomously protects Node.js apps against common and critical attacks
55 lines (54 loc) • 1.72 kB
JavaScript
;
// Based on https://github.com/demskie/netparser
// MIT License - Copyright (c) 2019 alex
Object.defineProperty(exports, "__esModule", { value: true });
exports.sortNetworks = sortNetworks;
exports.summarizeSortedNetworks = summarizeSortedNetworks;
exports.parseBaseNetwork = parseBaseNetwork;
const sort = require("./sort");
const Network_1 = require("./Network");
function sortNetworks(networks) {
sort.nativeSort(networks);
}
function increaseSizeByOneBit(network) {
const wider = network.setCIDR(network.cidr() - 1);
wider.addr.applySubnetMask(wider.cidr());
return wider;
}
function summarizeSortedNetworks(sorted) {
const summarized = sorted.slice(0, 1);
for (let idx = 1; idx < sorted.length; idx++) {
if (summarized[summarized.length - 1].contains(sorted[idx])) {
continue;
}
summarized.push(sorted[idx]);
while (summarized.length >= 2) {
const a = summarized[summarized.length - 2];
const b = summarized[summarized.length - 1];
if (a.cidr() != b.cidr() ||
!a.addr.isBaseAddress(a.cidr() - 1) ||
!a.adjacent(b)) {
break;
}
increaseSizeByOneBit(a);
summarized.pop();
}
}
return summarized;
}
function parseBaseNetwork(s, strict) {
const net = new Network_1.Network(s);
if (!net.isValid())
return null;
if (!strict) {
net.addr.applySubnetMask(net.cidr());
}
else {
const original = net.addr.duplicate();
net.addr.applySubnetMask(net.cidr());
if (!net.addr.equals(original)) {
return null;
}
}
return net;
}