From 7e3edfc0f2567d2735fcde57a5d0a58ef0aa4bf1 Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Mon, 18 Dec 2023 09:12:34 +0100 Subject: [PATCH] :lock: (radar) Improve scam detection by analyzing the entire typebot --- .../features/typebot/api/publishTypebot.ts | 9 +-- packages/radar/index.ts | 58 ++++--------------- 2 files changed, 12 insertions(+), 55 deletions(-) diff --git a/apps/builder/src/features/typebot/api/publishTypebot.ts b/apps/builder/src/features/typebot/api/publishTypebot.ts index 3e1de219b..abae108ca 100644 --- a/apps/builder/src/features/typebot/api/publishTypebot.ts +++ b/apps/builder/src/features/typebot/api/publishTypebot.ts @@ -89,14 +89,7 @@ export const publishTypebot = authenticatedProcedure const typebotWasVerified = existingTypebot.riskLevel === -1 - const riskLevel = typebotWasVerified - ? 0 - : computeRiskLevel({ - name: existingTypebot.name, - groups: parseGroups(existingTypebot.groups, { - typebotVersion: existingTypebot.version, - }), - }) + const riskLevel = typebotWasVerified ? 0 : computeRiskLevel(existingTypebot) if (riskLevel > 0 && riskLevel !== existingTypebot.riskLevel) { if (env.MESSAGE_WEBHOOK_URL && riskLevel !== 100) diff --git a/packages/radar/index.ts b/packages/radar/index.ts index 7dcc8e29b..a1ee3d401 100644 --- a/packages/radar/index.ts +++ b/packages/radar/index.ts @@ -1,56 +1,20 @@ -import { Group } from '@typebot.io/schemas' import { env } from '@typebot.io/env' -import { BubbleBlockType } from '@typebot.io/schemas/features/blocks/bubbles/constants' -import { TDescendant, TElement, TText } from '@udecode/plate-common' -export const computeRiskLevel = ({ - name, - groups, -}: { - name: string - groups: Group[] -}) => { +export const computeRiskLevel = (typebot: any) => { + const stringifiedTypebot = JSON.stringify(typebot) if (!env.RADAR_HIGH_RISK_KEYWORDS) return 0 if ( env.RADAR_HIGH_RISK_KEYWORDS.some((keyword) => - name.toLowerCase().includes(keyword) + stringifiedTypebot.toLowerCase().includes(keyword) ) ) return 100 - let hasSuspiciousKeywords = false - for (const group of groups) { - for (const block of group.blocks) { - if (block.type !== BubbleBlockType.TEXT) continue - for (const descendant of block.content?.richText as TDescendant[]) { - if ( - env.RADAR_HIGH_RISK_KEYWORDS && - richTextElementContainsKeywords(env.RADAR_HIGH_RISK_KEYWORDS)( - descendant - ) - ) - return 100 - if ( - env.RADAR_INTERMEDIATE_RISK_KEYWORDS && - richTextElementContainsKeywords(env.RADAR_INTERMEDIATE_RISK_KEYWORDS)( - descendant - ) - ) - hasSuspiciousKeywords = true - } - } - } - return hasSuspiciousKeywords ? 50 : 0 + if (!env.RADAR_INTERMEDIATE_RISK_KEYWORDS) return 0 + if ( + env.RADAR_INTERMEDIATE_RISK_KEYWORDS.some((keyword) => + stringifiedTypebot.toLowerCase().includes(keyword) + ) + ) + return 50 + return 0 } - -const richTextElementContainsKeywords = - (keywords: string[]) => (element: TElement | TText) => { - if (element.text) - return keywords.some((keyword) => - (element.text as string).toLowerCase().includes(keyword) - ) - if (element.children) - return (element.children as TDescendant[]).some( - richTextElementContainsKeywords(keywords) - ) - return false - }