From e79424932a249b0e1568722ec0d709cd79a385ce Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Tue, 2 May 2017 10:08:16 +0200 Subject: [PATCH] Make sure the AppFetcher fetches the new applist from the appstore When in the upgrade process the version in the config is still the old version. (Since we only upgrade it after the upgrade is complete). However the app list fetched from the appstore must be the new list. Signed-off-by: Roeland Jago Douma --- .../App/AppStore/Fetcher/AppFetcher.php | 29 +++++++++++++------ lib/private/App/AppStore/Fetcher/Fetcher.php | 25 ++++++++++++++-- lib/private/Server.php | 7 ++--- lib/private/Updater.php | 4 +++ 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/lib/private/App/AppStore/Fetcher/AppFetcher.php b/lib/private/App/AppStore/Fetcher/AppFetcher.php index 7c5efafc92..e020390988 100644 --- a/lib/private/App/AppStore/Fetcher/AppFetcher.php +++ b/lib/private/App/AppStore/Fetcher/AppFetcher.php @@ -46,14 +46,7 @@ class AppFetcher extends Fetcher { ); $this->fileName = 'apps.json'; - - $versionArray = explode('.', $this->config->getSystemValue('version')); - $this->endpointUrl = sprintf( - 'https://apps.nextcloud.com/api/v1/platform/%d.%d.%d/apps.json', - $versionArray[0], - $versionArray[1], - $versionArray[2] - ); + $this->setEndpoint(); } /** @@ -68,7 +61,7 @@ class AppFetcher extends Fetcher { /** @var mixed[] $response */ $response = parent::fetch($ETag, $content); - $ncVersion = $this->config->getSystemValue('version'); + $ncVersion = $this->getVersion(); $ncMajorVersion = explode('.', $ncVersion)[0]; foreach($response['data'] as $dataKey => $app) { $releases = []; @@ -118,4 +111,22 @@ class AppFetcher extends Fetcher { $response['data'] = array_values($response['data']); return $response; } + + private function setEndpoint() { + $versionArray = explode('.', $this->getVersion()); + $this->endpointUrl = sprintf( + 'https://apps.nextcloud.com/api/v1/platform/%d.%d.%d/apps.json', + $versionArray[0], + $versionArray[1], + $versionArray[2] + ); + } + + /** + * @param string $version + */ + public function setVersion($version) { + parent::setVersion($version); + $this->setEndpoint(); + } } diff --git a/lib/private/App/AppStore/Fetcher/Fetcher.php b/lib/private/App/AppStore/Fetcher/Fetcher.php index bde925b745..5354d334eb 100644 --- a/lib/private/App/AppStore/Fetcher/Fetcher.php +++ b/lib/private/App/AppStore/Fetcher/Fetcher.php @@ -43,6 +43,8 @@ abstract class Fetcher { protected $fileName; /** @var string */ protected $endpointUrl; + /** @var string */ + protected $version; /** * @param IAppData $appData @@ -95,7 +97,7 @@ abstract class Fetcher { } $responseJson['timestamp'] = $this->timeFactory->getTime(); - $responseJson['ncversion'] = $this->config->getSystemValue('version'); + $responseJson['ncversion'] = $this->getVersion(); if ($ETag !== '') { $responseJson['ETag'] = $ETag; } @@ -127,7 +129,7 @@ abstract class Fetcher { if (is_array($jsonBlob)) { // No caching when the version has been updated - if (isset($jsonBlob['ncversion']) && $jsonBlob['ncversion'] === $this->config->getSystemValue('version', '0.0.0')) { + if (isset($jsonBlob['ncversion']) && $jsonBlob['ncversion'] === $this->getVersion()) { // If the timestamp is older than 300 seconds request the files new if ((int)$jsonBlob['timestamp'] > ($this->timeFactory->getTime() - self::INVALIDATE_AFTER_SECONDS)) { @@ -154,4 +156,23 @@ abstract class Fetcher { return []; } } + + /** + * Get the currently Nextcloud version + * @return string + */ + protected function getVersion() { + if ($this->version === null) { + $this->version = $this->config->getSystemValue('version', '0.0.0'); + } + return $this->version; + } + + /** + * Set the current Nextcloud version + * @param string $version + */ + public function setVersion($version) { + $this->version = $version; + } } diff --git a/lib/private/Server.php b/lib/private/Server.php index 6bc9a1429c..07e449ee4a 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -420,7 +420,7 @@ class Server extends ServerContainer implements IServerContainer { $this->registerService('AppHelper', function ($c) { return new \OC\AppHelper(); }); - $this->registerService('AppFetcher', function ($c) { + $this->registerService(AppFetcher::class, function ($c) { return new AppFetcher( $this->getAppDataDir('appstore'), $this->getHTTPClientService(), @@ -428,6 +428,8 @@ class Server extends ServerContainer implements IServerContainer { $this->getConfig() ); }); + $this->registerAlias('AppFetcher', AppFetcher::class); + $this->registerService('CategoryFetcher', function ($c) { return new CategoryFetcher( $this->getAppDataDir('appstore'), @@ -821,9 +823,6 @@ class Server extends ServerContainer implements IServerContainer { $this->registerService(BundleFetcher::class, function () { return new BundleFetcher($this->getL10N('lib')); }); - $this->registerService(AppFetcher::class, function() { - return $this->getAppFetcher(); - }); $this->registerService(\OCP\Notification\IManager::class, function (Server $c) { return new Manager( $c->query(IValidator::class) diff --git a/lib/private/Updater.php b/lib/private/Updater.php index c080ee0eb4..5c4a7725a1 100644 --- a/lib/private/Updater.php +++ b/lib/private/Updater.php @@ -32,6 +32,7 @@ namespace OC; +use OC\App\AppStore\Fetcher\AppFetcher; use OC\Hooks\BasicEmitter; use OC\IntegrityCheck\Checker; use OC_App; @@ -246,6 +247,9 @@ class Updater extends BasicEmitter { $this->checkAppsRequirements(); $this->doAppUpgrade(); + // Update the appfetchers version so it downloads the correct list from the appstore + \OC::$server->getAppFetcher()->setVersion($currentVersion); + // upgrade appstore apps $this->upgradeAppStoreApps(\OC::$server->getAppManager()->getInstalledApps());