Files
deskhub/DeskHub-Webseite/tools/release-sign.php
T
2026-10-16 19:12:28 +00:00

27 lines
1.9 KiB
PHP

<?php
/**
* Signiert ein DeskHub-Release für das System-Update (nur Kommandozeile, nicht Teil des Webbereichs).
*
* php tools/release-sign.php <deskhub-1.0.7.zip> <herausgeber-privat.pem> <version>
*
* Schreibt <deskhub-1.0.7.zip>.sig neben das Paket. Beide Dateien (ZIP und .sig) werden als Anhänge des Releases
* hochgeladen, mit genau diesen Namen: deskhub-<version>.zip und deskhub-<version>.zip.sig.
* Verwendet wird derselbe private Schlüssel wie für Plugins und Themes (der öffentliche Teil steckt in
* includes/catalog_defaults.php). Signiert wird: "deskhub-update\n<version>\n<sha256 der ZIP>" mit RSA und SHA-256.
*/
if (PHP_SAPI !== 'cli') { http_response_code(404); exit; }
function fail(string $m): never { fwrite(STDERR, $m . PHP_EOL); exit(1); }
$zip = $argv[1] ?? fail('Aufruf: php tools/release-sign.php <paket.zip> <privater-schluessel.pem> <version>');
$keyFile = $argv[2] ?? fail('Privater Schlüssel fehlt.');
$version = ltrim(trim($argv[3] ?? fail('Version fehlt (z. B. 1.0.7).')), 'vV');
if (!is_file($zip)) fail('ZIP-Datei nicht gefunden.');
if (!preg_match('/^\d+\.\d+\.\d+([\-+][0-9A-Za-z.\-]+)?$/', $version)) fail('Die Version muss wie 1.0.7 aussehen.');
if (basename($zip) !== "deskhub-{$version}.zip") fwrite(STDERR, "Hinweis: Der Dateiname sollte deskhub-{$version}.zip lauten, sonst findet DeskHub das Paket nicht.\n");
$private = openssl_pkey_get_private((string) @file_get_contents($keyFile)) ?: fail('Der private Schlüssel konnte nicht gelesen werden.');
$sha = hash_file('sha256', $zip);
if (!openssl_sign("deskhub-update\n{$version}\n{$sha}", $signature, $private, OPENSSL_ALGO_SHA256)) fail('Signieren fehlgeschlagen: ' . openssl_error_string());
file_put_contents($zip . '.sig', base64_encode($signature));
echo "Fertig.\n Paket: {$zip}\n SHA-256: {$sha}\n Signatur: {$zip}.sig\nBeide Dateien als Anhänge ans Release {$version} hängen.\n";