56 lines
3.3 KiB
PHP
56 lines
3.3 KiB
PHP
<?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'));
|
||
$fcm = (string) @file_get_contents($secrets . '/fcm_service_account'); // optional: Firebase-Dienstkonto für den Push-Dienst
|
||
$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.');
|
||
|
||
$fcmFile = '';
|
||
if (trim($fcm) !== '') {
|
||
$sa = json_decode($fcm, true);
|
||
if (!is_array($sa) || ($sa['type'] ?? '') !== 'service_account' || empty($sa['client_email']) || empty($sa['project_id']) || !@openssl_pkey_get_private((string) ($sa['private_key'] ?? ''))) $fail('fcm_service_account ist keine gültige Firebase-Dienstkonto-Datei (JSON).');
|
||
$fcmFile = $keyDir . '/fcm-dienstkonto.json';
|
||
}
|
||
|
||
@mkdir($keyDir, 0750, true);
|
||
if ($fcmFile !== '') file_put_contents($fcmFile, $fcm);
|
||
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,
|
||
'fcm_service_account_file' => $fcmFile,
|
||
'locked' => true,
|
||
];
|
||
file_put_contents($configPath, "<?php\nreturn " . var_export($cfg, true) . ";\n");
|
||
echo $fcmFile !== '' ? "Push-Dienst: Firebase-Dienstkonto fest eingebaut.\n" : "Push-Dienst: KEIN Firebase-Dienstkonto eingebaut (schluessel/firebase-dienstkonto.json fehlt).\n";
|
||
echo "Zugang für \"{$user}\" und Signierschlüssel fest eingebaut. Öffentlicher Schlüssel:\n" . $details['key'];
|