From 1955516783bc2cf6123522f950de13981916972e Mon Sep 17 00:00:00 2001 From: JensFalk Date: Mon, 21 Sep 2026 19:42:10 +0200 Subject: [PATCH] HMAC-Schluessel automatisch erzeugen (v1.1.1) --- .../src/Service/AltchaService.php | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/fp_altcha_spamschutz/src/Service/AltchaService.php b/fp_altcha_spamschutz/src/Service/AltchaService.php index d59c0fe..737b512 100644 --- a/fp_altcha_spamschutz/src/Service/AltchaService.php +++ b/fp_altcha_spamschutz/src/Service/AltchaService.php @@ -24,11 +24,17 @@ use JTL\Plugin\PluginInterface; class AltchaService { private PluginInterface $plugin; + private string $pluginDir; private Altcha $altcha; - public function __construct(PluginInterface $plugin) + /** + * @param string $pluginDir Basisverzeichnis des Plugins (__DIR__ aus Bootstrap.php), fuer die + * automatische Erzeugung des HMAC-Geheimschluessels (siehe getHmacSecret()). + */ + public function __construct(PluginInterface $plugin, string $pluginDir) { $this->plugin = $plugin; + $this->pluginDir = \rtrim($pluginDir, '/\\'); $this->altcha = new Altcha($this->getHmacSecret()); } @@ -119,9 +125,60 @@ class AltchaService return $verified; } + /** + * Liefert den HMAC-Geheimschluessel. Wurde im Plugin-Einstellungsfeld manuell ein Wert + * eingetragen, hat dieser Vorrang (z. B. um denselben Schluessel bewusst auf mehreren + * Installationen zu verwenden). Andernfalls wird beim allerersten Aufruf automatisch ein + * zufaelliger Schluessel erzeugt und in einer eigenen Datei im Plugin-Verzeichnis gespeichert, + * sodass keine manuelle Einrichtung noetig ist. + */ private function getHmacSecret(): string { - return $this->getConfigValue('fp_altcha_hmac_secret', ''); + $configured = $this->getConfigValue('fp_altcha_hmac_secret', ''); + if ($configured !== '') { + return $configured; + } + + return $this->getOrCreateAutoSecret(); + } + + private function getOrCreateAutoSecret(): string + { + $dir = $this->pluginDir . '/data'; + $file = $dir . '/fp_altcha_hmac_secret.php'; + + if (\is_file($file)) { + $value = include $file; + if (\is_string($value) && $value !== '') { + return $value; + } + } + + $secret = \bin2hex(\random_bytes(32)); + + if (!\is_dir($dir)) { + @\mkdir($dir, 0755, true); + } + + $written = @\file_put_contents( + $file, + "log( + 'Konnte HMAC-Geheimschluessel nicht automatisch speichern (' . $file . '). ' + . 'Bitte Schreibrechte pruefen oder Schluessel manuell in den Einstellungen setzen.' + ); + + return ''; + } + + return $secret; } private function getConfigValue(string $name, string $default): string