From 3128cbf874bb6647063aea8613b572ff8e7f7894 Mon Sep 17 00:00:00 2001 From: pemontto Date: Thu, 9 Dec 2021 13:28:14 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20option=20to=20ignore=20reques?= =?UTF-8?q?ts=20from=20bots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/nodes-base/nodes/Wait/Wait.node.ts | 13 +++++++++++++ packages/nodes-base/nodes/Webhook/Webhook.node.ts | 14 ++++++++++++++ packages/nodes-base/package.json | 1 + 3 files changed, 28 insertions(+) diff --git a/packages/nodes-base/nodes/Wait/Wait.node.ts b/packages/nodes-base/nodes/Wait/Wait.node.ts index aa931c468c..3176747bad 100644 --- a/packages/nodes-base/nodes/Wait/Wait.node.ts +++ b/packages/nodes-base/nodes/Wait/Wait.node.ts @@ -21,6 +21,7 @@ import * as fs from 'fs'; import * as formidable from 'formidable'; +import * as isbot from 'isbot'; function authorizationError(resp: Response, realm: string, responseCode: number, message?: string) { if (message === undefined) { @@ -627,6 +628,13 @@ export class Wait implements INodeType { placeholder: 'webhook', description: 'This suffix path will be appended to the restart URL. Helpful when using multiple wait nodes. Note: Does not support expressions.', }, + { + displayName: 'Ignore Bots', + name: 'ignoreBots', + type: 'boolean', + default: false, + description: 'Set to true to ignore requests from bots like link previewers and web crawlers', + }, // { // displayName: 'Raw Body', // name: 'rawBody', @@ -656,6 +664,11 @@ export class Wait implements INodeType { const headers = this.getHeaderData(); const realm = 'Webhook'; + const ignoreBots = options.ignoreBots as boolean; + if (ignoreBots && isbot((headers as IDataObject)['user-agent'] as string)) { + return authorizationError(resp, realm, 403); + } + if (incomingAuthentication === 'basicAuth') { // Basic authorization is needed to call webhook const httpBasicAuth = await this.getCredentials('httpBasicAuth'); diff --git a/packages/nodes-base/nodes/Webhook/Webhook.node.ts b/packages/nodes-base/nodes/Webhook/Webhook.node.ts index 7ce48004a5..0f320a0f99 100644 --- a/packages/nodes-base/nodes/Webhook/Webhook.node.ts +++ b/packages/nodes-base/nodes/Webhook/Webhook.node.ts @@ -20,6 +20,8 @@ import * as fs from 'fs'; import * as formidable from 'formidable'; +import * as isbot from 'isbot'; + function authorizationError(resp: Response, realm: string, responseCode: number, message?: string) { if (message === undefined) { message = 'Authorization problem!'; @@ -379,6 +381,13 @@ export class Webhook implements INodeType { default: false, description: 'Raw body (binary)', }, + { + displayName: 'Ignore Bots', + name: 'ignoreBots', + type: 'boolean', + default: false, + description: 'Set to true to ignore requests from bots like link previewers and web crawlers', + }, ], }, ], @@ -392,6 +401,11 @@ export class Webhook implements INodeType { const headers = this.getHeaderData(); const realm = 'Webhook'; + const ignoreBots = options.ignoreBots as boolean; + if (ignoreBots && isbot((headers as IDataObject)['user-agent'] as string)) { + return authorizationError(resp, realm, 403); + } + if (authentication === 'basicAuth') { // Basic authorization is needed to call webhook const httpBasicAuth = await this.getCredentials('httpBasicAuth'); diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 2da78b154a..6771c0ca1b 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -702,6 +702,7 @@ "iconv-lite": "^0.6.2", "ics": "^2.27.0", "imap-simple": "^4.3.0", + "isbot": "^3.3.4", "iso-639-1": "^2.1.3", "jsonwebtoken": "^8.5.1", "kafkajs": "^1.14.0",