HMAC-Schluessel automatisch erzeugen (v1.1.1)
This commit is contained in:
@@ -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,
|
||||
"<?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
|
||||
|
||||
Reference in New Issue
Block a user