@forestadmin/agent 1.91.0 → 1.91.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -5,9 +5,11 @@ import BaseRoute from '../base-route';
|
|
|
5
5
|
export default class IpWhitelist extends BaseRoute {
|
|
6
6
|
type: RouteType;
|
|
7
7
|
private configuration;
|
|
8
|
+
private allowedIps;
|
|
8
9
|
setupRoutes(router: Router): void;
|
|
9
10
|
/** Load whitelist */
|
|
10
11
|
bootstrap(): Promise<void>;
|
|
12
|
+
private static allowRule;
|
|
11
13
|
checkIp(context: Context, next: Next): Promise<boolean>;
|
|
12
14
|
private isTrustedInternalCaller;
|
|
13
15
|
}
|
|
@@ -3,10 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
6
|
+
const net_1 = require("net");
|
|
7
7
|
const types_1 = require("../../types");
|
|
8
8
|
const base_route_1 = __importDefault(require("../base-route"));
|
|
9
9
|
const LOOPBACK_IPS = ['127.0.0.1', '::1', '::ffff:127.0.0.1'];
|
|
10
|
+
const ipVersion = (ip) => ((0, net_1.isIPv6)(ip) ? 'ipv6' : 'ipv4');
|
|
10
11
|
class IpWhitelist extends base_route_1.default {
|
|
11
12
|
constructor() {
|
|
12
13
|
super(...arguments);
|
|
@@ -18,6 +19,27 @@ class IpWhitelist extends base_route_1.default {
|
|
|
18
19
|
/** Load whitelist */
|
|
19
20
|
async bootstrap() {
|
|
20
21
|
this.configuration = await this.options.forestAdminClient.getIpWhitelistConfiguration();
|
|
22
|
+
this.allowedIps = new net_1.BlockList();
|
|
23
|
+
this.configuration.ipRules.forEach(rule => {
|
|
24
|
+
try {
|
|
25
|
+
IpWhitelist.allowRule(this.allowedIps, rule);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
this.options.logger('Warn', `IP whitelist: ignoring invalid rule ${JSON.stringify(rule)}`);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
static allowRule(allowedIps, rule) {
|
|
33
|
+
if (rule.type === 0) {
|
|
34
|
+
allowedIps.addAddress(rule.ip, ipVersion(rule.ip));
|
|
35
|
+
}
|
|
36
|
+
else if (rule.type === 1) {
|
|
37
|
+
allowedIps.addRange(rule.ipMinimum, rule.ipMaximum, ipVersion(rule.ipMinimum));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const [ip, prefix] = rule.range.split('/');
|
|
41
|
+
allowedIps.addSubnet(ip, Number(prefix), ipVersion(ip));
|
|
42
|
+
}
|
|
21
43
|
}
|
|
22
44
|
async checkIp(context, next) {
|
|
23
45
|
if (this.configuration.isFeatureEnabled) {
|
|
@@ -25,10 +47,8 @@ class IpWhitelist extends base_route_1.default {
|
|
|
25
47
|
this.options.logger('Debug', 'IP whitelist: exempting trusted internal caller');
|
|
26
48
|
return next();
|
|
27
49
|
}
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
const allowed = ipRules.some(ipRule => forest_ip_utils_1.default.isIpMatchesRule(currentIp, ipRule));
|
|
31
|
-
if (!allowed) {
|
|
50
|
+
const currentIp = `${context.request.headers['x-forwarded-for'] ?? context.request.ip}`;
|
|
51
|
+
if (!this.allowedIps.check(currentIp, ipVersion(currentIp))) {
|
|
32
52
|
return context.throw(types_1.HttpCode.Forbidden, `IP address rejected (${currentIp})`);
|
|
33
53
|
}
|
|
34
54
|
}
|
|
@@ -44,4 +64,4 @@ class IpWhitelist extends base_route_1.default {
|
|
|
44
64
|
}
|
|
45
65
|
}
|
|
46
66
|
exports.default = IpWhitelist;
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXAtd2hpdGVsaXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9zZWN1cml0eS9pcC13aGl0ZWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSw2QkFBd0M7QUFFeEMsdUNBQWtEO0FBQ2xELCtEQUFzQztBQUl0QyxNQUFNLFlBQVksR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUU5RCxNQUFNLFNBQVMsR0FBRyxDQUFDLEVBQVUsRUFBbUIsRUFBRSxDQUFDLENBQUMsSUFBQSxZQUFNLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFbEYsTUFBcUIsV0FBWSxTQUFRLG9CQUFTO0lBQWxEOztRQUNFLFNBQUksR0FBRyxpQkFBUyxDQUFDLGNBQWMsQ0FBQztJQStEbEMsQ0FBQztJQXpEQyxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELHFCQUFxQjtJQUNaLEtBQUssQ0FBQyxTQUFTO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDeEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGVBQVMsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QyxJQUFJLENBQUM7Z0JBQ0gsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/agent",
|
|
3
|
-
"version": "1.91.
|
|
3
|
+
"version": "1.91.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
"@koa/router": "^13.1.0",
|
|
24
24
|
"@paralleldrive/cuid2": "2.2.2",
|
|
25
25
|
"@types/koa__router": "^12.0.4",
|
|
26
|
-
"forest-ip-utils": "^1.0.1",
|
|
27
26
|
"json-api-serializer": "^2.6.6",
|
|
28
27
|
"json-stringify-pretty-compact": "^3.0.0",
|
|
29
28
|
"jsonwebtoken": "^9.0.3",
|