n8n-nodes-duo 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/LICENSE.md +21 -0
- package/README.md +81 -0
- package/dist/credentials/DuoSecurityApi.credentials.js +140 -0
- package/dist/credentials/DuoSecurityApi.credentials.js.map +6 -0
- package/dist/nodes/DuoSecurity/DuoSecurity.node.js +610 -0
- package/dist/nodes/DuoSecurity/DuoSecurity.node.js.map +6 -0
- package/dist/nodes/DuoSecurity/V1/duo-dark.svg +37 -0
- package/dist/nodes/DuoSecurity/V1/duo.svg +37 -0
- package/dist/nodes/DuoSecurity/duo-dark.svg +37 -0
- package/dist/nodes/DuoSecurity/duo.svg +37 -0
- package/examples/workflows/check-api-health.json +81 -0
- package/examples/workflows/duo-human-in-the-loop-approval.json +154 -0
- package/examples/workflows/duo-human-in-the-loop-approval.md +49 -0
- package/package.json +73 -0
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
9
|
+
try {
|
|
10
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
11
|
+
} catch (e) {
|
|
12
|
+
throw mod = 0, e;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
var __export = (target, all) => {
|
|
16
|
+
for (var name in all)
|
|
17
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
18
|
+
};
|
|
19
|
+
var __copyProps = (to, from, except, desc) => {
|
|
20
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
21
|
+
for (let key of __getOwnPropNames(from))
|
|
22
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
23
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
24
|
+
}
|
|
25
|
+
return to;
|
|
26
|
+
};
|
|
27
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
28
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
29
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
30
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
31
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
32
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
33
|
+
mod
|
|
34
|
+
));
|
|
35
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
36
|
+
|
|
37
|
+
// ../wetomate-node-toolkit/dist/interfaces.js
|
|
38
|
+
var require_interfaces = __commonJS({
|
|
39
|
+
"../wetomate-node-toolkit/dist/interfaces.js"(exports2) {
|
|
40
|
+
"use strict";
|
|
41
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
42
|
+
exports2.WetomateNodePropertiesArray = void 0;
|
|
43
|
+
exports2.processOptionalCollections = processOptionalCollections2;
|
|
44
|
+
var WetomateNodePropertiesArray = class extends Array {
|
|
45
|
+
processParams(ctx, itemIndex) {
|
|
46
|
+
return this.reduce((params, prop) => {
|
|
47
|
+
const value = ctx.getNodeParameter(prop.name, itemIndex, "ignore");
|
|
48
|
+
if (value !== "ignore") {
|
|
49
|
+
if (prop.process) {
|
|
50
|
+
const processed = prop.process(value, ctx);
|
|
51
|
+
if (processed) {
|
|
52
|
+
if (typeof processed === "object") {
|
|
53
|
+
Object.assign(params, processed);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
} else {
|
|
57
|
+
params[prop.name] = String(value).trim();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return params;
|
|
61
|
+
}, {});
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
exports2.WetomateNodePropertiesArray = WetomateNodePropertiesArray;
|
|
65
|
+
function processOptionalCollections2(value) {
|
|
66
|
+
const processed = {};
|
|
67
|
+
for (const [key, val] of Object.entries(value)) {
|
|
68
|
+
const strValue = String(val).trim();
|
|
69
|
+
if (val !== void 0 && val !== null) {
|
|
70
|
+
processed[key] = strValue;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return Object.keys(processed).length ? processed : {};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// ../wetomate-node-toolkit/dist/parameter-mapping.js
|
|
79
|
+
var require_parameter_mapping = __commonJS({
|
|
80
|
+
"../wetomate-node-toolkit/dist/parameter-mapping.js"(exports2) {
|
|
81
|
+
"use strict";
|
|
82
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
83
|
+
exports2.mapNodeParameters = mapNodeParameters2;
|
|
84
|
+
function mapNodeParameters2(context, itemIndex, rules) {
|
|
85
|
+
return rules.reduce((parameters, rule) => {
|
|
86
|
+
var _a;
|
|
87
|
+
const value = context.getNodeParameter(rule.parameter, itemIndex, null);
|
|
88
|
+
if (value === null || value === void 0)
|
|
89
|
+
return parameters;
|
|
90
|
+
if (rule.transform) {
|
|
91
|
+
const transformed = rule.transform(value, { context, itemIndex });
|
|
92
|
+
if (transformed)
|
|
93
|
+
Object.assign(parameters, transformed);
|
|
94
|
+
return parameters;
|
|
95
|
+
}
|
|
96
|
+
parameters[(_a = rule.target) !== null && _a !== void 0 ? _a : rule.parameter] = String(value).trim();
|
|
97
|
+
return parameters;
|
|
98
|
+
}, {});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// ../wetomate-node-toolkit/dist/index.js
|
|
104
|
+
var require_dist = __commonJS({
|
|
105
|
+
"../wetomate-node-toolkit/dist/index.js"(exports2) {
|
|
106
|
+
"use strict";
|
|
107
|
+
var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
|
|
108
|
+
if (k2 === void 0) k2 = k;
|
|
109
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
110
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
111
|
+
desc = { enumerable: true, get: function() {
|
|
112
|
+
return m[k];
|
|
113
|
+
} };
|
|
114
|
+
}
|
|
115
|
+
Object.defineProperty(o, k2, desc);
|
|
116
|
+
}) : (function(o, m, k, k2) {
|
|
117
|
+
if (k2 === void 0) k2 = k;
|
|
118
|
+
o[k2] = m[k];
|
|
119
|
+
}));
|
|
120
|
+
var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {
|
|
121
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
|
|
122
|
+
};
|
|
123
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
124
|
+
__exportStar(require_interfaces(), exports2);
|
|
125
|
+
__exportStar(require_parameter_mapping(), exports2);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// nodes/DuoSecurity/DuoSecurity.node.ts
|
|
130
|
+
var DuoSecurity_node_exports = {};
|
|
131
|
+
__export(DuoSecurity_node_exports, {
|
|
132
|
+
DuoSecurity: () => DuoSecurity
|
|
133
|
+
});
|
|
134
|
+
module.exports = __toCommonJS(DuoSecurity_node_exports);
|
|
135
|
+
var import_n8n_workflow2 = require("n8n-workflow");
|
|
136
|
+
|
|
137
|
+
// nodes/DuoSecurity/V1/DuoSecurityV1.node.ts
|
|
138
|
+
var import_n8n_workflow = require("n8n-workflow");
|
|
139
|
+
|
|
140
|
+
// nodes/DuoSecurity/V1/duoProperties.ts
|
|
141
|
+
var commonExtraAuthFields = [
|
|
142
|
+
{
|
|
143
|
+
displayName: "Hostname",
|
|
144
|
+
name: "hostname",
|
|
145
|
+
type: "string",
|
|
146
|
+
default: "",
|
|
147
|
+
placeholder: "Ex: johns-laptop or webserver01.company.com",
|
|
148
|
+
description: "The host name of the device accessing the application"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
displayName: "IP Address",
|
|
152
|
+
name: "ipaddr",
|
|
153
|
+
type: "string",
|
|
154
|
+
default: "",
|
|
155
|
+
placeholder: "Ex: 192.168.1.1",
|
|
156
|
+
description: "If an Auth API client does not send the ipaddr (IP address of the user) value in a request, policy settings based on available IP address information have no effect"
|
|
157
|
+
}
|
|
158
|
+
];
|
|
159
|
+
var duoProperties = [
|
|
160
|
+
{
|
|
161
|
+
displayName: "Endpoints",
|
|
162
|
+
name: "endpoint",
|
|
163
|
+
type: "options",
|
|
164
|
+
options: [
|
|
165
|
+
{
|
|
166
|
+
name: "AUTH",
|
|
167
|
+
value: "auth",
|
|
168
|
+
description: "The /auth endpoint performs second-factor authentication for a user by sending a push notification to the user's smartphone app, verifying a passcode, or placing a phone call"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: "AUTH STATUS",
|
|
172
|
+
value: "auth_status",
|
|
173
|
+
description: 'The /auth_status endpoint "long-polls" for the next status update from the authentication process for a given transaction'
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: "CHECK",
|
|
177
|
+
value: "check",
|
|
178
|
+
description: "The /check endpoint can be called to verify that the Auth API integration and secret keys are valid, and that the signature is being generated properly"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: "LOGO",
|
|
182
|
+
value: "logo",
|
|
183
|
+
description: "The /logo endpoint provides a programmatic way to retrieve your stored logo"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: "PING",
|
|
187
|
+
value: "ping",
|
|
188
|
+
description: "The /ping endpoint acts as a 'liveness check' that can be called to verify that Duo is up before trying to call other Auth API endpoints"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: "PREAUTH",
|
|
192
|
+
value: "preauth",
|
|
193
|
+
description: "The /preauth endpoint determines whether a user is authorized to log in, and (if so) returns the user's available authentication factors"
|
|
194
|
+
}
|
|
195
|
+
],
|
|
196
|
+
default: "auth",
|
|
197
|
+
description: "Choose an Endpoints",
|
|
198
|
+
builderHint: {
|
|
199
|
+
message: "Choose PING to check availability, PREAUTH to check user access, AUTH to start authentication, or AUTH STATUS to read an asynchronous authentication result."
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
displayName: "Identify User By",
|
|
204
|
+
name: "userIdentifier",
|
|
205
|
+
type: "resourceLocator",
|
|
206
|
+
default: { mode: "username", value: "" },
|
|
207
|
+
required: true,
|
|
208
|
+
description: "User_id: Permanent Duo-generated ID. Always points to the same user, even if their username changes. Best for stable references. username: App-level identifier (e.g., user@domain.com). Easier to use with existing systems, but may break if the username or alias changes.",
|
|
209
|
+
builderHint: {
|
|
210
|
+
message: "Use the stable Duo user ID when available; otherwise use the username known by the application."
|
|
211
|
+
},
|
|
212
|
+
modes: [
|
|
213
|
+
{
|
|
214
|
+
displayName: "Username",
|
|
215
|
+
name: "username",
|
|
216
|
+
type: "list",
|
|
217
|
+
placeholder: "Ex: John Miller"
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
displayName: "User ID",
|
|
221
|
+
name: "user_id",
|
|
222
|
+
type: "list",
|
|
223
|
+
placeholder: "Ex: DUT7R9FA3APHMTQEXHSO"
|
|
224
|
+
}
|
|
225
|
+
],
|
|
226
|
+
displayOptions: {
|
|
227
|
+
show: {
|
|
228
|
+
endpoint: ["auth", "preauth"]
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
displayName: "Transaction ID",
|
|
234
|
+
name: "txid",
|
|
235
|
+
type: "string",
|
|
236
|
+
default: "",
|
|
237
|
+
placeholder: "Ex: 56477e31-97bb-45ca-a7c0-e8d6e13c63dc",
|
|
238
|
+
description: "The transaction ID of the authentication attempt, as returned by the /auth endpoint",
|
|
239
|
+
builderHint: {
|
|
240
|
+
message: "Use the transaction ID returned by AUTH when checking an asynchronous authentication attempt."
|
|
241
|
+
},
|
|
242
|
+
displayOptions: {
|
|
243
|
+
show: {
|
|
244
|
+
endpoint: ["auth_status"]
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
displayName: "Authentication Factor",
|
|
250
|
+
name: "factor",
|
|
251
|
+
type: "options",
|
|
252
|
+
options: [
|
|
253
|
+
{
|
|
254
|
+
name: "Auto",
|
|
255
|
+
value: "auto",
|
|
256
|
+
description: "Use the out-of-band factor (push or phone) recommended by Duo as the best for the user's devices"
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
name: "Passcode",
|
|
260
|
+
value: "passcode",
|
|
261
|
+
description: "Authenticate the user with a passcode (from Duo Mobile, SMS, hardware token, or bypass code)"
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
name: "Phone Call",
|
|
265
|
+
value: "phone",
|
|
266
|
+
description: "Authenticate the user with phone callback"
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: "Push Notification",
|
|
270
|
+
value: "push",
|
|
271
|
+
description: "Authenticate the user with Duo Push"
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
name: "SMS Message",
|
|
275
|
+
value: "sms",
|
|
276
|
+
description: 'Send SMS passcodes, but it won\u2019t authenticate\u2014always returns "deny"; re-prompt user afterward'
|
|
277
|
+
}
|
|
278
|
+
],
|
|
279
|
+
default: "push",
|
|
280
|
+
displayOptions: {
|
|
281
|
+
show: {
|
|
282
|
+
endpoint: ["auth"]
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
required: true,
|
|
286
|
+
description: "Factor to use for authentication",
|
|
287
|
+
builderHint: {
|
|
288
|
+
message: "Use Push Notification for an approval request, or choose another factor only when the workflow requires it."
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
displayName: "Passcode",
|
|
293
|
+
name: "passcode",
|
|
294
|
+
type: "string",
|
|
295
|
+
default: "",
|
|
296
|
+
placeholder: "Ex: 123456",
|
|
297
|
+
displayOptions: {
|
|
298
|
+
show: {
|
|
299
|
+
endpoint: ["auth"],
|
|
300
|
+
factor: ["passcode"]
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
description: "Passcode entered by the user"
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
displayName: "Device",
|
|
307
|
+
name: "device",
|
|
308
|
+
type: "string",
|
|
309
|
+
default: "auto",
|
|
310
|
+
placeholder: "auto or device ID",
|
|
311
|
+
displayOptions: {
|
|
312
|
+
show: {
|
|
313
|
+
endpoint: ["auth"],
|
|
314
|
+
factor: ["auto", "push", "phone", "sms"]
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
description: "Identifies which of the user's devices this is"
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
displayName: "Push Info",
|
|
321
|
+
name: "pushinfo",
|
|
322
|
+
placeholder: "Add key/value",
|
|
323
|
+
type: "fixedCollection",
|
|
324
|
+
typeOptions: {
|
|
325
|
+
multipleValues: true
|
|
326
|
+
},
|
|
327
|
+
default: {},
|
|
328
|
+
description: "Optional key/value pairs with context for the authentication attempt, shown in Duo Mobile (e.g., from=login portal&domain=example.com), total length under 20 KB",
|
|
329
|
+
builderHint: {
|
|
330
|
+
message: "Include only non-secret context such as the event, action, and target shown to the approver."
|
|
331
|
+
},
|
|
332
|
+
displayOptions: {
|
|
333
|
+
show: {
|
|
334
|
+
endpoint: ["auth"],
|
|
335
|
+
"/factor": ["push"]
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
options: [
|
|
339
|
+
{
|
|
340
|
+
displayName: "Key-Value Pairs",
|
|
341
|
+
name: "pairs",
|
|
342
|
+
values: [
|
|
343
|
+
{
|
|
344
|
+
displayName: "Key",
|
|
345
|
+
name: "key",
|
|
346
|
+
type: "string",
|
|
347
|
+
default: ""
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
displayName: "Value",
|
|
351
|
+
name: "value",
|
|
352
|
+
type: "string",
|
|
353
|
+
default: ""
|
|
354
|
+
}
|
|
355
|
+
]
|
|
356
|
+
}
|
|
357
|
+
]
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
displayName: "Auth Optional Fields",
|
|
361
|
+
name: "authOptionalFields",
|
|
362
|
+
type: "collection",
|
|
363
|
+
placeholder: "Add Field",
|
|
364
|
+
displayOptions: {
|
|
365
|
+
show: {
|
|
366
|
+
endpoint: ["auth"]
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
default: {},
|
|
370
|
+
options: [
|
|
371
|
+
{
|
|
372
|
+
displayName: "Async",
|
|
373
|
+
name: "async",
|
|
374
|
+
type: "boolean",
|
|
375
|
+
default: true,
|
|
376
|
+
description: "Whether you enable async, your application provides this parameter with a value of true, /auth will immediately return a transaction ID and will be able to retrieve real-time status updates from the authentication process"
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
displayName: "Display Username",
|
|
380
|
+
name: "display_username",
|
|
381
|
+
type: "string",
|
|
382
|
+
default: "",
|
|
383
|
+
placeholder: "Ex: John Miller",
|
|
384
|
+
description: "String to display in Duo Mobile in place of the user's Duo username",
|
|
385
|
+
displayOptions: {
|
|
386
|
+
show: {
|
|
387
|
+
"/factor": ["push"]
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
...commonExtraAuthFields,
|
|
392
|
+
{
|
|
393
|
+
displayName: "Type",
|
|
394
|
+
name: "type",
|
|
395
|
+
type: "string",
|
|
396
|
+
default: "",
|
|
397
|
+
placeholder: "Ex: Login, Admin Access, SSH...",
|
|
398
|
+
description: "This string appears in Duo Mobile push notifications and UI. By default, Duo shows a standard phrase with the app name, but you can provide a custom string (not localized) to replace it.",
|
|
399
|
+
displayOptions: {
|
|
400
|
+
show: {
|
|
401
|
+
"/factor": ["push"]
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
]
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
displayName: "PreAuth Optional Fields",
|
|
409
|
+
name: "preAuthOptionalFields",
|
|
410
|
+
type: "collection",
|
|
411
|
+
placeholder: "Add Field",
|
|
412
|
+
displayOptions: {
|
|
413
|
+
show: {
|
|
414
|
+
endpoint: ["preauth"]
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
default: {},
|
|
418
|
+
options: [
|
|
419
|
+
{
|
|
420
|
+
displayName: "Verified Push Support?",
|
|
421
|
+
name: "clientSupportsVerifiedPush",
|
|
422
|
+
type: "boolean",
|
|
423
|
+
default: false,
|
|
424
|
+
description: "Whether set to 1 or not determines if your client supports Verified Duo Push; without it, the API assumes no support, ignores related policy, and push may be unavailable under certain risk-based restrictions"
|
|
425
|
+
},
|
|
426
|
+
...commonExtraAuthFields,
|
|
427
|
+
{
|
|
428
|
+
displayName: "Trusted Device Token",
|
|
429
|
+
name: "trustedDeviceToken",
|
|
430
|
+
type: "string",
|
|
431
|
+
typeOptions: { password: true },
|
|
432
|
+
default: "",
|
|
433
|
+
placeholder: "Ex: REkxSzP00Ld4ddEVTRZOUlYMEl8RFVVQkdJ05HwUldRRThJR1VTNE0=||1627133735|8356ef7779bb0ec4c28ca9b04dc50493c4d2e05e",
|
|
434
|
+
description: "If trusted_device_token is present and the policy allows Remembered Devices, the API returns 'allow' for the token's lifetime set by the administrator"
|
|
435
|
+
}
|
|
436
|
+
]
|
|
437
|
+
}
|
|
438
|
+
];
|
|
439
|
+
|
|
440
|
+
// nodes/DuoSecurity/V1/duoParameterMapping.ts
|
|
441
|
+
var import_n8n_node_toolkit = __toESM(require_dist());
|
|
442
|
+
var duoParameterRules = [
|
|
443
|
+
{
|
|
444
|
+
parameter: "userIdentifier",
|
|
445
|
+
transform: (value) => {
|
|
446
|
+
if (!value || typeof value !== "object") return;
|
|
447
|
+
const { mode, value: identifier } = value;
|
|
448
|
+
return mode && identifier ? { [mode]: identifier } : void 0;
|
|
449
|
+
}
|
|
450
|
+
},
|
|
451
|
+
{ parameter: "txid" },
|
|
452
|
+
{ parameter: "factor" },
|
|
453
|
+
{ parameter: "passcode" },
|
|
454
|
+
{ parameter: "device" },
|
|
455
|
+
{
|
|
456
|
+
parameter: "pushinfo",
|
|
457
|
+
transform: (value) => {
|
|
458
|
+
if (!value || typeof value !== "object") return;
|
|
459
|
+
const pairs = value.pairs;
|
|
460
|
+
if (!Array.isArray(pairs)) return;
|
|
461
|
+
const pushinfo = pairs.filter((pair) => pair.key && pair.value).map((pair) => `${pair.key}=${encodeURIComponent(pair.value)}`).join("&");
|
|
462
|
+
return pushinfo ? { pushinfo } : void 0;
|
|
463
|
+
}
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
parameter: "authOptionalFields",
|
|
467
|
+
transform: (value) => value && typeof value === "object" ? (0, import_n8n_node_toolkit.processOptionalCollections)(value) : void 0
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
parameter: "preAuthOptionalFields",
|
|
471
|
+
transform: (value) => value && typeof value === "object" ? (0, import_n8n_node_toolkit.processOptionalCollections)(value) : void 0
|
|
472
|
+
}
|
|
473
|
+
];
|
|
474
|
+
function mapDuoParameters(context, itemIndex) {
|
|
475
|
+
return (0, import_n8n_node_toolkit.mapNodeParameters)(context, itemIndex, duoParameterRules);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// nodes/DuoSecurity/utils/duoUtils.ts
|
|
479
|
+
function sortParams(input) {
|
|
480
|
+
return Object.fromEntries(
|
|
481
|
+
Object.entries(input).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)
|
|
482
|
+
);
|
|
483
|
+
}
|
|
484
|
+
function safeStringify(obj) {
|
|
485
|
+
return obj ? JSON.stringify(sortParams(obj)) : "";
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// nodes/DuoSecurity/V1/DuoSecurityV1.node.ts
|
|
489
|
+
var versionDescription = {
|
|
490
|
+
displayName: "Duo Security",
|
|
491
|
+
name: "duoSecurity",
|
|
492
|
+
icon: { light: "file:duo.svg", dark: "file:duo-dark.svg" },
|
|
493
|
+
group: ["transform"],
|
|
494
|
+
subtitle: "Duo Security Multi-factor Authentication/Authorization",
|
|
495
|
+
version: 1,
|
|
496
|
+
description: "Connects n8n workflows to Duo Security for user verification and second-factor authentication.",
|
|
497
|
+
builderHint: {
|
|
498
|
+
message: "Use for Duo user verification, pre-authentication, Duo Push approval, passcode authentication, or authentication status checks."
|
|
499
|
+
},
|
|
500
|
+
defaults: {
|
|
501
|
+
name: "Duo Security"
|
|
502
|
+
},
|
|
503
|
+
inputs: [import_n8n_workflow.NodeConnectionTypes.Main],
|
|
504
|
+
outputs: [import_n8n_workflow.NodeConnectionTypes.Main],
|
|
505
|
+
credentials: [
|
|
506
|
+
{
|
|
507
|
+
name: "duoSecurityApi",
|
|
508
|
+
required: true
|
|
509
|
+
}
|
|
510
|
+
],
|
|
511
|
+
hints: [
|
|
512
|
+
{
|
|
513
|
+
message: "The AUTH operation sends a real authentication challenge to the selected user.",
|
|
514
|
+
type: "warning",
|
|
515
|
+
location: "ndv",
|
|
516
|
+
whenToDisplay: "always",
|
|
517
|
+
displayCondition: '={{ $parameter["endpoint"] === "auth" }}'
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
message: "For asynchronous authentication, pass the transaction ID returned by AUTH to AUTH STATUS.",
|
|
521
|
+
type: "info",
|
|
522
|
+
location: "ndv",
|
|
523
|
+
whenToDisplay: "always",
|
|
524
|
+
displayCondition: '={{ $parameter["endpoint"] === "auth_status" }}'
|
|
525
|
+
}
|
|
526
|
+
],
|
|
527
|
+
properties: duoProperties,
|
|
528
|
+
usableAsTool: {
|
|
529
|
+
replacements: {
|
|
530
|
+
description: "Use Duo Security to verify a user or start a second-factor authentication challenge. Use PREAUTH before AUTH when checking whether a user can authenticate. Use Push Notification for administrator approvals and include only non-secret context in Push Info. Treat only an explicit result.response.result of allow as approval; never continue after a missing, denied, expired, or failed response."
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
};
|
|
534
|
+
var DuoSecurityV1 = class {
|
|
535
|
+
constructor(baseDescription) {
|
|
536
|
+
this.description = {
|
|
537
|
+
displayName: "Duo Security",
|
|
538
|
+
name: "duoSecurity",
|
|
539
|
+
icon: { light: "file:duo.svg", dark: "file:duo-dark.svg" },
|
|
540
|
+
group: ["transform"],
|
|
541
|
+
subtitle: "Duo Security Multi-factor Authentication/Authorization",
|
|
542
|
+
version: 1,
|
|
543
|
+
description: "Duo Security authentication operations",
|
|
544
|
+
defaults: { name: "Duo Security" },
|
|
545
|
+
inputs: [],
|
|
546
|
+
outputs: [],
|
|
547
|
+
properties: [],
|
|
548
|
+
usableAsTool: true
|
|
549
|
+
};
|
|
550
|
+
this.description = {
|
|
551
|
+
icon: { light: "file:duo.svg", dark: "file:duo-dark.svg" },
|
|
552
|
+
...baseDescription,
|
|
553
|
+
...versionDescription
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
async execute() {
|
|
557
|
+
const items = this.getInputData();
|
|
558
|
+
const returnData = [];
|
|
559
|
+
for (let i = 0; i < items.length; i++) {
|
|
560
|
+
const endpoint = this.getNodeParameter("endpoint", i);
|
|
561
|
+
const method = endpoint === "auth" || endpoint === "preauth" ? "POST" : "GET";
|
|
562
|
+
const isPost = method.toLowerCase() === "post";
|
|
563
|
+
const processedParams = mapDuoParameters(this, i);
|
|
564
|
+
const requestOptions = {
|
|
565
|
+
method,
|
|
566
|
+
url: `/auth/v2/${endpoint}`,
|
|
567
|
+
json: true,
|
|
568
|
+
body: isPost ? safeStringify(processedParams) : safeStringify({}),
|
|
569
|
+
qs: isPost ? {} : processedParams,
|
|
570
|
+
headers: {
|
|
571
|
+
"Content-Type": "application/json"
|
|
572
|
+
}
|
|
573
|
+
};
|
|
574
|
+
const response = await this.helpers.httpRequestWithAuthentication.call(
|
|
575
|
+
this,
|
|
576
|
+
"duoSecurityApi",
|
|
577
|
+
requestOptions
|
|
578
|
+
);
|
|
579
|
+
returnData.push({
|
|
580
|
+
json: { result: response },
|
|
581
|
+
pairedItem: { item: i }
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
return [returnData];
|
|
585
|
+
}
|
|
586
|
+
};
|
|
587
|
+
|
|
588
|
+
// nodes/DuoSecurity/DuoSecurity.node.ts
|
|
589
|
+
var DuoSecurity = class extends import_n8n_workflow2.VersionedNodeType {
|
|
590
|
+
constructor() {
|
|
591
|
+
const baseDescription = {
|
|
592
|
+
displayName: "Duo Security",
|
|
593
|
+
name: "duoSecurity",
|
|
594
|
+
icon: "file:duo.svg",
|
|
595
|
+
group: ["transform"],
|
|
596
|
+
subtitle: "Duo Security Multi-factor Authentication/Authorization",
|
|
597
|
+
defaultVersion: 1,
|
|
598
|
+
description: "Duo Security, is a two-factor authentication (2FA) and identity security solution that enhances online security by verifying user identities"
|
|
599
|
+
};
|
|
600
|
+
const nodeVersions = {
|
|
601
|
+
1: new DuoSecurityV1(baseDescription)
|
|
602
|
+
};
|
|
603
|
+
super(nodeVersions, baseDescription);
|
|
604
|
+
}
|
|
605
|
+
};
|
|
606
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
607
|
+
0 && (module.exports = {
|
|
608
|
+
DuoSecurity
|
|
609
|
+
});
|
|
610
|
+
//# sourceMappingURL=DuoSecurity.node.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../wetomate-node-toolkit/src/interfaces.ts", "../../../../wetomate-node-toolkit/src/parameter-mapping.ts", "../../../../wetomate-node-toolkit/src/index.ts", "../../../nodes/DuoSecurity/DuoSecurity.node.ts", "../../../nodes/DuoSecurity/V1/DuoSecurityV1.node.ts", "../../../nodes/DuoSecurity/V1/duoProperties.ts", "../../../nodes/DuoSecurity/V1/duoParameterMapping.ts", "../../../nodes/DuoSecurity/utils/duoUtils.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["exports", "processOptionalCollections", "exports", "mapNodeParameters", "exports", "import_n8n_workflow"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1"
|
|
3
|
+
viewBox="0 0 211.1 211.1"><!--Generator: Adobe Illustrator 29.3.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 151)-->
|
|
4
|
+
<defs>
|
|
5
|
+
<style>.st0 {
|
|
6
|
+
fill: #4d4d4f;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.st1 {
|
|
10
|
+
opacity: .8;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.st1, .st2 {
|
|
14
|
+
fill: #74bf4b;
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</defs>
|
|
18
|
+
<g transform="translate(0 54.35)">
|
|
19
|
+
<path class="st1" d="M.3,102.4h34c18.2,0,33.1-14.3,34-32.3H.3v32.3h0Z"/>
|
|
20
|
+
<path class="st2" d="M34.3,34.3H.3v32.3h68c-.9-18-15.8-32.3-34-32.3"/>
|
|
21
|
+
<path class="st2" d="M177.2,34.3c-18.2,0-33.1,14.3-34,32.3h67.9c-.9-18-15.8-32.3-34-32.3"/>
|
|
22
|
+
<path class="st1" d="M177.2,102.4c18.2,0,33.1-14.3,34-32.3h-67.9c.9,18,15.8,32.3,34,32.3"/>
|
|
23
|
+
<path class="st2" d="M71.7,34.3v34c0,18.2,14.3,33.1,32.3,34V34.3h-32.3Z"/>
|
|
24
|
+
<polygon class="st1" points="107.4 34.3 107.4 102.4 139.8 102.4 139.8 68.3 139.8 34.3 107.4 34.3"/>
|
|
25
|
+
</g>
|
|
26
|
+
<g>
|
|
27
|
+
<rect class="st0" x="18.7" y=".3" width="4.3" height="17"/>
|
|
28
|
+
<path class="st0"
|
|
29
|
+
d="M44.4,8.8c0,5.5,4.2,8.8,9,8.8s3.3-.5,3.9-.6v-4.6c-.2,0-1.6.9-3.6.9-2.8,0-4.7-2-4.7-4.5s1.9-4.5,4.7-4.5,3.4.8,3.6.9V.6c-.4-.1-1.9-.6-3.9-.6-5.2,0-9,3.7-9,8.8Z"/>
|
|
30
|
+
<path class="st0"
|
|
31
|
+
d="M0,8.8c0,5.5,4.2,8.8,9,8.8s3.3-.5,3.9-.6v-4.6c-.2,0-1.6.9-3.6.9-2.8,0-4.7-2-4.7-4.5s1.9-4.5,4.7-4.5,3.4.8,3.6.9V.6c-.4-.1-1.9-.6-3.9-.6C3.8,0,0,3.7,0,8.8Z"/>
|
|
32
|
+
<path class="st0"
|
|
33
|
+
d="M70.6,0c-5.2,0-8.9,3.9-8.9,8.8s3.7,8.8,8.9,8.8,8.9-3.9,8.9-8.8S75.8,0,70.6,0ZM70.6,13.3c-2.5,0-4.4-2-4.4-4.5s1.9-4.5,4.4-4.5,4.4,2,4.4,4.5-1.9,4.5-4.4,4.5Z"/>
|
|
34
|
+
<path class="st0"
|
|
35
|
+
d="M36.2,7l-1.2-.4c-.7-.2-1.9-.6-1.9-1.6s.9-1.4,2.6-1.4,3.3.5,3.3.5V.5c-.1,0-2.1-.5-4.1-.5-3.9,0-6.3,2.1-6.3,5.3s2,4.2,4.3,5c.3,0,.7.2.9.3,1.1.3,1.9.8,1.9,1.7s-1,1.6-3.1,1.6-3.6-.5-4-.6v3.9c.2,0,2.3.5,4.6.5,3.3,0,7-1.4,7-5.7s-1.3-4-4-4.9Z"/>
|
|
36
|
+
</g>
|
|
37
|
+
</svg>
|