n8n-core 2.25.2 → 2.26.1

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 (87) hide show
  1. package/dist/binary-data/file-system.manager.d.ts +1 -1
  2. package/dist/build.tsbuildinfo +1 -1
  3. package/dist/errors/error-reporter.js +2 -0
  4. package/dist/errors/error-reporter.js.map +1 -1
  5. package/dist/errors/workflow-has-issues.error.d.ts +2 -1
  6. package/dist/errors/workflow-has-issues.error.js +24 -2
  7. package/dist/errors/workflow-has-issues.error.js.map +1 -1
  8. package/dist/execution-engine/active-workflows.d.ts +3 -3
  9. package/dist/execution-engine/active-workflows.js +16 -16
  10. package/dist/execution-engine/active-workflows.js.map +1 -1
  11. package/dist/execution-engine/index.d.ts +5 -9
  12. package/dist/execution-engine/node-execution-context/base-execute-context.d.ts +8 -2
  13. package/dist/execution-engine/node-execution-context/base-execute-context.js +1 -1
  14. package/dist/execution-engine/node-execution-context/base-execute-context.js.map +1 -1
  15. package/dist/execution-engine/node-execution-context/credentials-test-context.js +2 -2
  16. package/dist/execution-engine/node-execution-context/credentials-test-context.js.map +1 -1
  17. package/dist/execution-engine/node-execution-context/index.d.ts +0 -1
  18. package/dist/execution-engine/node-execution-context/index.js +1 -3
  19. package/dist/execution-engine/node-execution-context/index.js.map +1 -1
  20. package/dist/execution-engine/node-execution-context/local-load-options-context.js +3 -2
  21. package/dist/execution-engine/node-execution-context/local-load-options-context.js.map +1 -1
  22. package/dist/execution-engine/node-execution-context/node-execution-context.d.ts +9 -3
  23. package/dist/execution-engine/node-execution-context/node-execution-context.js +3 -1
  24. package/dist/execution-engine/node-execution-context/node-execution-context.js.map +1 -1
  25. package/dist/execution-engine/node-execution-context/utils/request-helper-functions.d.ts +1 -18
  26. package/dist/execution-engine/node-execution-context/utils/request-helper-functions.js +3 -1058
  27. package/dist/execution-engine/node-execution-context/utils/request-helper-functions.js.map +1 -1
  28. package/dist/execution-engine/node-execution-context/utils/request-helpers/authentication.d.ts +3 -0
  29. package/dist/execution-engine/node-execution-context/utils/request-helpers/authentication.js +117 -0
  30. package/dist/execution-engine/node-execution-context/utils/request-helpers/authentication.js.map +1 -0
  31. package/dist/execution-engine/node-execution-context/utils/request-helpers/axios-utils.d.ts +4 -2
  32. package/dist/execution-engine/node-execution-context/utils/request-helpers/axios-utils.js +18 -0
  33. package/dist/execution-engine/node-execution-context/utils/request-helpers/axios-utils.js.map +1 -1
  34. package/dist/execution-engine/node-execution-context/utils/request-helpers/factory.d.ts +2 -0
  35. package/dist/execution-engine/node-execution-context/utils/request-helpers/factory.js +78 -0
  36. package/dist/execution-engine/node-execution-context/utils/request-helpers/factory.js.map +1 -0
  37. package/dist/execution-engine/node-execution-context/utils/request-helpers/http-request.d.ts +7 -0
  38. package/dist/execution-engine/node-execution-context/utils/request-helpers/http-request.js +146 -0
  39. package/dist/execution-engine/node-execution-context/utils/request-helpers/http-request.js.map +1 -0
  40. package/dist/execution-engine/node-execution-context/utils/request-helpers/index.d.ts +2 -1
  41. package/dist/execution-engine/node-execution-context/utils/request-helpers/index.js +4 -14
  42. package/dist/execution-engine/node-execution-context/utils/request-helpers/index.js.map +1 -1
  43. package/dist/execution-engine/node-execution-context/utils/request-helpers/legacy-request-adapter.d.ts +5 -0
  44. package/dist/execution-engine/node-execution-context/utils/request-helpers/legacy-request-adapter.js +301 -0
  45. package/dist/execution-engine/node-execution-context/utils/request-helpers/legacy-request-adapter.js.map +1 -0
  46. package/dist/execution-engine/node-execution-context/utils/request-helpers/oauth.d.ts +5 -0
  47. package/dist/execution-engine/node-execution-context/utils/request-helpers/oauth.js +288 -0
  48. package/dist/execution-engine/node-execution-context/utils/request-helpers/oauth.js.map +1 -0
  49. package/dist/execution-engine/node-execution-context/utils/{outbound-user-agent.js → request-helpers/outbound-user-agent.js} +2 -2
  50. package/dist/execution-engine/node-execution-context/utils/request-helpers/outbound-user-agent.js.map +1 -0
  51. package/dist/execution-engine/node-execution-context/utils/request-helpers/pagination.d.ts +4 -0
  52. package/dist/execution-engine/node-execution-context/utils/request-helpers/pagination.js +165 -0
  53. package/dist/execution-engine/node-execution-context/utils/request-helpers/pagination.js.map +1 -0
  54. package/dist/execution-engine/triggers-and-pollers.d.ts +2 -2
  55. package/dist/execution-engine/triggers-and-pollers.js +2 -2
  56. package/dist/execution-engine/triggers-and-pollers.js.map +1 -1
  57. package/dist/execution-engine/workflow-execute.js +24 -3
  58. package/dist/execution-engine/workflow-execute.js.map +1 -1
  59. package/dist/index.d.ts +1 -0
  60. package/dist/index.js +1 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/nodes-loader/directory-loader.js +8 -2
  63. package/dist/nodes-loader/directory-loader.js.map +1 -1
  64. package/dist/ssrf/dns-resolver.d.ts +13 -0
  65. package/dist/ssrf/dns-resolver.js +93 -0
  66. package/dist/ssrf/dns-resolver.js.map +1 -0
  67. package/dist/ssrf/hostname-matcher.d.ts +6 -0
  68. package/dist/ssrf/hostname-matcher.js +38 -0
  69. package/dist/ssrf/hostname-matcher.js.map +1 -0
  70. package/dist/ssrf/in-memory-dns-cache.service.d.ts +11 -0
  71. package/dist/ssrf/in-memory-dns-cache.service.js +61 -0
  72. package/dist/ssrf/in-memory-dns-cache.service.js.map +1 -0
  73. package/dist/ssrf/index.d.ts +5 -0
  74. package/dist/ssrf/index.js +10 -0
  75. package/dist/ssrf/index.js.map +1 -0
  76. package/dist/ssrf/ip-range-builder.d.ts +10 -0
  77. package/dist/ssrf/ip-range-builder.js +52 -0
  78. package/dist/ssrf/ip-range-builder.js.map +1 -0
  79. package/dist/ssrf/ssrf-blocked-ip.error.d.ts +6 -0
  80. package/dist/ssrf/ssrf-blocked-ip.error.js +21 -0
  81. package/dist/ssrf/ssrf-blocked-ip.error.js.map +1 -0
  82. package/dist/ssrf/ssrf-protection.service.d.ts +30 -0
  83. package/dist/ssrf/ssrf-protection.service.js +159 -0
  84. package/dist/ssrf/ssrf-protection.service.js.map +1 -0
  85. package/package.json +21 -19
  86. package/dist/execution-engine/node-execution-context/utils/outbound-user-agent.js.map +0 -1
  87. /package/dist/execution-engine/node-execution-context/utils/{outbound-user-agent.d.ts → request-helpers/outbound-user-agent.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/execution-engine/node-execution-context/utils/request-helpers/index.ts"],"names":[],"mappings":";;;AAAA,6CAauB;AAZtB,mHAAA,oBAAoB,OAAA;AACpB,oHAAA,qBAAqB,OAAA;AACrB,0HAAA,2BAA2B,OAAA;AAC3B,kHAAA,mBAAmB,OAAA;AACnB,uHAAA,wBAAwB,OAAA;AACxB,iHAAA,kBAAkB,OAAA;AAClB,wHAAA,yBAAyB,OAAA;AACzB,8GAAA,eAAe,OAAA;AACf,0GAAA,WAAW,OAAA;AACX,6GAAA,cAAc,OAAA;AACd,oHAAA,qBAAqB,OAAA;AACrB,6GAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/execution-engine/node-execution-context/utils/request-helpers/index.ts"],"names":[],"mappings":";;;AACA,0BAAwB;AAExB,qCAAsD;AAA7C,oHAAA,yBAAyB,OAAA"}
@@ -0,0 +1,5 @@
1
+ import type { AxiosRequestConfig } from 'axios';
2
+ import type { INode, IRequestOptions, IWorkflowExecuteAdditionalData, Workflow } from 'n8n-workflow';
3
+ import type { SsrfBridge } from '../../../../ssrf';
4
+ export declare function parseRequestObject(requestObject: IRequestOptions, ssrfBridge?: SsrfBridge): Promise<AxiosRequestConfig<any>>;
5
+ export declare function proxyRequestToAxios(workflow: Workflow | undefined, additionalData: IWorkflowExecuteAdditionalData | undefined, node: INode | undefined, uriOrObject: string | IRequestOptions, options?: IRequestOptions): Promise<any>;
@@ -0,0 +1,301 @@
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.parseRequestObject = parseRequestObject;
7
+ exports.proxyRequestToAxios = proxyRequestToAxios;
8
+ const backend_common_1 = require("@n8n/backend-common");
9
+ const di_1 = require("@n8n/di");
10
+ const crypto_1 = __importDefault(require("crypto"));
11
+ const http_1 = require("http");
12
+ const pick_1 = __importDefault(require("lodash/pick"));
13
+ const n8n_workflow_1 = require("n8n-workflow");
14
+ const qs_1 = require("qs");
15
+ const stream_1 = require("stream");
16
+ const binary_helper_functions_1 = require("../binary-helper-functions");
17
+ const parse_incoming_message_1 = require("../parse-incoming-message");
18
+ const axios_utils_1 = require("./axios-utils");
19
+ const http_request_1 = require("./http-request");
20
+ const outbound_user_agent_1 = require("./outbound-user-agent");
21
+ async function parseRequestObject(requestObject, ssrfBridge) {
22
+ const axiosConfig = {};
23
+ if (requestObject.headers !== undefined) {
24
+ axiosConfig.headers = requestObject.headers;
25
+ }
26
+ const contentTypeHeaderKeyName = axiosConfig.headers &&
27
+ Object.keys(axiosConfig.headers).find((headerName) => headerName.toLowerCase() === 'content-type');
28
+ const contentType = contentTypeHeaderKeyName &&
29
+ axiosConfig.headers?.[contentTypeHeaderKeyName];
30
+ if (contentType === 'application/x-www-form-urlencoded' && requestObject.formData === undefined) {
31
+ if (typeof requestObject.body === 'string') {
32
+ axiosConfig.data = requestObject.body;
33
+ }
34
+ else {
35
+ const allData = Object.assign(requestObject.body || {}, requestObject.form || {});
36
+ if (requestObject.useQuerystring === true) {
37
+ axiosConfig.data = (0, qs_1.stringify)(allData, { arrayFormat: 'repeat' });
38
+ }
39
+ else {
40
+ axiosConfig.data = (0, qs_1.stringify)(allData);
41
+ }
42
+ }
43
+ }
44
+ else if (contentType?.includes('multipart/form-data')) {
45
+ if (requestObject.formData !== undefined && (0, axios_utils_1.isFormDataInstance)(requestObject.formData)) {
46
+ axiosConfig.data = requestObject.formData;
47
+ }
48
+ else {
49
+ const allData = {
50
+ ...requestObject.body,
51
+ ...requestObject.formData,
52
+ };
53
+ axiosConfig.data = (0, axios_utils_1.createFormDataObject)(allData);
54
+ }
55
+ delete axiosConfig.headers?.[contentTypeHeaderKeyName];
56
+ const headers = axiosConfig.data.getHeaders();
57
+ axiosConfig.headers = Object.assign(axiosConfig.headers || {}, headers);
58
+ await (0, axios_utils_1.generateContentLengthHeader)(axiosConfig);
59
+ }
60
+ else {
61
+ if (requestObject.form !== undefined && requestObject.body === undefined) {
62
+ axiosConfig.data =
63
+ typeof requestObject.form === 'string'
64
+ ? (0, qs_1.stringify)(requestObject.form, { format: 'RFC3986' })
65
+ : (0, qs_1.stringify)(requestObject.form).toString();
66
+ if (axiosConfig.headers !== undefined) {
67
+ const headerName = (0, axios_utils_1.searchForHeader)(axiosConfig, 'content-type');
68
+ if (headerName) {
69
+ delete axiosConfig.headers[headerName];
70
+ }
71
+ axiosConfig.headers['Content-Type'] = 'application/x-www-form-urlencoded';
72
+ }
73
+ else {
74
+ axiosConfig.headers = {
75
+ 'Content-Type': 'application/x-www-form-urlencoded',
76
+ };
77
+ }
78
+ }
79
+ else if (requestObject.formData !== undefined) {
80
+ if (axiosConfig.headers !== undefined) {
81
+ const headers = Object.keys(axiosConfig.headers);
82
+ headers.forEach((header) => {
83
+ if (header.toLowerCase() === 'content-type') {
84
+ delete axiosConfig.headers?.[header];
85
+ }
86
+ });
87
+ }
88
+ if ((0, axios_utils_1.isFormDataInstance)(requestObject.formData)) {
89
+ axiosConfig.data = requestObject.formData;
90
+ }
91
+ else {
92
+ axiosConfig.data = (0, axios_utils_1.createFormDataObject)(requestObject.formData);
93
+ }
94
+ const headers = axiosConfig.data.getHeaders();
95
+ axiosConfig.headers = Object.assign(axiosConfig.headers || {}, headers);
96
+ await (0, axios_utils_1.generateContentLengthHeader)(axiosConfig);
97
+ }
98
+ else if (requestObject.body !== undefined) {
99
+ if (requestObject.form !== undefined && requestObject.body) {
100
+ requestObject.body = Object.assign(requestObject.body, requestObject.form);
101
+ }
102
+ axiosConfig.data = requestObject.body;
103
+ }
104
+ }
105
+ if (requestObject.uri !== undefined) {
106
+ axiosConfig.url = requestObject.uri?.toString();
107
+ }
108
+ if (requestObject.url !== undefined) {
109
+ axiosConfig.url = requestObject.url?.toString();
110
+ }
111
+ if (requestObject.baseURL !== undefined) {
112
+ axiosConfig.baseURL = requestObject.baseURL?.toString();
113
+ }
114
+ if (requestObject.method !== undefined) {
115
+ axiosConfig.method = requestObject.method;
116
+ }
117
+ if (requestObject.qs !== undefined && Object.keys(requestObject.qs).length > 0) {
118
+ axiosConfig.params = requestObject.qs;
119
+ }
120
+ function hasArrayFormatOptions(arg) {
121
+ if (typeof arg.qsStringifyOptions === 'object' &&
122
+ arg.qsStringifyOptions !== null &&
123
+ !Array.isArray(arg.qsStringifyOptions) &&
124
+ 'arrayFormat' in arg.qsStringifyOptions) {
125
+ return true;
126
+ }
127
+ return false;
128
+ }
129
+ if (requestObject.useQuerystring === true ||
130
+ (hasArrayFormatOptions(requestObject) &&
131
+ requestObject.qsStringifyOptions.arrayFormat === 'repeat')) {
132
+ axiosConfig.paramsSerializer = (params) => {
133
+ return (0, qs_1.stringify)(params, { arrayFormat: 'repeat' });
134
+ };
135
+ }
136
+ else if (requestObject.useQuerystring === false) {
137
+ axiosConfig.paramsSerializer = (params) => {
138
+ return (0, qs_1.stringify)(params, { arrayFormat: 'indices' });
139
+ };
140
+ }
141
+ if (hasArrayFormatOptions(requestObject) &&
142
+ requestObject.qsStringifyOptions.arrayFormat === 'brackets') {
143
+ axiosConfig.paramsSerializer = (params) => {
144
+ return (0, qs_1.stringify)(params, { arrayFormat: 'brackets' });
145
+ };
146
+ }
147
+ if (requestObject.auth !== undefined) {
148
+ if (requestObject.auth.bearer !== undefined) {
149
+ axiosConfig.headers = Object.assign(axiosConfig.headers || {}, {
150
+ Authorization: `Bearer ${requestObject.auth.bearer}`,
151
+ });
152
+ }
153
+ else {
154
+ const authObj = requestObject.auth;
155
+ axiosConfig.auth = {
156
+ username: (authObj.user || authObj.username),
157
+ password: (authObj.password || authObj.pass),
158
+ };
159
+ }
160
+ }
161
+ if (requestObject.json === true) {
162
+ const acceptHeaderExists = axiosConfig.headers === undefined
163
+ ? false
164
+ : Object.keys(axiosConfig.headers)
165
+ .map((headerKey) => headerKey.toLowerCase())
166
+ .includes('accept');
167
+ if (!acceptHeaderExists) {
168
+ axiosConfig.headers = Object.assign(axiosConfig.headers || {}, {
169
+ Accept: 'application/json',
170
+ });
171
+ }
172
+ }
173
+ if (requestObject.json === false || requestObject.json === undefined) {
174
+ axiosConfig.transformResponse = (res) => res;
175
+ }
176
+ const { method } = requestObject;
177
+ if ((requestObject.followRedirect !== false &&
178
+ (!method || method === 'GET' || method === 'HEAD')) ||
179
+ requestObject.followAllRedirects) {
180
+ axiosConfig.maxRedirects = requestObject.maxRedirects;
181
+ }
182
+ else {
183
+ axiosConfig.maxRedirects = 0;
184
+ }
185
+ const host = (0, axios_utils_1.getHostFromRequestObject)(requestObject);
186
+ const agentOptions = { ...requestObject.agentOptions };
187
+ if (host) {
188
+ agentOptions.servername = host;
189
+ }
190
+ if (requestObject.rejectUnauthorized === false) {
191
+ agentOptions.rejectUnauthorized = false;
192
+ agentOptions.secureOptions = crypto_1.default.constants.SSL_OP_LEGACY_SERVER_CONNECT;
193
+ }
194
+ if (requestObject.timeout !== undefined) {
195
+ axiosConfig.timeout = requestObject.timeout;
196
+ }
197
+ const secureLookup = ssrfBridge?.createSecureLookup();
198
+ (0, axios_utils_1.setAxiosAgents)(axiosConfig, agentOptions, requestObject.proxy, secureLookup);
199
+ axiosConfig.beforeRedirect = (0, axios_utils_1.getBeforeRedirectFn)(agentOptions, axiosConfig, requestObject.proxy, requestObject.sendCredentialsOnCrossOriginRedirect ?? true, requestObject.allowedDomains, ssrfBridge);
200
+ if (requestObject.useStream) {
201
+ axiosConfig.responseType = 'stream';
202
+ }
203
+ else if (requestObject.encoding === null) {
204
+ axiosConfig.responseType = 'arraybuffer';
205
+ }
206
+ const allHeaders = axiosConfig.headers ? Object.keys(axiosConfig.headers) : [];
207
+ if (!allHeaders.some((headerKey) => headerKey.toLowerCase() === 'accept')) {
208
+ axiosConfig.headers = Object.assign(axiosConfig.headers || {}, { accept: '*/*' });
209
+ }
210
+ if (requestObject.json !== false &&
211
+ axiosConfig.data !== undefined &&
212
+ axiosConfig.data !== '' &&
213
+ !(axiosConfig.data instanceof Buffer) &&
214
+ !allHeaders.some((headerKey) => headerKey.toLowerCase() === 'content-type')) {
215
+ axiosConfig.headers = Object.assign(axiosConfig.headers || {}, {
216
+ 'content-type': 'application/json',
217
+ });
218
+ }
219
+ if (requestObject.simple === false) {
220
+ axiosConfig.validateStatus = () => true;
221
+ }
222
+ (0, outbound_user_agent_1.applyDefaultOutboundUserAgent)(axiosConfig);
223
+ return axiosConfig;
224
+ }
225
+ async function proxyRequestToAxios(workflow, additionalData, node, uriOrObject, options) {
226
+ let axiosConfig = {
227
+ maxBodyLength: Infinity,
228
+ maxContentLength: -1,
229
+ };
230
+ let configObject;
231
+ if (typeof uriOrObject === 'string') {
232
+ configObject = { uri: uriOrObject, ...options };
233
+ }
234
+ else {
235
+ configObject = uriOrObject ?? {};
236
+ }
237
+ const ssrfBridge = additionalData?.ssrfBridge;
238
+ const url = (0, axios_utils_1.resolveLegacyRequestUrl)(configObject);
239
+ await (0, axios_utils_1.validateUrlSsrf)(url, ssrfBridge);
240
+ axiosConfig = Object.assign(axiosConfig, await parseRequestObject(configObject, ssrfBridge));
241
+ (0, axios_utils_1.throwIfDomainNotAllowed)(axiosConfig, configObject.allowedDomains);
242
+ try {
243
+ const response = await (0, http_request_1.invokeAxios)(axiosConfig, configObject.auth);
244
+ let body = response.data;
245
+ if (body instanceof http_1.IncomingMessage && axiosConfig.responseType === 'stream') {
246
+ (0, parse_incoming_message_1.parseIncomingMessage)(body);
247
+ }
248
+ else if (body === '') {
249
+ body = axiosConfig.responseType === 'arraybuffer' ? Buffer.alloc(0) : undefined;
250
+ }
251
+ await additionalData?.hooks?.runHook('nodeFetchedData', [workflow?.id, node]);
252
+ return configObject.resolveWithFullResponse
253
+ ? {
254
+ body,
255
+ headers: { ...response.headers },
256
+ statusCode: response.status,
257
+ statusMessage: response.statusText,
258
+ request: response.request,
259
+ }
260
+ : body;
261
+ }
262
+ catch (error) {
263
+ const { config, response } = error;
264
+ if (error.isAxiosError) {
265
+ error.config = error.request = undefined;
266
+ error.options = (0, pick_1.default)(config ?? {}, ['url', 'method', 'data', 'headers']);
267
+ if (response) {
268
+ di_1.Container.get(backend_common_1.Logger).debug('Request proxied to Axios failed', { status: response.status });
269
+ let responseData = response.data;
270
+ if (Buffer.isBuffer(responseData) || responseData instanceof stream_1.Readable) {
271
+ responseData = await (0, binary_helper_functions_1.binaryToString)(responseData);
272
+ }
273
+ if (configObject.simple === false) {
274
+ if (configObject.resolveWithFullResponse) {
275
+ return {
276
+ body: responseData,
277
+ headers: response.headers,
278
+ statusCode: response.status,
279
+ statusMessage: response.statusText,
280
+ };
281
+ }
282
+ else {
283
+ return responseData;
284
+ }
285
+ }
286
+ error.message = `${response.status} - ${JSON.stringify(responseData)}`;
287
+ throw Object.assign(error, {
288
+ statusCode: response.status,
289
+ status: response.status,
290
+ error: responseData,
291
+ response: (0, pick_1.default)(response, ['headers', 'status', 'statusText']),
292
+ });
293
+ }
294
+ else if ('rejectUnauthorized' in configObject && error.code?.includes('CERT')) {
295
+ throw new n8n_workflow_1.NodeSslError(error);
296
+ }
297
+ }
298
+ throw error;
299
+ }
300
+ }
301
+ //# sourceMappingURL=legacy-request-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-request-adapter.js","sourceRoot":"","sources":["../../../../../src/execution-engine/node-execution-context/utils/request-helpers/legacy-request-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ClientOAuth2TokenData } from '@n8n/client-oauth2';
2
+ import type { IAllExecuteFunctions, IHttpRequestOptions, INode, IOAuth2Options, IRequestOptions, IWorkflowExecuteAdditionalData } from 'n8n-workflow';
3
+ export declare function requestOAuth2(this: IAllExecuteFunctions, credentialsType: string, requestOptions: IHttpRequestOptions | IRequestOptions, node: INode, additionalData: IWorkflowExecuteAdditionalData, oAuth2Options?: IOAuth2Options, isN8nRequest?: boolean): Promise<any>;
4
+ export declare function requestOAuth1(this: IAllExecuteFunctions, credentialsType: string, requestOptions: IHttpRequestOptions | IRequestOptions, isN8nRequest?: boolean): Promise<any>;
5
+ export declare function refreshOAuth2Token(this: IAllExecuteFunctions, credentialsType: string, node: INode, additionalData: IWorkflowExecuteAdditionalData, oAuth2Options?: IOAuth2Options): Promise<ClientOAuth2TokenData>;
@@ -0,0 +1,288 @@
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.requestOAuth2 = requestOAuth2;
7
+ exports.requestOAuth1 = requestOAuth1;
8
+ exports.refreshOAuth2Token = refreshOAuth2Token;
9
+ const client_oauth2_1 = require("@n8n/client-oauth2");
10
+ const crypto_1 = require("crypto");
11
+ const get_1 = __importDefault(require("lodash/get"));
12
+ const n8n_workflow_1 = require("n8n-workflow");
13
+ const oauth_1_0a_1 = __importDefault(require("oauth-1.0a"));
14
+ const http_request_1 = require("./http-request");
15
+ function createOAuth2Client(credentials) {
16
+ const scopes = credentials.scope
17
+ ?.split(' ')
18
+ .map((s) => s.trim())
19
+ .filter(Boolean);
20
+ return new client_oauth2_1.ClientOAuth2({
21
+ clientId: credentials.clientId,
22
+ clientSecret: credentials.clientSecret,
23
+ accessTokenUri: credentials.accessTokenUrl,
24
+ scopes: scopes?.length ? scopes : undefined,
25
+ ignoreSSLIssues: credentials.ignoreSSLIssues,
26
+ authentication: credentials.authentication ?? 'header',
27
+ ...(credentials.additionalBodyProperties && {
28
+ additionalBodyProperties: (0, n8n_workflow_1.jsonParse)(credentials.additionalBodyProperties, {
29
+ fallbackValue: {},
30
+ }),
31
+ }),
32
+ });
33
+ }
34
+ function buildSigningToken(client, tokenData, oAuth2Options) {
35
+ const accessToken = (0, get_1.default)(tokenData, oAuth2Options?.property) || tokenData.accessToken;
36
+ const refreshToken = tokenData.refreshToken;
37
+ return client.createToken({
38
+ ...tokenData,
39
+ ...(accessToken ? { access_token: accessToken } : {}),
40
+ ...(refreshToken ? { refresh_token: refreshToken } : {}),
41
+ }, oAuth2Options?.tokenType || tokenData.tokenType);
42
+ }
43
+ async function decryptOAuth2TokenDataIfConfigured(additionalData, tokenData, jweEnabled) {
44
+ if (!jweEnabled)
45
+ return tokenData;
46
+ const proxy = additionalData['oauth-jwe']?.oauthJweProxyProvider;
47
+ if (!proxy || !tokenData)
48
+ return tokenData;
49
+ return await proxy.decryptOAuth2TokenData(tokenData);
50
+ }
51
+ function isRevokedOAuth2GrantError(error) {
52
+ if (!(error instanceof client_oauth2_1.AuthError))
53
+ return false;
54
+ const body = error.body;
55
+ return body?.error === 'invalid_grant';
56
+ }
57
+ function buildOAuth2ReconnectError(node, credentialsType) {
58
+ const credentialName = node.credentials?.[credentialsType]?.name;
59
+ const credentialLabel = credentialName ? `"${credentialName}"` : `of type "${credentialsType}"`;
60
+ return new n8n_workflow_1.NodeOperationError(node, `The credential ${credentialLabel} needs to be reconnected.`, {
61
+ description: 'Access could not be refreshed because the connected account has revoked access, the refresh token expired, or the account password or permissions changed. Open the credential and reconnect it to continue.',
62
+ level: 'warning',
63
+ });
64
+ }
65
+ async function refreshOrFetchToken(ctx) {
66
+ const { credentials, token, credentialsType, node, additionalData, oAuth2Options, logger, helpers, } = ctx;
67
+ const tokenRefreshOptions = {};
68
+ if (oAuth2Options?.includeCredentialsOnRefreshOnBody) {
69
+ const body = {
70
+ client_id: credentials.clientId,
71
+ ...(credentials.grantType === 'authorizationCode' && {
72
+ client_secret: credentials.clientSecret,
73
+ }),
74
+ };
75
+ tokenRefreshOptions.body = body;
76
+ tokenRefreshOptions.headers = { Authorization: '' };
77
+ }
78
+ logger.debug(`OAuth2 token for "${credentialsType}" used by node "${node.name}" expired. Revalidating.`);
79
+ let newToken;
80
+ try {
81
+ if (credentials.grantType === 'clientCredentials') {
82
+ newToken = await token.client.credentials.getToken();
83
+ }
84
+ else {
85
+ newToken = await token.refresh(tokenRefreshOptions);
86
+ }
87
+ }
88
+ catch (error) {
89
+ if (isRevokedOAuth2GrantError(error)) {
90
+ throw buildOAuth2ReconnectError(node, credentialsType);
91
+ }
92
+ throw error;
93
+ }
94
+ logger.debug(`OAuth2 token for "${credentialsType}" used by node "${node.name}" has been renewed.`);
95
+ const refreshedTokenData = await decryptOAuth2TokenDataIfConfigured(additionalData, newToken.data, credentials.jweEnabled === true);
96
+ credentials.oauthTokenData = refreshedTokenData;
97
+ const preAuthData = await additionalData.credentialsHelper.runPreAuthentication({ helpers }, credentials, credentialsType);
98
+ let signingToken = newToken;
99
+ if (preAuthData) {
100
+ Object.assign(credentials, preAuthData);
101
+ signingToken = buildSigningToken(token.client, credentials.oauthTokenData, oAuth2Options);
102
+ }
103
+ if (!node.credentials?.[credentialsType]) {
104
+ throw new n8n_workflow_1.ApplicationError('Node does not have credential type', {
105
+ extra: { nodeName: node.name, credentialType: credentialsType },
106
+ });
107
+ }
108
+ const nodeCredentials = node.credentials[credentialsType];
109
+ await additionalData.credentialsHelper.updateCredentialsOauthTokenData(nodeCredentials, credentialsType, credentials, additionalData);
110
+ return signingToken;
111
+ }
112
+ function resolveTokenExpiredStatusCode(oAuth2Options, credentials) {
113
+ return credentials?.tokenExpiredStatusCode ?? oAuth2Options?.tokenExpiredStatusCode ?? 401;
114
+ }
115
+ async function requestOAuth2(credentialsType, requestOptions, node, additionalData, oAuth2Options, isN8nRequest = false) {
116
+ (0, http_request_1.removeEmptyBody)(requestOptions);
117
+ const credentials = (await this.getCredentials(credentialsType));
118
+ if (credentials.grantType === 'authorizationCode' && credentials.oauthTokenData === undefined) {
119
+ throw new n8n_workflow_1.ApplicationError('OAuth credentials not connected');
120
+ }
121
+ const oAuthClient = createOAuth2Client(credentials);
122
+ let oauthTokenData = credentials.oauthTokenData;
123
+ if (credentials.grantType === 'clientCredentials' &&
124
+ (oauthTokenData === undefined ||
125
+ Object.keys(oauthTokenData).length === 0 ||
126
+ oauthTokenData.access_token === '')) {
127
+ let tokenResult;
128
+ try {
129
+ tokenResult = await oAuthClient.credentials.getToken();
130
+ }
131
+ catch (error) {
132
+ const message = error instanceof Error ? error.message : String(error);
133
+ throw new n8n_workflow_1.ApplicationError(`Failed to acquire OAuth2 access token: ${message}`, {
134
+ cause: error,
135
+ });
136
+ }
137
+ const { data } = tokenResult;
138
+ if (!node.credentials?.[credentialsType]) {
139
+ throw new n8n_workflow_1.ApplicationError('Node does not have credential type', {
140
+ extra: { nodeName: node.name },
141
+ tags: { credentialType: credentialsType },
142
+ });
143
+ }
144
+ const nodeCredentials = node.credentials[credentialsType];
145
+ const initialTokenData = (await decryptOAuth2TokenDataIfConfigured(additionalData, data, credentials.jweEnabled === true));
146
+ credentials.oauthTokenData = initialTokenData;
147
+ await additionalData.credentialsHelper.updateCredentialsOauthTokenData(nodeCredentials, credentialsType, credentials, additionalData);
148
+ oauthTokenData = initialTokenData;
149
+ }
150
+ const preAuthData = await additionalData.credentialsHelper.runPreAuthentication({ helpers: this.helpers }, credentials, credentialsType);
151
+ if (preAuthData) {
152
+ Object.assign(credentials, preAuthData);
153
+ oauthTokenData = credentials.oauthTokenData;
154
+ }
155
+ const token = buildSigningToken(oAuthClient, oauthTokenData, oAuth2Options);
156
+ requestOptions.rejectUnauthorized = !credentials.ignoreSSLIssues;
157
+ const newRequestOptions = token.sign(requestOptions);
158
+ const newRequestHeaders = (newRequestOptions.headers = newRequestOptions.headers ?? {});
159
+ if (oAuth2Options?.keepBearer === false && typeof newRequestHeaders.Authorization === 'string') {
160
+ newRequestHeaders.Authorization = newRequestHeaders.Authorization.split(' ')[1];
161
+ }
162
+ if (oAuth2Options?.keyToIncludeInAccessTokenHeader) {
163
+ Object.assign(newRequestHeaders, {
164
+ [oAuth2Options.keyToIncludeInAccessTokenHeader]: token.accessToken,
165
+ });
166
+ }
167
+ const tokenExpiredStatusCode = resolveTokenExpiredStatusCode(oAuth2Options, credentials);
168
+ const shouldSkipTokenRefresh = oAuth2Options?.skipTokenRefresh === true;
169
+ const refreshCtx = {
170
+ credentials,
171
+ token,
172
+ credentialsType,
173
+ node,
174
+ additionalData,
175
+ oAuth2Options,
176
+ logger: this.logger,
177
+ helpers: this.helpers,
178
+ };
179
+ const retryWithNewToken = async (makeRequest) => {
180
+ const newToken = await refreshOrFetchToken(refreshCtx);
181
+ const refreshedRequestOptions = newToken.sign(requestOptions);
182
+ refreshedRequestOptions.headers = refreshedRequestOptions.headers ?? {};
183
+ if (oAuth2Options?.keyToIncludeInAccessTokenHeader) {
184
+ Object.assign(refreshedRequestOptions.headers, {
185
+ [oAuth2Options.keyToIncludeInAccessTokenHeader]: newToken.accessToken,
186
+ });
187
+ }
188
+ return await makeRequest(refreshedRequestOptions);
189
+ };
190
+ if (isN8nRequest) {
191
+ return await this.helpers.httpRequest(newRequestOptions).catch(async (error) => {
192
+ if (!shouldSkipTokenRefresh && error.response?.status === tokenExpiredStatusCode) {
193
+ return await retryWithNewToken(async (opts) => await this.helpers.httpRequest(opts));
194
+ }
195
+ throw error;
196
+ });
197
+ }
198
+ return await this.helpers
199
+ .request(newRequestOptions)
200
+ .then((response) => {
201
+ const requestOptions = newRequestOptions;
202
+ if (!shouldSkipTokenRefresh &&
203
+ requestOptions.resolveWithFullResponse === true &&
204
+ requestOptions.simple === false &&
205
+ response.statusCode === tokenExpiredStatusCode) {
206
+ throw response;
207
+ }
208
+ return response;
209
+ })
210
+ .catch(async (error) => {
211
+ if (!shouldSkipTokenRefresh && error.statusCode === tokenExpiredStatusCode) {
212
+ return await retryWithNewToken(async (opts) => await this.helpers.request(opts));
213
+ }
214
+ throw error;
215
+ });
216
+ }
217
+ async function requestOAuth1(credentialsType, requestOptions, isN8nRequest = false) {
218
+ (0, http_request_1.removeEmptyBody)(requestOptions);
219
+ const credentials = await this.getCredentials(credentialsType);
220
+ if (credentials === undefined) {
221
+ throw new n8n_workflow_1.ApplicationError('No credentials were returned');
222
+ }
223
+ if (credentials.oauthTokenData === undefined) {
224
+ throw new n8n_workflow_1.ApplicationError('OAuth credentials not connected');
225
+ }
226
+ const oauth = new oauth_1_0a_1.default({
227
+ consumer: {
228
+ key: credentials.consumerKey,
229
+ secret: credentials.consumerSecret,
230
+ },
231
+ signature_method: credentials.signatureMethod,
232
+ hash_function(base, key) {
233
+ let algorithm;
234
+ switch (credentials.signatureMethod) {
235
+ case 'HMAC-SHA256':
236
+ algorithm = 'sha256';
237
+ break;
238
+ case 'HMAC-SHA512':
239
+ algorithm = 'sha512';
240
+ break;
241
+ default:
242
+ algorithm = 'sha1';
243
+ break;
244
+ }
245
+ return (0, crypto_1.createHmac)(algorithm, key).update(base).digest('base64');
246
+ },
247
+ });
248
+ const oauthTokenData = credentials.oauthTokenData;
249
+ const token = {
250
+ key: oauthTokenData.oauth_token,
251
+ secret: oauthTokenData.oauth_token_secret,
252
+ };
253
+ requestOptions.data = { ...requestOptions.qs, ...requestOptions.form };
254
+ if ('uri' in requestOptions && !requestOptions.url) {
255
+ requestOptions.url = requestOptions.uri;
256
+ delete requestOptions.uri;
257
+ }
258
+ requestOptions.headers = oauth.toHeader(oauth.authorize(requestOptions, token));
259
+ if (isN8nRequest) {
260
+ return await this.helpers.httpRequest(requestOptions);
261
+ }
262
+ return await this.helpers
263
+ .request(requestOptions)
264
+ .catch(async (error) => {
265
+ throw error;
266
+ });
267
+ }
268
+ async function refreshOAuth2Token(credentialsType, node, additionalData, oAuth2Options) {
269
+ const credentials = (await this.getCredentials(credentialsType));
270
+ if (credentials.grantType === 'authorizationCode' && credentials.oauthTokenData === undefined) {
271
+ throw new n8n_workflow_1.ApplicationError('OAuth credentials not connected');
272
+ }
273
+ const oAuthClient = createOAuth2Client(credentials);
274
+ const oauthTokenData = credentials.oauthTokenData;
275
+ const token = buildSigningToken(oAuthClient, oauthTokenData, oAuth2Options);
276
+ const newToken = await refreshOrFetchToken({
277
+ credentials,
278
+ token,
279
+ credentialsType,
280
+ node,
281
+ additionalData,
282
+ oAuth2Options,
283
+ logger: this.logger,
284
+ helpers: this.helpers,
285
+ });
286
+ return newToken.data;
287
+ }
288
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../../../src/execution-engine/node-execution-context/utils/request-helpers/oauth.ts"],"names":[],"mappings":"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"}