From ec34f72a3b6293ba7f720b343cabd4e7e3380dab Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Mon, 10 Jun 2024 22:16:25 -0700 Subject: [PATCH 1/7] [ticket/17336] Skip extension package aliases in dev stabilities PHPBB-17336 Signed-off-by: Matt Friedman --- phpBB/phpbb/composer/installer.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/phpBB/phpbb/composer/installer.php b/phpBB/phpbb/composer/installer.php index 28aaa4171b9..1d3e6c84846 100644 --- a/phpBB/phpbb/composer/installer.php +++ b/phpBB/phpbb/composer/installer.php @@ -396,6 +396,11 @@ protected function do_get_available_packages($type) /** @var CompletePackage $version */ foreach ($versions as $version) { + if (strpos($version->getVersion(), '9999999') === 0) + { + continue; + } + if (!$highest_version || version_compare($version->getVersion(), $highest_version->getVersion(), '>')) { $highest_version = $version; From d8aa3f05e5c0754241fcdcc19da35fa1a6b2c852 Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Tue, 11 Jun 2024 07:04:01 -0700 Subject: [PATCH 2/7] [ticket/17336] Correctly handle aliased packages PHPBB-17336 Signed-off-by: Matt Friedman --- phpBB/phpbb/composer/installer.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/phpBB/phpbb/composer/installer.php b/phpBB/phpbb/composer/installer.php index 1d3e6c84846..68b7f2e5200 100644 --- a/phpBB/phpbb/composer/installer.php +++ b/phpBB/phpbb/composer/installer.php @@ -22,7 +22,9 @@ use Composer\Json\JsonFile; use Composer\Json\JsonValidationException; use Composer\Package\BasePackage; +use Composer\Package\CompleteAliasPackage; use Composer\Package\CompletePackage; +use Composer\Package\Version\VersionParser; use Composer\PartialComposer; use Composer\Repository\ComposerRepository; use Composer\Semver\Constraint\ConstraintInterface; @@ -390,23 +392,25 @@ protected function do_get_available_packages($type) foreach ($compatible_packages as $name => $versions) { // Determine the highest version of the package - /** @var CompletePackage $highest_version */ + /** @var CompletePackage|CompleteAliasPackage $highest_version */ $highest_version = null; - /** @var CompletePackage $version */ + /** @var CompletePackage|CompleteAliasPackage $version */ foreach ($versions as $version) { - if (strpos($version->getVersion(), '9999999') === 0) - { - continue; - } - if (!$highest_version || version_compare($version->getVersion(), $highest_version->getVersion(), '>')) { $highest_version = $version; } } + // If highest version is DEFAULT_BRANCH_ALIAS (9999999-dev), then it's a non-numeric dev branch handled by + // an Alias, so we need to get the actual package being aliased in order to show the true non-numeric version. + if ($highest_version->getVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) + { + $highest_version = $highest_version->getAliasOf(); + } + // Generates the entry $available[$name] = []; $available[$name]['name'] = $highest_version->getPrettyName(); From 5229813c4761830f1c7ff067f55d860c68655bbb Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Tue, 11 Jun 2024 10:57:05 -0700 Subject: [PATCH 3/7] [ticket/17336] Optimize version sorting PHPBB-17336 Signed-off-by: Matt Friedman --- phpBB/phpbb/composer/installer.php | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/phpBB/phpbb/composer/installer.php b/phpBB/phpbb/composer/installer.php index 68b7f2e5200..3c59fc552dc 100644 --- a/phpBB/phpbb/composer/installer.php +++ b/phpBB/phpbb/composer/installer.php @@ -24,7 +24,6 @@ use Composer\Package\BasePackage; use Composer\Package\CompleteAliasPackage; use Composer\Package\CompletePackage; -use Composer\Package\Version\VersionParser; use Composer\PartialComposer; use Composer\Repository\ComposerRepository; use Composer\Semver\Constraint\ConstraintInterface; @@ -395,20 +394,23 @@ protected function do_get_available_packages($type) /** @var CompletePackage|CompleteAliasPackage $highest_version */ $highest_version = null; - /** @var CompletePackage|CompleteAliasPackage $version */ - foreach ($versions as $version) + // Sort the versions array in descending order + usort($versions, function ($a, $b) { - if (!$highest_version || version_compare($version->getVersion(), $highest_version->getVersion(), '>')) - { - $highest_version = $version; - } - } + return version_compare($b->getVersion(), $a->getVersion()); + }); - // If highest version is DEFAULT_BRANCH_ALIAS (9999999-dev), then it's a non-numeric dev branch handled by - // an Alias, so we need to get the actual package being aliased in order to show the true non-numeric version. - if ($highest_version->getVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) + // The first element in the sorted array is the highest version + if (!empty($versions)) { - $highest_version = $highest_version->getAliasOf(); + $highest_version = $versions[0]; + + // If highest version is a non-numeric dev branch, it's an instance of CompleteAliasPackage, + // so we need to get the package being aliased in order to show the true non-numeric version. + if ($highest_version instanceof CompleteAliasPackage) + { + $highest_version = $highest_version->getAliasOf(); + } } // Generates the entry From 0a20edf6b450c1019a97ac8fd64ee7256f2b9e6f Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Tue, 11 Jun 2024 10:59:29 -0700 Subject: [PATCH 4/7] [ticket/17336] Fix usage of a leaked loop-scoped variable PHPBB-17336 Signed-off-by: Matt Friedman --- phpBB/phpbb/composer/installer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/phpbb/composer/installer.php b/phpBB/phpbb/composer/installer.php index 3c59fc552dc..bd6e6c3168e 100644 --- a/phpBB/phpbb/composer/installer.php +++ b/phpBB/phpbb/composer/installer.php @@ -420,7 +420,7 @@ protected function do_get_available_packages($type) $available[$name]['composer_name'] = $highest_version->getName(); $available[$name]['version'] = $highest_version->getPrettyVersion(); - if ($version instanceof CompletePackage) + if ($highest_version instanceof CompletePackage) { $available[$name]['description'] = $highest_version->getDescription(); $available[$name]['url'] = $highest_version->getHomepage(); From b08023f231ccd2ddb577f370b5cad53b74047d68 Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Wed, 12 Jun 2024 06:10:23 -0700 Subject: [PATCH 5/7] [ticket/17336] Check extension compatibility correctly PHPBB-17336 Signed-off-by: Matt Friedman --- phpBB/phpbb/composer/installer.php | 36 +++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/phpBB/phpbb/composer/installer.php b/phpBB/phpbb/composer/installer.php index bd6e6c3168e..a18e49d24d0 100644 --- a/phpBB/phpbb/composer/installer.php +++ b/phpBB/phpbb/composer/installer.php @@ -24,9 +24,11 @@ use Composer\Package\BasePackage; use Composer\Package\CompleteAliasPackage; use Composer\Package\CompletePackage; +use Composer\Package\PackageInterface; use Composer\PartialComposer; use Composer\Repository\ComposerRepository; use Composer\Semver\Constraint\ConstraintInterface; +use Composer\Semver\VersionParser; use Composer\Util\HttpDownloader; use phpbb\composer\io\null_io; use phpbb\config\config; @@ -353,7 +355,7 @@ protected function do_get_available_packages($type) $downloader = new HttpDownloader($io, $composer_config); $json = $downloader->get($url)->getBody(); - /** @var \Composer\Package\PackageInterface $package */ + /** @var PackageInterface $package */ foreach (JsonFile::parseJson($json, $url)['packageNames'] as $package) { $versions = $repository->findPackages($package); @@ -365,7 +367,7 @@ protected function do_get_available_packages($type) { // Pre-filter repo packages by their type $packages = []; - /** @var \Composer\Package\PackageInterface $package */ + /** @var PackageInterface $package */ foreach ($repository->getPackages() as $package) { if ($package->getType() === $type) @@ -464,11 +466,11 @@ public function check_requirements() /** * Updates $compatible_packages with the versions of $versions compatibles with the $core_constraint * - * @param array $compatible_packages List of compatibles versions - * @param ConstraintInterface $core_constraint Constraint against the phpBB version + * @param array $compatible_packages List of compatibles versions + * @param ConstraintInterface $core_constraint Constraint against the phpBB version * @param string $core_stability Core stability - * @param string $package_name Considered package - * @param array $versions List of available versions + * @param string $package_name Considered package + * @param array $versions List of available versions * * @return array */ @@ -476,21 +478,35 @@ private function get_compatible_versions(array $compatible_packages, ConstraintI { $core_stability_value = BasePackage::$stabilities[$core_stability]; - /** @var \Composer\Package\PackageInterface $version */ + /** @var PackageInterface $version */ foreach ($versions as $version) { try { + // Check stability first to avoid unnecessary operations if (BasePackage::$stabilities[$version->getStability()] > $core_stability_value) { continue; } - if (array_key_exists('phpbb/phpbb', $version->getRequires())) + $requires = $version->getRequires(); + $extra = $version->getExtra(); + + // Check for compatibility with phpBB if 'phpbb/phpbb' exists in 'requires' + if (isset($requires['phpbb/phpbb'])) { - /** @var ConstraintInterface $package_constraint */ - $package_constraint = $version->getRequires()['phpbb/phpbb']->getConstraint(); + $package_constraint = $requires['phpbb/phpbb']->getConstraint(); + if (!$package_constraint->matches($core_constraint)) + { + continue; + } + } + // Check for compatibility with phpBB if 'phpbb/phpbb' exists in 'soft-require' + if (isset($extra['soft-require']['phpbb/phpbb'])) + { + $version_parser = new VersionParser(); + $package_constraint = $version_parser->parseConstraints($extra['soft-require']['phpbb/phpbb']); if (!$package_constraint->matches($core_constraint)) { continue; From 9a53df6f73a237e35132e5b7a6bef3afe4fd681b Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Wed, 12 Jun 2024 06:42:03 -0700 Subject: [PATCH 6/7] [ticket/17336] Move object instantiation outside of the loop PHPBB-17336 Signed-off-by: Matt Friedman --- phpBB/phpbb/composer/installer.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpBB/phpbb/composer/installer.php b/phpBB/phpbb/composer/installer.php index a18e49d24d0..a54e315ca0f 100644 --- a/phpBB/phpbb/composer/installer.php +++ b/phpBB/phpbb/composer/installer.php @@ -476,6 +476,8 @@ public function check_requirements() */ private function get_compatible_versions(array $compatible_packages, ConstraintInterface $core_constraint, $core_stability, $package_name, array $versions) { + $version_parser = new VersionParser(); + $core_stability_value = BasePackage::$stabilities[$core_stability]; /** @var PackageInterface $version */ @@ -505,7 +507,6 @@ private function get_compatible_versions(array $compatible_packages, ConstraintI // Check for compatibility with phpBB if 'phpbb/phpbb' exists in 'soft-require' if (isset($extra['soft-require']['phpbb/phpbb'])) { - $version_parser = new VersionParser(); $package_constraint = $version_parser->parseConstraints($extra['soft-require']['phpbb/phpbb']); if (!$package_constraint->matches($core_constraint)) { From 3690d307266b492a3bd4eb6c542ba5a1252ec21f Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Wed, 12 Jun 2024 06:42:38 -0700 Subject: [PATCH 7/7] [ticket/17336] Also check for compatible extension by PHP version PHPBB-17336 Signed-off-by: Matt Friedman --- phpBB/phpbb/composer/installer.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/phpBB/phpbb/composer/installer.php b/phpBB/phpbb/composer/installer.php index a54e315ca0f..cd7456baf64 100644 --- a/phpBB/phpbb/composer/installer.php +++ b/phpBB/phpbb/composer/installer.php @@ -514,6 +514,17 @@ private function get_compatible_versions(array $compatible_packages, ConstraintI } } + // Check for compatibility with php if 'php' exists in 'requires' + if (isset($requires['php'])) + { + $php_constraint = $version_parser->parseConstraints(PHP_VERSION); + $package_constraint = $requires['php']->getConstraint(); + if (!$package_constraint->matches($php_constraint)) + { + continue; + } + } + $compatible_packages[$package_name][] = $version; } catch (\Exception $e)