diff --git a/Jenkinsfile b/Jenkinsfile index 02fe649..b416518 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -334,6 +334,13 @@ stage('SonarQube Quality Gate') { steps { sh ''' + set -a + . /opt/furious-ducks/secrets/tiptop-mail.env + set +a + + test -n "${TURNSTILE_SITE_KEY}" + echo "Turnstile site key chargée (longueur: ${#TURNSTILE_SITE_KEY})" + docker build \ -t "${BACKEND_IMAGE}:${IMAGE_TAG}" \ backend diff --git a/frontend/src/components/Captcha.jsx b/frontend/src/components/Captcha.jsx index 87626cf..47d13e5 100644 --- a/frontend/src/components/Captcha.jsx +++ b/frontend/src/components/Captcha.jsx @@ -1,5 +1,5 @@ import { useEffect, useRef } from 'react' -import { TURNSTILE_SITE_KEY } from '../config/captcha' +import { CAPTCHA_ENABLED, TURNSTILE_SITE_KEY } from '../config/captcha' const TURNSTILE_SCRIPT_ID = 'cf-turnstile-script' const TURNSTILE_SCRIPT_URL = @@ -10,7 +10,9 @@ export default function Captcha({ onToken }) { const widgetIdRef = useRef(null) useEffect(() => { - if (!TURNSTILE_SITE_KEY || !containerRef.current) return + if (!CAPTCHA_ENABLED || !TURNSTILE_SITE_KEY || !containerRef.current) { + return + } let cancelled = false @@ -27,7 +29,7 @@ export default function Captcha({ onToken }) { try { window.turnstile.remove(widgetIdRef.current) } catch { - // Rien à faire + // Widget déjà supprimé } widgetIdRef.current = null @@ -41,6 +43,7 @@ export default function Captcha({ onToken }) { sitekey: TURNSTILE_SITE_KEY, language: 'fr', size: 'flexible', + appearance: 'always', callback: (token) => { onToken(token) @@ -66,23 +69,28 @@ export default function Captcha({ onToken }) { return } - const previousCallback = window.onloadTurnstileCallback + if (existingScript) { + existingScript.addEventListener('load', renderWidget, { + once: true, + }) - window.onloadTurnstileCallback = () => { - previousCallback?.() - renderWidget() + return () => { + cancelled = true + } } - if (!existingScript) { - const script = document.createElement('script') + const script = document.createElement('script') - script.id = TURNSTILE_SCRIPT_ID - script.src = `${TURNSTILE_SCRIPT_URL}&onload=onloadTurnstileCallback` - script.async = true - script.defer = true + script.id = TURNSTILE_SCRIPT_ID + script.src = TURNSTILE_SCRIPT_URL + script.async = true + script.defer = true - document.head.appendChild(script) - } + script.addEventListener('load', renderWidget, { + once: true, + }) + + document.head.appendChild(script) return () => { cancelled = true @@ -94,7 +102,7 @@ export default function Captcha({ onToken }) { try { window.turnstile.remove(widgetIdRef.current) } catch { - // Rien à faire + // Widget déjà supprimé } } @@ -102,7 +110,9 @@ export default function Captcha({ onToken }) { } }, [onToken]) - if (!TURNSTILE_SITE_KEY) return null + if (!CAPTCHA_ENABLED || !TURNSTILE_SITE_KEY) { + return null + } return (