Skip to content

Commit

Permalink
Merge pull request #25335 from nextcloud/fix/app-fetcher-php-compat-c…
Browse files Browse the repository at this point in the history
…omparison

Fix/app fetcher php compat comparison
  • Loading branch information
rullzer authored Jan 27, 2021
2 parents e0f0e6e + b4f71cc commit 3a9c7f9
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 12 deletions.
4 changes: 2 additions & 2 deletions lib/private/App/AppStore/Fetcher/AppFetcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,12 +113,12 @@ protected function fetch($ETag, $content, $allowUnstable = false) {
$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,
'<='
Expand Down
25 changes: 15 additions & 10 deletions lib/private/App/CompareVersion.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
<?php

declare(strict_types=1);

/**
* @copyright 2018 Christoph Wurst <christoph@winzerhof-wurst.at>
*
Expand All @@ -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.
Expand All @@ -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");
}
}

Expand Down
8 changes: 8 additions & 0 deletions tests/lib/App/CompareVersionTest.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<?php

declare(strict_types=1);

/**
* @copyright 2018 Christoph Wurst <christoph@winzerhof-wurst.at>
*
Expand Down Expand Up @@ -49,11 +51,17 @@ public function comparisonData() {
['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],
Expand Down

0 comments on commit 3a9c7f9

Please sign in to comment.