27 lines
1.9 KiB
PHP
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";
|