n8n-nodes-dominusnode 1.1.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/README.md +13 -10
  3. package/dist/credentials/DominusNodeApi.credentials.js +1 -1
  4. package/dist/index.d.ts +4 -0
  5. package/dist/index.js +9 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/nodes/DominusNodeAccount/DominusNodeAccount.node.d.ts +23 -0
  8. package/dist/nodes/DominusNodeAccount/DominusNodeAccount.node.js +346 -0
  9. package/dist/nodes/DominusNodeAccount/DominusNodeAccount.node.js.map +1 -0
  10. package/dist/nodes/DominusNodeKeys/DominusNodeKeys.node.d.ts +20 -0
  11. package/dist/nodes/DominusNodeKeys/DominusNodeKeys.node.js +162 -0
  12. package/dist/nodes/DominusNodeKeys/DominusNodeKeys.node.js.map +1 -0
  13. package/dist/nodes/DominusNodePlans/DominusNodePlans.node.d.ts +19 -0
  14. package/dist/nodes/DominusNodePlans/DominusNodePlans.node.js +142 -0
  15. package/dist/nodes/DominusNodePlans/DominusNodePlans.node.js.map +1 -0
  16. package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.d.ts +2 -1
  17. package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.js +33 -9
  18. package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.js.map +1 -1
  19. package/dist/nodes/DominusNodeTeams/DominusNodeTeams.node.d.ts +27 -0
  20. package/dist/nodes/DominusNodeTeams/DominusNodeTeams.node.js +309 -0
  21. package/dist/nodes/DominusNodeTeams/DominusNodeTeams.node.js.map +1 -0
  22. package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.d.ts +3 -1
  23. package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.js +47 -1
  24. package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.js.map +1 -1
  25. package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.d.ts +5 -1
  26. package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.js +361 -38
  27. package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.js.map +1 -1
  28. package/dist/shared/auth.js +1 -1
  29. package/dist/shared/auth.js.map +1 -1
  30. package/dist/shared/ssrf.js.map +1 -1
  31. package/package.json +8 -3
  32. package/src/credentials/DominusNodeApi.credentials.ts +0 -48
  33. package/src/index.ts +0 -4
  34. package/src/nodes/DominusNodeProxy/DominusNodeProxy.node.ts +0 -460
  35. package/src/nodes/DominusNodeUsage/DominusNodeUsage.node.ts +0 -131
  36. package/src/nodes/DominusNodeWallet/DominusNodeWallet.node.ts +0 -899
  37. package/src/shared/auth.ts +0 -287
  38. package/src/shared/constants.ts +0 -11
  39. package/src/shared/ssrf.ts +0 -257
  40. package/tests/DominusNodeProxy.test.ts +0 -281
  41. package/tests/DominusNodeUsage.test.ts +0 -250
  42. package/tests/DominusNodeWallet.test.ts +0 -591
  43. package/tests/ssrf.test.ts +0 -238
  44. package/tsconfig.json +0 -18
  45. package/vitest.config.ts +0 -8
package/CHANGELOG.md CHANGED
@@ -9,6 +9,7 @@ All notable changes to `n8n-nodes-dominusnode` will be documented in this file.
9
9
  ## [1.0.0] - 2025-02-23
10
10
 
11
11
  ### Added
12
+
12
13
  - Initial release of n8n community nodes for Dominus Node
13
14
  - **Dominus Node Proxy** node: Proxied Fetch, Get Proxy Config, List Active Sessions
14
15
  - **Dominus Node Wallet** node: 20 operations covering wallet, agentic wallets, and teams
package/README.md CHANGED
@@ -21,12 +21,12 @@ npm install n8n-nodes-dominusnode
21
21
 
22
22
  Create a **Dominus Node API** credential with:
23
23
 
24
- | Field | Description | Default |
25
- |-------|-------------|---------|
26
- | API Key | Your Dominus Node API key (`dn_live_...` or `dn_test_...`) | *(required)* |
27
- | Base URL | Dominus Node API base URL | `https://api.dominusnode.com` |
28
- | Proxy Host | Proxy gateway hostname | `proxy.dominusnode.com` |
29
- | Proxy Port | Proxy gateway port | `8080` |
24
+ | Field | Description | Default |
25
+ | ---------- | ---------------------------------------------------------- | ----------------------------- |
26
+ | API Key | Your Dominus Node API key (`dn_live_...` or `dn_test_...`) | _(required)_ |
27
+ | Base URL | Dominus Node API base URL | `https://api.dominusnode.com` |
28
+ | Proxy Host | Proxy gateway hostname | `proxy.dominusnode.com` |
29
+ | Proxy Port | Proxy gateway port | `8080` |
30
30
 
31
31
  ## Nodes
32
32
 
@@ -35,6 +35,7 @@ Create a **Dominus Node API** credential with:
35
35
  Make HTTP requests through Dominus Node's rotating proxy network.
36
36
 
37
37
  **Operations:**
38
+
38
39
  - **Proxied Fetch** -- Route HTTP requests through datacenter or residential proxies with geo-targeting
39
40
  - **Get Proxy Config** -- Retrieve proxy endpoint configuration
40
41
  - **List Active Sessions** -- List currently active proxy sessions
@@ -44,6 +45,7 @@ Make HTTP requests through Dominus Node's rotating proxy network.
44
45
  Manage your Dominus Node wallet, agentic sub-wallets, and teams.
45
46
 
46
47
  **Operations:**
48
+
47
49
  - **Check Balance** -- Get current wallet balance
48
50
  - **Top Up (Stripe)** -- Create a Stripe checkout session
49
51
  - **Top Up (Crypto)** -- Create a crypto invoice (BTC, ETH, LTC, XMR, ZEC, USDC, SOL, USDT, DAI, BNB)
@@ -66,6 +68,7 @@ Manage your Dominus Node wallet, agentic sub-wallets, and teams.
66
68
  Check proxy usage statistics.
67
69
 
68
70
  **Operations:**
71
+
69
72
  - **Check Usage** -- Get bandwidth and cost statistics for a given period (day, week, month)
70
73
 
71
74
  ## Security
@@ -81,10 +84,10 @@ All nodes include comprehensive security measures:
81
84
 
82
85
  ## Pricing
83
86
 
84
- | Pool Type | Price | Cost | Margin |
85
- |-----------|-------|------|--------|
86
- | Datacenter | $3/GB | $0.012/GB | 99.6% |
87
- | Residential | $5/GB | $4.00/GB | 20% |
87
+ | Pool Type | Price |
88
+ | ----------- | ----- |
89
+ | Datacenter | $3/GB |
90
+ | Residential | $5/GB |
88
91
 
89
92
  ## Development
90
93
 
@@ -13,7 +13,7 @@ class DominusNodeApi {
13
13
  typeOptions: { password: true },
14
14
  default: "",
15
15
  required: true,
16
- description: 'Dominus Node API key (starts with dn_live_ or dn_test_)',
16
+ description: "Dominus Node API key (starts with dn_live_ or dn_test_)",
17
17
  },
18
18
  {
19
19
  displayName: "Base URL",
package/dist/index.d.ts CHANGED
@@ -2,3 +2,7 @@ export { DominusNodeApi } from "./credentials/DominusNodeApi.credentials";
2
2
  export { DominusNodeProxy } from "./nodes/DominusNodeProxy/DominusNodeProxy.node";
3
3
  export { DominusNodeWallet } from "./nodes/DominusNodeWallet/DominusNodeWallet.node";
4
4
  export { DominusNodeUsage } from "./nodes/DominusNodeUsage/DominusNodeUsage.node";
5
+ export { DominusNodeAccount } from "./nodes/DominusNodeAccount/DominusNodeAccount.node";
6
+ export { DominusNodeKeys } from "./nodes/DominusNodeKeys/DominusNodeKeys.node";
7
+ export { DominusNodePlans } from "./nodes/DominusNodePlans/DominusNodePlans.node";
8
+ export { DominusNodeTeams } from "./nodes/DominusNodeTeams/DominusNodeTeams.node";
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DominusNodeUsage = exports.DominusNodeWallet = exports.DominusNodeProxy = exports.DominusNodeApi = void 0;
3
+ exports.DominusNodeTeams = exports.DominusNodePlans = exports.DominusNodeKeys = exports.DominusNodeAccount = exports.DominusNodeUsage = exports.DominusNodeWallet = exports.DominusNodeProxy = exports.DominusNodeApi = void 0;
4
4
  var DominusNodeApi_credentials_1 = require("./credentials/DominusNodeApi.credentials");
5
5
  Object.defineProperty(exports, "DominusNodeApi", { enumerable: true, get: function () { return DominusNodeApi_credentials_1.DominusNodeApi; } });
6
6
  var DominusNodeProxy_node_1 = require("./nodes/DominusNodeProxy/DominusNodeProxy.node");
@@ -9,4 +9,12 @@ var DominusNodeWallet_node_1 = require("./nodes/DominusNodeWallet/DominusNodeWal
9
9
  Object.defineProperty(exports, "DominusNodeWallet", { enumerable: true, get: function () { return DominusNodeWallet_node_1.DominusNodeWallet; } });
10
10
  var DominusNodeUsage_node_1 = require("./nodes/DominusNodeUsage/DominusNodeUsage.node");
11
11
  Object.defineProperty(exports, "DominusNodeUsage", { enumerable: true, get: function () { return DominusNodeUsage_node_1.DominusNodeUsage; } });
12
+ var DominusNodeAccount_node_1 = require("./nodes/DominusNodeAccount/DominusNodeAccount.node");
13
+ Object.defineProperty(exports, "DominusNodeAccount", { enumerable: true, get: function () { return DominusNodeAccount_node_1.DominusNodeAccount; } });
14
+ var DominusNodeKeys_node_1 = require("./nodes/DominusNodeKeys/DominusNodeKeys.node");
15
+ Object.defineProperty(exports, "DominusNodeKeys", { enumerable: true, get: function () { return DominusNodeKeys_node_1.DominusNodeKeys; } });
16
+ var DominusNodePlans_node_1 = require("./nodes/DominusNodePlans/DominusNodePlans.node");
17
+ Object.defineProperty(exports, "DominusNodePlans", { enumerable: true, get: function () { return DominusNodePlans_node_1.DominusNodePlans; } });
18
+ var DominusNodeTeams_node_1 = require("./nodes/DominusNodeTeams/DominusNodeTeams.node");
19
+ Object.defineProperty(exports, "DominusNodeTeams", { enumerable: true, get: function () { return DominusNodeTeams_node_1.DominusNodeTeams; } });
12
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uFAA0E;AAAjE,4HAAA,cAAc,OAAA;AACvB,wFAAkF;AAAzE,yHAAA,gBAAgB,OAAA;AACzB,2FAAqF;AAA5E,2HAAA,iBAAiB,OAAA;AAC1B,wFAAkF;AAAzE,yHAAA,gBAAgB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uFAA0E;AAAjE,4HAAA,cAAc,OAAA;AACvB,wFAAkF;AAAzE,yHAAA,gBAAgB,OAAA;AACzB,2FAAqF;AAA5E,2HAAA,iBAAiB,OAAA;AAC1B,wFAAkF;AAAzE,yHAAA,gBAAgB,OAAA;AACzB,8FAAwF;AAA/E,6HAAA,kBAAkB,OAAA;AAC3B,qFAA+E;AAAtE,uHAAA,eAAe,OAAA;AACxB,wFAAkF;AAAzE,yHAAA,gBAAgB,OAAA;AACzB,wFAAkF;AAAzE,yHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Dominus Node Account n8n community node.
3
+ *
4
+ * Operations (6 tools):
5
+ * - Register: Create a new account
6
+ * - Login: Log in with email and password
7
+ * - Get Account Info: Get current account details
8
+ * - Verify Email: Verify email with a token
9
+ * - Resend Verification: Resend the email verification link
10
+ * - Update Password: Change account password
11
+ *
12
+ * Security:
13
+ * - Credential sanitization in error messages
14
+ * - Email and password validation
15
+ * - Control character rejection
16
+ *
17
+ * @module
18
+ */
19
+ import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from "n8n-workflow";
20
+ export declare class DominusNodeAccount implements INodeType {
21
+ description: INodeTypeDescription;
22
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
23
+ }
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+ /**
3
+ * Dominus Node Account n8n community node.
4
+ *
5
+ * Operations (6 tools):
6
+ * - Register: Create a new account
7
+ * - Login: Log in with email and password
8
+ * - Get Account Info: Get current account details
9
+ * - Verify Email: Verify email with a token
10
+ * - Resend Verification: Resend the email verification link
11
+ * - Update Password: Change account password
12
+ *
13
+ * Security:
14
+ * - Credential sanitization in error messages
15
+ * - Email and password validation
16
+ * - Control character rejection
17
+ *
18
+ * @module
19
+ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || (function () {
37
+ var ownKeys = function(o) {
38
+ ownKeys = Object.getOwnPropertyNames || function (o) {
39
+ var ar = [];
40
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
+ return ar;
42
+ };
43
+ return ownKeys(o);
44
+ };
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod;
47
+ var result = {};
48
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ })();
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.DominusNodeAccount = void 0;
55
+ const crypto = __importStar(require("node:crypto"));
56
+ const n8n_workflow_1 = require("n8n-workflow");
57
+ const auth_1 = require("../../shared/auth");
58
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
59
+ const CONTROL_CHAR_RE = /[\x00-\x1f\x7f]/;
60
+ // ---------------------------------------------------------------------------
61
+ // SHA-256 Proof-of-Work solver
62
+ // ---------------------------------------------------------------------------
63
+ function countLeadingZeroBits(buf) {
64
+ let count = 0;
65
+ for (const byte of buf) {
66
+ if (byte === 0) {
67
+ count += 8;
68
+ continue;
69
+ }
70
+ let mask = 0x80;
71
+ while (mask && !(byte & mask)) {
72
+ count++;
73
+ mask >>= 1;
74
+ }
75
+ break;
76
+ }
77
+ return count;
78
+ }
79
+ async function solvePoW(baseUrl) {
80
+ try {
81
+ const resp = await fetch(`${baseUrl}/api/auth/pow/challenge`, {
82
+ method: "POST",
83
+ headers: { "Content-Type": "application/json" },
84
+ redirect: "error",
85
+ });
86
+ if (!resp.ok)
87
+ return null;
88
+ const text = await resp.text();
89
+ if (text.length > 10_485_760)
90
+ return null;
91
+ const challenge = JSON.parse(text);
92
+ const prefix = challenge.prefix ?? "";
93
+ const difficulty = challenge.difficulty ?? 20;
94
+ const challengeId = challenge.challengeId ?? "";
95
+ if (!prefix || !challengeId)
96
+ return null;
97
+ for (let nonce = 0; nonce < 100_000_000; nonce++) {
98
+ const hash = crypto
99
+ .createHash("sha256")
100
+ .update(prefix + nonce.toString())
101
+ .digest();
102
+ if (countLeadingZeroBits(hash) >= difficulty) {
103
+ return { challengeId, nonce: nonce.toString() };
104
+ }
105
+ }
106
+ return null;
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ class DominusNodeAccount {
113
+ description = {
114
+ displayName: "Dominus Node Account",
115
+ name: "dominusNodeAccount",
116
+ icon: "file:dominusnode.svg",
117
+ group: ["transform"],
118
+ version: 1,
119
+ subtitle: '={{$parameter["operation"]}}',
120
+ description: "Manage Dominus Node account registration, login, and settings",
121
+ defaults: { name: "Dominus Node Account" },
122
+ inputs: ["main"],
123
+ outputs: ["main"],
124
+ credentials: [{ name: "dominusNodeApi", required: true }],
125
+ properties: [
126
+ {
127
+ displayName: "Operation",
128
+ name: "operation",
129
+ type: "options",
130
+ noDataExpression: true,
131
+ options: [
132
+ {
133
+ name: "Register",
134
+ value: "register",
135
+ description: "Create a new account",
136
+ action: "Register",
137
+ },
138
+ {
139
+ name: "Login",
140
+ value: "login",
141
+ description: "Log in with email and password",
142
+ action: "Login",
143
+ },
144
+ {
145
+ name: "Get Account Info",
146
+ value: "getAccountInfo",
147
+ description: "Get current account details",
148
+ action: "Get account info",
149
+ },
150
+ {
151
+ name: "Verify Email",
152
+ value: "verifyEmail",
153
+ description: "Verify email with a token",
154
+ action: "Verify email",
155
+ },
156
+ {
157
+ name: "Resend Verification",
158
+ value: "resendVerification",
159
+ description: "Resend email verification link",
160
+ action: "Resend verification",
161
+ },
162
+ {
163
+ name: "Update Password",
164
+ value: "updatePassword",
165
+ description: "Change account password",
166
+ action: "Update password",
167
+ },
168
+ ],
169
+ default: "getAccountInfo",
170
+ },
171
+ // --- Register / Login ---
172
+ {
173
+ displayName: "Email",
174
+ name: "email",
175
+ type: "string",
176
+ default: "",
177
+ required: true,
178
+ description: "Account email address",
179
+ displayOptions: { show: { operation: ["register", "login"] } },
180
+ },
181
+ {
182
+ displayName: "Password",
183
+ name: "password",
184
+ type: "string",
185
+ typeOptions: { password: true },
186
+ default: "",
187
+ required: true,
188
+ description: "Account password (8-128 characters)",
189
+ displayOptions: { show: { operation: ["register", "login"] } },
190
+ },
191
+ // --- Verify Email ---
192
+ {
193
+ displayName: "Verification Token",
194
+ name: "verificationToken",
195
+ type: "string",
196
+ default: "",
197
+ required: true,
198
+ description: "Email verification token received via email",
199
+ displayOptions: { show: { operation: ["verifyEmail"] } },
200
+ },
201
+ // --- Update Password ---
202
+ {
203
+ displayName: "Current Password",
204
+ name: "currentPassword",
205
+ type: "string",
206
+ typeOptions: { password: true },
207
+ default: "",
208
+ required: true,
209
+ description: "Current account password",
210
+ displayOptions: { show: { operation: ["updatePassword"] } },
211
+ },
212
+ {
213
+ displayName: "New Password",
214
+ name: "newPassword",
215
+ type: "string",
216
+ typeOptions: { password: true },
217
+ default: "",
218
+ required: true,
219
+ description: "New password (8-128 characters)",
220
+ displayOptions: { show: { operation: ["updatePassword"] } },
221
+ },
222
+ ],
223
+ };
224
+ async execute() {
225
+ const items = this.getInputData();
226
+ const returnData = [];
227
+ const credentials = await this.getCredentials("dominusNodeApi");
228
+ const apiKey = credentials.apiKey;
229
+ const baseUrl = credentials.baseUrl || "https://api.dominusnode.com";
230
+ if (!apiKey) {
231
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "API Key is required");
232
+ }
233
+ const agentSecret = credentials.agentSecret || undefined;
234
+ const auth = new auth_1.DominusNodeAuth(apiKey, baseUrl, 30000, agentSecret);
235
+ const operation = this.getNodeParameter("operation", 0);
236
+ for (let i = 0; i < items.length; i++) {
237
+ try {
238
+ let result;
239
+ switch (operation) {
240
+ case "register": {
241
+ const email = this.getNodeParameter("email", i);
242
+ const password = this.getNodeParameter("password", i);
243
+ const safeEmail = validateEmail(this, email, i);
244
+ const safePassword = validatePassword(this, password, i);
245
+ // Solve PoW for CAPTCHA-free registration
246
+ const pow = await solvePoW(baseUrl);
247
+ const regBody = {
248
+ email: safeEmail,
249
+ password: safePassword,
250
+ };
251
+ if (pow)
252
+ regBody.pow = pow;
253
+ result = await auth.apiRequest("POST", "/api/auth/register", regBody);
254
+ break;
255
+ }
256
+ case "login": {
257
+ const email = this.getNodeParameter("email", i);
258
+ const password = this.getNodeParameter("password", i);
259
+ const safeEmail = validateEmail(this, email, i);
260
+ const safePassword = validatePassword(this, password, i);
261
+ result = await auth.apiRequest("POST", "/api/auth/login", {
262
+ email: safeEmail,
263
+ password: safePassword,
264
+ });
265
+ break;
266
+ }
267
+ case "getAccountInfo": {
268
+ result = await auth.apiRequest("GET", "/api/auth/me");
269
+ break;
270
+ }
271
+ case "verifyEmail": {
272
+ const token = this.getNodeParameter("verificationToken", i);
273
+ if (!token ||
274
+ typeof token !== "string" ||
275
+ token.trim().length === 0) {
276
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Verification token is required", { itemIndex: i });
277
+ }
278
+ if (CONTROL_CHAR_RE.test(token)) {
279
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "Token contains invalid control characters", { itemIndex: i });
280
+ }
281
+ result = await auth.apiRequest("POST", "/api/auth/verify-email", {
282
+ token: token.trim(),
283
+ });
284
+ break;
285
+ }
286
+ case "resendVerification": {
287
+ result = await auth.apiRequest("POST", "/api/auth/resend-verification");
288
+ break;
289
+ }
290
+ case "updatePassword": {
291
+ const currentPassword = this.getNodeParameter("currentPassword", i);
292
+ const newPassword = this.getNodeParameter("newPassword", i);
293
+ validatePassword(this, currentPassword, i);
294
+ validatePassword(this, newPassword, i);
295
+ result = await auth.apiRequest("POST", "/api/auth/change-password", {
296
+ currentPassword,
297
+ newPassword,
298
+ });
299
+ break;
300
+ }
301
+ default:
302
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unknown operation: ${operation}`, { itemIndex: i });
303
+ }
304
+ returnData.push({ json: (result ?? {}) });
305
+ }
306
+ catch (err) {
307
+ if (this.continueOnFail()) {
308
+ returnData.push({
309
+ json: {
310
+ error: (0, auth_1.sanitizeError)(err instanceof Error ? err.message : String(err)),
311
+ },
312
+ });
313
+ continue;
314
+ }
315
+ if (err instanceof n8n_workflow_1.NodeOperationError)
316
+ throw err;
317
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), (0, auth_1.sanitizeError)(err instanceof Error ? err.message : String(err)), { itemIndex: i });
318
+ }
319
+ }
320
+ return [returnData];
321
+ }
322
+ }
323
+ exports.DominusNodeAccount = DominusNodeAccount;
324
+ // ---------------------------------------------------------------------------
325
+ // Validation helpers
326
+ // ---------------------------------------------------------------------------
327
+ function validateEmail(ctx, email, itemIndex) {
328
+ const trimmed = (email ?? "").trim();
329
+ if (!trimmed || !EMAIL_RE.test(trimmed)) {
330
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), "A valid email address is required", { itemIndex });
331
+ }
332
+ if (trimmed.length > 254) {
333
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), "Email address too long (max 254 characters)", { itemIndex });
334
+ }
335
+ return trimmed;
336
+ }
337
+ function validatePassword(ctx, password, itemIndex) {
338
+ if (!password || password.length < 8) {
339
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), "Password must be at least 8 characters", { itemIndex });
340
+ }
341
+ if (password.length > 128) {
342
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), "Password must be at most 128 characters", { itemIndex });
343
+ }
344
+ return password;
345
+ }
346
+ //# sourceMappingURL=DominusNodeAccount.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DominusNodeAccount.node.js","sourceRoot":"","sources":["../../../src/nodes/DominusNodeAccount/DominusNodeAccount.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Dominus Node Keys n8n community node.
3
+ *
4
+ * Operations (3 tools):
5
+ * - List Keys: List all API keys
6
+ * - Create Key: Create a new API key
7
+ * - Revoke Key: Revoke an existing API key
8
+ *
9
+ * Security:
10
+ * - UUID validation for key IDs
11
+ * - Control character rejection in labels
12
+ * - Credential sanitization in error messages
13
+ *
14
+ * @module
15
+ */
16
+ import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from "n8n-workflow";
17
+ export declare class DominusNodeKeys implements INodeType {
18
+ description: INodeTypeDescription;
19
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
20
+ }