From 2502bac4e9494d55363439e8f8b1558608d8bcd2 Mon Sep 17 00:00:00 2001 From: Adam Hall Date: Fri, 2 May 2025 16:35:31 +0930 Subject: [PATCH 1/2] Add regex check for IPv6 Address validation --- .../assets/handlers/maintenance/lib/file.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/graphql-mesh-server/assets/handlers/maintenance/lib/file.ts b/packages/graphql-mesh-server/assets/handlers/maintenance/lib/file.ts index 161a488b..467f2706 100644 --- a/packages/graphql-mesh-server/assets/handlers/maintenance/lib/file.ts +++ b/packages/graphql-mesh-server/assets/handlers/maintenance/lib/file.ts @@ -2,6 +2,7 @@ import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs"; const IP_REGEX = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\/([1-9]|[1-2][0-9]|3[1-2]))?$/; +const IP_V6_REGEX = /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const MAINTENANCE_FILE_PATH = process.env.MAINTENANCE_FILE_PATH!; @@ -60,5 +61,5 @@ export const toggleMaintenanceStatus = () => { const validateIps = (ipList: string) => { const ips = ipList.split(","); - return ips.find(ip => !IP_REGEX.test(ip)) === undefined; + return ips.find(ip => !IP_REGEX.test(ip) && !IP_V6_REGEX.test(ip)) === undefined; }; From a4be75ca3baa77f23f222014c25a85ba269ea4a8 Mon Sep 17 00:00:00 2001 From: Adam Hall Date: Fri, 2 May 2025 16:50:25 +0930 Subject: [PATCH 2/2] Linting fixes --- .../assets/handlers/maintenance/lib/file.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/graphql-mesh-server/assets/handlers/maintenance/lib/file.ts b/packages/graphql-mesh-server/assets/handlers/maintenance/lib/file.ts index 467f2706..0df2fcd1 100644 --- a/packages/graphql-mesh-server/assets/handlers/maintenance/lib/file.ts +++ b/packages/graphql-mesh-server/assets/handlers/maintenance/lib/file.ts @@ -2,7 +2,8 @@ import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs"; const IP_REGEX = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\/([1-9]|[1-2][0-9]|3[1-2]))?$/; -const IP_V6_REGEX = /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/ +const IP_V6_REGEX = + /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const MAINTENANCE_FILE_PATH = process.env.MAINTENANCE_FILE_PATH!; @@ -61,5 +62,7 @@ export const toggleMaintenanceStatus = () => { const validateIps = (ipList: string) => { const ips = ipList.split(","); - return ips.find(ip => !IP_REGEX.test(ip) && !IP_V6_REGEX.test(ip)) === undefined; + return ( + ips.find(ip => !IP_REGEX.test(ip) && !IP_V6_REGEX.test(ip)) === undefined + ); };