UNPKG

@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
"use strict"; // 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; }