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.
- package/CHANGELOG.md +21 -0
- package/LICENSE +21 -0
- package/README.md +99 -0
- package/dist/credentials/DominusNodeApi.credentials.d.ts +7 -0
- package/dist/credentials/DominusNodeApi.credentials.js +42 -0
- package/dist/credentials/DominusNodeApi.credentials.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.d.ts +24 -0
- package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.js +436 -0
- package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.js.map +1 -0
- package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.d.ts +13 -0
- package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.js +105 -0
- package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.js.map +1 -0
- package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.d.ts +33 -0
- package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.js +656 -0
- package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.js.map +1 -0
- package/dist/shared/auth.d.ts +74 -0
- package/dist/shared/auth.js +264 -0
- package/dist/shared/auth.js.map +1 -0
- package/dist/shared/constants.d.ts +9 -0
- package/dist/shared/constants.js +13 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/ssrf.d.ts +42 -0
- package/dist/shared/ssrf.js +252 -0
- package/dist/shared/ssrf.js.map +1 -0
- package/package.json +41 -0
- package/src/credentials/DominusNodeApi.credentials.ts +39 -0
- package/src/index.ts +4 -0
- package/src/nodes/DominusNodeProxy/DominusNodeProxy.node.ts +459 -0
- package/src/nodes/DominusNodeUsage/DominusNodeUsage.node.ts +130 -0
- package/src/nodes/DominusNodeWallet/DominusNodeWallet.node.ts +898 -0
- package/src/shared/auth.ts +272 -0
- package/src/shared/constants.ts +11 -0
- package/src/shared/ssrf.ts +257 -0
- package/tests/DominusNodeProxy.test.ts +281 -0
- package/tests/DominusNodeUsage.test.ts +250 -0
- package/tests/DominusNodeWallet.test.ts +591 -0
- package/tests/ssrf.test.ts +238 -0
- package/tsconfig.json +18 -0
- 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";
|