@n8n/backend-network 1.2.1 → 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.
Files changed (50) hide show
  1. package/README.md +135 -4
  2. package/dist/build.tsbuildinfo +1 -1
  3. package/dist/http/axios/request.js +2 -2
  4. package/dist/http/axios/utils.js +5 -4
  5. package/dist/http/axios/utils.js.map +1 -1
  6. package/dist/http/client-default-headers.d.ts +1 -1
  7. package/dist/http/client-default-headers.js +17 -6
  8. package/dist/http/client-default-headers.js.map +1 -1
  9. package/dist/http/client-options.d.ts +1 -0
  10. package/dist/http/client-request-error.d.ts +1 -0
  11. package/dist/http/client-request-error.js +6 -0
  12. package/dist/http/client-request-error.js.map +1 -1
  13. package/dist/http/fake-outbound-http.d.ts +30 -0
  14. package/dist/http/fake-outbound-http.js +77 -0
  15. package/dist/http/fake-outbound-http.js.map +1 -0
  16. package/dist/http/http-proxy.d.ts +0 -6
  17. package/dist/http/http-proxy.js +2 -33
  18. package/dist/http/http-proxy.js.map +1 -1
  19. package/dist/http/index.d.ts +4 -3
  20. package/dist/http/index.js +6 -4
  21. package/dist/http/index.js.map +1 -1
  22. package/dist/http/outbound-http.d.ts +9 -5
  23. package/dist/http/outbound-http.js +1 -1
  24. package/dist/http/outbound-http.js.map +1 -1
  25. package/dist/http/undici/transport.js +9 -5
  26. package/dist/http/undici/transport.js.map +1 -1
  27. package/dist/proxy/index.d.ts +2 -0
  28. package/dist/proxy/index.js +11 -0
  29. package/dist/proxy/index.js.map +1 -0
  30. package/dist/proxy/no-proxy-patch.d.ts +1 -0
  31. package/dist/proxy/no-proxy-patch.js +71 -0
  32. package/dist/proxy/no-proxy-patch.js.map +1 -0
  33. package/dist/proxy/proxy-resolution.d.ts +6 -0
  34. package/dist/proxy/proxy-resolution.js +42 -0
  35. package/dist/proxy/proxy-resolution.js.map +1 -0
  36. package/dist/ssrf/hostname-matcher.js +2 -1
  37. package/dist/ssrf/hostname-matcher.js.map +1 -1
  38. package/dist/ssrf/index.d.ts +1 -0
  39. package/dist/ssrf/index.js +3 -1
  40. package/dist/ssrf/index.js.map +1 -1
  41. package/dist/ssrf/ssrf-blocked-hostname.error.d.ts +5 -0
  42. package/dist/ssrf/ssrf-blocked-hostname.error.js +18 -0
  43. package/dist/ssrf/ssrf-blocked-hostname.error.js.map +1 -0
  44. package/dist/ssrf/ssrf-protection.service.d.ts +3 -1
  45. package/dist/ssrf/ssrf-protection.service.js +15 -1
  46. package/dist/ssrf/ssrf-protection.service.js.map +1 -1
  47. package/dist/testing.d.ts +1 -0
  48. package/dist/testing.js +3 -1
  49. package/dist/testing.js.map +1 -1
  50. package/package.json +20 -11
@@ -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
- return hostname.trim().toLowerCase();
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":";;;AAiBA,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,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;CACD;AA/CD,0CA+CC"}
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"}
@@ -1,3 +1,4 @@
1
1
  export { SsrfProtectionService } from './ssrf-protection.service';
2
2
  export type { SsrfBridge } from './ssrf-protection.service';
3
3
  export { SsrfBlockedIpError } from './ssrf-blocked-ip.error';
4
+ export { SsrfBlockedHostnameError } from './ssrf-blocked-hostname.error';
@@ -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
@@ -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,5 @@
1
+ import { UserError } from 'n8n-workflow';
2
+ export declare class SsrfBlockedHostnameError extends UserError {
3
+ readonly hostname: string;
4
+ constructor(hostname: string);
5
+ }
@@ -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: string;
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 (this.allowedHostnameMatcher.matches(hostname)) {
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":"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"}
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
@@ -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.2.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,13 +33,16 @@
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
  },
34
42
  "files": [
35
43
  "dist/**/*",
36
- "LICENSE_EE.md",
37
- "LICENSE.md"
44
+ "LICENSE.md",
45
+ "LICENSE_EE.md"
38
46
  ],
39
47
  "dependencies": {
40
48
  "axios": "1.18.0",
@@ -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/backend-common": "1.28.1",
52
- "@n8n/config": "2.26.0",
59
+ "@n8n/constants": "0.29.0",
53
60
  "@n8n/di": "0.14.0",
54
- "n8n-workflow": "2.28.1",
55
- "@n8n/constants": "0.28.0"
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
- "@vitest/coverage-v8": "4.1.1",
67
+ "@types/qs": "6.9.15",
68
+ "@vitest/coverage-v8": "4.1.9",
60
69
  "nock": "14.0.14",
61
- "vitest": "^4.1.1",
70
+ "vitest": "^4.1.9",
62
71
  "vitest-mock-extended": "^3.1.0",
63
- "@n8n/typescript-config": "1.6.1",
64
- "@n8n/vitest-config": "1.15.0"
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",