import { PermissionAction } from '@supabase/shared-types/out/constants' import { Download, Loader2 } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { DocsButton } from 'components/ui/DocsButton' import { FormHeader } from 'components/ui/Forms/FormHeader' import { FormPanel } from 'components/ui/Forms/FormPanel' import { FormSection, FormSectionContent, FormSectionLabel } from 'components/ui/Forms/FormSection' import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' import { useSSLEnforcementQuery } from 'data/ssl-enforcement/ssl-enforcement-query' import { useSSLEnforcementUpdateMutation } from 'data/ssl-enforcement/ssl-enforcement-update-mutation' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Alert, Button, Switch, Tooltip, TooltipContent, TooltipTrigger } from 'ui' const SSLConfiguration = () => { const { ref } = useParams() const [isEnforced, setIsEnforced] = useState(false) const { data: settings } = useProjectSettingsV2Query({ projectRef: ref }) const { data: sslEnforcementConfiguration, isLoading, isSuccess, } = useSSLEnforcementQuery({ projectRef: ref, }) const { mutate: updateSSLEnforcement, isLoading: isSubmitting } = useSSLEnforcementUpdateMutation( { onSuccess: () => { toast.success('Successfully updated SSL configuration') }, onError: (error) => { setIsEnforced(initialIsEnforced) toast.error(`Failed to update SSL enforcement: ${error.message}`) }, } ) const { project } = useProjectContext() const canUpdateSSLEnforcement = useCheckPermissions(PermissionAction.UPDATE, 'projects', { resource: { project_id: project?.id, }, }) const initialIsEnforced = isSuccess ? sslEnforcementConfiguration.appliedSuccessfully && sslEnforcementConfiguration.currentConfig.database : false const hasAccessToSSLEnforcement = !( sslEnforcementConfiguration !== undefined && 'isNotAllowed' in sslEnforcementConfiguration && sslEnforcementConfiguration.isNotAllowed ) const env = process.env.NEXT_PUBLIC_ENVIRONMENT === 'prod' ? 'prod' : 'staging' const hasSSLCertificate = settings?.inserted_at !== undefined && new Date(settings.inserted_at) >= new Date('2021-04-30') useEffect(() => { if (!isLoading && sslEnforcementConfiguration) { setIsEnforced(initialIsEnforced) } }, [isLoading]) const toggleSSLEnforcement = async () => { if (!ref) return console.error('Project ref is required') setIsEnforced(!isEnforced) updateSSLEnforcement({ projectRef: ref, requestedConfig: { database: !isEnforced } }) } return (
Reject non-SSL connections to your database
{isSuccess && !sslEnforcementConfiguration?.appliedSuccessfully && (SSL Certificate
Use this certificate when connecting to your database to prevent snooping and man-in-the-middle attacks.