diff --git a/server/lib/schemas.ts b/server/lib/schemas.ts index f1aa6c9d..0888ff31 100644 --- a/server/lib/schemas.ts +++ b/server/lib/schemas.ts @@ -1,24 +1,19 @@ import { z } from "zod"; - export const subdomainSchema = z .string() .regex( - /^[a-z0-9](?:[a-z0-9-]*[a-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])?$/, "Invalid subdomain format" ) .min(1, "Subdomain must be at least 1 character long") - .max(63, "Subdomain must not exceed 63 characters") .transform((val) => val.toLowerCase()); export const tlsNameSchema = z .string() .regex( - /^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?)(\.[a-z0-9](?:[a-z0-9-]*[a-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])?$|^$/, "Invalid subdomain format" - ).max(253, "Domain must not exceed 253 characters") - .refine((val) => { - const labels = val.split('.'); - return labels.every((label) => label.length <= 63); - }, "Each part of the domain must not exceed 63 characters") - .transform((val) => val.toLowerCase()); \ No newline at end of file + ) + .transform((val) => val.toLowerCase()); + diff --git a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx index 8c5ee667..ef70abad 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx @@ -53,6 +53,7 @@ import { import DomainPicker from "@app/components/DomainPicker"; import { Globe } from "lucide-react"; import { build } from "@server/build"; +import { finalizeSubdomainSanitize } from "@app/lib/subdomain-utils"; export default function GeneralForm() { const [formKey, setFormKey] = useState(0); @@ -454,18 +455,27 @@ export default function GeneralForm() {