Browse Source

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 <roeland@famdouma.nl>
Roeland Jago Douma 7 years ago
parent
commit
e79424932a

+ 20 - 9
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();
+	}
 }

+ 23 - 2
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;
+	}
 }

+ 3 - 4
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)

+ 4 - 0
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());