HMAC-Schluessel automatisch erzeugen (v1.1.1)

This commit is contained in:
2026-09-21 19:42:10 +02:00
parent be0644083a
commit 1955516783
@@ -24,11 +24,17 @@ use JTL\Plugin\PluginInterface;
class AltchaService class AltchaService
{ {
private PluginInterface $plugin; private PluginInterface $plugin;
private string $pluginDir;
private Altcha $altcha; 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->plugin = $plugin;
$this->pluginDir = \rtrim($pluginDir, '/\\');
$this->altcha = new Altcha($this->getHmacSecret()); $this->altcha = new Altcha($this->getHmacSecret());
} }
@@ -119,9 +125,60 @@ class AltchaService
return $verified; 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 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,
"<?php\n\n// Automatisch erzeugter HMAC-Geheimschluessel -- nicht manuell bearbeiten.\n"
. 'return ' . \var_export($secret, true) . ";\n"
);
if ($written === false) {
// Verzeichnis nicht beschreibbar o. Ae. -- sicherheitshalber "nicht konfiguriert"
// melden (siehe isConfigured()/verifyPost()), statt bei jedem Aufruf einen neuen,
// nicht dauerhaften Schluessel zu verwenden.
$this->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 private function getConfigValue(string $name, string $default): string