import React from "react"; import { z } from "zod"; import { useForm } from "@mantine/form"; import { zodResolver } from "mantine-form-zod-resolver"; import { Box, Button, Group, Stack, Switch, TextInput, Textarea, Text, Accordion, } from "@mantine/core"; import classes from "@/ee/security/components/sso.module.css"; import { IAuthProvider } from "@/ee/security/types/security.types.ts"; import { useTranslation } from "react-i18next"; import { useUpdateSsoProviderMutation } from "@/ee/security/queries/security-query.ts"; import { IconInfoCircle } from "@tabler/icons-react"; const ssoSchema = z.object({ name: z.string().min(1, "Display name is required"), ldapUrl: z.string().url().startsWith("ldap", "Must be an LDAP URL"), ldapBindDn: z.string().min(1, "Bind DN is required"), ldapBindPassword: z.string().min(1, "Bind password is required"), ldapBaseDn: z.string().min(1, "Base DN is required"), ldapUserSearchFilter: z.string().optional(), ldapTlsEnabled: z.boolean(), ldapTlsCaCert: z.string().optional(), isEnabled: z.boolean(), allowSignup: z.boolean(), groupSync: z.boolean(), }); type SSOFormValues = z.infer; interface SsoFormProps { provider: IAuthProvider; onClose?: () => void; } export function SsoLDAPForm({ provider, onClose }: SsoFormProps) { const { t } = useTranslation(); const updateSsoProviderMutation = useUpdateSsoProviderMutation(); const form = useForm({ initialValues: { name: provider.name || "", ldapUrl: provider.ldapUrl || "", ldapBindDn: provider.ldapBindDn || "", ldapBindPassword: provider.ldapBindPassword || "", ldapBaseDn: provider.ldapBaseDn || "", ldapUserSearchFilter: provider.ldapUserSearchFilter || "(mail={{username}})", ldapTlsEnabled: provider.ldapTlsEnabled || false, ldapTlsCaCert: provider.ldapTlsCaCert || "", isEnabled: provider.isEnabled, allowSignup: provider.allowSignup, groupSync: provider.groupSync || false, }, validate: zodResolver(ssoSchema), }); const handleSubmit = async (values: SSOFormValues) => { const ssoData: Partial = { providerId: provider.id, }; if (form.isDirty("name")) { ssoData.name = values.name; } if (form.isDirty("ldapUrl")) { ssoData.ldapUrl = values.ldapUrl; } if (form.isDirty("ldapBindDn")) { ssoData.ldapBindDn = values.ldapBindDn; } if (form.isDirty("ldapBindPassword")) { ssoData.ldapBindPassword = values.ldapBindPassword; } if (form.isDirty("ldapBaseDn")) { ssoData.ldapBaseDn = values.ldapBaseDn; } if (form.isDirty("ldapUserSearchFilter")) { ssoData.ldapUserSearchFilter = values.ldapUserSearchFilter; } if (form.isDirty("ldapTlsEnabled")) { ssoData.ldapTlsEnabled = values.ldapTlsEnabled; } if (form.isDirty("ldapTlsCaCert")) { ssoData.ldapTlsCaCert = values.ldapTlsCaCert; } if (form.isDirty("isEnabled")) { ssoData.isEnabled = values.isEnabled; } if (form.isDirty("allowSignup")) { ssoData.allowSignup = values.allowSignup; } if (form.isDirty("groupSync")) { ssoData.groupSync = values.groupSync; } await updateSsoProviderMutation.mutateAsync(ssoData); form.resetDirty(); onClose(); }; return (
}> {t("Advanced Settings")}
{t("Enable TLS/SSL")} Use secure connection to LDAP server
{form.values.ldapTlsEnabled && (