fix(Wait Node): Authentication fix (#10236)

This commit is contained in:
Michael Kret 2024-07-30 15:43:05 +03:00 committed by GitHub
parent d6770b5fca
commit f87854f8db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 41 additions and 6 deletions

View file

@ -140,8 +140,11 @@ const checkResponseModeConfiguration = (context: IWebhookFunctions) => {
} }
}; };
export async function formWebhook(context: IWebhookFunctions) { export async function formWebhook(
const nodeVersion = context.getNode().typeVersion; context: IWebhookFunctions,
authProperty = FORM_TRIGGER_AUTHENTICATION_PROPERTY,
) {
const node = context.getNode();
const options = context.getNodeParameter('options', {}) as { const options = context.getNodeParameter('options', {}) as {
ignoreBots?: boolean; ignoreBots?: boolean;
respondWithOptions?: { respondWithOptions?: {
@ -159,9 +162,10 @@ export async function formWebhook(context: IWebhookFunctions) {
const req = context.getRequestObject(); const req = context.getRequestObject();
try { try {
if (options.ignoreBots && isbot(req.headers['user-agent'])) if (options.ignoreBots && isbot(req.headers['user-agent'])) {
throw new WebhookAuthorizationError(403); throw new WebhookAuthorizationError(403);
await validateWebhookAuthentication(context, FORM_TRIGGER_AUTHENTICATION_PROPERTY); }
await validateWebhookAuthentication(context, authProperty);
} catch (error) { } catch (error) {
if (error instanceof WebhookAuthorizationError) { if (error instanceof WebhookAuthorizationError) {
res.writeHead(error.responseCode, { 'WWW-Authenticate': 'Basic realm="Webhook"' }); res.writeHead(error.responseCode, { 'WWW-Authenticate': 'Basic realm="Webhook"' });
@ -310,7 +314,7 @@ export async function formWebhook(context: IWebhookFunctions) {
let { useWorkflowTimezone } = options; let { useWorkflowTimezone } = options;
if (useWorkflowTimezone === undefined && nodeVersion > 2) { if (useWorkflowTimezone === undefined && node.typeVersion > 2) {
useWorkflowTimezone = true; useWorkflowTimezone = true;
} }

View file

@ -237,6 +237,14 @@ export class Wait extends Webhook {
inputs: ['main'], inputs: ['main'],
outputs: ['main'], outputs: ['main'],
credentials: credentialsProperty(this.authPropertyName), credentials: credentialsProperty(this.authPropertyName),
hints: [
{
message:
"When testing your workflow using the Editor UI, you can't see the rest of the execution following the Wait node. To inspect the execution results, enable Save Manual Executions in your Workflow settings so you can review the execution results there.",
location: 'outputPane',
whenToDisplay: 'beforeExecution',
},
],
webhooks: [ webhooks: [
{ {
...defaultWebhookDescription, ...defaultWebhookDescription,
@ -294,6 +302,29 @@ export class Wait extends Webhook {
default: 'timeInterval', default: 'timeInterval',
description: 'Determines the waiting mode to use before the workflow continues', description: 'Determines the waiting mode to use before the workflow continues',
}, },
{
displayName: 'Authentication',
name: 'incomingAuthentication',
type: 'options',
options: [
{
name: 'Basic Auth',
value: 'basicAuth',
},
{
name: 'None',
value: 'none',
},
],
default: 'none',
description:
'If and how incoming resume-webhook-requests to $execution.resumeFormUrl should be authenticated for additional security',
displayOptions: {
show: {
resume: ['form'],
},
},
},
{ {
...authenticationProperty(this.authPropertyName), ...authenticationProperty(this.authPropertyName),
description: description:
@ -427,7 +458,7 @@ export class Wait extends Webhook {
async webhook(context: IWebhookFunctions) { async webhook(context: IWebhookFunctions) {
const resume = context.getNodeParameter('resume', 0) as string; const resume = context.getNodeParameter('resume', 0) as string;
if (resume === 'form') return await formWebhook(context); if (resume === 'form') return await formWebhook(context, this.authPropertyName);
return await super.webhook(context); return await super.webhook(context);
} }