]> source.dussan.org Git - nextcloud-server.git/commitdiff
Check php compatibility of app store app releases 24698/head
authorChristoph Wurst <christoph@winzerhof-wurst.at>
Fri, 27 Nov 2020 15:44:55 +0000 (16:44 +0100)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Mon, 14 Dec 2020 17:22:10 +0000 (17:22 +0000)
Apps might increase the minimum php version requirement, in which case
an update could break the app or even the whole instance. We must not
install those releases, or better, don't even show them for
update/installation. This extends the app fetcher code to filter out the
releases that are not installable.

The filter respects minimum and maximum requirements. E.g. apps that are
still only released for php7.3 won't show up for php7.4 instances. This
behavior is new but if an app lists an explicit version requirement,
then we ought to repect that.

Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
lib/private/App/AppStore/Fetcher/AppFetcher.php

index 21ec38ead308d132eb0cd07dcf6f72b727713de1..4dc517879e83b2590446d9b831ee47c02a83cecf 100644 (file)
@@ -101,14 +101,32 @@ class AppFetcher extends Fetcher {
                                        // Exclude all versions not compatible with the current version
                                        try {
                                                $versionParser = new VersionParser();
-                                               $version = $versionParser->getVersion($release['rawPlatformVersionSpec']);
+                                               $serverVersion = $versionParser->getVersion($release['rawPlatformVersionSpec']);
                                                $ncVersion = $this->getVersion();
-                                               $min = $version->getMinimumVersion();
-                                               $max = $version->getMaximumVersion();
-                                               $minFulfilled = $this->compareVersion->isCompatible($ncVersion, $min, '>=');
-                                               $maxFulfilled = $max !== '' &&
-                                                       $this->compareVersion->isCompatible($ncVersion, $max, '<=');
-                                               if ($minFulfilled && ($this->ignoreMaxVersion || $maxFulfilled)) {
+                                               $minServerVersion = $serverVersion->getMinimumVersion();
+                                               $maxServerVersion = $serverVersion->getMaximumVersion();
+                                               $minFulfilled = $this->compareVersion->isCompatible($ncVersion, $minServerVersion, '>=');
+                                               $maxFulfilled = $maxServerVersion !== '' &&
+                                                       $this->compareVersion->isCompatible($ncVersion, $maxServerVersion, '<=');
+                                               $isPhpCompatible = true;
+                                               if (($release['rawPhpVersionSpec'] ?? '*') !== '*') {
+                                                       $phpVersion = $versionParser->getVersion($release['rawPhpVersionSpec']);
+                                                       $minPhpVersion = $phpVersion->getMinimumVersion();
+                                                       $maxPhpVersion = $phpVersion->getMaximumVersion();
+                                                       $minPhpFulfilled = $minPhpVersion === '' || $this->compareVersion->isCompatible(
+                                                                       PHP_VERSION,
+                                                                       $minPhpVersion,
+                                                                       '>='
+                                                               );
+                                                       $maxPhpFulfilled = $maxPhpVersion === '' || $this->compareVersion->isCompatible(
+                                                                       PHP_VERSION,
+                                                                       $maxPhpVersion,
+                                                                       '<='
+                                                               );
+
+                                                       $isPhpCompatible = $minPhpFulfilled && $maxPhpFulfilled;
+                                               }
+                                               if ($minFulfilled && ($this->ignoreMaxVersion || $maxFulfilled) && $isPhpCompatible) {
                                                        $releases[] = $release;
                                                }
                                        } catch (\InvalidArgumentException $e) {