Fix captcha token not being loaded early enough (#9800)

I've re-investigated the captchaToken being invalid on workspace domain
url in case where email is passed in the URL.
We need to be a bit more granular
This commit is contained in:
Charles Bochet
2025-01-22 18:11:21 +01:00
committed by GitHub
parent 5902dbd0b4
commit e881616822
2 changed files with 35 additions and 8 deletions

View File

@ -21,12 +21,12 @@ import {
import { SignInUpMode } from '@/auth/types/signInUpMode'; import { SignInUpMode } from '@/auth/types/signInUpMode';
import { useReadCaptchaToken } from '@/captcha/hooks/useReadCaptchaToken'; import { useReadCaptchaToken } from '@/captcha/hooks/useReadCaptchaToken';
import { useRequestFreshCaptchaToken } from '@/captcha/hooks/useRequestFreshCaptchaToken'; import { useRequestFreshCaptchaToken } from '@/captcha/hooks/useRequestFreshCaptchaToken';
import { isRequestingCaptchaTokenState } from '@/captcha/states/isRequestingCaptchaTokenState';
import { authProvidersState } from '@/client-config/states/authProvidersState'; import { authProvidersState } from '@/client-config/states/authProvidersState';
import { useRedirectToWorkspaceDomain } from '@/domain-manager/hooks/useRedirectToWorkspaceDomain'; import { useRedirectToWorkspaceDomain } from '@/domain-manager/hooks/useRedirectToWorkspaceDomain';
import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/SnackBar'; import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/SnackBar';
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
import { isRequestingCaptchaTokenState } from '@/captcha/states/isRequestingCaptchaTokenState';
const StyledContentContainer = styled(motion.div)` const StyledContentContainer = styled(motion.div)`
margin-bottom: ${({ theme }) => theme.spacing(8)}; margin-bottom: ${({ theme }) => theme.spacing(8)};

View File

@ -1,15 +1,22 @@
import { useSignInUp } from '@/auth/sign-in-up/hooks/useSignInUp'; import { useSignInUp } from '@/auth/sign-in-up/hooks/useSignInUp';
import { useSignInUpForm } from '@/auth/sign-in-up/hooks/useSignInUpForm'; import { useSignInUpForm } from '@/auth/sign-in-up/hooks/useSignInUpForm';
import { SignInUpStep } from '@/auth/states/signInUpStepState'; import { SignInUpStep } from '@/auth/states/signInUpStepState';
import { isRequestingCaptchaTokenState } from '@/captcha/states/isRequestingCaptchaTokenState';
import { captchaState } from '@/client-config/states/captchaState';
import { workspaceAuthProvidersState } from '@/workspace/states/workspaceAuthProvidersState'; import { workspaceAuthProvidersState } from '@/workspace/states/workspaceAuthProvidersState';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
import { isRequestingCaptchaTokenState } from '@/captcha/states/isRequestingCaptchaTokenState';
const searchParams = new URLSearchParams(window.location.search); const searchParams = new URLSearchParams(window.location.search);
const email = searchParams.get('email'); const email = searchParams.get('email');
enum LoadingStatus {
Loading = 'loading',
RequestingCaptchaToken = 'requestingCaptchaToken',
Done = 'done',
}
export const SignInUpWorkspaceScopeFormEffect = () => { export const SignInUpWorkspaceScopeFormEffect = () => {
const workspaceAuthProviders = useRecoilValue(workspaceAuthProvidersState); const workspaceAuthProviders = useRecoilValue(workspaceAuthProvidersState);
@ -17,7 +24,11 @@ export const SignInUpWorkspaceScopeFormEffect = () => {
isRequestingCaptchaTokenState, isRequestingCaptchaTokenState,
); );
const [isInitialLoading, setIsInitialLoading] = useState(false); const captcha = useRecoilValue(captchaState);
const [loadingStatus, setLoadingStatus] = useState<LoadingStatus>(
LoadingStatus.Loading,
);
const { form } = useSignInUpForm(); const { form } = useSignInUpForm();
@ -25,10 +36,26 @@ export const SignInUpWorkspaceScopeFormEffect = () => {
useSignInUp(form); useSignInUp(form);
useEffect(() => { useEffect(() => {
if (!isRequestingCaptchaToken) { if (loadingStatus === LoadingStatus.Done) {
setIsInitialLoading(true); return;
} }
}, [isRequestingCaptchaToken]);
if (!isDefined(captcha?.provider)) {
setLoadingStatus(LoadingStatus.Done);
return;
}
if (isRequestingCaptchaToken) {
setLoadingStatus(LoadingStatus.RequestingCaptchaToken);
}
if (
!isRequestingCaptchaToken &&
loadingStatus === LoadingStatus.RequestingCaptchaToken
) {
setLoadingStatus(LoadingStatus.Done);
}
}, [captcha?.provider, isRequestingCaptchaToken, loadingStatus]);
useEffect(() => { useEffect(() => {
if ( if (
@ -44,7 +71,7 @@ export const SignInUpWorkspaceScopeFormEffect = () => {
if ( if (
isDefined(email) && isDefined(email) &&
workspaceAuthProviders.password && workspaceAuthProviders.password &&
isInitialLoading loadingStatus === LoadingStatus.Done
) { ) {
continueWithCredentials(); continueWithCredentials();
} }
@ -56,7 +83,7 @@ export const SignInUpWorkspaceScopeFormEffect = () => {
workspaceAuthProviders.password, workspaceAuthProviders.password,
continueWithEmail, continueWithEmail,
continueWithCredentials, continueWithCredentials,
isInitialLoading, loadingStatus,
]); ]);
return <></>; return <></>;