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