Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@users.noreply.github.com>2021-01-27 17:14:52 +0300
committerGitHub <noreply@github.com>2021-01-27 17:14:52 +0300
commit3a9c7f99f632f973caaf6a7aca5ca9294bb11db3 (patch)
treee909e1964868f5985c539cf5e53e3ad70a39d20d
parente0f0e6e41a47dbdb5fbe3527dc923dfbc1ea37e1 (diff)
parentb4f71ccf4dd43332ab92eb860604c2308cb36a9d (diff)
Merge pull request #25335 from nextcloud/fix/app-fetcher-php-compat-comparison
Fix/app fetcher php compat comparison
-rw-r--r--lib/private/App/AppStore/Fetcher/AppFetcher.php4
-rw-r--r--lib/private/App/CompareVersion.php25
-rw-r--r--tests/lib/App/CompareVersionTest.php8
3 files changed, 25 insertions, 12 deletions
diff --git a/lib/private/App/AppStore/Fetcher/AppFetcher.php b/lib/private/App/AppStore/Fetcher/AppFetcher.php
index 70bf2a37d9d..4dc517879e8 100644
--- a/lib/private/App/AppStore/Fetcher/AppFetcher.php
+++ b/lib/private/App/AppStore/Fetcher/AppFetcher.php
@@ -113,12 +113,12 @@ class AppFetcher extends Fetcher {
$phpVersion = $versionParser->getVersion($release['rawPhpVersionSpec']);
$minPhpVersion = $phpVersion->getMinimumVersion();
$maxPhpVersion = $phpVersion->getMaximumVersion();
- $minPhpFulfilled = $minPhpVersion === '' || version_compare(
+ $minPhpFulfilled = $minPhpVersion === '' || $this->compareVersion->isCompatible(
PHP_VERSION,
$minPhpVersion,
'>='
);
- $maxPhpFulfilled = $maxPhpVersion === '' || version_compare(
+ $maxPhpFulfilled = $maxPhpVersion === '' || $this->compareVersion->isCompatible(
PHP_VERSION,
$maxPhpVersion,
'<='
diff --git a/lib/private/App/CompareVersion.php b/lib/private/App/CompareVersion.php
index 5d38d4c358e..9df28a457ff 100644
--- a/lib/private/App/CompareVersion.php
+++ b/lib/private/App/CompareVersion.php
@@ -1,4 +1,7 @@
<?php
+
+declare(strict_types=1);
+
/**
* @copyright 2018 Christoph Wurst <christoph@winzerhof-wurst.at>
*
@@ -24,12 +27,13 @@
namespace OC\App;
use InvalidArgumentException;
+use function explode;
class CompareVersion {
- public const REGEX_MAJOR = '/^\d+$/';
- public const REGEX_MAJOR_MINOR = '/^\d+.\d+$/';
- public const REGEX_MAJOR_MINOR_PATCH = '/^\d+.\d+.\d+$/';
- public const REGEX_SERVER = '/^\d+.\d+.\d+(.\d+)?$/';
+ private const REGEX_MAJOR = '/^\d+$/';
+ private const REGEX_MAJOR_MINOR = '/^\d+\.\d+$/';
+ private const REGEX_MAJOR_MINOR_PATCH = '/^\d+\.\d+\.\d+(?!\.\d+)/';
+ private const REGEX_ACTUAL = '/^\d+(\.\d+){1,2}/';
/**
* Checks if the given server version fulfills the given (app) version requirements.
@@ -45,18 +49,19 @@ class CompareVersion {
*/
public function isCompatible(string $actual, string $required,
string $comparator = '>='): bool {
- if (!preg_match(self::REGEX_SERVER, $actual)) {
- throw new InvalidArgumentException('server version is invalid');
+ if (!preg_match(self::REGEX_ACTUAL, $actual, $matches)) {
+ throw new InvalidArgumentException("version specification $actual is invalid");
}
+ $cleanActual = $matches[0];
if (preg_match(self::REGEX_MAJOR, $required) === 1) {
- return $this->compareMajor($actual, $required, $comparator);
+ return $this->compareMajor($cleanActual, $required, $comparator);
} elseif (preg_match(self::REGEX_MAJOR_MINOR, $required) === 1) {
- return $this->compareMajorMinor($actual, $required, $comparator);
+ return $this->compareMajorMinor($cleanActual, $required, $comparator);
} elseif (preg_match(self::REGEX_MAJOR_MINOR_PATCH, $required) === 1) {
- return $this->compareMajorMinorPatch($actual, $required, $comparator);
+ return $this->compareMajorMinorPatch($cleanActual, $required, $comparator);
} else {
- throw new InvalidArgumentException('required version is invalid');
+ throw new InvalidArgumentException("required version $required is invalid");
}
}
diff --git a/tests/lib/App/CompareVersionTest.php b/tests/lib/App/CompareVersionTest.php
index 6db31d0ee6f..d94b6f18a0f 100644
--- a/tests/lib/App/CompareVersionTest.php
+++ b/tests/lib/App/CompareVersionTest.php
@@ -1,5 +1,7 @@
<?php
+declare(strict_types=1);
+
/**
* @copyright 2018 Christoph Wurst <christoph@winzerhof-wurst.at>
*
@@ -49,11 +51,17 @@ class CompareVersionTest extends TestCase {
['13.0.0', '13', '>=', true],
['13.0.1', '13', '>=', true],
['13.0.1', '13', '<=', true],
+ ['13.0.1.9', '13', '<=', true],
+ ['13.0.1-beta.1', '13', '<=', true],
+ ['7.4.14', '7.4', '<=', true],
+ ['7.4.14-ubuntu', '7.4', '<=', true],
+ ['7.4.14-ubuntu', '7.4.15', '<=', true],
// Incompatible major versions
['13.0.0.3', '13.0.0', '<', false],
['12.0.0', '13.0.0', '>=', false],
['12.0.0', '13.0', '>=', false],
['12.0.0', '13', '>=', false],
+ ['7.4.15-ubuntu', '7.4.15', '>=', true],
// Incompatible minor and patch versions
['13.0.0', '13.0.1', '>=', false],
['13.0.0', '13.1', '>=', false],