import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' import Link from 'next/link' import { useEffect, useState } from 'react' import toast from 'react-hot-toast' import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { FormHeader, FormPanel, FormSection, FormSectionContent, FormSectionLabel, } from 'components/ui/Forms' import { useProjectSettingsQuery } from 'data/config/project-settings-query' import { useSSLEnforcementQuery } from 'data/ssl-enforcement/ssl-enforcement-query' import { useSSLEnforcementUpdateMutation } from 'data/ssl-enforcement/ssl-enforcement-update-mutation' import { useCheckPermissions } from 'hooks' import { Alert, Button, IconDownload, IconExternalLink, IconLoader, Toggle } from 'ui' const SSLConfiguration = () => { const { ref } = useParams() const [isEnforced, setIsEnforced] = useState(false) const { data: projectSettings } = useProjectSettingsQuery({ 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?.isNotAllowed const env = process.env.NEXT_PUBLIC_ENVIRONMENT === 'prod' ? 'prod' : 'staging' const hasSSLCertificate = projectSettings?.project !== undefined && new Date(projectSettings.project.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.