From e24c3150a6b45775c856f32e53192699a06e329c Mon Sep 17 00:00:00 2001 From: skjnldsv Date: Thu, 10 Jul 2025 10:48:29 +0200 Subject: [PATCH] feat: allow to provide manual URL Signed-off-by: skjnldsv --- index.php | 18 +++++++++++++++--- lib/UpdateCommand.php | 24 +++++++++++++++++------- lib/Updater.php | 18 +++++++++++++++--- updater.phar | Bin 1173429 -> 1174237 bytes vendor/composer/installed.php | 4 ++-- 5 files changed, 49 insertions(+), 15 deletions(-) diff --git a/index.php b/index.php index dd787d2f..7ebb6fd2 100644 --- a/index.php +++ b/index.php @@ -546,10 +546,17 @@ private function getUpdateServerResponse(): array { * * @throws \Exception */ - public function downloadUpdate(): void { + public function downloadUpdate(?string $url = null): void { $this->silentLog('[info] downloadUpdate()'); - $downloadURLs = $this->getDownloadURLs(); + if ($url) { + // If a URL is provided, use it directly + $downloadURLs = [$url]; + } else { + // Otherwise, get the download URLs from the update server + $downloadURLs = $this->getDownloadURLs(); + } + $this->silentLog('[info] will try to download archive from: ' . implode(', ', $downloadURLs)); $storageLocation = $this->getUpdateDirectoryLocation() . '/updater-' . $this->getConfigOptionMandatoryString('instanceid') . '/downloads/'; @@ -743,7 +750,7 @@ private function getDownloadedFilePath(): string { * * @throws \Exception */ - public function verifyIntegrity(): void { + public function verifyIntegrity(?string $urlOverride = null): void { $this->silentLog('[info] verifyIntegrity()'); if ($this->getCurrentReleaseChannel() === 'daily') { @@ -751,6 +758,11 @@ public function verifyIntegrity(): void { return; } + if ($urlOverride) { + $this->silentLog('[info] custom download url provided, cannot verify signature'); + return; + } + $response = $this->getUpdateServerResponse(); if (empty($response['signature'])) { throw new \Exception('No signature specified for defined update'); diff --git a/lib/UpdateCommand.php b/lib/UpdateCommand.php index 718f224b..9a410ad5 100644 --- a/lib/UpdateCommand.php +++ b/lib/UpdateCommand.php @@ -21,6 +21,7 @@ class UpdateCommand extends Command { protected bool $shouldStop = false; protected bool $skipBackup = false; protected bool $skipUpgrade = false; + protected string $urlOverride = ''; /** @var list strings of text for stages of updater */ protected array $checkTexts = [ @@ -45,7 +46,8 @@ protected function configure(): void { ->setDescription('Updates the code of an Nextcloud instance') ->setHelp("This command fetches the latest code that is announced via the updater server and safely replaces the existing code with the new one.") ->addOption('no-backup', null, InputOption::VALUE_NONE, 'Skip backup of current Nextcloud version') - ->addOption('no-upgrade', null, InputOption::VALUE_NONE, "Don't automatically run occ upgrade"); + ->addOption('no-upgrade', null, InputOption::VALUE_NONE, "Don't automatically run occ upgrade") + ->addOption('url', null, InputOption::VALUE_OPTIONAL, 'The URL of the Nextcloud release to download'); } public static function getUpdaterVersion(): string { @@ -60,6 +62,7 @@ public static function getUpdaterVersion(): string { protected function execute(InputInterface $input, OutputInterface $output) { $this->skipBackup = (bool)$input->getOption('no-backup'); $this->skipUpgrade = (bool)$input->getOption('no-upgrade'); + $this->urlOverride = (string)$input->getOption('url'); $version = static::getUpdaterVersion(); $output->writeln('Nextcloud Updater - version: ' . $version); @@ -133,7 +136,12 @@ protected function execute(InputInterface $input, OutputInterface $output) { $output->writeln('Current version is ' . $this->updater->getCurrentVersion() . '.'); // needs to be called that early because otherwise updateAvailable() returns false - $updateString = $this->updater->checkForUpdate(); + if ($this->urlOverride) { + $this->updater->log('[info] Using URL override: ' . $this->urlOverride); + $updateString = 'Update check forced with URL override: ' . $this->urlOverride; + } else { + $updateString = $this->updater->checkForUpdate(); + } $output->writeln(''); @@ -146,9 +154,11 @@ protected function execute(InputInterface $input, OutputInterface $output) { $output->writeln(''); - if (!$this->updater->updateAvailable() && $stepNumber === 0) { - $output->writeln('Nothing to do.'); - return 0; + if (!$this->urlOverride) { + if (!$this->updater->updateAvailable() && $stepNumber === 0) { + $output->writeln('Nothing to do.'); + return 0; + } } $questionText = 'Start update'; @@ -360,10 +370,10 @@ protected function executeStep(int $step): array { } break; case 4: - $this->updater->downloadUpdate(); + $this->updater->downloadUpdate($this->urlOverride); break; case 5: - $this->updater->verifyIntegrity(); + $this->updater->verifyIntegrity($this->urlOverride); break; case 6: $this->updater->extractDownload(); diff --git a/lib/Updater.php b/lib/Updater.php index 70f06bcc..87fa4698 100644 --- a/lib/Updater.php +++ b/lib/Updater.php @@ -508,10 +508,17 @@ private function getUpdateServerResponse(): array { * * @throws \Exception */ - public function downloadUpdate(): void { + public function downloadUpdate(?string $url = null): void { $this->silentLog('[info] downloadUpdate()'); - $downloadURLs = $this->getDownloadURLs(); + if ($url) { + // If a URL is provided, use it directly + $downloadURLs = [$url]; + } else { + // Otherwise, get the download URLs from the update server + $downloadURLs = $this->getDownloadURLs(); + } + $this->silentLog('[info] will try to download archive from: ' . implode(', ', $downloadURLs)); $storageLocation = $this->getUpdateDirectoryLocation() . '/updater-' . $this->getConfigOptionMandatoryString('instanceid') . '/downloads/'; @@ -705,7 +712,7 @@ private function getDownloadedFilePath(): string { * * @throws \Exception */ - public function verifyIntegrity(): void { + public function verifyIntegrity(?string $urlOverride = null): void { $this->silentLog('[info] verifyIntegrity()'); if ($this->getCurrentReleaseChannel() === 'daily') { @@ -713,6 +720,11 @@ public function verifyIntegrity(): void { return; } + if ($urlOverride) { + $this->silentLog('[info] custom download url provided, cannot verify signature'); + return; + } + $response = $this->getUpdateServerResponse(); if (empty($response['signature'])) { throw new \Exception('No signature specified for defined update'); diff --git a/updater.phar b/updater.phar index ab9b118362aac66324386d3807a24842625c20ed..1081ba2f432d721ebcff9bf47980d910f53c03f1 100755 GIT binary patch delta 8069 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 BXU+fs delta 7504 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 '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'bbd6e8e521f3fd1d02d34e3c9eda83c4c8d4c460', + 'reference' => 'd57261832b96a413d7ae92aa66ac15054ae8f4d5', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'bbd6e8e521f3fd1d02d34e3c9eda83c4c8d4c460', + 'reference' => 'd57261832b96a413d7ae92aa66ac15054ae8f4d5', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(),