From bb2dcc51c6dd7e3d716d96409b4e96913f0b0a1d Mon Sep 17 00:00:00 2001 From: Hariom Balhara Date: Wed, 10 Sep 2025 16:59:04 +0530 Subject: [PATCH] Ignore requests from bot for headless router (#23733) --- apps/web/package.json | 1 + .../server/lib/router/getServerSideProps.ts | 21 +++++++++++++++++++ yarn.lock | 8 +++++++ 3 files changed, 30 insertions(+) diff --git a/apps/web/package.json b/apps/web/package.json index 51ad343203..94909a2899 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -93,6 +93,7 @@ "handlebars": "^4.7.7", "ical.js": "^1.4.0", "ics": "^2.37.0", + "isbot": "^5.1.30", "jose": "^4.13.1", "jotai": "^2.12.2", "jsdom": "^22.0.0", diff --git a/apps/web/server/lib/router/getServerSideProps.ts b/apps/web/server/lib/router/getServerSideProps.ts index d4799f7e09..ad2038c222 100644 --- a/apps/web/server/lib/router/getServerSideProps.ts +++ b/apps/web/server/lib/router/getServerSideProps.ts @@ -1,14 +1,35 @@ import { wrapGetServerSidePropsWithSentry } from "@sentry/nextjs"; +import { isbot } from "isbot"; import type { GetServerSidePropsContext } from "next"; import { getRoutedUrl, hasEmbedPath } from "@calcom/features/routing-forms/lib/getRoutedUrl"; +import logger from "@calcom/lib/logger"; import { TRPCError } from "@trpc/server"; +const log = logger.getSubLogger({ prefix: ["router/getServerSideProps"] }); + +// Show a positive message to the bots so that they don't think that the form is broken. +const BOT_MESSAGE = "Thank you for your interest! We will be in touch soon."; + export const getServerSideProps = wrapGetServerSidePropsWithSentry(async function getServerSideProps( context: GetServerSidePropsContext ) { try { + // Check if the request is from a bot + const userAgent = context.req.headers["user-agent"]; + if (userAgent && isbot(userAgent)) { + log.info(`[BOT] Ignoring request from user agent: ${userAgent}`); + return { + props: { + isEmbed: hasEmbedPath(context.req.url || ""), + form: null, + message: BOT_MESSAGE, + errorMessage: null, + }, + }; + } + return await getRoutedUrl(context); } catch (error) { if (error instanceof TRPCError && error.code === "TOO_MANY_REQUESTS") { diff --git a/yarn.lock b/yarn.lock index 043fe28a7a..883e733e68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4307,6 +4307,7 @@ __metadata: handlebars: ^4.7.7 ical.js: ^1.4.0 ics: ^2.37.0 + isbot: ^5.1.30 jose: ^4.13.1 jotai: ^2.12.2 jsdom: ^22.0.0 @@ -31899,6 +31900,13 @@ __metadata: languageName: node linkType: hard +"isbot@npm:^5.1.30": + version: 5.1.30 + resolution: "isbot@npm:5.1.30" + checksum: 296e6c13767d0d0cff22f778aa8e06fddf59eb347ed0c237647f9a65fd0681fd420468cc9e145f4c9fe7b9d17784816f4991d0299b1f3d489822c0d5c773d264 + languageName: node + linkType: hard + "isbuffer@npm:~0.0.0": version: 0.0.0 resolution: "isbuffer@npm:0.0.0"