v1.2.0: Umbenennung, zweizeiliger Erfolgstext, Umlaute

This commit is contained in:
2026-09-21 20:27:23 +02:00
parent 53a6ee2296
commit bda785662d
@@ -7,25 +7,25 @@ namespace Plugin\fp_altcha_spamschutz\src\Handler;
use Plugin\fp_altcha_spamschutz\src\Service\AltchaService; use Plugin\fp_altcha_spamschutz\src\Service\AltchaService;
/** /**
* Prueft die ALTCHA-Loesung bei Registrierung und Newsletter-Anmeldung. * Prüft die ALTCHA-Lösung bei Registrierung und Newsletter-Anmeldung.
* *
* Registrierung: nutzt den dokumentierten Hook HOOK_REGISTRIEREN_PAGE_REGISTRIEREN_PLAUSI (41), * Registrierung: nutzt den dokumentierten Hook HOOK_REGISTRIEREN_PAGE_REGISTRIEREN_PLAUSI (41),
* der genau fuer diesen Zweck (Plausibilitaetspruefung nach Formularabsendung) vorgesehen ist. * der genau für diesen Zweck (Plausibilitätsprüfung nach Formularabsendung) vorgesehen ist.
* Bei fehlender/ungueltiger Pruefung wird ein Eintrag zu "fehlendeAngaben" hinzugefuegt -- das ist * Bei fehlender/ungültiger Prüfung wird ein Eintrag zu "fehlendeAngaben" hinzugefügt -- das ist
* derselbe Mechanismus, den JTL-Shop fuer "Pflichtfeld nicht ausgefuellt" nutzt, der Kunde bekommt * derselbe Mechanismus, den JTL-Shop für "Pflichtfeld nicht ausgefüllt" nutzt, der Kunde bekommt
* also die normale, vertraute Fehlermeldung des Shops. * also die normale, vertraute Fehlermeldung des Shops.
* *
* Newsletter: die Dokumentation zum passenden Hook (HOOK_NEWSLETTER_PAGE_EMPFAENGEREINTRAGEN) ist * Newsletter: die Dokumentation zum passenden Hook (HOOK_NEWSLETTER_PAGE_EMPFAENGEREINTRAGEN) ist
* nicht eindeutig genug, um sich allein darauf zu verlassen. Deshalb wird zusaetzlich ganz frueh * nicht eindeutig genug, um sich allein darauf zu verlassen. Deshalb wird zusätzlich ganz früh
* (direkt in Bootstrap::boot(), vor jeder Shop-Verarbeitung) geprueft: schlaegt die Pruefung fehl, * (direkt in Bootstrap::boot(), vor jeder Shop-Verarbeitung) geprüft: schlägt die Prüfung fehl,
* wird das POST-Feld "abonnieren" entfernt, sodass JTL-Shop die Anmeldung erst gar nicht verarbeitet. * wird das POST-Feld "abonnieren" entfernt, sodass JTL-Shop die Anmeldung erst gar nicht verarbeitet.
* Der Hook-Handler unten ist eine zusaetzliche Absicherung ("defense in depth"), falls dieser fruehe * Der Hook-Handler unten ist eine zusätzliche Absicherung ("defense in depth"), falls dieser frühe
* Filter aus irgendeinem Grund nicht greift. * Filter aus irgendeinem Grund nicht greift.
* *
* Kontaktformular: der dafuer vorgesehene Hook (HOOK_KONTAKT_PAGE_PLAUSI) ist offiziell nicht * Kontaktformular: der dafür vorgesehene Hook (HOOK_KONTAKT_PAGE_PLAUSI) ist offiziell nicht
* dokumentiert (keine Angaben zu den uebergebenen Parametern). Um sich nicht auf ungeprueftes * dokumentiert (keine Angaben zu den übergebenen Parametern). Um sich nicht auf ungeprüftes
* Verhalten zu verlassen, wird hier bewusst derselbe fruehe, hook-unabhaengige Ansatz wie bei der * Verhalten zu verlassen, wird hier bewusst derselbe frühe, hook-unabhängige Ansatz wie bei der
* Newsletter-Anmeldung verwendet: direkte Pruefung von $_POST, noch bevor JTL-Shop das Formular * Newsletter-Anmeldung verwendet: direkte Prüfung von $_POST, noch bevor JTL-Shop das Formular
* verarbeitet (siehe guardContactSubmission()). * verarbeitet (siehe guardContactSubmission()).
*/ */
class ValidationHandler class ValidationHandler
@@ -52,26 +52,26 @@ class ValidationHandler
} }
if (isset($args['fehlendeAngaben']) && \is_array($args['fehlendeAngaben'])) { if (isset($args['fehlendeAngaben']) && \is_array($args['fehlendeAngaben'])) {
$args['fehlendeAngaben'][] = 'Sicherheitspruefung'; $args['fehlendeAngaben'][] = 'Sicherheitsprüfung';
} }
if (\array_key_exists('nReturnValue', $args)) { if (\array_key_exists('nReturnValue', $args)) {
$args['nReturnValue'] = 0; $args['nReturnValue'] = 0;
} }
} catch (\Throwable $e) { } catch (\Throwable $e) {
// Bewusste Entscheidung: bei einem unerwarteten Fehler (z. B. Plugin nicht vollstaendig // Bewusste Entscheidung: bei einem unerwarteten Fehler (z. B. Plugin nicht vollständig
// konfiguriert) lieber die Registrierung durchlassen, als die komplette Registrierungs- // 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 // seite für echte Kunden zu blockieren. Ein Bot mehr ist besser als ein Shop, bei dem
// sich niemand mehr registrieren kann. // sich niemand mehr registrieren kann.
if ($this->altchaService->isDebug()) { if ($this->altchaService->isDebug()) {
error_log('[fp_altcha_spamschutz] Fehler bei Registrierungspruefung: ' . $e->getMessage()); error_log('[fp_altcha_spamschutz] Fehler bei Registrierungsprüfung: ' . $e->getMessage());
} }
} }
} }
/** /**
* Fruehe Pruefung fuer die Newsletter-Anmeldung. Wird direkt aus Bootstrap::boot() aufgerufen, * Frühe Prüfung für die Newsletter-Anmeldung. Wird direkt aus Bootstrap::boot() aufgerufen,
* nicht ueber einen Hook, damit sie garantiert vor der Verarbeitung durch newsletter.php laeuft. * nicht über einen Hook, damit sie garantiert vor der Verarbeitung durch newsletter.php läuft.
*/ */
public function guardNewsletterSubmission(): void public function guardNewsletterSubmission(): void
{ {
@@ -96,18 +96,18 @@ class ValidationHandler
unset($_POST['abonnieren']); unset($_POST['abonnieren']);
$_SESSION['fp_altcha_newsletter_error'] = true; $_SESSION['fp_altcha_newsletter_error'] = true;
} catch (\Throwable $e) { } catch (\Throwable $e) {
// Wird direkt in Bootstrap::boot() aufgerufen (nicht ueber einen Hook) -- ein // Wird direkt in Bootstrap::boot() aufgerufen (nicht über einen Hook) -- ein
// Fehler hier darf auf keinen Fall den kompletten Seitenaufbau verhindern. // Fehler hier darf auf keinen Fall den kompletten Seitenaufbau verhindern.
if ($this->altchaService->isDebug()) { if ($this->altchaService->isDebug()) {
error_log('[fp_altcha_spamschutz] Fehler bei Newsletter-Fruehpruefung: ' . $e->getMessage()); error_log('[fp_altcha_spamschutz] Fehler bei Newsletter-Frühprüfung: ' . $e->getMessage());
} }
} }
} }
/** /**
* Fruehe Pruefung fuer das Kontaktformular. Wird direkt aus Bootstrap::boot() aufgerufen, nach * Frühe Prüfung für das Kontaktformular. Wird direkt aus Bootstrap::boot() aufgerufen, nach
* demselben Muster wie guardNewsletterSubmission(). Das Formular sendet ein verstecktes Feld * demselben Muster wie guardNewsletterSubmission(). Das Formular sendet ein verstecktes Feld
* "kontakt" mit dem Wert "1" mit, das als zuverlaessiges Erkennungsmerkmal dient. * "kontakt" mit dem Wert "1" mit, das als zuverlässiges Erkennungsmerkmal dient.
*/ */
public function guardContactSubmission(): void public function guardContactSubmission(): void
{ {
@@ -127,23 +127,23 @@ class ValidationHandler
return; return;
} }
// Pflichtfeld leeren, damit JTL-Shops eigene Pruefung ("Pflichtfeld nicht ausgefuellt") // Pflichtfeld leeren, damit JTL-Shops eigene Prüfung ("Pflichtfeld nicht ausgefüllt")
// die Anfrage abweist -- der Besucher bekommt die normale, vertraute Fehlermeldung. // die Anfrage abweist -- der Besucher bekommt die normale, vertraute Fehlermeldung.
unset($_POST['nachricht']); unset($_POST['nachricht']);
} catch (\Throwable $e) { } catch (\Throwable $e) {
// Wird direkt in Bootstrap::boot() aufgerufen (nicht ueber einen Hook) -- ein // Wird direkt in Bootstrap::boot() aufgerufen (nicht über einen Hook) -- ein
// Fehler hier darf auf keinen Fall den kompletten Seitenaufbau verhindern. // Fehler hier darf auf keinen Fall den kompletten Seitenaufbau verhindern.
if ($this->altchaService->isDebug()) { if ($this->altchaService->isDebug()) {
error_log('[fp_altcha_spamschutz] Fehler bei Kontakt-Fruehpruefung: ' . $e->getMessage()); error_log('[fp_altcha_spamschutz] Fehler bei Kontakt-Frühprüfung: ' . $e->getMessage());
} }
} }
} }
/** /**
* Zusaetzliche Absicherung ueber HOOK_NEWSLETTER_PAGE_EMPFAENGEREINTRAGEN, falls die fruehe * Zusätzliche Absicherung über HOOK_NEWSLETTER_PAGE_EMPFAENGEREINTRAGEN, falls die frühe
* Pruefung in guardNewsletterSubmission() aus irgendeinem Grund nicht gegriffen hat. * Prüfung in guardNewsletterSubmission() aus irgendeinem Grund nicht gegriffen hat.
* *
* @param array<string, mixed> $args Enthaelt 'oNewsletterEmpfaenger' (stdClass, per Referenz). * @param array<string, mixed> $args Enthält 'oNewsletterEmpfaenger' (stdClass, per Referenz).
*/ */
public function checkNewsletterRecipient(array $args): void public function checkNewsletterRecipient(array $args): void
{ {
@@ -153,8 +153,8 @@ class ValidationHandler
} }
if (!empty($_SESSION['fp_altcha_newsletter_error'])) { if (!empty($_SESSION['fp_altcha_newsletter_error'])) {
// Bereits in guardNewsletterSubmission() als ungueltig erkannt: Empfaenger-E-Mail // Bereits in guardNewsletterSubmission() als ungültig erkannt: Empfänger-E-Mail
// leeren, damit JTL-Shops eigene Pflichtfeld-Pruefung den Insert verhindert. // leeren, damit JTL-Shops eigene Pflichtfeld-Prüfung den Insert verhindert.
if (isset($args['oNewsletterEmpfaenger']) && \is_object($args['oNewsletterEmpfaenger'])) { if (isset($args['oNewsletterEmpfaenger']) && \is_object($args['oNewsletterEmpfaenger'])) {
$args['oNewsletterEmpfaenger']->cEmail = ''; $args['oNewsletterEmpfaenger']->cEmail = '';
} }