import { useEffect } from "react"; import { Controller, useForm } from "react-hook-form"; import { useRouter } from "next/router"; import { faAt } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; import { Button, ContentLoader, FormControl, Input, Select, SelectClear, SelectItem, Switch, Tab, TabList, TabPanel, Tabs } from "@app/components/v2"; import { useOrganization, useServerConfig, useUser } from "@app/context"; import { useGetOrganizations, useUpdateServerConfig } from "@app/hooks/api"; import { AuthPanel } from "./AuthPanel"; import { RateLimitPanel } from "./RateLimitPanel"; enum TabSections { Settings = "settings", Auth = "auth", RateLimit = "rate-limit" } enum SignUpModes { Disabled = "disabled", Anyone = "anyone" } const formSchema = z.object({ signUpMode: z.nativeEnum(SignUpModes), allowedSignUpDomain: z.string().optional().nullable(), trustSamlEmails: z.boolean(), trustLdapEmails: z.boolean(), trustOidcEmails: z.boolean(), defaultAuthOrgId: z.string() }); type TDashboardForm = z.infer; export const AdminDashboardPage = () => { const router = useRouter(); const data = useServerConfig(); const { config } = data; const { control, handleSubmit, watch, formState: { isSubmitting, isDirty } } = useForm({ resolver: zodResolver(formSchema), values: { // eslint-disable-next-line signUpMode: config.allowSignUp ? SignUpModes.Anyone : SignUpModes.Disabled, allowedSignUpDomain: config.allowedSignUpDomain, trustSamlEmails: config.trustSamlEmails, trustLdapEmails: config.trustLdapEmails, trustOidcEmails: config.trustOidcEmails, defaultAuthOrgId: config.defaultAuthOrgId ?? "" } }); const signUpMode = watch("signUpMode"); const defaultAuthOrgId = watch("defaultAuthOrgId"); const { user, isLoading: isUserLoading } = useUser(); const { orgs } = useOrganization(); const { mutateAsync: updateServerConfig } = useUpdateServerConfig(); const organizations = useGetOrganizations(); const isNotAllowed = !user?.superAdmin; // TODO(akhilmhdh): on nextjs 14 roadmap this will be properly addressed with context split useEffect(() => { if (isNotAllowed && !isUserLoading) { if (orgs?.length) { localStorage.setItem("orgData.id", orgs?.[0]?.id); router.push(`/org/${orgs?.[0]?.id}/overview`); } } }, [isNotAllowed, isUserLoading]); const onFormSubmit = async (formData: TDashboardForm) => { try { const { allowedSignUpDomain, trustSamlEmails, trustLdapEmails, trustOidcEmails } = formData; await updateServerConfig({ defaultAuthOrgId: defaultAuthOrgId || null, allowSignUp: signUpMode !== SignUpModes.Disabled, allowedSignUpDomain: signUpMode === SignUpModes.Anyone ? allowedSignUpDomain : null, trustSamlEmails, trustLdapEmails, trustOidcEmails }); createNotification({ text: "Successfully changed sign up setting.", type: "success" }); } catch (e) { console.error(e); createNotification({ type: "error", text: "Failed to update sign up setting." }); } }; return (

Admin Dashboard

Manage your instance level configurations.

{isUserLoading || isNotAllowed ? ( ) : (
General Authentication Rate Limit
Allow user signups
Select if you want users to be able to signup freely into your Infisical instance.
( )} />
{signUpMode === "anyone" && (
Restrict signup by email domain(s)
( } /> )} />
)}
Default organization
Select the default organization you want to set for SAML/LDAP based logins. When selected, user logins will be automatically scoped to the selected organization.
( )} />
Trust emails
Select if you want Infisical to trust external emails from SAML/LDAP/OIDC identity providers. If set to false, then Infisical will prompt SAML/LDAP/OIDC provisioned users to verify their email upon their first login.
{ return ( field.onChange(value)} isChecked={field.value} >

Trust SAML emails

); }} /> { return ( field.onChange(value)} isChecked={field.value} >

Trust LDAP emails

); }} /> { return ( field.onChange(value)} isChecked={field.value} >

Trust OIDC emails

); }} />
)}
); };