Only use CAPTCHA in logged out operations and pages (#10607)

Issue #10235

---------

Co-authored-by: ad-elias <elias@autodiligence.com>
This commit is contained in:
eliasylonen
2025-03-07 11:03:30 +01:00
committed by GitHub
parent f3feaa6a0e
commit 0210e07497
7 changed files with 34 additions and 2 deletions

View File

@ -1,8 +1,13 @@
import React from 'react';
import { CaptchaProviderScriptLoaderEffect } from '@/captcha/components/CaptchaProviderScriptLoaderEffect';
import { isCaptchaRequiredForPath } from '@/captcha/utils/isCaptchaRequiredForPath';
export const CaptchaProvider = ({ children }: React.PropsWithChildren) => {
if (!isCaptchaRequiredForPath(window.location.pathname)) {
return <>{children}</>;
}
return (
<>
<div id="captcha-widget" data-size="invisible"></div>

View File

@ -0,0 +1,9 @@
import { AppPath } from '@/types/AppPath';
export const CAPTCHA_PROTECTED_PATHS: string[] = [
AppPath.SignInUp,
AppPath.Verify,
AppPath.VerifyEmail,
AppPath.ResetPassword,
AppPath.Invite,
];

View File

@ -2,6 +2,7 @@ import { useRecoilCallback, useSetRecoilState } from 'recoil';
import { captchaTokenState } from '@/captcha/states/captchaTokenState';
import { isRequestingCaptchaTokenState } from '@/captcha/states/isRequestingCaptchaTokenState';
import { isCaptchaRequiredForPath } from '@/captcha/utils/isCaptchaRequiredForPath';
import { captchaState } from '@/client-config/states/captchaState';
import { CaptchaDriverType } from '~/generated-metadata/graphql';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
@ -22,6 +23,10 @@ export const useRequestFreshCaptchaToken = () => {
const requestFreshCaptchaToken = useRecoilCallback(
({ snapshot }) =>
async () => {
if (!isCaptchaRequiredForPath(window.location.pathname)) {
return;
}
const captcha = snapshot.getLoadable(captchaState).getValue();
if (isUndefinedOrNull(captcha?.provider)) {

View File

@ -0,0 +1,13 @@
import { matchPath } from 'react-router-dom';
import { CAPTCHA_PROTECTED_PATHS } from '../constants/CaptchaProtectedPaths';
export const isCaptchaRequiredForPath = (pathname: string): boolean =>
CAPTCHA_PROTECTED_PATHS.some((path) =>
matchPath(
{
path,
end: false, // Match nested routes too
},
pathname,
),
);

View File

@ -1,6 +1,6 @@
import { DynamicModule, Global } from '@nestjs/common';
import { CAPTCHA_DRIVER } from 'src/engine/core-modules/captcha/captcha.constants';
import { CAPTCHA_DRIVER } from 'src/engine/core-modules/captcha/constants/captcha-driver.constants';
import { CaptchaService } from 'src/engine/core-modules/captcha/captcha.service';
import { GoogleRecaptchaDriver } from 'src/engine/core-modules/captcha/drivers/google-recaptcha.driver';
import { TurnstileDriver } from 'src/engine/core-modules/captcha/drivers/turnstile.driver';

View File

@ -2,7 +2,7 @@ import { Inject, Injectable } from '@nestjs/common';
import { CaptchaDriver } from 'src/engine/core-modules/captcha/drivers/interfaces/captcha-driver.interface';
import { CAPTCHA_DRIVER } from 'src/engine/core-modules/captcha/captcha.constants';
import { CAPTCHA_DRIVER } from 'src/engine/core-modules/captcha/constants/captcha-driver.constants';
import { CaptchaValidateResult } from 'src/engine/core-modules/captcha/interfaces';
@Injectable()