isFile() || $item->isLink()) { continue; } $relative = str_replace('\\', '/', substr($item->getPathname(), strlen($root) + 1)); if ($accept($relative)) { $files[$relative] = $item->getPathname(); } } } foreach (glob($root . '/*.php') ?: array() as $file) { $name = basename($file); if (!in_array(strtolower($name), array('config.php', 'config.local.php'), true)) { $files[$name] = $file; } } foreach (array('.htaccess', 'composer.json', 'composer.lock', 'LICENSE', 'README.md', 'config.countries.php') as $name) { if (is_file($root . '/' . $name)) { $files[$name] = $root . '/' . $name; } } ksort($files); $packageName = 'znotex-core-' . $version . '.zip'; $packageFile = $releaseDirectory . '/' . $packageName; $zip = new ZipArchive(); if ($zip->open($packageFile, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) { fwrite(STDERR, "The release ZIP cannot be created.\n"); exit(1); } $hashes = array(); foreach ($files as $relative => $file) { if (!$zip->addFile($file, $relative)) { $zip->close(); fwrite(STDERR, "A file cannot be added: " . $relative . "\n"); exit(1); } $hashes[$relative] = hash_file('sha256', $file); } $zip->close(); $manifest = $metadata; $manifest['schema'] = 1; $manifest['project'] = 'ZnoteX'; $manifest['version'] = $version; $manifest['published_at'] = gmdate(DATE_ATOM); $manifest['package'] = array( 'name' => $packageName, 'sha256' => hash_file('sha256', $packageFile), 'size' => filesize($packageFile), ); $manifest['installation'] = array( 'mode' => 'signed-core-update', 'backup' => true, 'rollback' => 'files', 'database_policy' => 'expand-only' ); $manifest['protected_paths'] = array('config.php', 'config.local.php', 'plugins/', 'layouts/', 'engine/cache/', 'engine/img/theme/', 'engine/update/', 'install/', 'release/'); $manifest['links'] = array( 'repository' => 'https://github.com/Open-Games-Community/ZnoteX', 'release' => 'https://github.com/Open-Games-Community/ZnoteX/releases/tag/v' . $version ); $manifest['files'] = $hashes; $json = json_encode($manifest, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . "\n"; if (!openssl_sign($json, $signature, $key, OPENSSL_ALGO_SHA256)) { fwrite(STDERR, "The release manifest cannot be signed.\n"); exit(1); } file_put_contents($releaseDirectory . '/update.json', $json, LOCK_EX); file_put_contents($releaseDirectory . '/update.json.sig', base64_encode($signature) . "\n", LOCK_EX); echo $releaseDirectory . PHP_EOL; echo $packageName . PHP_EOL; echo count($hashes) . " files\n";