From c8f01c01012ae95337ee417fba9eb3a00d78dad8 Mon Sep 17 00:00:00 2001 From: JensFalk Date: Mon, 21 Sep 2026 15:28:03 +0200 Subject: [PATCH] ValidationHandler.php hinzufuegen --- .../src/Handler/ValidationHandler.php | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 fp_altcha_spamschutz/src/Handler/ValidationHandler.php diff --git a/fp_altcha_spamschutz/src/Handler/ValidationHandler.php b/fp_altcha_spamschutz/src/Handler/ValidationHandler.php new file mode 100644 index 0000000..009855e --- /dev/null +++ b/fp_altcha_spamschutz/src/Handler/ValidationHandler.php @@ -0,0 +1,127 @@ +altchaService = $altchaService; + } + + /** + * @param array $args + */ + public function checkRegistrationPlausibility(array $args): void + { + try { + if (!$this->altchaService->isEnabledForRegistration()) { + return; + } + + if ($this->altchaService->verifyPost()) { + return; + } + + if (isset($args['fehlendeAngaben']) && \is_array($args['fehlendeAngaben'])) { + $args['fehlendeAngaben'][] = 'Sicherheitspruefung'; + } + + if (\array_key_exists('nReturnValue', $args)) { + $args['nReturnValue'] = 0; + } + } catch (\Throwable $e) { + // Bewusste Entscheidung: bei einem unerwarteten Fehler (z. B. Plugin nicht vollstaendig + // konfiguriert) lieber die Registrierung durchlassen, als die komplette Registrierungs- + // seite fuer echte Kunden zu blockieren. Ein Bot mehr ist besser als ein Shop, bei dem + // sich niemand mehr registrieren kann. + if ($this->altchaService->isDebug()) { + error_log('[fp_altcha_spamschutz] Fehler bei Registrierungspruefung: ' . $e->getMessage()); + } + } + } + + /** + * Fruehe Pruefung fuer die Newsletter-Anmeldung. Wird direkt aus Bootstrap::boot() aufgerufen, + * nicht ueber einen Hook, damit sie garantiert vor der Verarbeitung durch newsletter.php laeuft. + */ + public function guardNewsletterSubmission(): void + { + try { + if (!$this->altchaService->isEnabledForNewsletter()) { + return; + } + + $isNewsletterSubscribeSubmit = ($_SERVER['REQUEST_METHOD'] ?? '') === 'POST' + && isset($_POST['abonnieren']); + + if (!$isNewsletterSubscribeSubmit) { + return; + } + + if ($this->altchaService->verifyPost()) { + return; + } + + // Feld entfernen, damit JTL-Shop die Anmeldung nicht als "abonnieren"-Request erkennt + // und stattdessen nur das (leere) Formular erneut anzeigt. + unset($_POST['abonnieren']); + $_SESSION['fp_altcha_newsletter_error'] = true; + } catch (\Throwable $e) { + // Wird direkt in Bootstrap::boot() aufgerufen (nicht ueber einen Hook) -- ein + // Fehler hier darf auf keinen Fall den kompletten Seitenaufbau verhindern. + if ($this->altchaService->isDebug()) { + error_log('[fp_altcha_spamschutz] Fehler bei Newsletter-Fruehpruefung: ' . $e->getMessage()); + } + } + } + + /** + * Zusaetzliche Absicherung ueber HOOK_NEWSLETTER_PAGE_EMPFAENGEREINTRAGEN, falls die fruehe + * Pruefung in guardNewsletterSubmission() aus irgendeinem Grund nicht gegriffen hat. + * + * @param array $args Enthaelt 'oNewsletterEmpfaenger' (stdClass, per Referenz). + */ + public function checkNewsletterRecipient(array $args): void + { + try { + if (!$this->altchaService->isEnabledForNewsletter()) { + return; + } + + if (!empty($_SESSION['fp_altcha_newsletter_error'])) { + // Bereits in guardNewsletterSubmission() als ungueltig erkannt: Empfaenger-E-Mail + // leeren, damit JTL-Shops eigene Pflichtfeld-Pruefung den Insert verhindert. + if (isset($args['oNewsletterEmpfaenger']) && \is_object($args['oNewsletterEmpfaenger'])) { + $args['oNewsletterEmpfaenger']->cEmail = ''; + } + } + } catch (\Throwable $e) { + if ($this->altchaService->isDebug()) { + error_log('[fp_altcha_spamschutz] Fehler bei Newsletter-Absicherung: ' . $e->getMessage()); + } + } + } +}