From ebb29b82075fa436355d022b6a98230f5c277d24 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 24 Jan 2024 13:25:37 +0100 Subject: [PATCH] Allow setting visitor IP when registering event through API --- src/lib/constants.ts | 1 + src/lib/detect.ts | 2 +- src/pages/api/send.ts | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 0c894634..d0efd046 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -203,6 +203,7 @@ export const UUID_REGEX = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/; export const HOSTNAME_REGEX = /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/; +export const IP_REGEX = /^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$/; export const DESKTOP_SCREEN_WIDTH = 1920; export const LAPTOP_SCREEN_WIDTH = 1024; diff --git a/src/lib/detect.ts b/src/lib/detect.ts index dab08312..cdef3670 100644 --- a/src/lib/detect.ts +++ b/src/lib/detect.ts @@ -123,7 +123,7 @@ export async function getLocation(ip, req) { export async function getClientInfo(req: NextApiRequestCollect, { screen }) { const userAgent = req.headers['user-agent']; - const ip = getIpAddress(req); + const ip = req.body.payload.ip || getIpAddress(req); const location = await getLocation(ip, req); const country = location?.country; const subdivision1 = location?.subdivision1; diff --git a/src/pages/api/send.ts b/src/pages/api/send.ts index 1698d858..9ed7a15f 100644 --- a/src/pages/api/send.ts +++ b/src/pages/api/send.ts @@ -1,6 +1,6 @@ import ipaddr from 'ipaddr.js'; import isbot from 'isbot'; -import { COLLECTION_TYPE, HOSTNAME_REGEX } from 'lib/constants'; +import { COLLECTION_TYPE, HOSTNAME_REGEX, IP_REGEX } from 'lib/constants'; import { secret } from 'lib/crypto'; import { getIpAddress } from 'lib/detect'; import { useCors, useSession, useValidate } from 'lib/middleware'; @@ -14,6 +14,7 @@ export interface CollectRequestBody { payload: { data: { [key: string]: any }; hostname: string; + ip: string; language: string; referrer: string; screen: string; @@ -53,6 +54,7 @@ const schema = { .shape({ data: yup.object(), hostname: yup.string().matches(HOSTNAME_REGEX).max(100), + ip: yup.string().matches(IP_REGEX), language: yup.string().max(35), referrer: yup.string().max(500), screen: yup.string().max(11),