From 40e959cd2fe5cbbe6d53188b3030f6084f0273ae Mon Sep 17 00:00:00 2001 From: alejandrobailo Date: Thu, 16 Oct 2025 16:49:30 +0200 Subject: [PATCH] feat: update addCredentialsFormSchema to require Client Secret or Certificate Content based on 'via' parameter --- ui/types/formSchemas.ts | 56 ++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/ui/types/formSchemas.ts b/ui/types/formSchemas.ts index 10900a3f26..d6421ee16d 100644 --- a/ui/types/formSchemas.ts +++ b/ui/types/formSchemas.ts @@ -168,12 +168,13 @@ export const addCredentialsFormSchema = ( .min(1, "Client ID is required"), [ProviderCredentialFields.CLIENT_SECRET]: z .string() - .min(1, "Client Secret is required"), + .optional(), + [ProviderCredentialFields.CERTIFICATE_CONTENT]: z + .string() + .optional(), [ProviderCredentialFields.TENANT_ID]: z .string() .min(1, "Tenant ID is required"), - [ProviderCredentialFields.USER]: z.string().optional(), - [ProviderCredentialFields.PASSWORD]: z.string().optional(), } : providerType === "github" ? { @@ -194,23 +195,26 @@ export const addCredentialsFormSchema = ( }) .superRefine((data: Record, ctx) => { if (providerType === "m365") { - const hasUser = !!data[ProviderCredentialFields.USER]; - const hasPassword = !!data[ProviderCredentialFields.PASSWORD]; - - if (hasUser && !hasPassword) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "If you provide a user, you must also provide a password", - path: [ProviderCredentialFields.PASSWORD], - }); - } - - if (hasPassword && !hasUser) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "If you provide a password, you must also provide a user", - path: [ProviderCredentialFields.USER], - }); + // Validate based on the via parameter + if (via === "app_client_secret") { + const clientSecret = data[ProviderCredentialFields.CLIENT_SECRET]; + if (!clientSecret || clientSecret.trim() === "") { + ctx.addIssue({ + code: "custom", + message: "Client Secret is required", + path: [ProviderCredentialFields.CLIENT_SECRET], + }); + } + } else if (via === "app_certificate") { + const certificateContent = + data[ProviderCredentialFields.CERTIFICATE_CONTENT]; + if (!certificateContent || certificateContent.trim() === "") { + ctx.addIssue({ + code: "custom", + message: "Certificate Content is required", + path: [ProviderCredentialFields.CERTIFICATE_CONTENT], + }); + } } } @@ -219,7 +223,7 @@ export const addCredentialsFormSchema = ( if (via === "personal_access_token") { if (!data[ProviderCredentialFields.PERSONAL_ACCESS_TOKEN]) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Personal Access Token is required", path: [ProviderCredentialFields.PERSONAL_ACCESS_TOKEN], }); @@ -227,7 +231,7 @@ export const addCredentialsFormSchema = ( } else if (via === "oauth_app") { if (!data[ProviderCredentialFields.OAUTH_APP_TOKEN]) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "OAuth App Token is required", path: [ProviderCredentialFields.OAUTH_APP_TOKEN], }); @@ -235,14 +239,14 @@ export const addCredentialsFormSchema = ( } else if (via === "github_app") { if (!data[ProviderCredentialFields.GITHUB_APP_ID]) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "GitHub App ID is required", path: [ProviderCredentialFields.GITHUB_APP_ID], }); } if (!data[ProviderCredentialFields.GITHUB_APP_KEY]) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "GitHub App Private Key is required", path: [ProviderCredentialFields.GITHUB_APP_KEY], }); @@ -390,7 +394,7 @@ export const mutedFindingsConfigFormSchema = z.object({ const yamlValidation = validateYaml(val); if (!yamlValidation.isValid) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Invalid YAML format: ${yamlValidation.error}`, }); return; @@ -399,7 +403,7 @@ export const mutedFindingsConfigFormSchema = z.object({ const mutelistValidation = validateMutelistYaml(val); if (!mutelistValidation.isValid) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: `Invalid mutelist structure: ${mutelistValidation.error}`, }); }