Upload via GUI (24 Dateien)

This commit is contained in:
2026-10-16 18:42:18 +00:00
parent 1f03c7e4cd
commit d9d58112e0
24 changed files with 1167 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
<?php
/**
* Läuft nur beim Docker-Build: schreibt die Zugangsdaten fest in config.php (schreibgeschützt, 'locked').
* Erwartet die BuildKit-Secrets /run/secrets/admin_hash und /run/secrets/signing_key sowie BASE_URL, SITE_NAME, ADMIN_USER.
*/
if (PHP_SAPI !== 'cli') exit(1);
$fail = function (string $m): never { fwrite(STDERR, "FEHLER: {$m}\n"); exit(1); };
// Pfade nur für Tests überschreibbar (beim Docker-Build gelten die Vorgaben)
$secrets = getenv('BAKE_SECRETS_DIR') ?: '/run/secrets';
$keyDir = getenv('BAKE_KEY_DIR') ?: '/opt/plugin-site-secure';
$configPath = getenv('BAKE_CONFIG_PATH') ?: '/var/www/html/config.php';
$storage = getenv('BAKE_STORAGE_DIR') ?: '/data';
$hash = trim((string) @file_get_contents($secrets . '/admin_hash'));
$key = (string) @file_get_contents($secrets . '/signing_key');
$access = trim((string) @file_get_contents($secrets . '/catalog_key'));
$base = rtrim((string) getenv('BASE_URL'), '/');
$user = (string) getenv('ADMIN_USER');
if (!str_starts_with($base, 'https://')) $fail('BASE_URL muss mit https:// beginnen.');
if ($user === '' || !preg_match('/^[A-Za-z0-9._@-]{3,64}$/', $user)) $fail('ADMIN_USER ist ungültig (3–64 Zeichen: Buchstaben, Ziffern, . _ @ -).');
$info = password_get_info($hash);
if (($info['algo'] ?? null) === null || $info['algo'] === 0) $fail('admin_hash ist kein gültiger Passwort-Hash (mit password_hash erzeugen).');
if (!preg_match('/^[A-Za-z0-9]{32,128}$/', $access)) $fail('catalog_key (Zugangsschlüssel für den Katalog) fehlt oder ist ungültig: 32–128 Buchstaben/Ziffern.');
$private = openssl_pkey_get_private($key);
if (!$private) $fail('signing_key ist kein gültiger privater Schlüssel (PEM).');
$details = openssl_pkey_get_details($private);
if (($details['type'] ?? null) !== OPENSSL_KEYTYPE_RSA || ($details['bits'] ?? 0) < 2048) $fail('Der Signierschlüssel muss RSA mit mindestens 2048 Bit sein.');
@mkdir($keyDir, 0750, true);
file_put_contents($keyDir . '/herausgeber-privat.pem', $key);
$cfg = [
'site_name' => (string) (getenv('SITE_NAME') ?: 'DeskHub Plugins und Themes'),
'base_url' => $base,
'admin_user' => $user,
'admin_password_hash' => $hash,
'signing_key_file' => $keyDir . '/herausgeber-privat.pem',
'storage_dir' => $storage,
'access_key' => $access,
'locked' => true,
];
file_put_contents($configPath, "<?php\nreturn " . var_export($cfg, true) . ";\n");
echo "Zugang für \"{$user}\" und Signierschlüssel fest eingebaut. Öffentlicher Schlüssel:\n" . $details['key'];