n8n-nodes-dominusnode 1.0.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 (42) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +99 -0
  4. package/dist/credentials/DominusNodeApi.credentials.d.ts +7 -0
  5. package/dist/credentials/DominusNodeApi.credentials.js +42 -0
  6. package/dist/credentials/DominusNodeApi.credentials.js.map +1 -0
  7. package/dist/index.d.ts +4 -0
  8. package/dist/index.js +12 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.d.ts +24 -0
  11. package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.js +436 -0
  12. package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.js.map +1 -0
  13. package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.d.ts +13 -0
  14. package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.js +105 -0
  15. package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.js.map +1 -0
  16. package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.d.ts +33 -0
  17. package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.js +656 -0
  18. package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.js.map +1 -0
  19. package/dist/shared/auth.d.ts +74 -0
  20. package/dist/shared/auth.js +264 -0
  21. package/dist/shared/auth.js.map +1 -0
  22. package/dist/shared/constants.d.ts +9 -0
  23. package/dist/shared/constants.js +13 -0
  24. package/dist/shared/constants.js.map +1 -0
  25. package/dist/shared/ssrf.d.ts +42 -0
  26. package/dist/shared/ssrf.js +252 -0
  27. package/dist/shared/ssrf.js.map +1 -0
  28. package/package.json +41 -0
  29. package/src/credentials/DominusNodeApi.credentials.ts +39 -0
  30. package/src/index.ts +4 -0
  31. package/src/nodes/DominusNodeProxy/DominusNodeProxy.node.ts +459 -0
  32. package/src/nodes/DominusNodeUsage/DominusNodeUsage.node.ts +130 -0
  33. package/src/nodes/DominusNodeWallet/DominusNodeWallet.node.ts +898 -0
  34. package/src/shared/auth.ts +272 -0
  35. package/src/shared/constants.ts +11 -0
  36. package/src/shared/ssrf.ts +257 -0
  37. package/tests/DominusNodeProxy.test.ts +281 -0
  38. package/tests/DominusNodeUsage.test.ts +250 -0
  39. package/tests/DominusNodeWallet.test.ts +591 -0
  40. package/tests/ssrf.test.ts +238 -0
  41. package/tsconfig.json +18 -0
  42. package/vitest.config.ts +8 -0
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ /**
3
+ * SSRF prevention utilities for the DomiNode n8n integration.
4
+ *
5
+ * Blocks private IPs, localhost, internal hostnames, embedded credentials,
6
+ * hex/octal/decimal-encoded IPs, IPv4-mapped IPv6, IPv4-compatible IPv6,
7
+ * Teredo (2001:0000::/32), 6to4 (2002::/16), CGNAT, multicast, .localhost,
8
+ * .local, .internal, .arpa TLDs, and IPv6 zone IDs.
9
+ *
10
+ * @module
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.normalizeIpv4 = normalizeIpv4;
14
+ exports.isPrivateIp = isPrivateIp;
15
+ exports.validateUrl = validateUrl;
16
+ // ---------------------------------------------------------------------------
17
+ // Blocked hostnames
18
+ // ---------------------------------------------------------------------------
19
+ const BLOCKED_HOSTNAMES = new Set([
20
+ "localhost",
21
+ "localhost.localdomain",
22
+ "ip6-localhost",
23
+ "ip6-loopback",
24
+ "[::1]",
25
+ "[::ffff:127.0.0.1]",
26
+ "0.0.0.0",
27
+ "[::]",
28
+ "metadata.google.internal",
29
+ "169.254.169.254",
30
+ ]);
31
+ // ---------------------------------------------------------------------------
32
+ // IPv4 normalization (hex, octal, decimal integer)
33
+ // ---------------------------------------------------------------------------
34
+ /**
35
+ * Normalize non-standard IPv4 representations to standard dotted-decimal.
36
+ * Handles decimal integers (2130706433), hex (0x7f000001), and octal (0177.0.0.1).
37
+ *
38
+ * @returns Normalized dotted-decimal string or null if not a recognizable IP.
39
+ */
40
+ function normalizeIpv4(hostname) {
41
+ // Single decimal integer (e.g., 2130706433 = 127.0.0.1)
42
+ if (/^\d+$/.test(hostname)) {
43
+ const n = parseInt(hostname, 10);
44
+ if (n >= 0 && n <= 0xffffffff) {
45
+ return `${(n >>> 24) & 0xff}.${(n >>> 16) & 0xff}.${(n >>> 8) & 0xff}.${n & 0xff}`;
46
+ }
47
+ }
48
+ // Hex notation (e.g., 0x7f000001)
49
+ if (/^0x[0-9a-fA-F]+$/i.test(hostname)) {
50
+ const n = parseInt(hostname, 16);
51
+ if (n >= 0 && n <= 0xffffffff) {
52
+ return `${(n >>> 24) & 0xff}.${(n >>> 16) & 0xff}.${(n >>> 8) & 0xff}.${n & 0xff}`;
53
+ }
54
+ }
55
+ // Octal or mixed-radix octets (e.g., 0177.0.0.1)
56
+ const parts = hostname.split(".");
57
+ if (parts.length === 4) {
58
+ const octets = [];
59
+ for (const part of parts) {
60
+ let val;
61
+ if (/^0x[0-9a-fA-F]+$/i.test(part)) {
62
+ val = parseInt(part, 16);
63
+ }
64
+ else if (/^0\d+$/.test(part)) {
65
+ val = parseInt(part, 8);
66
+ }
67
+ else if (/^\d+$/.test(part)) {
68
+ val = parseInt(part, 10);
69
+ }
70
+ else {
71
+ return null;
72
+ }
73
+ if (isNaN(val) || val < 0 || val > 255)
74
+ return null;
75
+ octets.push(val);
76
+ }
77
+ return octets.join(".");
78
+ }
79
+ return null;
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // Private IP detection
83
+ // ---------------------------------------------------------------------------
84
+ /**
85
+ * Check whether a hostname/IP is a private, loopback, link-local, CGNAT,
86
+ * multicast, or other reserved address.
87
+ *
88
+ * Handles:
89
+ * - Standard IPv4 private ranges (10/8, 172.16/12, 192.168/16, 127/8, 0/8)
90
+ * - CGNAT (100.64/10)
91
+ * - Multicast (224/4) and reserved (240+)
92
+ * - Link-local (169.254/16)
93
+ * - IPv6 loopback (::1), unspecified (::), ULA (fc00::/7), link-local (fe80::/10)
94
+ * - IPv4-mapped IPv6 (::ffff:x.x.x.x), IPv4-compatible IPv6 (::x.x.x.x)
95
+ * - Teredo tunneling (2001:0000::/32) — embeds IPv4 in last 32 bits
96
+ * - 6to4 (2002::/16) — embeds IPv4 in bits 16-48
97
+ * - Bracketed IPv6 ([::1])
98
+ * - IPv6 zone IDs (%eth0)
99
+ */
100
+ function isPrivateIp(hostname) {
101
+ let ip = hostname.replace(/^\[|\]$/g, "");
102
+ // Strip IPv6 zone ID (%25eth0, %eth0)
103
+ const zoneIdx = ip.indexOf("%");
104
+ if (zoneIdx !== -1) {
105
+ ip = ip.substring(0, zoneIdx);
106
+ }
107
+ const normalized = normalizeIpv4(ip);
108
+ const checkIp = normalized ?? ip;
109
+ // IPv4 private ranges
110
+ const ipv4Match = checkIp.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
111
+ if (ipv4Match) {
112
+ const a = Number(ipv4Match[1]);
113
+ const b = Number(ipv4Match[2]);
114
+ if (a === 0)
115
+ return true; // 0.0.0.0/8
116
+ if (a === 10)
117
+ return true; // 10.0.0.0/8
118
+ if (a === 127)
119
+ return true; // 127.0.0.0/8
120
+ if (a === 169 && b === 254)
121
+ return true; // 169.254.0.0/16
122
+ if (a === 172 && b >= 16 && b <= 31)
123
+ return true; // 172.16.0.0/12
124
+ if (a === 192 && b === 168)
125
+ return true; // 192.168.0.0/16
126
+ if (a === 100 && b >= 64 && b <= 127)
127
+ return true; // 100.64.0.0/10 CGNAT
128
+ if (a >= 224)
129
+ return true; // multicast + reserved
130
+ return false;
131
+ }
132
+ // IPv6 private ranges
133
+ const ipLower = ip.toLowerCase();
134
+ if (ipLower === "::1")
135
+ return true;
136
+ if (ipLower === "::")
137
+ return true;
138
+ if (ipLower.startsWith("fc") || ipLower.startsWith("fd"))
139
+ return true;
140
+ if (ipLower.startsWith("fe80"))
141
+ return true;
142
+ // IPv4-mapped IPv6 (::ffff:x.x.x.x or ::ffff:HHHH:HHHH)
143
+ if (ipLower.startsWith("::ffff:")) {
144
+ const embedded = ipLower.slice(7);
145
+ if (embedded.includes("."))
146
+ return isPrivateIp(embedded);
147
+ // Hex form: ::ffff:7f00:0001
148
+ const hexParts = embedded.split(":");
149
+ if (hexParts.length === 2) {
150
+ const hi = parseInt(hexParts[0], 16);
151
+ const lo = parseInt(hexParts[1], 16);
152
+ if (!isNaN(hi) && !isNaN(lo)) {
153
+ const reconstructed = `${(hi >> 8) & 0xff}.${hi & 0xff}.${(lo >> 8) & 0xff}.${lo & 0xff}`;
154
+ return isPrivateIp(reconstructed);
155
+ }
156
+ }
157
+ return isPrivateIp(embedded);
158
+ }
159
+ // IPv4-compatible IPv6 (::x.x.x.x or ::HHHH:HHHH without ffff)
160
+ if (ipLower.startsWith("::") && !ipLower.startsWith("::ffff:")) {
161
+ const rest = ipLower.slice(2);
162
+ if (rest && rest.includes("."))
163
+ return isPrivateIp(rest);
164
+ // Hex form: ::7f00:0001
165
+ const hexParts = rest.split(":");
166
+ if (hexParts.length === 2 && hexParts[0] && hexParts[1]) {
167
+ const hi = parseInt(hexParts[0], 16);
168
+ const lo = parseInt(hexParts[1], 16);
169
+ if (!isNaN(hi) && !isNaN(lo)) {
170
+ const reconstructed = `${(hi >> 8) & 0xff}.${hi & 0xff}.${(lo >> 8) & 0xff}.${lo & 0xff}`;
171
+ return isPrivateIp(reconstructed);
172
+ }
173
+ }
174
+ }
175
+ // Teredo tunneling (2001:0000::/32) — last 32 bits are inverted client IPv4
176
+ if (ipLower.startsWith("2001:0000:") || ipLower.startsWith("2001:0:")) {
177
+ const segments = ipLower.split(":");
178
+ if (segments.length >= 8) {
179
+ const hi = parseInt(segments[6], 16);
180
+ const lo = parseInt(segments[7], 16);
181
+ if (!isNaN(hi) && !isNaN(lo)) {
182
+ // Teredo inverts the IPv4 bits
183
+ const invertedIp = `${((hi >> 8) & 0xff) ^ 0xff}.${(hi & 0xff) ^ 0xff}.${((lo >> 8) & 0xff) ^ 0xff}.${(lo & 0xff) ^ 0xff}`;
184
+ return isPrivateIp(invertedIp);
185
+ }
186
+ }
187
+ // If we can't parse it, block conservatively
188
+ return true;
189
+ }
190
+ // 6to4 (2002::/16) — bits 16-48 contain the embedded IPv4
191
+ if (ipLower.startsWith("2002:")) {
192
+ const segments = ipLower.split(":");
193
+ if (segments.length >= 3) {
194
+ const hi = parseInt(segments[1], 16);
195
+ const lo = parseInt(segments[2], 16);
196
+ if (!isNaN(hi) && !isNaN(lo)) {
197
+ const embeddedIp = `${(hi >> 8) & 0xff}.${hi & 0xff}.${(lo >> 8) & 0xff}.${lo & 0xff}`;
198
+ return isPrivateIp(embeddedIp);
199
+ }
200
+ }
201
+ return true;
202
+ }
203
+ // IPv6 multicast (ff00::/8)
204
+ if (ipLower.startsWith("ff"))
205
+ return true;
206
+ return false;
207
+ }
208
+ // ---------------------------------------------------------------------------
209
+ // URL validation
210
+ // ---------------------------------------------------------------------------
211
+ /**
212
+ * Validate a URL for safety before sending through the proxy.
213
+ * Blocks private IPs, localhost, internal hostnames, non-HTTP(S) protocols,
214
+ * and embedded credentials.
215
+ *
216
+ * @throws {Error} If the URL is invalid or targets a private/blocked address.
217
+ */
218
+ function validateUrl(url) {
219
+ let parsed;
220
+ try {
221
+ parsed = new URL(url);
222
+ }
223
+ catch {
224
+ throw new Error(`Invalid URL: ${url}`);
225
+ }
226
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
227
+ throw new Error(`Only http: and https: protocols are supported, got ${parsed.protocol}`);
228
+ }
229
+ const hostname = parsed.hostname.toLowerCase();
230
+ if (BLOCKED_HOSTNAMES.has(hostname)) {
231
+ throw new Error("Requests to localhost/loopback addresses are blocked");
232
+ }
233
+ if (isPrivateIp(hostname)) {
234
+ throw new Error("Requests to private/internal IP addresses are blocked");
235
+ }
236
+ // .localhost TLD (RFC 6761)
237
+ if (hostname.endsWith(".localhost")) {
238
+ throw new Error("Requests to localhost/loopback addresses are blocked");
239
+ }
240
+ // Internal network hostnames
241
+ if (hostname.endsWith(".local") ||
242
+ hostname.endsWith(".internal") ||
243
+ hostname.endsWith(".arpa")) {
244
+ throw new Error("Requests to internal network hostnames are blocked");
245
+ }
246
+ // Block embedded credentials in URL
247
+ if (parsed.username || parsed.password) {
248
+ throw new Error("URLs with embedded credentials are not allowed");
249
+ }
250
+ return parsed;
251
+ }
252
+ //# sourceMappingURL=ssrf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssrf.js","sourceRoot":"","sources":["../../src/shared/ssrf.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "n8n-nodes-dominusnode",
3
+ "version": "1.0.0",
4
+ "description": "n8n community nodes for DomiNode rotating proxy service",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "n8n": {
8
+ "n8nNodesApiVersion": 1,
9
+ "credentials": [
10
+ "dist/credentials/DominusNodeApi.credentials.js"
11
+ ],
12
+ "nodes": [
13
+ "dist/nodes/DominusNodeProxy/DominusNodeProxy.node.js",
14
+ "dist/nodes/DominusNodeWallet/DominusNodeWallet.node.js",
15
+ "dist/nodes/DominusNodeUsage/DominusNodeUsage.node.js"
16
+ ]
17
+ },
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "test": "vitest run",
21
+ "lint": "tsc --noEmit"
22
+ },
23
+ "keywords": [
24
+ "n8n",
25
+ "n8n-community-node-package",
26
+ "dominusnode",
27
+ "proxy",
28
+ "rotating-proxy",
29
+ "web-scraping"
30
+ ],
31
+ "license": "MIT",
32
+ "peerDependencies": {
33
+ "n8n-workflow": ">=1.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "n8n-workflow": "^1.70.0",
37
+ "vitest": "^3.0.0",
38
+ "typescript": "^5.7.0",
39
+ "@types/node": "^22.0.0"
40
+ }
41
+ }
@@ -0,0 +1,39 @@
1
+ import { ICredentialType, INodeProperties } from "n8n-workflow";
2
+
3
+ export class DominusNodeApi implements ICredentialType {
4
+ name = "dominusNodeApi";
5
+ displayName = "DomiNode API";
6
+ documentationUrl = "https://docs.dominusnode.com";
7
+ properties: INodeProperties[] = [
8
+ {
9
+ displayName: "API Key",
10
+ name: "apiKey",
11
+ type: "string",
12
+ typeOptions: { password: true },
13
+ default: "",
14
+ required: true,
15
+ description: 'DomiNode API key (starts with dn_live_ or dn_test_)',
16
+ },
17
+ {
18
+ displayName: "Base URL",
19
+ name: "baseUrl",
20
+ type: "string",
21
+ default: "https://api.dominusnode.com",
22
+ description: "DomiNode API base URL",
23
+ },
24
+ {
25
+ displayName: "Proxy Host",
26
+ name: "proxyHost",
27
+ type: "string",
28
+ default: "proxy.dominusnode.com",
29
+ description: "DomiNode proxy gateway hostname",
30
+ },
31
+ {
32
+ displayName: "Proxy Port",
33
+ name: "proxyPort",
34
+ type: "number",
35
+ default: 8080,
36
+ description: "DomiNode proxy gateway port",
37
+ },
38
+ ];
39
+ }
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export { DominusNodeApi } from "./credentials/DominusNodeApi.credentials";
2
+ export { DominusNodeProxy } from "./nodes/DominusNodeProxy/DominusNodeProxy.node";
3
+ export { DominusNodeWallet } from "./nodes/DominusNodeWallet/DominusNodeWallet.node";
4
+ export { DominusNodeUsage } from "./nodes/DominusNodeUsage/DominusNodeUsage.node";