From 0ae5c8dd3b88e1eb22981815cc1e86a478047772 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 27 Nov 2020 16:44:55 +0100 Subject: [PATCH] Check php compatibility of app store app releases 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 --- .../App/AppStore/Fetcher/AppFetcher.php | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/lib/private/App/AppStore/Fetcher/AppFetcher.php b/lib/private/App/AppStore/Fetcher/AppFetcher.php index 21ec38ead3..4dc517879e 100644 --- a/lib/private/App/AppStore/Fetcher/AppFetcher.php +++ b/lib/private/App/AppStore/Fetcher/AppFetcher.php @@ -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) {