import { Helmet } from "react-helmet-async"; import { getAppName, isCloud } from "@/lib/config.ts"; import SettingsTitle from "@/components/settings/settings-title.tsx"; import { Alert, Button, Card, Divider, Group, Space, Title, Tooltip, } from "@mantine/core"; import { IconInfoCircle } from "@tabler/icons-react"; import React, { useState } from "react"; import useUserRole from "@/hooks/use-user-role.tsx"; import SsoProviderList from "@/ee/security/components/sso-provider-list.tsx"; import CreateSsoProvider from "@/ee/security/components/create-sso-provider.tsx"; import EnforceSso from "@/ee/security/components/enforce-sso.tsx"; import AllowedDomains from "@/ee/security/components/allowed-domains.tsx"; import { useTranslation } from "react-i18next"; import EnforceMfa from "@/ee/security/components/enforce-mfa.tsx"; import DisablePublicSharing from "@/ee/security/components/disable-public-sharing.tsx"; import TrashRetention from "@/ee/security/components/trash-retention.tsx"; import { useAtom } from "jotai"; import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts"; import { useHasFeature } from "@/ee/hooks/use-feature"; import { Feature } from "@/ee/features"; import { useGetScimTokensQuery } from "@/ee/scim/queries/scim-token-query"; import { ScimUrlPanel } from "@/ee/scim/components/scim-url-panel"; import { ScimTokenTable } from "@/ee/scim/components/scim-token-table"; import { CreateScimTokenModal } from "@/ee/scim/components/create-scim-token-modal"; import { ScimTokenCreatedModal } from "@/ee/scim/components/scim-token-created-modal"; import { RevokeScimTokenModal } from "@/ee/scim/components/revoke-scim-token-modal"; import { UpdateScimTokenModal } from "@/ee/scim/components/update-scim-token-modal"; import EnableScim from "@/ee/scim/components/enable-scim"; import { useCursorPaginate } from "@/hooks/use-cursor-paginate"; import Paginate from "@/components/common/paginate"; import { IScimToken } from "@/ee/scim/types/scim-token.types"; const SCIM_TOKEN_LIMIT = 5; export default function Security() { const { t } = useTranslation(); const { isAdmin } = useUserRole(); const hasCustomSso = useHasFeature(Feature.SSO_CUSTOM); const hasScim = useHasFeature(Feature.SCIM); const [workspace] = useAtom(workspaceAtom); const isScimEnabled = workspace?.isScimEnabled ?? false; const { cursor, goNext, goPrev } = useCursorPaginate(); const { data: scimData, isLoading: scimLoading } = useGetScimTokensQuery( hasScim && isScimEnabled ? { cursor } : undefined, ); const [createOpen, setCreateOpen] = useState(false); const [createdToken, setCreatedToken] = useState(null); const [updateTarget, setUpdateTarget] = useState(null); const [revokeTarget, setRevokeTarget] = useState(null); if (!isAdmin) { return null; } return ( <> Security - {getAppName()} {t("Single sign-on (SSO)")} {(isCloud() || hasCustomSso) && ( <> )} {hasCustomSso && ( <> )} {hasScim && ( <> {t("SCIM provisioning")} } color="blue" variant="light" mb="md" > {t("SCIM takes precedence over SSO group sync while enabled.")} {isScimEnabled && ( <> {t("SCIM tokens")} {scimData?.items.length > 0 && ( goNext(scimData?.meta?.nextCursor)} onPrev={goPrev} /> )} setCreateOpen(false)} onSuccess={setCreatedToken} /> setCreatedToken(null)} scimToken={createdToken} /> setUpdateTarget(null)} scimToken={updateTarget} /> setRevokeTarget(null)} scimToken={revokeTarget} /> )} )} ); }