From 96eee4326a66d4af75de867c55c89092b1f55d8f Mon Sep 17 00:00:00 2001 From: Youssef Date: Mon, 22 Jun 2026 23:25:01 +0200 Subject: [PATCH] feat(security): configuration dynamique du Captcha Cloudflare Turnstile --- .../PublicInscriptionController.java | 32 +++++++++++-------- .../resources/templates/public/demarrer.html | 11 ++++--- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/as-talange-web/src/main/java/com/astalange/web/controller/PublicInscriptionController.java b/as-talange-web/src/main/java/com/astalange/web/controller/PublicInscriptionController.java index e84d3f5..0f8d727 100644 --- a/as-talange-web/src/main/java/com/astalange/web/controller/PublicInscriptionController.java +++ b/as-talange-web/src/main/java/com/astalange/web/controller/PublicInscriptionController.java @@ -24,10 +24,10 @@ public class PublicInscriptionController { private final PreInscriptionRepository preInscriptionRepository; private final SaisonRepository saisonRepository; - public PublicInscriptionController(CaptchaValidationService captchaValidationService, - TokenPreInscriptionRepository tokenRepository, - PreInscriptionRepository preInscriptionRepository, - SaisonRepository saisonRepository) { + public PublicInscriptionController(CaptchaValidationService captchaValidationService, + TokenPreInscriptionRepository tokenRepository, + PreInscriptionRepository preInscriptionRepository, + SaisonRepository saisonRepository) { this.captchaValidationService = captchaValidationService; this.tokenRepository = tokenRepository; this.preInscriptionRepository = preInscriptionRepository; @@ -44,13 +44,16 @@ public class PublicInscriptionController { } @PostMapping("/demarrer") - public String processDemarrer(@RequestParam("cf-turnstile-response") String captchaResponse, RedirectAttributes redirectAttributes) { + public String processDemarrer(@RequestParam("cf-turnstile-response") String captchaResponse, + RedirectAttributes redirectAttributes) { Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null); if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) { - redirectAttributes.addFlashAttribute("error", "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club."); + redirectAttributes.addFlashAttribute("error", + "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club."); return "redirect:/inscription-public/demarrer"; } - // En vrai, captchaResponse dépend du fournisseur. Cloudflare Turnstile = cf-turnstile-response + // En vrai, captchaResponse dépend du fournisseur. Cloudflare Turnstile = + // cf-turnstile-response if (!captchaValidationService.validateCaptcha(captchaResponse)) { redirectAttributes.addFlashAttribute("error", "Validation CAPTCHA échouée. Veuillez réessayer."); return "redirect:/inscription-public/demarrer"; @@ -65,13 +68,15 @@ public class PublicInscriptionController { } @GetMapping("/formulaire") - public String showFormulaire(@RequestParam("token") String tokenUuid, Model model, RedirectAttributes redirectAttributes) { + public String showFormulaire(@RequestParam("token") String tokenUuid, Model model, + RedirectAttributes redirectAttributes) { Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null); if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) { - redirectAttributes.addFlashAttribute("error", "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club."); + redirectAttributes.addFlashAttribute("error", + "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club."); return "redirect:/inscription-public/demarrer"; } - + TokenPreInscription token = tokenRepository.findByValeurUuid(tokenUuid).orElse(null); if (token == null || !token.isValide()) { return "public/lien-expire"; @@ -84,8 +89,8 @@ public class PublicInscriptionController { @PostMapping("/formulaire") public String processFormulaire(@RequestParam("token") String tokenUuid, - @ModelAttribute("preInscription") PreInscription preInscription, - RedirectAttributes redirectAttributes) { + @ModelAttribute("preInscription") PreInscription preInscription, + RedirectAttributes redirectAttributes) { TokenPreInscription token = tokenRepository.findByValeurUuid(tokenUuid).orElse(null); if (token == null || !token.isValide()) { return "public/lien-expire"; @@ -93,7 +98,8 @@ public class PublicInscriptionController { Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null); if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) { - redirectAttributes.addFlashAttribute("error", "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club."); + redirectAttributes.addFlashAttribute("error", + "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club."); return "redirect:/inscription-public/demarrer"; } diff --git a/as-talange-web/src/main/resources/templates/public/demarrer.html b/as-talange-web/src/main/resources/templates/public/demarrer.html index 6dd401b..7f0e2de 100644 --- a/as-talange-web/src/main/resources/templates/public/demarrer.html +++ b/as-talange-web/src/main/resources/templates/public/demarrer.html @@ -20,15 +20,18 @@ AS Talange

Inscription au club

-

Veuillez valider le captcha pour accéder au formulaire sécurisé.

+

Veuillez valider le captcha pour accéder au + formulaire sécurisé.

+ +
-
-
Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club.
-
+