From 9542512ce970ecf033fdfac61309ab9658d43a64 Mon Sep 17 00:00:00 2001 From: Ephraim Duncan <55143799+ephraimduncan@users.noreply.github.com> Date: Wed, 16 Sep 2026 03:54:52 +0000 Subject: [PATCH] refactor(lib): reuse the http url validator (#3346) --- .../envelope-editor-settings-dialog.tsx | 4 ++-- packages/lib/schemas/common.ts | 10 ++++------ packages/lib/types/document-meta.ts | 4 ++-- packages/lib/utils/is-valid-redirect-url.ts | 15 --------------- .../document-flow/add-settings.types.ts | 4 ++-- .../template-flow/add-template-settings.types.tsx | 4 ++-- 6 files changed, 12 insertions(+), 29 deletions(-) delete mode 100644 packages/lib/utils/is-valid-redirect-url.ts diff --git a/apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx b/apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx index ea60d1819..1abf0fa54 100644 --- a/apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx +++ b/apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx @@ -16,7 +16,7 @@ import { ZDocumentMetaTimezoneSchema, } from '@documenso/lib/types/document-meta'; import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth'; -import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url'; +import { isHttpUrl } from '@documenso/lib/utils/is-http-url'; import { canAccessTeamDocument, DocumentSignatureType, extractTeamSignatureSettings } from '@documenso/lib/utils/teams'; import { zEmail } from '@documenso/lib/utils/zod'; import { trpc } from '@documenso/trpc/react'; @@ -97,7 +97,7 @@ export const ZAddSettingsFormSchema = z.object({ redirectUrl: z .string() .optional() - .refine((value) => value === undefined || value === '' || isValidRedirectUrl(value), { + .refine((value) => value === undefined || value === '' || isHttpUrl(value), { message: 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', }), language: z diff --git a/packages/lib/schemas/common.ts b/packages/lib/schemas/common.ts index c63b9b399..1ac5b7a05 100644 --- a/packages/lib/schemas/common.ts +++ b/packages/lib/schemas/common.ts @@ -1,12 +1,10 @@ import { z } from 'zod'; -import { isValidRedirectUrl } from '../utils/is-valid-redirect-url'; +import { isHttpUrl } from '../utils/is-http-url'; /** * Note this allows empty strings. */ -export const ZUrlSchema = z - .string() - .refine((value) => value === undefined || value === '' || isValidRedirectUrl(value), { - message: 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', - }); +export const ZUrlSchema = z.string().refine((value) => value === undefined || value === '' || isHttpUrl(value), { + message: 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', +}); diff --git a/packages/lib/types/document-meta.ts b/packages/lib/types/document-meta.ts index 12c1cf87c..2ca4f5fde 100644 --- a/packages/lib/types/document-meta.ts +++ b/packages/lib/types/document-meta.ts @@ -2,7 +2,7 @@ import { VALID_DATE_FORMAT_VALUES } from '@documenso/lib/constants/date-formats' import { ZEnvelopeExpirationPeriod } from '@documenso/lib/constants/envelope-expiration'; import { ZEnvelopeReminderSettings } from '@documenso/lib/constants/envelope-reminder'; import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n'; -import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url'; +import { isHttpUrl } from '@documenso/lib/utils/is-http-url'; import { zEmail } from '@documenso/lib/utils/zod'; import { DocumentMetaSchema } from '@documenso/prisma/generated/zod/modelSchema/DocumentMetaSchema'; import { msg } from '@lingui/core/macro'; @@ -71,7 +71,7 @@ export type TDocumentMetaDateFormat = z.infer value === undefined || value === '' || isValidRedirectUrl(value), { + .refine((value) => value === undefined || value === '' || isHttpUrl(value), { message: 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', }); diff --git a/packages/lib/utils/is-valid-redirect-url.ts b/packages/lib/utils/is-valid-redirect-url.ts deleted file mode 100644 index de827f69c..000000000 --- a/packages/lib/utils/is-valid-redirect-url.ts +++ /dev/null @@ -1,15 +0,0 @@ -const ALLOWED_PROTOCOLS = ['http', 'https']; - -export const isValidRedirectUrl = (value: string) => { - try { - const url = new URL(value); - - if (!ALLOWED_PROTOCOLS.includes(url.protocol.slice(0, -1).toLowerCase())) { - return false; - } - - return true; - } catch { - return false; - } -}; diff --git a/packages/ui/primitives/document-flow/add-settings.types.ts b/packages/ui/primitives/document-flow/add-settings.types.ts index d2f2cdd8e..377bd0004 100644 --- a/packages/ui/primitives/document-flow/add-settings.types.ts +++ b/packages/ui/primitives/document-flow/add-settings.types.ts @@ -4,7 +4,7 @@ import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n'; import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones'; import { ZDocumentAccessAuthTypesSchema, ZDocumentActionAuthTypesSchema } from '@documenso/lib/types/document-auth'; import { ZDocumentMetaDateFormatSchema, ZDocumentMetaTimezoneSchema } from '@documenso/lib/types/document-meta'; -import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url'; +import { isHttpUrl } from '@documenso/lib/utils/is-http-url'; import { msg } from '@lingui/core/macro'; import { DocumentVisibility } from '@prisma/client'; import { z } from 'zod'; @@ -25,7 +25,7 @@ export const ZAddSettingsFormSchema = z.object({ redirectUrl: z .string() .optional() - .refine((value) => value === undefined || value === '' || isValidRedirectUrl(value), { + .refine((value) => value === undefined || value === '' || isHttpUrl(value), { message: 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', }), language: z diff --git a/packages/ui/primitives/template-flow/add-template-settings.types.tsx b/packages/ui/primitives/template-flow/add-template-settings.types.tsx index f7280d841..2b8ef649d 100644 --- a/packages/ui/primitives/template-flow/add-template-settings.types.tsx +++ b/packages/ui/primitives/template-flow/add-template-settings.types.tsx @@ -5,7 +5,7 @@ import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones' import { ZDocumentAccessAuthTypesSchema, ZDocumentActionAuthTypesSchema } from '@documenso/lib/types/document-auth'; import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email'; import { ZDocumentMetaDateFormatSchema, ZDocumentMetaTimezoneSchema } from '@documenso/lib/types/document-meta'; -import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url'; +import { isHttpUrl } from '@documenso/lib/utils/is-http-url'; import { zEmail } from '@documenso/lib/utils/zod'; import { msg } from '@lingui/core/macro'; import { DocumentDistributionMethod, DocumentVisibility, TemplateType } from '@prisma/client'; @@ -31,7 +31,7 @@ export const ZAddTemplateSettingsFormSchema = z.object({ redirectUrl: z .string() .optional() - .refine((value) => value === undefined || value === '' || isValidRedirectUrl(value), { + .refine((value) => value === undefined || value === '' || isHttpUrl(value), { message: 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', }), language: z