@n8n/backend-network 1.2.0 → 1.3.0
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.
- package/README.md +135 -4
- package/dist/build.tsbuildinfo +1 -1
- package/dist/http/axios/request.js +2 -2
- package/dist/http/axios/utils.js +5 -4
- package/dist/http/axios/utils.js.map +1 -1
- package/dist/http/client-default-headers.d.ts +1 -1
- package/dist/http/client-default-headers.js +17 -6
- package/dist/http/client-default-headers.js.map +1 -1
- package/dist/http/client-options.d.ts +1 -0
- package/dist/http/client-request-error.d.ts +1 -0
- package/dist/http/client-request-error.js +6 -0
- package/dist/http/client-request-error.js.map +1 -1
- package/dist/http/fake-outbound-http.d.ts +30 -0
- package/dist/http/fake-outbound-http.js +77 -0
- package/dist/http/fake-outbound-http.js.map +1 -0
- package/dist/http/http-proxy.d.ts +0 -6
- package/dist/http/http-proxy.js +2 -33
- package/dist/http/http-proxy.js.map +1 -1
- package/dist/http/index.d.ts +4 -3
- package/dist/http/index.js +6 -4
- package/dist/http/index.js.map +1 -1
- package/dist/http/outbound-http.d.ts +9 -5
- package/dist/http/outbound-http.js +1 -1
- package/dist/http/outbound-http.js.map +1 -1
- package/dist/http/undici/transport.js +9 -5
- package/dist/http/undici/transport.js.map +1 -1
- package/dist/proxy/index.d.ts +2 -0
- package/dist/proxy/index.js +11 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/no-proxy-patch.d.ts +1 -0
- package/dist/proxy/no-proxy-patch.js +71 -0
- package/dist/proxy/no-proxy-patch.js.map +1 -0
- package/dist/proxy/proxy-resolution.d.ts +6 -0
- package/dist/proxy/proxy-resolution.js +42 -0
- package/dist/proxy/proxy-resolution.js.map +1 -0
- package/dist/ssrf/hostname-matcher.js +2 -1
- package/dist/ssrf/hostname-matcher.js.map +1 -1
- package/dist/ssrf/index.d.ts +1 -0
- package/dist/ssrf/index.js +3 -1
- package/dist/ssrf/index.js.map +1 -1
- package/dist/ssrf/ssrf-blocked-hostname.error.d.ts +5 -0
- package/dist/ssrf/ssrf-blocked-hostname.error.js +18 -0
- package/dist/ssrf/ssrf-blocked-hostname.error.js.map +1 -0
- package/dist/ssrf/ssrf-protection.service.d.ts +3 -1
- package/dist/ssrf/ssrf-protection.service.js +15 -1
- package/dist/ssrf/ssrf-protection.service.js.map +1 -1
- package/dist/testing.d.ts +1 -0
- package/dist/testing.js +3 -1
- package/dist/testing.js.map +1 -1
- package/package.json +18 -9
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureHostsBypassProxy = ensureHostsBypassProxy;
|
|
4
|
+
const STATE_KEY = Symbol.for('n8n.backend-network.no-proxy-patch');
|
|
5
|
+
function getState() {
|
|
6
|
+
const store = globalThis;
|
|
7
|
+
return (store[STATE_KEY] ??= {
|
|
8
|
+
activeCount: 0,
|
|
9
|
+
upper: { had: false, value: undefined },
|
|
10
|
+
lower: { had: false, value: undefined },
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function capture(name) {
|
|
14
|
+
return {
|
|
15
|
+
had: Object.prototype.hasOwnProperty.call(process.env, name),
|
|
16
|
+
value: process.env[name],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function restore(name, captured) {
|
|
20
|
+
if (!captured.had) {
|
|
21
|
+
delete process.env[name];
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
process.env[name] = captured.value;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function effectiveNoProxy() {
|
|
28
|
+
const lower = process.env.no_proxy;
|
|
29
|
+
if (lower !== undefined && lower.length > 0)
|
|
30
|
+
return lower;
|
|
31
|
+
const upper = process.env.NO_PROXY;
|
|
32
|
+
if (upper !== undefined && upper.length > 0)
|
|
33
|
+
return upper;
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
function ensureHostsBypassProxy(hosts) {
|
|
37
|
+
const state = getState();
|
|
38
|
+
if (state.activeCount === 0) {
|
|
39
|
+
state.upper = capture('NO_PROXY');
|
|
40
|
+
state.lower = capture('no_proxy');
|
|
41
|
+
}
|
|
42
|
+
applyPatch(hosts);
|
|
43
|
+
state.activeCount++;
|
|
44
|
+
let restored = false;
|
|
45
|
+
return () => {
|
|
46
|
+
if (restored)
|
|
47
|
+
return;
|
|
48
|
+
restored = true;
|
|
49
|
+
state.activeCount--;
|
|
50
|
+
if (state.activeCount === 0) {
|
|
51
|
+
restore('NO_PROXY', state.upper);
|
|
52
|
+
restore('no_proxy', state.lower);
|
|
53
|
+
state.upper = { had: false, value: undefined };
|
|
54
|
+
state.lower = { had: false, value: undefined };
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function applyPatch(hosts) {
|
|
59
|
+
const previous = effectiveNoProxy();
|
|
60
|
+
const entries = previous
|
|
61
|
+
.split(',')
|
|
62
|
+
.map((entry) => entry.trim())
|
|
63
|
+
.filter((entry) => entry.length > 0);
|
|
64
|
+
const missing = hosts.filter((host) => !entries.includes(host));
|
|
65
|
+
if (missing.length > 0) {
|
|
66
|
+
const merged = previous.length > 0 ? `${missing.join(',')},${previous}` : missing.join(',');
|
|
67
|
+
process.env.NO_PROXY = merged;
|
|
68
|
+
process.env.no_proxy = merged;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=no-proxy-patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-proxy-patch.js","sourceRoot":"","sources":["../../src/proxy/no-proxy-patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import http from 'http';
|
|
2
|
+
import https from 'https';
|
|
3
|
+
export declare function resolveProxyUrl(targetUrl: string | undefined, fallbackUrl?: string): string | undefined;
|
|
4
|
+
export declare function createHttpProxyAgent(targetUrl: string, customProxyUrl?: string | null, options?: http.AgentOptions): http.Agent;
|
|
5
|
+
export declare function createHttpsProxyAgent(targetUrl: string, customProxyUrl?: string | null, options?: https.AgentOptions): https.Agent;
|
|
6
|
+
export declare function hasProxyEnvironmentVariables(): boolean;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resolveProxyUrl = resolveProxyUrl;
|
|
7
|
+
exports.createHttpProxyAgent = createHttpProxyAgent;
|
|
8
|
+
exports.createHttpsProxyAgent = createHttpsProxyAgent;
|
|
9
|
+
exports.hasProxyEnvironmentVariables = hasProxyEnvironmentVariables;
|
|
10
|
+
const http_1 = __importDefault(require("http"));
|
|
11
|
+
const http_proxy_agent_1 = require("http-proxy-agent");
|
|
12
|
+
const https_1 = __importDefault(require("https"));
|
|
13
|
+
const https_proxy_agent_1 = require("https-proxy-agent");
|
|
14
|
+
const proxy_from_env_1 = require("proxy-from-env");
|
|
15
|
+
function resolveProxyUrl(targetUrl, fallbackUrl) {
|
|
16
|
+
return (0, proxy_from_env_1.getProxyForUrl)(targetUrl ?? fallbackUrl ?? '') || undefined;
|
|
17
|
+
}
|
|
18
|
+
function createHttpProxyAgent(targetUrl, customProxyUrl, options) {
|
|
19
|
+
const proxyUrl = customProxyUrl ?? (0, proxy_from_env_1.getProxyForUrl)(targetUrl);
|
|
20
|
+
if (proxyUrl) {
|
|
21
|
+
return new http_proxy_agent_1.HttpProxyAgent(proxyUrl, options);
|
|
22
|
+
}
|
|
23
|
+
return new http_1.default.Agent(options);
|
|
24
|
+
}
|
|
25
|
+
function createHttpsProxyAgent(targetUrl, customProxyUrl, options) {
|
|
26
|
+
const proxyUrl = customProxyUrl ?? (0, proxy_from_env_1.getProxyForUrl)(targetUrl);
|
|
27
|
+
if (proxyUrl) {
|
|
28
|
+
return new https_proxy_agent_1.HttpsProxyAgent(proxyUrl, options);
|
|
29
|
+
}
|
|
30
|
+
return new https_1.default.Agent(options);
|
|
31
|
+
}
|
|
32
|
+
function hasProxyEnvironmentVariables() {
|
|
33
|
+
return [
|
|
34
|
+
process.env.HTTP_PROXY,
|
|
35
|
+
process.env.http_proxy,
|
|
36
|
+
process.env.HTTPS_PROXY,
|
|
37
|
+
process.env.https_proxy,
|
|
38
|
+
process.env.ALL_PROXY,
|
|
39
|
+
process.env.all_proxy,
|
|
40
|
+
].some((value) => Boolean(value));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=proxy-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-resolution.js","sourceRoot":"","sources":["../../src/proxy/proxy-resolution.ts"],"names":[],"mappings":";;;;;AAmBA,0CAKC;AAUD,oDAYC;AAUD,sDAYC;AAGD,oEASC;AAhFD,gDAAwB;AACxB,uDAAkD;AAClD,kDAA0B;AAC1B,yDAAoD;AACpD,mDAAgD;AAehD,SAAgB,eAAe,CAC9B,SAA6B,EAC7B,WAAoB;IAEpB,OAAO,IAAA,+BAAc,EAAC,SAAS,IAAI,WAAW,IAAI,EAAE,CAAC,IAAI,SAAS,CAAC;AACpE,CAAC;AAUD,SAAgB,oBAAoB,CACnC,SAAiB,EACjB,cAA8B,EAC9B,OAA2B;IAE3B,MAAM,QAAQ,GAAG,cAAc,IAAI,IAAA,+BAAc,EAAC,SAAS,CAAC,CAAC;IAE7D,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,iCAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,cAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAUD,SAAgB,qBAAqB,CACpC,SAAiB,EACjB,cAA8B,EAC9B,OAA4B;IAE5B,MAAM,QAAQ,GAAG,cAAc,IAAI,IAAA,+BAAc,EAAC,SAAS,CAAC,CAAC;IAE7D,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,mCAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAGD,SAAgB,4BAA4B;IAC3C,OAAO;QACN,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,OAAO,CAAC,GAAG,CAAC,SAAS;QACrB,OAAO,CAAC,GAAG,CAAC,SAAS;KACrB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -31,7 +31,8 @@ class HostnameMatcher {
|
|
|
31
31
|
return false;
|
|
32
32
|
}
|
|
33
33
|
normalizeHostname(hostname) {
|
|
34
|
-
|
|
34
|
+
const trimmed = hostname.trim().toLowerCase();
|
|
35
|
+
return trimmed.endsWith('.') ? trimmed.slice(0, -1) : trimmed;
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
exports.HostnameMatcher = HostnameMatcher;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hostname-matcher.js","sourceRoot":"","sources":["../../src/ssrf/hostname-matcher.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"hostname-matcher.js","sourceRoot":"","sources":["../../src/ssrf/hostname-matcher.ts"],"names":[],"mappings":";;;AAkBA,MAAa,eAAe;IAG3B,YAAY,QAA2B;QACtC,IAAI,CAAC,MAAM,GAAG,QAAQ;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;aACrC,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACd,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9B,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACrC,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;IAKD,OAAO,CAAC,QAAgB;QACvB,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAE5D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBAGxB,IACC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;oBAC3C,kBAAkB,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAChD,CAAC;oBACF,OAAO,IAAI,CAAC;gBACb,CAAC;gBACD,SAAS;YACV,CAAC;YAGD,IAAI,kBAAkB,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC9C,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/D,CAAC;CACD;AAhDD,0CAgDC"}
|
package/dist/ssrf/index.d.ts
CHANGED
package/dist/ssrf/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SsrfBlockedIpError = exports.SsrfProtectionService = void 0;
|
|
3
|
+
exports.SsrfBlockedHostnameError = exports.SsrfBlockedIpError = exports.SsrfProtectionService = void 0;
|
|
4
4
|
var ssrf_protection_service_1 = require("./ssrf-protection.service");
|
|
5
5
|
Object.defineProperty(exports, "SsrfProtectionService", { enumerable: true, get: function () { return ssrf_protection_service_1.SsrfProtectionService; } });
|
|
6
6
|
var ssrf_blocked_ip_error_1 = require("./ssrf-blocked-ip.error");
|
|
7
7
|
Object.defineProperty(exports, "SsrfBlockedIpError", { enumerable: true, get: function () { return ssrf_blocked_ip_error_1.SsrfBlockedIpError; } });
|
|
8
|
+
var ssrf_blocked_hostname_error_1 = require("./ssrf-blocked-hostname.error");
|
|
9
|
+
Object.defineProperty(exports, "SsrfBlockedHostnameError", { enumerable: true, get: function () { return ssrf_blocked_hostname_error_1.SsrfBlockedHostnameError; } });
|
|
8
10
|
//# sourceMappingURL=index.js.map
|
package/dist/ssrf/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ssrf/index.ts"],"names":[],"mappings":";;;AAAA,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAE9B,iEAA6D;AAApD,2HAAA,kBAAkB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ssrf/index.ts"],"names":[],"mappings":";;;AAAA,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAE9B,iEAA6D;AAApD,2HAAA,kBAAkB,OAAA;AAC3B,6EAAyE;AAAhE,uIAAA,wBAAwB,OAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SsrfBlockedHostnameError = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
class SsrfBlockedHostnameError extends n8n_workflow_1.UserError {
|
|
6
|
+
constructor(hostname) {
|
|
7
|
+
super('The request was blocked because the destination hostname is restricted', {
|
|
8
|
+
description: `The hostname '${hostname}' is on the configured deny-list. ` +
|
|
9
|
+
'If you need to reach this destination, ask your n8n administrator to remove it from ' +
|
|
10
|
+
'the blocked hostnames or add it to the allowed hostnames in the environment configuration.',
|
|
11
|
+
extra: { hostname },
|
|
12
|
+
});
|
|
13
|
+
this.name = 'SsrfBlockedHostnameError';
|
|
14
|
+
this.hostname = hostname;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.SsrfBlockedHostnameError = SsrfBlockedHostnameError;
|
|
18
|
+
//# sourceMappingURL=ssrf-blocked-hostname.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssrf-blocked-hostname.error.js","sourceRoot":"","sources":["../../src/ssrf/ssrf-blocked-hostname.error.ts"],"names":[],"mappings":";;;AAAA,+CAAyC;AAQzC,MAAa,wBAAyB,SAAQ,wBAAS;IAGtD,YAAY,QAAgB;QAC3B,KAAK,CAAC,wEAAwE,EAAE;YAC/E,WAAW,EACV,iBAAiB,QAAQ,oCAAoC;gBAC7D,sFAAsF;gBACtF,4FAA4F;YAC7F,KAAK,EAAE,EAAE,QAAQ,EAAE;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;CACD;AAfD,4DAeC"}
|
|
@@ -4,9 +4,10 @@ import { Result } from 'n8n-workflow';
|
|
|
4
4
|
import type { LookupFunction } from 'node:net';
|
|
5
5
|
import { DnsResolver } from '../dns';
|
|
6
6
|
export type SsrfCheckResult = Result<void, Error>;
|
|
7
|
+
type SsrfBlockedReason = 'blocked_ip' | 'blocked_hostname' | 'invalid_url' | 'dns_error';
|
|
7
8
|
type SsrfBlockedPayload = {
|
|
8
9
|
phase: SsrfPhase;
|
|
9
|
-
reason:
|
|
10
|
+
reason: SsrfBlockedReason;
|
|
10
11
|
durationMs: number;
|
|
11
12
|
};
|
|
12
13
|
type SsrfAllowedPayload = {
|
|
@@ -33,6 +34,7 @@ export declare class SsrfProtectionService implements SsrfBridge {
|
|
|
33
34
|
private readonly blockedIps;
|
|
34
35
|
private readonly allowedIps;
|
|
35
36
|
private readonly allowedHostnameMatcher;
|
|
37
|
+
private readonly blockedHostnameMatcher;
|
|
36
38
|
constructor(ssrfConfig: SsrfProtectionConfig, dnsResolver: DnsResolver, logger: Logger);
|
|
37
39
|
validateUrl(url: string | URL): Promise<SsrfCheckResult>;
|
|
38
40
|
validateIp(ip: string): SsrfCheckResult;
|
|
@@ -22,6 +22,7 @@ const node_net_1 = require("node:net");
|
|
|
22
22
|
const dns_1 = require("../dns");
|
|
23
23
|
const hostname_matcher_1 = require("./hostname-matcher");
|
|
24
24
|
const ip_range_builder_1 = require("./ip-range-builder");
|
|
25
|
+
const ssrf_blocked_hostname_error_1 = require("./ssrf-blocked-hostname.error");
|
|
25
26
|
const ssrf_blocked_ip_error_1 = require("./ssrf-blocked-ip.error");
|
|
26
27
|
let SsrfProtectionService = class SsrfProtectionService {
|
|
27
28
|
constructor(ssrfConfig, dnsResolver, logger) {
|
|
@@ -40,6 +41,7 @@ let SsrfProtectionService = class SsrfProtectionService {
|
|
|
40
41
|
}
|
|
41
42
|
this.allowedIps = allowed.list;
|
|
42
43
|
this.allowedHostnameMatcher = new hostname_matcher_1.HostnameMatcher(this.ssrfConfig.allowedHostnames);
|
|
44
|
+
this.blockedHostnameMatcher = new hostname_matcher_1.HostnameMatcher(this.ssrfConfig.blockedHostnames);
|
|
43
45
|
}
|
|
44
46
|
async validateUrl(url) {
|
|
45
47
|
const parsed = this.tryParseUrl(url);
|
|
@@ -95,6 +97,11 @@ let SsrfProtectionService = class SsrfProtectionService {
|
|
|
95
97
|
const { hostname } = parsed;
|
|
96
98
|
if (this.allowedHostnameMatcher.matches(hostname))
|
|
97
99
|
return;
|
|
100
|
+
if (this.blockedHostnameMatcher.matches(hostname)) {
|
|
101
|
+
const error = new ssrf_blocked_hostname_error_1.SsrfBlockedHostnameError(hostname);
|
|
102
|
+
this.withEvents('redirect', () => (0, n8n_workflow_1.createResultError)(error));
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
98
105
|
const cleanIp = this.normalizeIpInHostname(hostname);
|
|
99
106
|
if ((0, node_net_1.isIP)(cleanIp)) {
|
|
100
107
|
const result = this.withEvents('redirect', () => this.validateIp(cleanIp));
|
|
@@ -128,9 +135,13 @@ let SsrfProtectionService = class SsrfProtectionService {
|
|
|
128
135
|
},
|
|
129
136
|
]);
|
|
130
137
|
}
|
|
138
|
+
const allowedByName = this.allowedHostnameMatcher.matches(hostname);
|
|
139
|
+
if (!allowedByName && this.blockedHostnameMatcher.matches(hostname)) {
|
|
140
|
+
return (0, n8n_workflow_1.createResultError)(new ssrf_blocked_hostname_error_1.SsrfBlockedHostnameError(hostname));
|
|
141
|
+
}
|
|
131
142
|
const resolved = await this.dnsResolver.lookup(hostname, options);
|
|
132
143
|
(0, node_assert_1.default)(resolved.length > 0, `DNS lookup for ${hostname} returned no results`);
|
|
133
|
-
if (
|
|
144
|
+
if (allowedByName) {
|
|
134
145
|
return (0, n8n_workflow_1.createResultOk)(resolved);
|
|
135
146
|
}
|
|
136
147
|
for (const ip of resolved) {
|
|
@@ -170,6 +181,9 @@ let SsrfProtectionService = class SsrfProtectionService {
|
|
|
170
181
|
if (error instanceof ssrf_blocked_ip_error_1.SsrfBlockedIpError) {
|
|
171
182
|
return 'blocked_ip';
|
|
172
183
|
}
|
|
184
|
+
if (error instanceof ssrf_blocked_hostname_error_1.SsrfBlockedHostnameError) {
|
|
185
|
+
return 'blocked_hostname';
|
|
186
|
+
}
|
|
173
187
|
return 'dns_error';
|
|
174
188
|
}
|
|
175
189
|
tryParseUrl(url) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssrf-protection.service.js","sourceRoot":"","sources":["../../src/ssrf/ssrf-protection.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,wDAA2D;AAC3D,wCAAmD;AACnD,gCAAkC;AAClC,+CAAsF;AACtF,8DAAiC;AAGjC,uCAAgC;AAEhC,gCAAqC;AACrC,yDAAqD;AACrD,yDAAsD;AACtD,mEAA6D;
|
|
1
|
+
{"version":3,"file":"ssrf-protection.service.js","sourceRoot":"","sources":["../../src/ssrf/ssrf-protection.service.ts"],"names":[],"mappings":"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"}
|
package/dist/testing.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ export { convertN8nRequestToAxios } from './http/axios/request';
|
|
|
2
2
|
export { generateContentLengthHeader, isFormDataInstance } from './http/axios/utils';
|
|
3
3
|
export { buildRfcStyleUserAgent, getDefaultN8nOutboundUserAgent } from './http/axios/user-agent';
|
|
4
4
|
export { startServer, type LocalServer } from './http/local-server';
|
|
5
|
+
export { createFakeOutboundHttp, type Route, type MockFnFactory, } from './http/fake-outbound-http';
|
package/dist/testing.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.startServer = exports.getDefaultN8nOutboundUserAgent = exports.buildRfcStyleUserAgent = exports.isFormDataInstance = exports.generateContentLengthHeader = exports.convertN8nRequestToAxios = void 0;
|
|
3
|
+
exports.createFakeOutboundHttp = exports.startServer = exports.getDefaultN8nOutboundUserAgent = exports.buildRfcStyleUserAgent = exports.isFormDataInstance = exports.generateContentLengthHeader = exports.convertN8nRequestToAxios = void 0;
|
|
4
4
|
var request_1 = require("./http/axios/request");
|
|
5
5
|
Object.defineProperty(exports, "convertN8nRequestToAxios", { enumerable: true, get: function () { return request_1.convertN8nRequestToAxios; } });
|
|
6
6
|
var utils_1 = require("./http/axios/utils");
|
|
@@ -11,4 +11,6 @@ Object.defineProperty(exports, "buildRfcStyleUserAgent", { enumerable: true, get
|
|
|
11
11
|
Object.defineProperty(exports, "getDefaultN8nOutboundUserAgent", { enumerable: true, get: function () { return user_agent_1.getDefaultN8nOutboundUserAgent; } });
|
|
12
12
|
var local_server_1 = require("./http/local-server");
|
|
13
13
|
Object.defineProperty(exports, "startServer", { enumerable: true, get: function () { return local_server_1.startServer; } });
|
|
14
|
+
var fake_outbound_http_1 = require("./http/fake-outbound-http");
|
|
15
|
+
Object.defineProperty(exports, "createFakeOutboundHttp", { enumerable: true, get: function () { return fake_outbound_http_1.createFakeOutboundHttp; } });
|
|
14
16
|
//# sourceMappingURL=testing.js.map
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":";;;AAQA,gDAAgE;AAAvD,mHAAA,wBAAwB,OAAA;AACjC,4CAAqF;AAA5E,oHAAA,2BAA2B,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AACxD,sDAAiG;AAAxF,oHAAA,sBAAsB,OAAA;AAAE,4HAAA,8BAA8B,OAAA;AAC/D,oDAAoE;AAA3D,2GAAA,WAAW,OAAA"}
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":";;;AAQA,gDAAgE;AAAvD,mHAAA,wBAAwB,OAAA;AACjC,4CAAqF;AAA5E,oHAAA,2BAA2B,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AACxD,sDAAiG;AAAxF,oHAAA,sBAAsB,OAAA;AAAE,4HAAA,8BAA8B,OAAA;AAC/D,oDAAoE;AAA3D,2GAAA,WAAW,OAAA;AACpB,gEAImC;AAHlC,4HAAA,sBAAsB,OAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@n8n/backend-network",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "src/index.ts",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -19,6 +19,11 @@
|
|
|
19
19
|
"types": "./dist/transport.d.ts",
|
|
20
20
|
"import": "./src/transport.ts",
|
|
21
21
|
"require": "./dist/transport.js"
|
|
22
|
+
},
|
|
23
|
+
"./proxy": {
|
|
24
|
+
"types": "./dist/proxy/index.d.ts",
|
|
25
|
+
"import": "./src/proxy/index.ts",
|
|
26
|
+
"require": "./dist/proxy/index.js"
|
|
22
27
|
}
|
|
23
28
|
},
|
|
24
29
|
"typesVersions": {
|
|
@@ -28,6 +33,9 @@
|
|
|
28
33
|
],
|
|
29
34
|
"transport": [
|
|
30
35
|
"dist/transport.d.ts"
|
|
36
|
+
],
|
|
37
|
+
"proxy": [
|
|
38
|
+
"dist/proxy/index.d.ts"
|
|
31
39
|
]
|
|
32
40
|
}
|
|
33
41
|
},
|
|
@@ -48,20 +56,21 @@
|
|
|
48
56
|
"reflect-metadata": "0.2.2",
|
|
49
57
|
"undici": "^7.28.0",
|
|
50
58
|
"zod": "3.25.67",
|
|
51
|
-
"@n8n/
|
|
52
|
-
"@n8n/config": "2.26.0",
|
|
53
|
-
"@n8n/constants": "0.28.0",
|
|
59
|
+
"@n8n/constants": "0.29.0",
|
|
54
60
|
"@n8n/di": "0.14.0",
|
|
55
|
-
"n8n-
|
|
61
|
+
"@n8n/backend-common": "1.29.0",
|
|
62
|
+
"n8n-workflow": "2.29.0",
|
|
63
|
+
"@n8n/config": "2.27.0"
|
|
56
64
|
},
|
|
57
65
|
"devDependencies": {
|
|
58
66
|
"@types/proxy-from-env": "^1.0.4",
|
|
59
|
-
"@
|
|
67
|
+
"@types/qs": "6.9.15",
|
|
68
|
+
"@vitest/coverage-v8": "4.1.9",
|
|
60
69
|
"nock": "14.0.14",
|
|
61
|
-
"vitest": "^4.1.
|
|
70
|
+
"vitest": "^4.1.9",
|
|
62
71
|
"vitest-mock-extended": "^3.1.0",
|
|
63
|
-
"@n8n/typescript-config": "1.
|
|
64
|
-
"@n8n/vitest-config": "1.
|
|
72
|
+
"@n8n/typescript-config": "1.7.0",
|
|
73
|
+
"@n8n/vitest-config": "1.16.0"
|
|
65
74
|
},
|
|
66
75
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
67
76
|
"homepage": "https://n8n.io",
|