$cnf, 'private_key_bits' => 2048, 'private_key_type' => OPENSSL_KEYTYPE_RSA]); openssl_pkey_export($kp, $privPem, null, ['config' => $cnf]); file_put_contents($tmp . '/sign.pem', $privPem); putenv('PLUGIN_SITE_SIGNING_KEY=' . $tmp . '/sign.pem'); require_once __DIR__ . '/fixtures/paths.php'; $siteDir = website_dir_or_skip('plugin_website_apps'); require_once $siteDir . '/inc/lib.php'; $failures = []; $total = 0; $check = function (bool $ok, string $what) use (&$failures, &$total): void { $total++; if (!$ok) $failures[] = $what; }; $makeZip = function (array $files): string { $p = tempnam(sys_get_temp_dir(), 'pwa') . '.zip'; $z = new ZipArchive(); $z->open($p, ZipArchive::CREATE | ZipArchive::OVERWRITE); foreach ($files as $n => $c) $z->addFromString($n, $c); $z->close(); return $p; }; $pad = bin2hex(random_bytes(1200)); // zufällig, damit das ZIP die Mindestgröße erreicht // ── WordPress-Plugin ───────────────────────────────────────────────────────── $wp = fn(string $v) => $makeZip(['deskhub-tickets/deskhub-tickets.php' => " 'x']); $check(site_zip_app_version('wordpress', $wp('1.2.2')) === '1.2.2', 'Version steht im Plugin-Kopf'); $check(site_zip_app_version('wordpress', $makeZip(['a/a.php' => ' $pad]), '', ''); $check(!$bad['ok'] && str_contains($bad['error'], 'kein WordPress-Plugin'), 'ZIP ohne Plugin-Kopf wird abgelehnt'); $check(site_publish_app('wordpress', $wp('9.9.9'), '4.0.1', '')['ok'] && site_app_release('wordpress')['version'] === '4.0.1', 'eingetippte Version hat Vorrang'); // ── Chrome-Erweiterung ─────────────────────────────────────────────────────── $ch = fn(string $v) => $makeZip(['manifest.json' => json_encode(['manifest_version' => 3, 'name' => 'DeskHub', 'version' => $v]), 'app.js' => $pad]); $r = site_publish_app('chrome', $ch('2.0.0'), '', ''); $check($r['ok'] && $r['version'] === '2.0.0', 'Chrome-Erweiterung: Version aus manifest.json: ' . json_encode($r)); $check(site_publish_app('chrome', $ch('2.1'), '', '')['ok'] && site_app_release('chrome')['version'] === '2.1.0', 'zweiteilige Version wird zu 2.1.0'); $check(!site_publish_app('chrome', $makeZip(['manifest.json' => '{}', 'a.js' => $pad]), '', '')['ok'], 'manifest.json ohne Version wird abgelehnt'); $check(!site_publish_app('chrome', $wp('1.0.0'), '', '')['ok'], 'WordPress-Plugin ist keine Chrome-Erweiterung'); $check(!site_publish_app('windows', $ch('1.0.0'), '', '')['ok'], 'Windows-App braucht EXE und eine Versionsnummer'); $check(site_app_release('unbekannt') === null, 'unbekannte Plattform liefert nichts'); $p = site_app_platforms(); $check(isset($p['wordpress'], $p['chrome']) && $p['chrome']['file'] === 'deskhub-chrome-erweiterung.zip', 'Plattformliste enthält WordPress und Chrome'); // ── System-Update des Servers ──────────────────────────────────────────────── $srv = fn(string $v) => $makeZip(['deskhub/version.php' => " ' ' ' $makeZip(['plugin.json' => json_encode(['slug' => 'bildtest', 'name' => 'Bildtest', 'version' => $v]), 'plugin.php' => '