From 310fac3f4d5bc6db7bc0d29e30b63cc9b5046340 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 14 Feb 2024 14:07:05 +0800 Subject: [PATCH] Clean up auth related feature flags --- .../BasicAuthSettingsForm.tsx | 179 ++++++++---------- .../Auth/Hooks/BasicHooksConfig.tsx | 26 +-- .../Auth/Hooks/EnterpriseHooksConfig.tsx | 70 ++----- .../layouts/AuthLayout/AuthLayout.tsx | 5 +- .../layouts/AuthLayout/AuthLayout.utils.ts | 20 +- 5 files changed, 105 insertions(+), 195 deletions(-) diff --git a/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx index edec80576b2..ac78878ccfa 100644 --- a/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx @@ -1,7 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' - import { useParams } from 'common' -import { observer } from 'mobx-react-lite' import { useEffect, useState } from 'react' import { AlertDescription_Shadcn_, @@ -18,6 +16,7 @@ import { } from 'ui' import { boolean, number, object, string } from 'yup' +import { Markdown } from 'components/interfaces/Markdown' import { FormActions, FormHeader, @@ -30,8 +29,7 @@ import UpgradeToPro from 'components/ui/UpgradeToPro' import { useAuthConfigQuery } from 'data/auth/auth-config-query' import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useCheckPermissions, useFlag, useSelectedOrganization, useStore } from 'hooks' -import { Markdown } from 'components/interfaces/Markdown' +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import FormField from '../AuthProvidersForm/FormField' // Use a const string to represent no chars option. Represented as empty string on the backend side. @@ -75,7 +73,7 @@ function HoursOrNeverText({ value }: { value: number }) { const formId = 'auth-config-basic-settings' -const BasicAuthSettingsForm = observer(() => { +const BasicAuthSettingsForm = () => { const { ui } = useStore() const { ref: projectRef } = useParams() const { @@ -96,9 +94,6 @@ const BasicAuthSettingsForm = observer(() => { }) const isProPlanAndUp = isSuccessSubscription && subscription?.plan?.id !== 'free' - const singlePerUserReleased = useFlag('authSingleSessionPerUserReleased') - const passwordStrengthReleased = useFlag('authPasswordStrengthReleased') - const hibpReleased = useFlag('authHIBPReleased') const INITIAL_VALUES = { DISABLE_SIGNUP: !authConfig?.DISABLE_SIGNUP, @@ -109,25 +104,11 @@ const BasicAuthSettingsForm = observer(() => { SECURITY_CAPTCHA_PROVIDER: authConfig?.SECURITY_CAPTCHA_PROVIDER || 'hcaptcha', SESSIONS_TIMEBOX: authConfig?.SESSIONS_TIMEBOX || 0, SESSIONS_INACTIVITY_TIMEOUT: authConfig?.SESSIONS_INACTIVITY_TIMEOUT || 0, - ...(singlePerUserReleased - ? { - SESSIONS_SINGLE_PER_USER: authConfig?.SESSIONS_SINGLE_PER_USER || false, - } - : null), - - ...(passwordStrengthReleased - ? { - PASSWORD_MIN_LENGTH: authConfig?.PASSWORD_MIN_LENGTH || 6, - PASSWORD_REQUIRED_CHARACTERS: - authConfig?.PASSWORD_REQUIRED_CHARACTERS || NO_REQUIRED_CHARACTERS, - - ...(hibpReleased - ? { - PASSWORD_HIBP_ENABLED: authConfig?.PASSWORD_HIBP_ENABLED || false, - } - : null), - } - : null), + SESSIONS_SINGLE_PER_USER: authConfig?.SESSIONS_SINGLE_PER_USER || false, + PASSWORD_MIN_LENGTH: authConfig?.PASSWORD_MIN_LENGTH || 6, + PASSWORD_REQUIRED_CHARACTERS: + authConfig?.PASSWORD_REQUIRED_CHARACTERS || NO_REQUIRED_CHARACTERS, + PASSWORD_HIBP_ENABLED: authConfig?.PASSWORD_HIBP_ENABLED || false, } const onSubmit = (values: any, { resetForm }: any) => { @@ -173,6 +154,7 @@ const BasicAuthSettingsForm = observer(() => { {({ handleReset, resetForm, values, initialValues }: any) => { const hasChanges = JSON.stringify(values) !== JSON.stringify(initialValues) // Form is reset once remote data is loaded in store + // eslint-disable-next-line react-hooks/rules-of-hooks useEffect(() => { if (isSuccess) resetForm({ values: INITIAL_VALUES, initialValues: INITIAL_VALUES }) }, [isSuccess]) @@ -228,70 +210,65 @@ const BasicAuthSettingsForm = observer(() => { /> - {passwordStrengthReleased && ( - <> - Passwords}> - - characters} - disabled={!canUpdateConfig} - /> - - {isProPlanAndUp ? ( - <> - ) : ( - - )} - - - - - )} + Passwords}> + + characters} + disabled={!canUpdateConfig} + /> + + {isProPlanAndUp ? ( + <> + ) : ( + + )} + + + User Sessions}> {isProPlanAndUp ? ( @@ -304,16 +281,14 @@ const BasicAuthSettingsForm = observer(() => { organizationSlug={organization!.slug} /> )} - {singlePerUserReleased && ( - - )} + { }} ) -}) +} export default BasicAuthSettingsForm diff --git a/apps/studio/components/interfaces/Auth/Hooks/BasicHooksConfig.tsx b/apps/studio/components/interfaces/Auth/Hooks/BasicHooksConfig.tsx index ea90bb8f6d3..476f85236b7 100644 --- a/apps/studio/components/interfaces/Auth/Hooks/BasicHooksConfig.tsx +++ b/apps/studio/components/interfaces/Auth/Hooks/BasicHooksConfig.tsx @@ -21,8 +21,7 @@ import { } from 'components/ui/Forms' import { useAuthConfigQuery } from 'data/auth/auth-config-query' import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useCheckPermissions, useFlag, useStore } from 'hooks' - +import { useCheckPermissions, useStore } from 'hooks' import SchemaFunctionSelector from './SchemaFunctionSelector' const schema = object({ @@ -43,19 +42,12 @@ const BasicHooksConfig = () => { isSuccess, } = useAuthConfigQuery({ projectRef }) const { mutate: updateAuthConfig, isLoading: isUpdatingConfig } = useAuthConfigUpdateMutation() - - const customizeAccessTokenReleased = useFlag('authHooksCustomizeAccessToken') - const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') // TODO: Remove as any once these properties are defined in Auth Config types const INITIAL_VALUES = { - ...(customizeAccessTokenReleased - ? { - HOOK_CUSTOM_ACCESS_TOKEN_ENABLED: authConfig?.HOOK_CUSTOM_ACCESS_TOKEN_ENABLED || false, - HOOK_CUSTOM_ACCESS_TOKEN_URI: authConfig?.HOOK_CUSTOM_ACCESS_TOKEN_URI || '', - } - : null), + HOOK_CUSTOM_ACCESS_TOKEN_ENABLED: authConfig?.HOOK_CUSTOM_ACCESS_TOKEN_ENABLED || false, + HOOK_CUSTOM_ACCESS_TOKEN_URI: authConfig?.HOOK_CUSTOM_ACCESS_TOKEN_URI || '', } const onSubmit = (values: any, { resetForm }: any) => { @@ -142,23 +134,15 @@ const BasicHooksConfig = () => { descriptionText="Select the function to be called by Supabase Auth each time a new JWT is created. It should return the claims you wish to be present in the JWT." values={values} setFieldValue={setFieldValue} - disabled={!canUpdateConfig || !customizeAccessTokenReleased} + disabled={!canUpdateConfig} /> - {!customizeAccessTokenReleased && ( - - Coming soon! - - This hook is not available yet on your project. - - - )} {values.HOOK_CUSTOM_ACCESS_TOKEN_URI && ( )} diff --git a/apps/studio/components/interfaces/Auth/Hooks/EnterpriseHooksConfig.tsx b/apps/studio/components/interfaces/Auth/Hooks/EnterpriseHooksConfig.tsx index e027518dbeb..167f26f0c12 100644 --- a/apps/studio/components/interfaces/Auth/Hooks/EnterpriseHooksConfig.tsx +++ b/apps/studio/components/interfaces/Auth/Hooks/EnterpriseHooksConfig.tsx @@ -23,8 +23,7 @@ import UpgradeToPro from 'components/ui/UpgradeToPro' import { useAuthConfigQuery } from 'data/auth/auth-config-query' import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useCheckPermissions, useFlag, useSelectedOrganization, useStore } from 'hooks' - +import { useCheckPermissions, useSelectedOrganization, useStore } from 'hooks' import SchemaFunctionSelector from './SchemaFunctionSelector' const schema = object({ @@ -47,10 +46,7 @@ const EnterpriseHooksConfig = () => { isSuccess, } = useAuthConfigQuery({ projectRef }) const { mutate: updateAuthConfig, isLoading: isUpdatingConfig } = useAuthConfigUpdateMutation() - const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') - const mfaVerificationAttemptReleased = useFlag('authHookMFAVerification') - const passwordVerificationAttemptReleased = useFlag('authHookPasswordVerification') const organization = useSelectedOrganization() const { data: subscription, isSuccess: isSuccessSubscription } = useOrgSubscriptionQuery({ @@ -61,22 +57,14 @@ const EnterpriseHooksConfig = () => { isSuccessSubscription && subscription?.plan?.id !== 'free' && subscription?.plan?.id !== 'pro' const INITIAL_VALUES = { - ...(mfaVerificationAttemptReleased - ? { - HOOK_MFA_VERIFICATION_ATTEMPT_ENABLED: - authConfig?.HOOK_MFA_VERIFICATION_ATTEMPT_ENABLED || false, - HOOK_MFA_VERIFICATION_ATTEMPT_URI: authConfig?.HOOK_MFA_VERIFICATION_ATTEMPT_URI || '', - } - : null), - ...(passwordVerificationAttemptReleased - ? { - // remove as any when the types are merged in - HOOK_PASSWORD_VERIFICATION_ATTEMPT_ENABLED: - (authConfig as any)?.HOOK_PASSWORD_VERIFICATION_ATTEMPT_ENABLED || false, - HOOK_PASSWORD_VERIFICATION_ATTEMPT_URI: - (authConfig as any)?.HOOK_PASSWORD_VERIFICATION_ATTEMPT_URI || '', - } - : null), + HOOK_MFA_VERIFICATION_ATTEMPT_ENABLED: + authConfig?.HOOK_MFA_VERIFICATION_ATTEMPT_ENABLED || false, + HOOK_MFA_VERIFICATION_ATTEMPT_URI: authConfig?.HOOK_MFA_VERIFICATION_ATTEMPT_URI || '', + // remove as any when the types are merged in + HOOK_PASSWORD_VERIFICATION_ATTEMPT_ENABLED: + (authConfig as any)?.HOOK_PASSWORD_VERIFICATION_ATTEMPT_ENABLED || false, + HOOK_PASSWORD_VERIFICATION_ATTEMPT_URI: + (authConfig as any)?.HOOK_PASSWORD_VERIFICATION_ATTEMPT_URI || '', } const onSubmit = (values: any, { resetForm }: any) => { @@ -172,31 +160,15 @@ const EnterpriseHooksConfig = () => { descriptionText="Select the function to be called by Supabase Auth each time a user tries to verify an MFA factor. Return a decision on whether to reject the attempt and future ones, or to allow the user to keep trying." values={values} setFieldValue={setFieldValue} - disabled={ - !canUpdateConfig || - !isTeamsEnterprisePlan || - !mfaVerificationAttemptReleased - } + disabled={!canUpdateConfig || !isTeamsEnterprisePlan} /> - {!mfaVerificationAttemptReleased && ( - - Coming soon! - - This hook is not available yet on your project. - - - )} {values.HOOK_MFA_VERIFICATION_ATTEMPT_URI && ( )} @@ -212,31 +184,15 @@ const EnterpriseHooksConfig = () => { descriptionText="Select the function to be called by Supabase Auth each time a user tries to sign in with a password. Return a decision whether to allow the user to reject the attempt, or to allow the user to keep trying." values={values} setFieldValue={setFieldValue} - disabled={ - !canUpdateConfig || - !isTeamsEnterprisePlan || - !passwordVerificationAttemptReleased - } + disabled={!canUpdateConfig || !isTeamsEnterprisePlan} /> - {!passwordVerificationAttemptReleased && ( - - Coming soon! - - This hook is not available yet on your project. - - - )} {values.HOOK_PASSWORD_VERIFICATION_ATTEMPT_URI && ( )} diff --git a/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx b/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx index 4d3d62e1312..1a247684ec7 100644 --- a/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx +++ b/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx @@ -5,7 +5,7 @@ import { PropsWithChildren } from 'react' import { useIsColumnLevelPrivilegesEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import ProductMenu from 'components/ui/ProductMenu' import { useAuthConfigPrefetch } from 'data/auth/auth-config-query' -import { useFlag, withAuth } from 'hooks' +import { withAuth } from 'hooks' import ProjectLayout from '../' import { generateAuthMenu } from './AuthLayout.utils' @@ -15,7 +15,6 @@ export interface AuthLayoutProps { const AuthLayout = ({ title, children }: PropsWithChildren) => { const { ref: projectRef = 'default' } = useParams() - const hooksReleased = useFlag('authHooksReleased') const columnLevelPrivileges = useIsColumnLevelPrivilegesEnabled() useAuthConfigPrefetch({ projectRef }) @@ -30,7 +29,7 @@ const AuthLayout = ({ title, children }: PropsWithChildren) => productMenu={ } isBlocking={false} diff --git a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts index e3bfdcfc5b4..4704150201f 100644 --- a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts +++ b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts @@ -3,7 +3,7 @@ import { IS_PLATFORM } from 'lib/constants' export const generateAuthMenu = ( ref: string, - options: { hooksReleased?: boolean; columnLevelPrivileges?: boolean } = {} + options: { columnLevelPrivileges?: boolean } = {} ): ProductMenuGroup[] => { return [ { @@ -56,17 +56,13 @@ export const generateAuthMenu = ( url: `/project/${ref}/auth/url-configuration`, items: [], }, - ...(options?.hooksReleased - ? [ - { - name: 'Hooks', - key: 'hooks', - url: `/project/${ref}/auth/hooks`, - items: [], - label: 'BETA', - }, - ] - : []), + { + name: 'Hooks', + key: 'hooks', + url: `/project/${ref}/auth/hooks`, + items: [], + label: 'BETA', + }, ] : []), ],