diff --git a/.gitattributes b/.gitattributes index e8945a9a..29fe0627 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ -/build-advisories export-ignore +.github export-ignore .gitattributes export-ignore .gitignore export-ignore .travis.yml export-ignore diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..85e88125 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: [Ocramius] +tidelift: "packagist/roave/security-advisories" diff --git a/.gitignore b/.gitignore index ed91a430..7579f743 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,2 @@ vendor -composer.phar composer.lock -composer-installer.php -build diff --git a/.travis.yml b/.travis.yml index 6df7d99a..050fdbd0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,19 +2,12 @@ language: php sudo: false -cache: - directories: - - $HOME/.composer/cache/files - php: - - 7 - -before_script: - - composer self-update - - composer update --working-dir=./build-advisories - - git config --global user.email "ocramius+travis-ci@gmail.com" - - git config --global user.name "Marco Pivetta (via Travis-CI)" + - 5.6 + - 7.0 + - 7.1 + - 7.2 script: - - ./build-advisories/vendor/bin/phpunit -c build-advisories - - php ./build-advisories/build-conflicts.php + - composer validate + - composer update diff --git a/README.md b/README.md index c38040a6..8da1ae97 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,46 @@ # Roave Security Advisories -[![Build Status](https://travis-ci.org/Roave/SecurityAdvisories.svg?branch=master)](https://travis-ci.org/Roave/SecurityAdvisories) +## A message to Russian 🇷🇺 people + +If you currently live in Russia, please read [this message](./ToRussianPeople.md). + +[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) + +## Help Palestine 🇵🇸 + +[![ReadMeSupportPalestine](https://raw.githubusercontent.com/Safouene1/support-palestine-banner/master/banner-support.svg)](https://github.com/TheBSD/StandWithPalestine/blob/main/docs/README.md) + +### Purpose + +[![Hourly build](https://github.com/Roave/SecurityAdvisoriesBuilder/workflows/Hourly%20build/badge.svg?branch=latest)](https://github.com/Roave/SecurityAdvisoriesBuilder/actions?query=workflow%3A%22Hourly+build%22) [![Downloads](https://img.shields.io/packagist/dt/roave/security-advisories.svg)](https://packagist.org/packages/roave/security-advisories) This package ensures that your application doesn't have installed dependencies with known security vulnerabilities. +> [!TIP] +> Safety first, my friend! Help keep your supply chain secure with this library, +> but if you need an extra hand with updating dependencies, application security +> development, or anything else, [get in touch](https://roave.com/contact-us/). +> +> \- The Roave Team + ## Installation ```sh -composer require roave/security-advisories:dev-master +composer require --dev roave/security-advisories:dev-latest ``` ## Usage This package does not provide any API or usable classes: its only purpose is to prevent installation of software with known and documented security issues. -Simply add `"roave/security-advisories": "dev-master"` to your `composer.json` `"require"` section and you will +Simply add `"roave/security-advisories": "dev-latest"` to your `composer.json` `"require-dev"` section and you will not be able to harm yourself with software with known security vulnerabilities. For example, try following: ```sh -composer require roave/security-advisories:dev-master +composer require --dev roave/security-advisories:dev-latest # following commands will fail: composer require symfony/symfony:2.5.2 composer require zendframework/zendframework:2.3.1 @@ -31,9 +50,19 @@ The checks are only executed when adding a new dependency via `composer require` deploying an application with a valid `composer.lock` and via `composer install` won't trigger any security versions checking. + > You can manually trigger a version check by using the `--dry-run` switch on an update while not doing anything. Running `composer update --dry-run roave/security-advisories` is an effective way to manually trigger a security version check. + +## roave/security-advisories for enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of roave/security-advisories and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more](https://tidelift.com/subscription/pkg/packagist-roave-security-advisories?utm_source=packagist-roave-security-advisories&utm_medium=referral&utm_campaign=enterprise&utm_term=repo). + +You can also contact us at team@roave.com for looking into security issues in your own project. + ## Stability -This package can only be required in its `dev-master` version: there will never be stable/tagged versions because of +This package can only be required in its `dev-latest` version: there will never be stable/tagged versions because of the nature of the problem being targeted. Security issues are in fact a moving target, and locking your project to a specific tagged version of the package would not make any sense. @@ -42,4 +71,4 @@ This package is therefore only suited for installation in the root of your deplo ## Sources This package extracts information about existing security issues in various composer projects from -the [FriendsOfPHP/security-advisories](https://github.com/FriendsOfPHP/security-advisories) repository. +the [FriendsOfPHP/security-advisories](https://github.com/FriendsOfPHP/security-advisories) repository and the [GitHub Advisory Database](https://github.com/advisories?query=ecosystem%3Acomposer). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..da9c516d --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,5 @@ +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. diff --git a/ToRussianPeople.md b/ToRussianPeople.md new file mode 100644 index 00000000..a64e9ca0 --- /dev/null +++ b/ToRussianPeople.md @@ -0,0 +1,22 @@ + +## 🇷🇺 Русским гражданам + +В Украине сейчас идет война. Силами РФ наносятся удары по гражданской инфраструктуре в [Харькове][1], [Киеве][2], [Чернигове][3], [Сумах][4], [Ирпене][5] и десятках других городов. Гибнут люди - и гражданское население, и военные, в том числе российские призывники, которых бросили воевать. Чтобы лишить собственный народ доступа к информации, правительство РФ запретило называть войну войной, закрыло независимые СМИ и принимает сейчас ряд диктаторских законов. Эти законы призваны заткнуть рот всем, кто против войны. За обычный призыв к миру сейчас можно получить несколько лет тюрьмы. + +Не молчите! Молчание - знак вашего согласия с политикой российского правительства. +**Вы можете сделать выбор НЕ МОЛЧАТЬ.** + +--- + +## 🇺🇸 To people of Russia + +There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilian infrastructure in [Kharkiv][1], [Kyiv][2], [Chernihiv][3], [Sumy][4], [Irpin][5] and dozens of other cities. People are dying – both civilians and military servicemen, including Russian conscripts who were thrown into the fighting. In order to deprive its own people of access to information, the government of the Russian Federation has forbidden calling a war a war, shut down independent media and is passing a number of dictatorial laws. These laws are meant to silence all those who are against war. You can be jailed for multiple years for simply calling for peace. + +Do not be silent! Silence is a sign that you accept the Russian government's policy. +**You can choose NOT TO BE SILENT.** + +[1]: "Kharkiv under attack" +[2]: "Kyiv under attack" +[3]: "Chernihiv under attack" +[4]: "Sumy under attack" +[5]: "Irpin under attack" diff --git a/build-advisories/.gitignore b/build-advisories/.gitignore deleted file mode 100644 index c99e530b..00000000 --- a/build-advisories/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -vendor -composer.phar -composer.lock -composer-installer.php diff --git a/build-advisories/build-conflicts.php b/build-advisories/build-conflicts.php deleted file mode 100644 index 1198d313..00000000 --- a/build-advisories/build-conflicts.php +++ /dev/null @@ -1,238 +0,0 @@ - 'roave/security-advisories', - 'type' => 'metapackage', - 'description' => 'Prevents installation of composer packages with known security vulnerabilities: ' - . 'no API, simply require it', - 'license' => 'MIT', - 'authors' => [[ - 'name' => 'Marco Pivetta', - 'role' => 'maintainer', - 'email' => 'ocramius@gmail.com', - ]], -]; - -$cleanBuildDir = function () use ($buildDir) { - system('rm -rf ' . escapeshellarg($buildDir)); - system('mkdir ' . escapeshellarg($buildDir)); -}; - -$cloneAdvisories = function () use ($advisoriesRepository, $buildDir) { - system( - 'git clone ' - . escapeshellarg($advisoriesRepository) - . ' ' . escapeshellarg($buildDir . '/security-advisories') - ); -}; - -/** - * @param string $path - * - * @return Advisory[] - */ -$findAdvisories = function ($path) use ($advisoriesExtension) { - $yaml = new Yaml(); - - return array_map( - function (SplFileInfo $advisoryFile) use ($yaml) { - return Advisory::fromArrayData( - $yaml->parse(file_get_contents($advisoryFile->getRealPath()), true) - ); - }, - iterator_to_array(new \CallbackFilterIterator( - new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), - RecursiveIteratorIterator::SELF_FIRST - ), - function (SplFileInfo $advisoryFile) use ($advisoriesExtension) { - // @todo skip `vendor` dir - return $advisoryFile->isFile() && $advisoryFile->getExtension() === $advisoriesExtension; - } - )) - ); -}; - -/** - * @param Advisory[] $advisories - * - * @return Component[] - */ -$buildComponents = function (array $advisories) { - // @todo need a functional way to do this, somehow - $indexedAdvisories = []; - $components = []; - - foreach ($advisories as $advisory) { - if (! isset($indexedAdvisories[$advisory->getComponentName()])) { - $indexedAdvisories[$advisory->getComponentName()] = []; - } - - $indexedAdvisories[$advisory->getComponentName()][] = $advisory; - } - - foreach ($indexedAdvisories as $componentName => $advisories) { - $components[$componentName] = new Component($componentName, $advisories); - } - - return $components; -}; - -/** - * @param Component[] $components - * - * @return string[] - */ -$buildConflicts = function (array $components) { - $conflicts = []; - - foreach ($components as $component) { - $conflicts[$component->getName()] = $component->getConflictConstraint(); - } - - ksort($conflicts); - - return array_filter($conflicts); -}; - -$buildConflictsJson = function (array $baseConfig, array $conflicts) { - return json_encode( - array_merge( - $baseConfig, - ['conflict' => $conflicts] - ), - JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE - ); -}; - -$writeJson = function ($jsonString, $path) { - file_put_contents($path, $jsonString . "\n"); -}; - -$runInPath = function (callable $function, $path) { - $originalPath = getcwd(); - - chdir($path); - - try { - $returnValue = $function(); - } finally { - chdir($originalPath); - } - - return $returnValue; -}; - -$getComposerPhar = function ($targetDir) use ($runInPath) { - return $runInPath( - function () { - return system( - 'curl -sS https://getcomposer.org/installer -o composer-installer.php && php composer-installer.php' - ); - }, - $targetDir - ); -}; - -$execute = function ($commandString) { - exec($commandString, $ignored, $result); - - return $result === 0; -}; - -$validateComposerJson = function ($composerJsonPath) use ($runInPath, $execute) { - $runInPath( - function () use ($execute) { - if (! $execute('php composer.phar validate')) { - throw new UnexpectedValueException('Composer file validation failed'); - } - }, - dirname($composerJsonPath) - ); -}; - -$commitComposerJson = function ($composerJsonPath) use ($runInPath, $execute) { - $runInPath( - function () use ($composerJsonPath, $execute) { - if (! $execute('git add ' . escapeshellarg(realpath($composerJsonPath)))) { - throw new UnexpectedValueException(sprintf( - 'Could not add file "%s" to staged commit', - $composerJsonPath - )); - } - - $message = sprintf( - 'Committing generated "composer.json" file as per "%s"', - (new DateTime('now', new DateTimeZone('UTC')))->format(DateTime::W3C) - ); - - $execute('git diff-index --quiet HEAD || git commit -m ' . escapeshellarg($message)); - }, - dirname($composerJsonPath) - ); -}; - -// cleanup: -$cleanBuildDir(); -$cloneAdvisories(); - -// actual work: -$writeJson( - $buildConflictsJson( - $baseComposerJson, - $buildConflicts( - $buildComponents( - $findAdvisories($buildDir . '/security-advisories') - ) - ) - ), - $rootDir . '/composer.json' -); - -$getComposerPhar($rootDir); -$validateComposerJson($rootDir . '/composer.json'); - -$commitComposerJson($rootDir . '/composer.json'); - -echo 'Completed!' . PHP_EOL; diff --git a/build-advisories/composer.json b/build-advisories/composer.json deleted file mode 100644 index f889e024..00000000 --- a/build-advisories/composer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "roave/security-advisories-builder", - "description": "Build tool for roave/roave-security-advisories", - "license": "MIT", - "authors": [ - { - "name": "Marco Pivetta", - "role": "maintainer", - "email": "ocramius@gmail.com" - } - ], - "require": { - "php": "~7.0", - "symfony/yaml": "~3.0" - }, - "require-dev": { - "phpunit/phpunit": "~5.0" - }, - "autoload": { - "psr-0": { - "Roave\\SecurityAdvisories\\": "src" - } - }, - "autoload-dev": { - "psr-0": { - "RoaveTest\\SecurityAdvisories\\": "test" - } - } -} diff --git a/build-advisories/phpunit.xml.dist b/build-advisories/phpunit.xml.dist deleted file mode 100644 index 0a467f52..00000000 --- a/build-advisories/phpunit.xml.dist +++ /dev/null @@ -1,22 +0,0 @@ - - - - ./test - - - - ./src - - - diff --git a/build-advisories/src/Roave/SecurityAdvisories/Advisory.php b/build-advisories/src/Roave/SecurityAdvisories/Advisory.php deleted file mode 100644 index 0c5121bc..00000000 --- a/build-advisories/src/Roave/SecurityAdvisories/Advisory.php +++ /dev/null @@ -1,102 +0,0 @@ -componentName = (string) $componentName; - $this->branchConstraints = $checkType(...$branchConstraints); - } - - /** - * @param array $config - * - * @return self - * - * @throws \InvalidArgumentException - */ - public static function fromArrayData(array $config) - { - // @TODO may want to throw exceptions on missing/invalid keys - return new self( - str_replace('composer://', '', $config['reference']), - array_values(array_map( - function (array $branchConfig) { - return VersionConstraint::fromString(implode(',', (array) $branchConfig['versions'])); - }, - $config['branches'] - )) - ); - } - - /** - * @return string - */ - public function getComponentName() - { - return $this->componentName; - } - - /** - * @return VersionConstraint[] - */ - public function getVersionConstraints() - { - return $this->branchConstraints; - } - - /** - * @return string|null - */ - public function getConstraint() - { - // @TODO may want to escape this - return implode( - '|', - array_map( - function (VersionConstraint $versionConstraint) { - return $versionConstraint->getConstraintString(); - }, - $this->branchConstraints - ) - ) ?: null; - } -} diff --git a/build-advisories/src/Roave/SecurityAdvisories/Component.php b/build-advisories/src/Roave/SecurityAdvisories/Component.php deleted file mode 100644 index d1553b81..00000000 --- a/build-advisories/src/Roave/SecurityAdvisories/Component.php +++ /dev/null @@ -1,105 +0,0 @@ -name = (string) $name; - $this->advisories = $checkAdvisories(...array_values($advisories)); - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * @return string - */ - public function getConflictConstraint() - { - return implode( - '|', - array_filter(array_map( - function (VersionConstraint $versionConstraint) { - return $versionConstraint->getConstraintString(); - }, - $this->deDuplicateConstraints(array_merge( - [], - ...array_values(array_map( - function (Advisory $advisory) { - return $advisory->getVersionConstraints(); - }, - $this->advisories - )) - )) - )) - ); - } - - /** - * @param VersionConstraint[] $constraints - * - * @return VersionConstraint[] - */ - private function deDuplicateConstraints(array $constraints) - { - restart: - - foreach ($constraints as & $constraint) { - foreach ($constraints as $key => $comparedConstraint) { - if ($constraint !== $comparedConstraint && $constraint->canMergeWith($comparedConstraint)) { - unset($constraints[$key]); - $constraint = $constraint->mergeWith($comparedConstraint); - - // note: this is just simulating tail recursion. Normal recursion not viable here, and `foreach` - // becomes unstable when elements are removed from the loop - goto restart; - } - } - } - - return $constraints; - } -} diff --git a/build-advisories/src/Roave/SecurityAdvisories/Version.php b/build-advisories/src/Roave/SecurityAdvisories/Version.php deleted file mode 100644 index f4355153..00000000 --- a/build-advisories/src/Roave/SecurityAdvisories/Version.php +++ /dev/null @@ -1,112 +0,0 @@ -versionNumbers = $versionNumbers; - } - - /** - * @param string $version - * - * @return self - * - * @throws \InvalidArgumentException - */ - public static function fromString($version) - { - if (! preg_match(self::VALIDITY_MATCHER, $version)) { - throw new \InvalidArgumentException(sprintf('Given version "%s" is not a valid version string', $version)); - } - - return new self(self::removeTrailingZeroes(array_map('intval', explode('.', $version)))); - } - - /** - * Compares two versions and sees if this one is greater than the given one - * - * @todo may become a simple array comparison (if PHP supports it) - * - * @param Version $other - * - * @return bool - */ - public function isGreaterThan(self $other) - { - foreach ($other->versionNumbers as $index => $otherVersion) { - $thisVersion = isset($this->versionNumbers[$index]) ? $this->versionNumbers[$index] : 0; - - if ($thisVersion === $otherVersion) { - continue; - } - - return $thisVersion > $otherVersion; - } - - return (bool) array_filter(array_slice($this->versionNumbers, count($other->versionNumbers))); - } - - /** - * Compares two versions and sees if this one is greater or equal than the given one - * - * @todo may become a simple array comparison (if PHP supports it) - * - * @param Version $other - * - * @return bool - */ - public function isGreaterOrEqualThan(self $other) - { - foreach ($other->versionNumbers as $index => $otherVersion) { - $thisVersion = isset($this->versionNumbers[$index]) ? $this->versionNumbers[$index] : 0; - - if ($thisVersion === $otherVersion) { - continue; - } - - return $thisVersion > $otherVersion; - } - - return true; - } - - /** - * @return string - */ - public function getVersion() - { - return implode('.', $this->versionNumbers); - } - - /** - * @param int[] $versionNumbers - * - * @return int[] - */ - private static function removeTrailingZeroes(array $versionNumbers) - { - for ($i = count($versionNumbers) - 1; $i > 0; $i -= 1) { - if ($versionNumbers[$i] > 0) { - break; - } - } - - return array_slice($versionNumbers, 0, $i + 1); - } -} diff --git a/build-advisories/src/Roave/SecurityAdvisories/VersionConstraint.php b/build-advisories/src/Roave/SecurityAdvisories/VersionConstraint.php deleted file mode 100644 index ac9576e4..00000000 --- a/build-advisories/src/Roave/SecurityAdvisories/VersionConstraint.php +++ /dev/null @@ -1,334 +0,0 @@ -=1.2.3,<4.5.6" - */ -final class VersionConstraint -{ - const CLOSED_RANGE_MATCHER = '/^>(=?)\s*((?:\d+\.)*\d+)\s*,\s*<(=?)\s*((?:\d+\.)*\d+)$/'; - const LEFT_OPEN_RANGE_MATCHER = '/^<(=?)\s*((?:\d+\.)*\d+)$/'; - const RIGHT_OPEN_RANGE_MATCHER = '/^>(=?)\s*((?:\d+\.)*\d+)$/'; - - /** - * @var string|null - */ - private $constraintString; - - /** - * @var bool whether the lower bound is included or excluded - */ - private $lowerBoundIncluded = false; - - /** - * @var Version|null the upper bound of this constraint, null if unbound - */ - private $lowerBound; - - /** - * @var bool whether the upper bound is included or excluded - */ - private $upperBoundIncluded = false; - - /** - * @var Version|null the upper bound of this constraint, null if unbound - */ - private $upperBound; - - private function __construct() - { - } - - /** - * @param string $versionConstraint - * - * @return self - * - * @throws \InvalidArgumentException - */ - public static function fromString($versionConstraint) - { - $constraintString = (string) $versionConstraint; - $instance = new self(); - - if (preg_match(self::CLOSED_RANGE_MATCHER, $constraintString, $matches)) { - $instance->lowerBoundIncluded = (bool) $matches[1]; - $instance->upperBoundIncluded = (bool) $matches[3]; - $instance->lowerBound = Version::fromString($matches[2]); - $instance->upperBound = Version::fromString($matches[4]); - - return $instance; - } - - if (preg_match(self::LEFT_OPEN_RANGE_MATCHER, $constraintString, $matches)) { - $instance->upperBoundIncluded = (bool) $matches[1]; - $instance->upperBound = Version::fromString($matches[2]); - - return $instance; - } - - if (preg_match(self::RIGHT_OPEN_RANGE_MATCHER, $constraintString, $matches)) { - $instance->lowerBoundIncluded = (bool) $matches[1]; - $instance->lowerBound = Version::fromString($matches[2]); - - return $instance; - } - - $instance->constraintString = $constraintString; - - return $instance; - } - - /** - * @return bool - */ - public function isSimpleRangeString() - { - return null === $this->constraintString; - } - - /** - * @return string - */ - public function getConstraintString() - { - if (null !== $this->constraintString) { - return $this->constraintString; - } - - $parts = []; - - if ($this->lowerBound) { - $parts[] = '>' . ($this->lowerBoundIncluded ? '=' : '') . $this->lowerBound->getVersion(); - } - - if ($this->upperBound) { - $parts[] = '<' . ($this->upperBoundIncluded ? '=' : '') . $this->upperBound->getVersion(); - } - - return implode(',', $parts); - } - - /** - * @return bool - */ - public function isLowerBoundIncluded() - { - return $this->lowerBoundIncluded; - } - - /** - * @return null|Version - */ - public function getLowerBound() - { - return $this->lowerBound; - } - - /** - * @return null|Version - */ - public function getUpperBound() - { - return $this->upperBound; - } - - /** - * @return bool - */ - public function isUpperBoundIncluded() - { - return $this->upperBoundIncluded; - } - - /** - * @param VersionConstraint $other - * - * @return bool - */ - public function canMergeWith(VersionConstraint $other) - { - return $this->contains($other) - || $other->contains($this) - || $this->overlapsWith($other) - || $other->overlapsWith($this); - } - - /** - * @param VersionConstraint $other - * - * @return VersionConstraint - * - * @throws \LogicException - */ - public function mergeWith(VersionConstraint $other) - { - if ($this->contains($other)) { - return $this; - } - - if ($other->contains($this)) { - return $other; - } - - if ($this->overlapsWith($other)) { - return $this->mergeWithOverlapping($other); - } - - if ($other->overlapsWith($this)) { - return $other->mergeWithOverlapping($this); - } - - throw new \LogicException(sprintf( - 'Cannot merge %s "%s" with %s "%s"', - self::class, - $this->getConstraintString(), - self::class, - $other->getConstraintString() - )); - } - - /** - * @param VersionConstraint $other - * - * @return bool - */ - private function contains(VersionConstraint $other) - { - return $this->isSimpleRangeString() // cannot compare - too complex :-( - && $other->isSimpleRangeString() // cannot compare - too complex :-( - && $this->containsLowerBound($other->lowerBoundIncluded, $other->lowerBound) - && $this->containsUpperBound($other->upperBoundIncluded, $other->upperBound); - } - - /** - * @param bool $otherLowerBoundIncluded - * @param Version|null $otherLowerBound - * - * @return bool - */ - private function containsLowerBound($otherLowerBoundIncluded, Version $otherLowerBound = null) - { - if (! $this->lowerBound) { - return true; - } - - if (! $otherLowerBound) { - return false; - } - - if (($this->lowerBoundIncluded === $otherLowerBoundIncluded) || $this->lowerBoundIncluded) { - return $otherLowerBound->isGreaterOrEqualThan($this->lowerBound); - } - - return $otherLowerBound->isGreaterThan($this->lowerBound); - } - - - /** - * @param bool $otherUpperBoundIncluded - * @param Version|null $otherUpperBound - * - * @return bool - */ - private function containsUpperBound($otherUpperBoundIncluded, Version $otherUpperBound = null) - { - if (! $this->upperBound) { - return true; - } - - if (! $otherUpperBound) { - return false; - } - - if (($this->upperBoundIncluded === $otherUpperBoundIncluded) || $this->upperBoundIncluded) { - return $this->upperBound->isGreaterOrEqualThan($otherUpperBound); - } - - return $this->upperBound->isGreaterThan($otherUpperBound); - } - - /** - * @param VersionConstraint $other - * - * @return bool - */ - private function overlapsWith(VersionConstraint $other) - { - if (! $this->isSimpleRangeString() && $other->isSimpleRangeString()) { - return false; - } - - if ($this->contains($other) || $other->contains($this)) { - return false; - } - - return $this->strictlyContainsOtherBound($other->lowerBound) - xor $this->strictlyContainsOtherBound($other->upperBound); - } - - /** - * @param VersionConstraint $other - * - * @return bool - * - * @throws \LogicException - */ - private function mergeWithOverlapping(VersionConstraint $other) - { - if (! $this->overlapsWith($other)) { - throw new \LogicException(sprintf( - '%s "%s" does not overlap with %s "%s"', - self::class, - $this->getConstraintString(), - self::class, - $other->getConstraintString() - )); - } - - if ($this->strictlyContainsOtherBound($other->lowerBound)) { - $instance = new self(); - - $instance->lowerBound = $this->lowerBound; - $instance->lowerBoundIncluded = $this->lowerBoundIncluded; - $instance->upperBound = $other->upperBound; - $instance->upperBoundIncluded = $other->upperBoundIncluded; - - return $instance; - } - - $instance = new self(); - - $instance->lowerBound = $other->lowerBound; - $instance->lowerBoundIncluded = $other->lowerBoundIncluded; - $instance->upperBound = $this->upperBound; - $instance->upperBoundIncluded = $this->upperBoundIncluded; - - return $instance; - } - - /** - * @param Version|null $bound - * - * @return bool - * - * Note: most of the limitations/complication probably go away if we define a `Bound` VO - */ - private function strictlyContainsOtherBound(Version $bound = null) - { - if (! $bound) { - return false; - } - - if (! $this->lowerBound) { - return $this->upperBound->isGreaterThan($bound); - } - - if (! $this->upperBound) { - return $bound->isGreaterThan($this->lowerBound); - } - - return $bound->isGreaterThan($this->lowerBound) && $this->upperBound->isGreaterThan($bound); - } -} diff --git a/build-advisories/test/RoaveTest/SecurityAdvisories/AdvisoryTest.php b/build-advisories/test/RoaveTest/SecurityAdvisories/AdvisoryTest.php deleted file mode 100644 index 242dfbf6..00000000 --- a/build-advisories/test/RoaveTest/SecurityAdvisories/AdvisoryTest.php +++ /dev/null @@ -1,60 +0,0 @@ - 'composer://foo/bar', - 'branches' => [ - '1.0.x' => [ - 'versions' => ['>=1.0', '<1.1'], - ], - '2.0.x' => [ - 'versions' => ['>=2.0', '<2.1'], - ], - ], - ]); - - $this->assertInstanceOf(Advisory::class, $advisory); - - $this->assertSame('foo/bar', $advisory->getComponentName()); - $this->assertSame('>=1,<1.1|>=2,<2.1', $advisory->getConstraint()); - - $constraints = $advisory->getVersionConstraints(); - - $this->assertCount(2, $constraints); - $this->assertInstanceOf(VersionConstraint::class, $constraints[0]); - $this->assertInstanceOf(VersionConstraint::class, $constraints[1]); - - $this->assertSame('>=1,<1.1', $constraints[0]->getConstraintString()); - $this->assertSame('>=2,<2.1', $constraints[1]->getConstraintString()); - } -} diff --git a/build-advisories/test/RoaveTest/SecurityAdvisories/ComponentTest.php b/build-advisories/test/RoaveTest/SecurityAdvisories/ComponentTest.php deleted file mode 100644 index 21ff2702..00000000 --- a/build-advisories/test/RoaveTest/SecurityAdvisories/ComponentTest.php +++ /dev/null @@ -1,112 +0,0 @@ - 'composer://foo/bar', - 'branches' => [ - '1.0.x' => [ - 'versions' => ['>=1.0', '<1.1'], - ], - '2.0.x' => [ - 'versions' => ['>=2.0', '<2.1'], - ], - ], - ]); - $advisory2 = Advisory::fromArrayData([ - 'reference' => 'composer://foo/bar', - 'branches' => [ - '1.0.x' => [ - 'versions' => ['>=3.0', '<3.1'], - ], - '2.0.x' => [ - 'versions' => ['>=4.0', '<4.1'], - ], - ], - ]); - - $component = new Component('foo/bar', [$advisory1, $advisory2]); - - $this->assertInstanceOf(Component::class, $component); - - $this->assertSame('>=1,<1.1|>=2,<2.1|>=3,<3.1|>=4,<4.1', $component->getConflictConstraint()); - $this->assertSame('foo/bar', $component->getName()); - } - - public function testDeDuplicatesOverlappingAdvisories() - { - $advisory1 = Advisory::fromArrayData([ - 'reference' => 'composer://foo/bar', - 'branches' => [ - '1.0.x' => [ - 'versions' => ['>=1.0', '<1.1'], - ], - '2.0.x' => [ - 'versions' => ['>=2.0', '<2.1'], - ], - ], - ]); - $advisory2 = Advisory::fromArrayData([ - 'reference' => 'composer://foo/bar', - 'branches' => [ - '1.0.x' => [ - // this should not appear, as it is included in a previous advisory - 'versions' => ['>=1.0.1', '<1.0.99'], - ], - '2.0.x' => [ - // this should not appear, as it is included in a previous advisory - 'versions' => ['>=2.0.1', '<2.1'], - ], - '3.0.x' => [ - // this should appear, as it is not covered by previous advisories - 'versions' => ['>=3.0', '<3.1'], - ], - ], - ]); - $advisory3 = Advisory::fromArrayData([ - 'reference' => 'composer://foo/bar', - 'branches' => [ - '3.0.x' => [ - // this should not appear, as it is included in the second advisory - 'versions' => ['>=3.0.1', '<3.0.99'], - ], - ], - ]); - - $component = new Component('foo/bar', [$advisory1, $advisory2, $advisory3]); - - $this->assertInstanceOf(Component::class, $component); - - $this->assertSame('>=1,<1.1|>=2,<2.1|>=3,<3.1', $component->getConflictConstraint()); - $this->assertSame('foo/bar', $component->getName()); - } -} diff --git a/build-advisories/test/RoaveTest/SecurityAdvisories/VersionConstraintTest.php b/build-advisories/test/RoaveTest/SecurityAdvisories/VersionConstraintTest.php deleted file mode 100644 index a468c224..00000000 --- a/build-advisories/test/RoaveTest/SecurityAdvisories/VersionConstraintTest.php +++ /dev/null @@ -1,552 +0,0 @@ -assertInstanceOf(VersionConstraint::class, $constraint); - $this->assertTrue($constraint->isSimpleRangeString()); - $this->assertInstanceOf(Version::class, $constraint->getLowerBound()); - $this->assertInstanceOf(Version::class, $constraint->getUpperBound()); - - $constraintAsString = $constraint->getConstraintString(); - - $this->assertSame((bool) preg_match('/>=/', $stringConstraint), $constraint->isLowerBoundIncluded()); - $this->assertSame((bool) preg_match('/<=/',$stringConstraint), $constraint->isUpperBoundIncluded()); - $this->assertStringMatchesFormat('%A' . $constraint->getLowerBound()->getVersion() . '%A', $constraintAsString); - $this->assertStringMatchesFormat('%A' . $constraint->getUpperBound()->getVersion() . '%A', $constraintAsString); - } - - /** - * @dataProvider normalizableRangesProvider - * - * @param string $originalRange - * @param string $normalizedRange - */ - public function testOperatesOnNormalizedRanges($originalRange, $normalizedRange) - { - $this->assertSame($normalizedRange, VersionConstraint::fromString($originalRange)->getConstraintString()); - } - - public function testLeftOpenEndedRange() - { - $constraint = VersionConstraint::fromString('<1'); - - $this->assertTrue($constraint->isSimpleRangeString()); - $this->assertSame('<1', $constraint->getConstraintString()); - $this->assertNull($constraint->getLowerBound()); - $this->assertInstanceOf(Version::class, $constraint->getUpperBound()); - $this->assertFalse($constraint->isLowerBoundIncluded()); - $this->assertFalse($constraint->isUpperBoundIncluded()); - } - - public function testRightOpenEndedRange() - { - $constraint = VersionConstraint::fromString('>1'); - - $this->assertTrue($constraint->isSimpleRangeString()); - $this->assertSame('>1', $constraint->getConstraintString()); - $this->assertNull($constraint->getUpperBound()); - $this->assertInstanceOf(Version::class, $constraint->getLowerBound()); - $this->assertFalse($constraint->isLowerBoundIncluded()); - $this->assertFalse($constraint->isUpperBoundIncluded()); - } - - public function testLeftOpenEndedRangeBoundIncluded() - { - $constraint = VersionConstraint::fromString('<=1'); - - $this->assertTrue($constraint->isSimpleRangeString()); - $this->assertSame('<=1', $constraint->getConstraintString()); - $this->assertNull($constraint->getLowerBound()); - $this->assertInstanceOf(Version::class, $constraint->getUpperBound()); - $this->assertFalse($constraint->isLowerBoundIncluded()); - $this->assertTrue($constraint->isUpperBoundIncluded()); - } - - public function testRightOpenEndedRangeBoundIncluded() - { - $constraint = VersionConstraint::fromString('>=1'); - - $this->assertTrue($constraint->isSimpleRangeString()); - $this->assertSame('>=1', $constraint->getConstraintString()); - $this->assertNull($constraint->getUpperBound()); - $this->assertInstanceOf(Version::class, $constraint->getLowerBound()); - $this->assertTrue($constraint->isLowerBoundIncluded()); - $this->assertFalse($constraint->isUpperBoundIncluded()); - } - - /** - * @dataProvider complexRangesProvider - * - * @param string $stringConstraint - */ - public function testFromRangeWithComplexRanges($stringConstraint) - { - $constraint = VersionConstraint::fromString($stringConstraint); - - $this->assertInstanceOf(VersionConstraint::class, $constraint); - $this->assertFalse($constraint->isSimpleRangeString()); - $this->assertSame($stringConstraint, $constraint->getConstraintString()); - } - - public function testContainsWithMatchingRanges() - { - $constraint1 = VersionConstraint::fromString('>1.2.3,<4.5.6'); - $constraint2 = VersionConstraint::fromString('>1.2.4,<4.5.5'); - - $this->assertTrue($this->callContains($constraint1, $constraint2)); - $this->assertFalse($this->callContains($constraint2, $constraint1)); - } - - public function testCannotCompareComplexRanges() - { - $constraint1 = VersionConstraint::fromString('1|2'); - $constraint2 = VersionConstraint::fromString('1|2|3'); - - $this->assertFalse($this->callContains($constraint1, $constraint2)); - $this->assertFalse($this->callContains($constraint2, $constraint1)); - } - - /** - * @dataProvider rangesForComparisonProvider - * - * @param string $constraintString1 - * @param string $constraintString2 - * @param bool $constraint1ContainsConstraint2 - * @param bool $constraint2ContainsConstraint1 - */ - public function testContainsWithRanges( - $constraintString1, - $constraintString2, - $constraint1ContainsConstraint2, - $constraint2ContainsConstraint1 - ) { - $constraint1 = VersionConstraint::fromString($constraintString1); - $constraint2 = VersionConstraint::fromString($constraintString2); - - $this->assertSame($constraint1ContainsConstraint2, $this->callContains($constraint1, $constraint2)); - $this->assertSame($constraint2ContainsConstraint1, $this->callContains($constraint2, $constraint1)); - } - - /** - * @dataProvider mergeableRangesProvider - * - * @param string $constraintString1 - * @param string $constraintString2 - * @param bool $constraint1ContainsConstraint2 - * @param bool $constraint2ContainsConstraint1 - */ - public function testCanMergeWithContainedRanges( - $constraintString1, - $constraintString2, - $constraint1ContainsConstraint2, - $constraint2ContainsConstraint1 - ) { - $constraint1 = VersionConstraint::fromString($constraintString1); - $constraint2 = VersionConstraint::fromString($constraintString2); - $expectation = $constraint2ContainsConstraint1 || $constraint1ContainsConstraint2; - - $this->assertSame($expectation, $constraint1->canMergeWith($constraint2)); - $this->assertSame($expectation, $constraint1->canMergeWith($constraint2)); - } - - /** - * @dataProvider mergeableRangesProvider - * - * @param string $constraintString1 - * @param string $constraintString2 - * @param bool $constraint1ContainsConstraint2 - * @param bool $constraint2ContainsConstraint1 - */ - public function testMergeWithMergeableRanges( - $constraintString1, - $constraintString2, - $constraint1ContainsConstraint2, - $constraint2ContainsConstraint1 - ) { - $constraint1 = VersionConstraint::fromString($constraintString1); - $constraint2 = VersionConstraint::fromString($constraintString2); - - if (! ($constraint2ContainsConstraint1 || $constraint1ContainsConstraint2)) { - $this->setExpectedException(\LogicException::class); - } - - $merged1 = $constraint1->mergeWith($constraint2); - $merged2 = $constraint2->mergeWith($constraint1); - - $this->assertEquals($merged1, $merged2); - - $this->assertTrue($this->callContains($merged1, $constraint1)); - $this->assertTrue($this->callContains($merged1, $constraint2)); - } - - /** - * @dataProvider strictlyOverlappingRangesProvider - * - * @param string $range1 - * @param string $range2 - * @param string $expected - */ - public function testCanMergeWithMergeableRanges($range1, $range2, $expected) - { - $constraint1 = VersionConstraint::fromString($range1); - $constraint2 = VersionConstraint::fromString($range2); - - $this->assertTrue($this->callOverlapsWith($constraint1, $constraint2)); - $this->assertTrue($this->callOverlapsWith($constraint2, $constraint1)); - - $this->assertSame( - $expected, - $this->callMergeWithOverlapping($constraint1, $constraint2)->getConstraintString() - ); - $this->assertSame( - $expected, - $this->callMergeWithOverlapping($constraint2, $constraint1)->getConstraintString() - ); - $this->assertSame($expected, $constraint1->mergeWith($constraint2)->getConstraintString()); - $this->assertSame($expected, $constraint2->mergeWith($constraint1)->getConstraintString()); - } - - /** - * @dataProvider nonStrictlyOverlappingRangesProvider - * - * @param string $range1 - * @param string $range2 - */ - public function testNonMergeableRanges($range1, $range2) - { - $constraint1 = VersionConstraint::fromString($range1); - $constraint2 = VersionConstraint::fromString($range2); - - $this->assertFalse($this->callOverlapsWith($constraint1, $constraint2)); - $this->assertFalse($this->callOverlapsWith($constraint2, $constraint1)); - - $this->setExpectedException(\LogicException::class); - - $this->callMergeWithOverlapping($constraint1, $constraint2); - } - - /** - * @return string[][] - */ - public function closedRangesProvider() - { - $matchedRanges = [ - ['>1.2.3,<4.5.6'], - ['>=1.2.3,<4.5.6'], - ['>1.2.3,<=4.5.6'], - ['>=1.2.3,<=4.5.6'], - ['> 1.2.3 , < 4.5.6'], - ['>= 1.2.3 , <4.5.6'], - ['> 1.2.3 , <=4.5.6'], - ['>=1.2.3, <=4.5.6'], - ['>11.22.33,<44.55.66'], - ['>11.22.33.44.55.66.77,<44.55.66.77.88.99.1010'], - ['>1,<2'], - ]; - - return array_combine( - array_map( - function (array $entry) { - return $entry[0]; - }, - $matchedRanges - ), - $matchedRanges - ); - } - - /** - * @return string[][] - */ - public function complexRangesProvider() - { - return $this->dataProviderFirstValueAsProviderKey([ - ['>1.2.3,<4.5.6,<7.8.9'], - ['1.2.3|4.5.6'], - ['1'], - ['1|2'], - ['<1,<2'], - ['>1,>2'], - ['~2'], - ['>1a2b3,<4c5d6'], - ['>1a2'], - ['<1a2'], - ]); - } - - /** - * @return string[][]|bool[][] - * - * - range1 - * - range2 - * - range1 contains range2 - * - range2 contains range1 - */ - public function rangesForComparisonProvider() - { - $entries = [ - ['>1,<2', '>1,<2', true, true], - ['>1,<2', '>1.1,<2', true, false], - ['>1,<2', '>3,<4', false, false], - ['>1.1,<2.1', '>1.2,<2', true, false], - ['>100,<200', '>1.0.0,<2.0.0', false, false], - ['>1.10,<2', '>1.100,<2', true, false], - ['>1,<2.10', '>1,<2.100', false, true], - ['>1.0,<2', '>1,<2', true, true], - ['>1,<2.0', '>1,<2', true, true], - ['>1.0.0,<2', '>1,<2', true, true], - ['>1,<2.0.0', '>1,<2', true, true], - ['>=1,<2', '>1,<2', true, false], - ['>=1,<2', '>=1,<2', true, true], - ['>1,<=2', '>1,<2', true, false], - ['>1,<=2', '>1,<=2', true, true], - ['>=1,<=2', '>1,<2', true, false], - ['>=1,<=2', '>=1,<=2', true, true], - ['>=1,<=2', '>=1,<=2', true, true], - ['>=1', '>=1,<2', true, false], - ['>=1', '>1,<2', true, false], - ['>1', '>=1,<2', false, false], // this is mergeable, but not updated in tests - ['<=2', '>1,<=2', true, false], - ['<=2', '>1,<2', true, false], - ['<2', '>1,<=2', false, false], // this is mergeable, but not updated in tests - ['<2', '<2', true, true], - ['<=2', '<=2', true, true], - ['<=2', '<2', true, false], - ['<=2', '<1', true, false], - ['<=2', '<3', false, true], - ['>2', '>2', true, true], - ['>=2', '>=2', true, true], - ['>=2', '>2', true, false], - ['>=2', '>1', false, true], - ['>=2', '>3', true, false], - ]; - - return array_combine( - array_map( - function (array $entry) { - return '(∀ x ∈ (' . $entry[0] . '): x ∈ (' . $entry[1] . ')) = ' . var_export($entry[2], true); - }, - $entries - ), - $entries - ); - } - - /** - * @return string[] - */ - public function mergeableRangesProvider() - { - $entries = [ - ['>1,<2', '>1,<2', true, true], - ['>1,<2', '>1.1,<2', true, false], - ['>1,<2', '>3,<4', false, false], - ['>1.1,<2.1', '>1.2,<2', true, false], - ['>100,<200', '>1.0.0,<2.0.0', false, false], - ['>1.10,<2', '>1.100,<2', true, false], - ['>1,<2.10', '>1,<2.100', false, true], - ['>1.0,<2', '>1,<2', true, true], - ['>1,<2.0', '>1,<2', true, true], - ['>1.0.0,<2', '>1,<2', true, true], - ['>1,<2.0.0', '>1,<2', true, true], - ['>=1,<2', '>1,<2', true, false], - ['>=1,<2', '>=1,<2', true, true], - ['>1,<=2', '>1,<2', true, false], - ['>1,<=2', '>1,<=2', true, true], - ['>=1,<=2', '>1,<2', true, false], - ['>=1,<=2', '>=1,<=2', true, true], - ['>=1,<=2', '>=1,<=2', true, true], - ['>=1', '>=1,<2', true, false], - ['>=1', '>1,<2', true, false], - ['>1', '>=1,<2', true, true], - ['<=2', '>1,<=2', true, false], - ['<=2', '>1,<2', true, false], - ['<2', '>1,<=2', true, true], - ['<2', '<2', true, true], - ['<=2', '<=2', true, true], - ['<=2', '<2', true, false], - ['<=2', '<1', true, false], - ['<=2', '<3', false, true], - ['>2', '>2', true, true], - ['>=2', '>=2', true, true], - ['>=2', '>2', true, false], - ['>=2', '>1', false, true], - ['>=2', '>3', true, false], - ]; - - return array_combine( - array_map( - function (array $entry) { - return '((' . $entry[0] . ') ∩ (' . $entry[1] . ')) ≠ ∅'; - }, - $entries - ), - $entries - ); - } - - /** - * @return string[][] - */ - public function normalizableRangesProvider() - { - return $this->dataProviderFirstValueAsProviderKey([ - ['>1.0,<2.0', '>1,<2'], - ['>=1.0,<2.0', '>=1,<2'], - ['>1.0,<=2.0', '>1,<=2'], - ['>=1.0,<=2.0', '>=1,<=2'], - ['>1.0', '>1'], - ['>=1.0', '>=1'], - ['<1.0', '<1'], - ['<=1.0', '<=1'], - ]); - } - - public function strictlyOverlappingRangesProvider() - { - $entries = [ - ['>2,<3', '>2.1,<4', '>2,<4'], - ['>2,<3', '>1,<2.1', '>1,<3'], - ['<3', '>1,<3.1', '<3.1'], - ['>3', '>2.1,<3.1', '>2.1'], - ]; - - return array_combine( - array_map( - function (array $entry) { - return '((' . $entry[0] . ') ∪ (' . $entry[1] . ')) = (' . $entry[2] . ')'; - }, - $entries - ), - $entries - ); - } - - public function nonStrictlyOverlappingRangesProvider() - { - $entries = [ - ['>2,<3', '>3,<4'], - ['>2,<3', '>=3,<4'], - ['>2,<=3', '>3,<4'], - ['>2,<=3', '>=3,<4'], - ['>2,<3', '>1,<2'], - ['>2,<3', '>1,<=2'], - ['>=2,<3', '>1,<2'], - ['>=2,<3', '>1,<=2'], - ['foo', '>1,<2'], - ['>2,<3', 'foo'], - ['bar', 'foo'], - ['>1,<4', '>2,<3'], // note: containing, not overlapping. - ]; - - return array_combine( - array_map( - function (array $entry) { - return '((' . $entry[0] . ') ∩ (' . $entry[1] . ')) = ∅'; - }, - $entries - ), - $entries - ); - } - - /** - * @param mixed[][] $entries - * - * @return mixed[][] - */ - private function dataProviderFirstValueAsProviderKey(array $entries) - { - return array_combine( - array_map( - function (array $entry) { - return $entry[0]; - }, - $entries - ), - $entries - ); - } - - /** - * @param VersionConstraint $versionConstraint - * @param VersionConstraint $other - * - * @return bool - */ - private function callContains(VersionConstraint $versionConstraint, VersionConstraint $other) - { - $containsReflection = new ReflectionMethod($versionConstraint, 'contains'); - - $containsReflection->setAccessible(true); - - return $containsReflection->invoke($versionConstraint, $other); - } - - /** - * @param VersionConstraint $versionConstraint - * @param VersionConstraint $other - * - * @return bool - */ - private function callOverlapsWith(VersionConstraint $versionConstraint, VersionConstraint $other) - { - $overlapsWithReflection = new ReflectionMethod($versionConstraint, 'overlapsWith'); - - $overlapsWithReflection->setAccessible(true); - - return $overlapsWithReflection->invoke($versionConstraint, $other); - } - - /** - * @param VersionConstraint $versionConstraint - * @param VersionConstraint $other - * - * @return VersionConstraint - */ - private function callMergeWithOverlapping(VersionConstraint $versionConstraint, VersionConstraint $other) - { - $mergeWithOverlappingReflection = new ReflectionMethod($versionConstraint, 'mergeWithOverlapping'); - - $mergeWithOverlappingReflection->setAccessible(true); - - return $mergeWithOverlappingReflection->invoke($versionConstraint, $other); - } -} diff --git a/build-advisories/test/RoaveTest/SecurityAdvisories/VersionTest.php b/build-advisories/test/RoaveTest/SecurityAdvisories/VersionTest.php deleted file mode 100644 index 98f9757c..00000000 --- a/build-advisories/test/RoaveTest/SecurityAdvisories/VersionTest.php +++ /dev/null @@ -1,219 +0,0 @@ -setExpectedException(\InvalidArgumentException::class); - - Version::fromString($versionString); - } - - /** - * @dataProvider validVersionStringProvider - * - * @param string $versionString - */ - public function testGetVersionWithValidVersion($versionString) - { - $version = Version::fromString($versionString); - - $this->assertInstanceOf(Version::class, $version); - $this->assertRegExp('/([0-9]*)(\\.[1-9][0-9]*)*/', $version->getVersion()); - } - - /** - * @dataProvider validVersionStringProvider - * - * @param string $versionString - */ - public function testVersionNumbersAreNormalized($versionString) - { - $this->assertNotRegExp('/(\\.[0]+)+$/', Version::fromString($versionString)->getVersion()); - } - - /** - * @dataProvider greaterThanComparisonVersionsProvider - * - * @param string $version1String - * @param string $version2String - * @param bool $v1GreaterThanV2 - * @param bool $v2GreaterThanV1 - */ - public function testGreaterThanVersionWith($version1String, $version2String, $v1GreaterThanV2, $v2GreaterThanV1) - { - $version1 = Version::fromString($version1String); - $version2 = Version::fromString($version2String); - - $this->assertSame($v1GreaterThanV2, $version1->isGreaterThan($version2)); - $this->assertSame($v2GreaterThanV1, $version2->isGreaterThan($version1)); - } - - /** - * @dataProvider greaterOrEqualThanComparisonVersionsProvider - * - * @param string $version1String - * @param string $version2String - * @param bool $v1GreaterOrEqualThanV2 - * @param bool $v2GreaterOrEqualThanV1 - */ - public function testGreaterOrEqualThanVersionWith( - $version1String, - $version2String, - $v1GreaterOrEqualThanV2, - $v2GreaterOrEqualThanV1 - ) { - $version1 = Version::fromString($version1String); - $version2 = Version::fromString($version2String); - - $this->assertSame($v1GreaterOrEqualThanV2, $version1->isGreaterOrEqualThan($version2)); - $this->assertSame($v2GreaterOrEqualThanV1, $version2->isGreaterOrEqualThan($version1)); - } - - /** - * @dataProvider equivalentVersionProvider - * - * @param string $version1String - * @param string $version2String - */ - public function testVersionEquivalence($version1String, $version2String) - { - $this->assertEquals(Version::fromString($version1String), Version::fromString($version2String)); - } - - public function validVersionStringProvider() - { - return [ - ['0'], - ['1'], - ['12345'], - ['12345.00'], - ['0.1.2.3.4'], - ['1.2.3.4'], - ['1.2.3.4.5.6.7.8.9.10'], - ['12345.12345.12345.12345.0'], - ]; - } - - public function greaterThanComparisonVersionsProvider() - { - $versions = [ - ['0', '0', false, false], - ['1', '1', false, false], - ['3', '3', false, false], - ['100', '99', true, false], - ['1', '0', true, false], - ['1.1', '1.1', false, false], - ['1.10', '1.1', true, false], - ['1.100', '1.100', false, false], - ['1.2', '1.100', false, true], - ['1.1', '1.1.0', false, false], - ['1.1', '1.1.0.0', false, false], - ['1.1', '1.1.0.0.1', false, true], - ['1.0.0.0.0.0.2', '1.0.0.0.0.2', false, true], - ['1.0.12', '1.0.11', true, false], - ]; - - return array_combine( - array_map( - function (array $versionData) { - return $versionData[0] . ' > ' . $versionData[1]; - }, - $versions - ), - $versions - ); - } - - public function greaterOrEqualThanComparisonVersionsProvider() - { - $versions = [ - ['0', '0', true, true], - ['0.0', '0', true, true], - ['0.0.0', '0', true, true], - ['0.0.0.1', '0', true, false], - ['100', '99', true, false], - ['1', '0', true, false], - ['1.1', '1.1', true, true], - ['1.10', '1.1', true, false], - ['1.10', '1.10', true, true], - ['1.100', '1.100', true, true], - ['1.2', '1.100', false, true], - ['1.1', '1.1.0', true, true], - ['1.1', '1.1.0.0', true, true], - ['1.1', '1.1.0.0.1', false, true], - ['1.0.0.0.0.0.2', '1.0.0.0.0.2', false, true], - ['1.0.12', '1.0.11', true, false], - ]; - - return array_combine( - array_map( - function (array $versionData) { - return $versionData[0] . ' >= ' . $versionData[1]; - }, - $versions - ), - $versions - ); - } - - public function invalidVersionStringsProvider() - { - return [ - [''], - ['12.a'], - ['12a3'], - ['alpha'], - ['beta'], - ['1-a'], - ['1.2.a'], - ['.1'], - ]; - } - - public function equivalentVersionProvider() - { - return [ - ['0', '0.0'], - ['1', '1.0'], - ['1', '1.0.0'], - ['1.0.0.0', '1.0.0'], - ['2.0.1.0', '2.0.1'], - ['2.0.1.0.0.0', '2.0.1'], - ]; - } -} diff --git a/build-advisories/update-security-advisories.php b/build-advisories/update-security-advisories.php deleted file mode 100644 index cea2a584..00000000 --- a/build-advisories/update-security-advisories.php +++ /dev/null @@ -1,106 +0,0 @@ -&1', $output, $result); - - if (0 !== $result) { - throw new \UnexpectedValueException(sprintf( - 'Command failed: "%s" "%s"', - $commandString, - implode(PHP_EOL, $output) - )); - } - - return $output; - }; - - $getCurrentSha1 = function () use ($runInPath, $execute) { - return $runInPath( - function () use ($execute) { - return $execute('git rev-parse --verify HEAD')[0]; - }, - realpath(__DIR__ . '/..') - ); - }; - - $runInPath( - function () use ($execute) { - $execute('git fetch origin'); - $execute('git reset --hard origin/master'); - }, - realpath(__DIR__ . '/..') - ); - - $previousSha1 = $getCurrentSha1(); - - $runInPath( - function () use ($execute) { - $execute( - 'curl -sS https://getcomposer.org/installer -o composer-installer.php && php composer-installer.php' - ); - $execute('php composer.phar install'); - }, - realpath(__DIR__) - ); - - $runInPath( - function () use ($execute) { - $execute('php build-advisories/build-conflicts.php'); - $execute('git push origin master'); - }, - realpath(__DIR__ . '/..') - ); - - header('Content-Type: application/json'); - echo json_encode([ - 'before' => $previousSha1, - 'after' => $getCurrentSha1(), - ]); -})(); diff --git a/composer.json b/composer.json index 38e9fc30..5dd03178 100644 --- a/composer.json +++ b/composer.json @@ -3,97 +3,1093 @@ "type": "metapackage", "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", "license": "MIT", + "keywords": [ + "dev" + ], "authors": [ { "name": "Marco Pivetta", "role": "maintainer", "email": "ocramius@gmail.com" + }, + { + "name": "Ilya Tribusean", + "role": "maintainer", + "email": "slash3b@gmail.com" } ], "conflict": { - "aws/aws-sdk-php": ">=3,<3.2.1", - "cakephp/cakephp": ">=3,<3.0.15|>=2,<2.4.99|>=2.5,<2.5.90|>=2.6,<2.6.12|>=1.3,<1.3.18|>=2.7,<2.7.6|>=3.1,<3.1.3", - "codeigniter/framework": "<3.0.3", - "contao/core": ">=2.11,<3|>=3,<3.1|>=3.1,<3.2|>=3.2,<3.2.19|>=3.3,<3.4|>=3.4,<3.4.4", - "doctrine/annotations": ">=1,<1.2.7", + "3f/pygmentize": "<1.2", + "adaptcms/adaptcms": "<=1.3", + "adawolfa/isdoc": "<1.4.3|>=1.5,<1.5.1|>=1.6,<1.6.1", + "admidio/admidio": "<=5.0.11", + "adodb/adodb-php": "<=5.22.9", + "aheinze/cockpit": "<2.2", + "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.07.2", + "aimeos/ai-admin-jsonadm": "<2020.10.13|>=2021.04.1,<2021.10.6|>=2022.04.1,<2022.10.3|>=2023.04.1,<2023.10.4|==2024.04.1", + "aimeos/ai-client-html": ">=2020.04.1,<2020.10.27|>=2021.04.1,<2021.10.22|>=2022.04.1,<2022.10.13|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.04.7", + "aimeos/ai-cms-grapesjs": ">=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.9|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.10.8|>=2025.04.1,<2025.10.2", + "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9|==2024.04.1", + "aimeos/aimeos-core": ">=2022.04.1,<2022.10.17|>=2023.04.1,<2023.10.17|>=2024.04.1,<2024.04.7", + "aimeos/aimeos-laravel": "==2021.10", + "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", + "aimeos/pagible": "<0.10.4", + "airesvsg/acf-to-rest-api": "<=3.1", + "akaunting/akaunting": "<2.1.13", + "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", + "alextselegidis/easyappointments": "<=1.5.2", + "alexusmai/laravel-file-manager": "<=3.3.1", + "algolia/algoliasearch-magento-2": "<=3.16.1|>=3.17.0.0-beta1,<=3.17.1", + "almirhodzic/nova-toggle-5": "<1.3", + "alt-design/alt-redirect": "<1.6.4", + "altcha-org/altcha": "<1.3.1", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", + "ameos/ameos_tarteaucitron": "<1.2.23", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<=1.7.2|>=2,<=2.1", + "amphp/http-client": ">=4,<4.4", + "amphp/http-server": ">=2.0.0.0-RC1-dev,<2.1.10|>=3.0.0.0-beta1,<3.4.4", + "anchorcms/anchor-cms": "<=0.12.7", + "andreapollastri/cipi": "<=3.1.15", + "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", + "aoe/restler": "<1.7.1", + "apache-solr-for-typo3/solr": "<2.8.3", + "apereo/phpcas": "<1.6", + "api-platform/core": "<4.1.29|>=4.2,<4.2.25|>=4.3,<4.3.8", + "api-platform/graphql": "<3.4.17|>=4,<4.0.22|>=4.1,<4.1.5", + "api-platform/hal": ">=4,<4.1.29|>=4.2,<4.2.25|>=4.3,<4.3.8", + "api-platform/json-api": ">=4,<4.1.29|>=4.2,<4.2.25|>=4.3,<4.3.8", + "appwrite/server-ce": "<=1.2.1", + "arc/web": "<3", + "area17/twill": "<1.2.5|>=2,<2.5.3", + "artesaos/seotools": "<0.17.2", + "asymmetricrypt/asymmetricrypt": "<9.9.99", + "athlon1600/php-proxy": "<=5.1", + "athlon1600/php-proxy-app": "<=3", + "athlon1600/youtube-downloader": "<=4", + "aureuserp/aureuserp": "<1.3.0.0-beta1", + "austintoddj/canvas": "<=3.4.2", + "auth0/auth0-php": ">=3.3,<=8.18", + "auth0/login": "<=7.20", + "auth0/symfony": "<=5.8", + "auth0/wordpress": "<=5.5", + "automad/automad": "<=2.0.0.0-beta27", + "automattic/jetpack": "<9.8", + "awesome-support/awesome-support": "<=6.0.7", + "aws/aws-sdk-php": "<=3.371.3", + "ayacoo/redirect-tab": "<2.1.2|>=3,<3.1.7|>=4,<4.0.5", + "azuracast/azuracast": "<=0.23.5", + "b13/seo_basics": "<0.8.2", + "backdrop/backdrop": "<=1.32", + "backpack/crud": "<4.0.63|>=4.1,<4.1.69|>=5,<5.0.13", + "backpack/filemanager": "<2.0.2|>=3,<3.0.9", + "bacula-web/bacula-web": "<9.7.1", + "badaso/core": "<=2.9.11", + "bagisto/bagisto": "<=2.3.15", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "barryvdh/laravel-translation-manager": "<0.6.8", + "barzahlen/barzahlen-php": "<2.0.1", + "baserproject/basercms": "<=5.2.2", + "bassjobsen/bootstrap-3-typeahead": ">4.0.2", + "bbpress/bbpress": "<2.6.5", + "bcit-ci/codeigniter": "<3.1.3", + "bcosca/fatfree": "<3.7.2", + "bedita/bedita": "<4", + "bednee/cooluri": "<1.0.30", + "bigfork/silverstripe-form-capture": ">=3,<3.1.1", + "billabear/billabear": "<=2025.01.03", + "billz/raspap-webgui": "<3.3.6", + "binarytorch/larecipe": "<2.8.1", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "blueimp/jquery-file-upload": "==6.4.4", + "bmarshall511/wordpress_zero_spam": "<5.2.13", + "bolt/bolt": "<3.7.2", + "bolt/core": "<=4.2", + "born05/craft-twofactorauthentication": "<3.3.4", + "bottelet/flarepoint": "<2.2.1", + "bref/bref": "<2.1.17", + "brightlocal/phpwhois": "<=4.2.5", + "brotkrueml/codehighlight": "<2.7", + "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", + "brotkrueml/typo3-matomo-integration": "<1.3.2", + "buddypress/buddypress": "<7.2.1", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "bvbmedia/multishop": "<2.0.39", + "bytefury/crater": "<6.0.2", + "cachethq/cachet": "<2.5.1", + "cadmium-org/cadmium-cms": "<=0.4.9", + "cakephp/authentication": "<3.3.6|>=4,<4.1.1", + "cakephp/cakephp": "<4.5.11|>=4.6,<4.6.4|>=5,<5.1.7|>=5.2,<5.2.13|>=5.3,<5.3.6", + "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cardgate/magento2": "<2.0.33", + "cardgate/woocommerce": "<=3.1.15", + "cart2quote/module-quotation": ">=4.1.6,<4.4.6|>=5,<5.4.4", + "cart2quote/module-quotation-encoded": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<2.1.7", + "catfan/medoo": "<1.7.5", + "causal/oidc": "<4", + "cecil/cecil": "<7.47.1", + "centreon/centreon": "<22.10.15", + "cesargb/laravel-magiclink": ">=2,<2.25.1", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "chriskacerguis/codeigniter-restserver": "<=2.7.1", + "chrome-php/chrome": "<1.14", + "ci4-cms-erp/ci4ms": "<=0.31.8", + "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", + "ckeditor/ckeditor": "<4.25", + "clickstorm/cs-seo": ">=6,<6.8|>=7,<7.5|>=8,<8.4|>=9,<9.3", + "co-stack/fal_sftp": "<0.2.6", + "cockpit-hq/cockpit": "<=2.14", + "code16/sharp": "<9.22.3", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", + "codeigniter/framework": "<3.1.10", + "codeigniter4/framework": "<4.7.2", + "codeigniter4/shield": "<1.0.0.0-beta8", + "codiad/codiad": "<=2.8.4", + "codingms/additional-tca": ">=1.7,<1.15.17|>=1.16,<1.16.9", + "codingms/modules": "<4.3.11|>=5,<5.7.4|>=6,<6.4.2|>=7,<7.5.5", + "commerceteam/commerce": ">=0.9.6,<0.9.9", + "components/jquery": ">=1.0.3,<3.5", + "composer/composer": "<2.2.29|>=2.3,<2.10.2", + "concrete5/concrete5": "<9.5.2", + "concrete5/core": "<8.5.8|>=9,<9.1", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", + "contao/contao": ">=3,<3.5.37|>=4,<4.4.56|>=4.5,<5.3.48|>=5.4,<5.7.9", + "contao/core": "<3.5.39", + "contao/core-bundle": "<5.3.48|>=5.4,<5.7.9", + "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", + "contao/managed-edition": "<=1.5", + "coreshop/core-shop": "<4.1.9|==5", + "corveda/phpsandbox": "<1.3.5", + "cosenary/instagram": "<=2.3", + "cotonti/cotonti": "<=1", + "couleurcitron/tarteaucitron-wp": "<0.3", + "cpsit/typo3-mailqueue": "<0.4.5|>=0.5,<0.5.2", + "craftcms/aws-s3": ">=2.0.2,<=2.2.4", + "craftcms/azure-blob": ">=2.0.0.0-beta1,<=2.1", + "craftcms/cms": "<4.18|>=5,<5.10", + "craftcms/commerce": ">=4,<=4.11.1|>=5,<=5.6.4", + "craftcms/composer": ">=4.0.0.0-RC1-dev,<=4.10|>=5.0.0.0-RC1-dev,<=5.5.1", + "craftcms/craft": ">=3.5,<=4.16.17|>=5.0.0.0-RC1-dev,<=5.8.21", + "craftcms/google-cloud": ">=2.0.0.0-beta1,<=2.2", + "craftcms/webhooks": ">=3,<3.2", + "croogo/croogo": "<=4.0.7", + "cuyz/valinor": "<0.12", + "czim/file-handling": "<1.5|>=2,<2.3", + "czproject/git-php": "<4.0.3", + "damienharper/auditor-bundle": "<5.2.6", + "dapphp/securimage": "<3.6.6", + "darylldoyle/safe-svg": "<1.9.10", + "datadog/dd-trace": ">=0.30,<0.30.2", + "datahihi1/tiny-env": "<1.0.3|>=1.0.9,<1.0.11", + "datatables/datatables": "<1.10.10", + "david-garcia/phpwhois": "<=4.3.1", + "dbrisinajumi/d2files": "<1", + "dcat/laravel-admin": "<=2.1.3|==2.2.0.0-beta|==2.2.2.0-beta", + "dedoc/scramble": ">=0.13.2,<0.13.22", + "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4", + "desperado/xml-bundle": "<=0.1.7", + "dev-lancer/minecraft-motd-parser": "<=1.0.5", + "devcode-it/openstamanager": "<=2.10.1", + "devgroup/dotplant": "<2020.09.14-dev", + "digimix/wp-svg-upload": "<=1", + "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", + "directorytree/imapengine": "<1.22.3", + "dl/yag": "<3.0.1", + "dmk/webkitpdf": "<1.1.4", + "dnadesign/silverstripe-elemental": "<5.3.12", + "doctrine/annotations": "<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", - "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/common": "<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", "doctrine/doctrine-bundle": "<1.5.2", - "doctrine/doctrine-module": "<=0.7.1", - "doctrine/mongodb-odm": ">=1,<1.0.2", - "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", - "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", - "dompdf/dompdf": ">=0.6,<0.6.1", - "firebase/php-jwt": "<2", + "doctrine/doctrine-module": "<0.7.2", + "doctrine/mongodb-odm": "<1.0.2", + "doctrine/mongodb-odm-bundle": "<3.0.1", + "doctrine/orm": ">=1,<1.2.4|>=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<=23.0.2", + "dompdf/dompdf": "<3.1.6", + "doublethreedigital/guest-entries": "<3.1.2", + "dreamfactory/df-core": "<1.0.4", + "drupal-pattern-lab/unified-twig-extensions": "<=0.1", + "drupal/access_code": "<2.0.5", + "drupal/acquia_dam": "<1.1.5", + "drupal/admin_audit_trail": "<1.0.5", + "drupal/ai": "<1.0.5", + "drupal/alogin": "<2.0.6", + "drupal/cache_utility": "<1.2.1", + "drupal/civictheme": "<1.12", + "drupal/commerce_alphabank_redirect": "<1.0.3", + "drupal/commerce_eurobank_redirect": "<2.1.1", + "drupal/config_split": "<1.10|>=2,<2.0.2", + "drupal/core": ">=6,<6.38|>=7,<7.103|>=8,<10.5.10|>=10.6,<10.6.9|>=11,<11.2.12|>=11.3,<11.3.10", + "drupal/core-recommended": ">=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", + "drupal/currency": "<3.5", + "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", + "drupal/email_tfa": "<2.0.6", + "drupal/formatter_suite": "<2.1", + "drupal/gdpr": "<3.0.1|>=3.1,<3.1.2", + "drupal/google_tag": "<1.8|>=2,<2.0.8", + "drupal/ignition": "<1.0.4", + "drupal/json_field": "<1.5", + "drupal/lightgallery": "<1.6", + "drupal/link_field_display_mode_formatter": "<1.6", + "drupal/matomo": "<1.24", + "drupal/oauth2_client": "<4.1.3", + "drupal/oauth2_server": "<2.1", + "drupal/obfuscate": "<2.0.1", + "drupal/plausible_tracking": "<1.0.2", + "drupal/quick_node_block": "<2", + "drupal/rapidoc_elements_field_formatter": "<1.0.1", + "drupal/reverse_proxy_header": "<1.1.2", + "drupal/simple_multistep": "<2", + "drupal/simple_oauth": ">=6,<6.0.7", + "drupal/spamspan": "<3.2.1", + "drupal/tfa": "<1.10", + "drupal/umami_analytics": "<1.0.1", + "duncanmcclean/guest-entries": "<3.1.2", + "dweeves/magmi": "<=0.7.24", + "easycorp/easyadmin-bundle": ">=4,<4.29.10|>=5,<5.0.13", + "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.3.1", + "ecodev/newsletter": "<=4", + "ectouch/ectouch": "<=2.7.2", + "egroupware/egroupware": "<23.1.20260601|>=26.0.20251208,<26.5.20260507", + "elefant/cms": "<2.0.7", + "elgg/elgg": "<3.3.24|>=4,<4.0.5", + "elijaa/phpmemcacheadmin": "<=1.3", + "elmsln/haxcms": "<11.0.14", + "encore/laravel-admin": "<=1.8.19", + "endroid/qr-code-bundle": "<3.4.2", + "enhavo/enhavo-app": "<=0.13.1", + "enshrined/svg-sanitize": "<0.22", + "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", + "evolutioncms/evolution": "<=3.2.3", + "evoweb/sf-register": "<13.2.4|>=14,<14.0.2", + "exceedone/exment": "<4.4.3|>=5,<5.0.3", + "exceedone/laravel-admin": "<2.2.3|==3", + "ezsystems/demobundle": ">=5.4,<5.4.6.1-dev", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1-dev", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1-dev|>=5.4,<5.4.11.1-dev|>=2017.12,<2017.12.0.1-dev", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.39|>=3.3,<3.3.39", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1|>=5.3.0.0-beta1,<5.3.5", + "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", + "ezsystems/ezplatform-http-cache": "<2.3.16", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<1.3.35", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<2.3.26|>=3.3,<3.3.40", + "ezsystems/ezplatform-solr-search-engine": ">=1.7,<1.7.12|>=2,<2.0.2|>=3.3,<3.3.15", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<7.5.31", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", + "ezyang/htmlpurifier": "<=4.2", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", + "facturascripts/facturascripts": "<=2026.2", + "fastly/magento2": "<1.2.26", + "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=2.1.1", + "fenom/fenom": "<=2.12.1", + "filament/actions": ">=3.2,<3.2.123|>=4,<=4.11.3|>=5,<=5.6.3", + "filament/filament": ">=3,<=3.3.51|>=4,<4.11.5|>=5,<5.6.5", + "filament/forms": ">=3,<=3.3.52", + "filament/infolists": ">=3,<3.2.115|>=4,<=4.11.4|>=5,<=5.6.4", + "filament/tables": ">=3,<=3.3.50|>=4,<=4.11.4|>=5,<=5.6.4", + "filegator/filegator": "<7.8", + "filp/whoops": "<2.1.13", + "fineuploader/php-traditional-server": "<=1.2.2", + "firebase/php-jwt": "<7", + "fisharebest/webtrees": "<=2.1.18", + "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", + "fixpunkt/fp-newsletter": "<1.1.1|>=1.2,<2.1.2|>=2.2,<3.2.6", + "flarum/core": "<=1.8.15|>=2.0.0.0-beta1,<=2.0.0.0-beta8", + "flarum/flarum": "<0.1.0.0-beta8", + "flarum/framework": "<1.8.10", + "flarum/mentions": "<1.6.3", + "flarum/nicknames": "<1.8.3", + "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", + "flarum/tags": "<=0.1.0.0-beta13", + "flightphp/core": "<3.18.1", + "floriangaerber/magnesium": "<0.3.1", + "fluidtypo3/vhs": "<5.1.1", + "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", + "fof/pretty-mail": "<=1.1.2", + "fof/upload": "<1.2.3", + "foodcoopshop/foodcoopshop": ">=3.2,<3.6.1", + "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.11.1", + "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<=11.5.1", + "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2", + "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", - "friendsofsymfony/user-bundle": ">=1.2,<1.3|>=1.3,<1.3.5", - "illuminate/auth": ">=4,<4.0.99|>=4.1,<4.1.26", - "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "friendsofsymfony/user-bundle": ">=1,<1.3.5", + "friendsofsymfony1/swiftmailer": ">=4,<5.4.13|>=6,<6.2.5", + "friendsofsymfony1/symfony1": ">=1.1,<1.5.19", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", + "friendsoftypo3/tt-address": "<8.1.2|>=9,<9.1.1|>=10,<10.0.1", + "froala/wysiwyg-editor": "<=4.3", + "frosh/adminer-platform": "<2.2.1", + "froxlor/froxlor": "<2.3.7", + "frozennode/administrator": "<=5.0.12", + "fuel/core": "<1.8.1", + "funadmin/funadmin": "<=7.1.0.0-RC6", + "gaoming13/wechat-php-sdk": "<=1.10.2", + "genix/cms": "<=1.1.11", + "georgringer/news": "<10.0.4|>=11,<11.4.4|>=12,<12.3.2|>=13,<13.0.2|>=14,<14.0.3", + "geshi/geshi": "<=1.0.9.1", + "getformwork/formwork": "<=2.3.3", + "getgrav/grav": "<=2.0.0.0-RC8", + "getgrav/grav-plugin-api": "<1.0.0.0-beta15", + "getgrav/grav-plugin-form": "<9.1", + "getkirby/cms": "<=4.9.3|>=5,<=5.4.3", + "getkirby/kirby": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1", + "getkirby/panel": "<2.5.14", + "getkirby/starterkit": "<=3.7.0.2", + "gilacms/gila": "<=1.15.4", + "gleez/cms": "<=1.3|==2", + "globalpayments/php-sdk": "<2", + "goalgorilla/open_social": "<12.3.11|>=12.4,<12.4.10|>=13.0.0.0-alpha1,<13.0.0.0-alpha11", + "gogentooss/samlbase": "<1.2.7", + "goodoneuz/pay-uz": "<=2.2.24", + "google/protobuf": "<4.33.6", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gp247/core": "<1.1.24", + "gree/jose": "<2.2.1", + "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<=6.6.2", + "gugoan/economizzer": "<=0.9.0.0-beta1", + "guzzlehttp/guzzle": "<7.15.1", + "guzzlehttp/guzzle-services": "<1.5.4", + "guzzlehttp/oauth-subscriber": "<0.8.1", + "guzzlehttp/psr7": "<2.12.3", + "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", + "handcraftedinthealps/goodby-csv": "<1.4.3", + "harvesthq/chosen": "<1.8.7", + "helloxz/imgurl": "<=2.31", + "hhxsv5/laravel-s": "<3.7.36", + "hillelcoren/invoice-ninja": "<5.3.35", + "himiklab/yii2-jqgrid-widget": "<1.0.8", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "httpsoft/http-message": "<1.0.12", + "hybridauth/hybridauth": "<=3.12.2", + "hyn/multi-tenant": ">=5.6,<5.7.2", + "ibexa/admin-ui": ">=4.2,<4.2.3|>=4.6,<4.6.25|>=5,<5.0.3", + "ibexa/admin-ui-assets": ">=4.6.0.0-alpha1,<4.6.21", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3|>=4.5,<4.5.6|>=4.6,<4.6.2", + "ibexa/fieldtype-richtext": ">=4.6,<4.6.25|>=5,<5.0.3", + "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", + "ibexa/http-cache": ">=4.6,<4.6.14", + "ibexa/post-install": "<1.0.16|>=4.6,<4.6.14", + "ibexa/solr": ">=4.5,<4.5.4", + "ibexa/user": ">=4,<4.4.3|>=5,<5.0.4", + "icecoder/icecoder": "<=8.1", + "idno/known": "<1.6.4", + "ilicmiljan/secure-props": ">=1.2,<1.2.2", + "illuminate/auth": "<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/mail": ">=9,<12.60|>=13,<13.10", + "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", + "imdbphp/imdbphp": "<=5.1.1", + "impresscms/impresscms": "<=1.4.5", + "impresspages/impresspages": "<1.0.13", + "in2code/femanager": "<6.4.2|>=7,<7.5.3|>=8,<8.3.1", + "in2code/ipandlanguageredirect": "<5.1.2", + "in2code/lux": "<17.6.1|>=18,<24.0.2", + "in2code/powermail": "<7.5.1|>=8,<8.5.1|>=9,<10.9.1|>=11,<12.5.3|==13", + "innologi/typo3-appointments": "<2.0.6", + "intelliants/subrion": "<4.2.2", + "inter-mediator/inter-mediator": "==5.5", + "intercom/intercom-php": "==5.0.2", + "invoiceninja/invoiceninja": "<5.13.4", + "ipl/web": "<=0.10.2|>=0.11,<=0.13", + "islandora/crayfish": "<4.1", + "islandora/islandora": ">=2,<2.4.1", + "ivankristianto/phpwhois": "<=4.3", + "j0k3r/graby": "<=2.5", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", + "jambagecom/div2007": "<0.10.2", + "james-heinrich/getid3": "<1.9.21", + "james-heinrich/phpthumb": "<=1.7.23", + "jasig/phpcas": "<1.3.3", + "jbartels/wec-map": "<3.0.3", + "jcbrand/converse.js": "<3.3.3", + "jleehr/canto-saas-api": "<=2", + "joedolson/my-calendar": "<3.7.7", + "joelbutcher/socialstream": "<5.6|>=6,<6.2", + "johnbillion/query-monitor": "<3.20.4", + "johnbillion/wp-crontrol": "<1.16.2|>=1.17,<1.19.2", + "joomla/application": "<1.0.13", + "joomla/archive": "<1.1.12|>=2,<2.0.1", + "joomla/database": ">=1,<2.2|>=3,<3.4", + "joomla/filesystem": "<1.6.2|>=2,<2.0.1", + "joomla/filter": "<2.0.6|>=3,<3.0.5|==4", + "joomla/framework": "<1.5.7|>=2.5.4,<=3.8.12", + "joomla/input": ">=2,<2.0.2", + "joomla/joomla-cms": "<3.9.12|>=4,<4.4.13|>=5,<5.2.6", + "joomla/joomla-platform": "<1.5.4", "joomla/session": "<1.3.1", - "laravel/framework": ">=4,<4.0.99|>=4.1,<4.1.29", - "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "joyqi/hyper-down": "<=2.4.27", + "jsdecena/laracom": "<2.0.9", + "jsmitty12/phpwhois": "<5.1", + "juzaweb/cms": "<=3.4.2", + "jweiland/events2": "<8.3.8|>=9,<9.0.6", + "jweiland/kk-downloader": "<1.2.2", + "kantorge/yaffa": "<=2", + "kazist/phpwhois": "<=4.2.6", + "kelvinmo/simplejwt": "<=1.1", + "kelvinmo/simplexrd": "<3.1.1", + "kevinpapst/kimai2": "<1.16.7", + "khodakhah/nodcms": "<=3.4.1", + "kimai/kimai": "<2.59", + "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", + "klaviyo/magento2-extension": ">=1,<3", + "knplabs/knp-snappy": "<=1.7", + "kohana/core": "<3.3.3", + "koillection/koillection": "<1.6.12", + "krayin/laravel-crm": "<=2.2", + "kreait/firebase-php": ">=3.2,<3.8.1", + "kumbiaphp/kumbiapp": "<=1.1.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laktak/hjson": "<2.3", + "laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2", + "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", + "laminas/laminas-http": "<2.14.2", + "lara-zeus/artemis": ">=1,<=1.0.6", + "lara-zeus/dynamic-dashboard": ">=3,<=3.0.1", + "laravel/fortify": "<1.11.1", + "laravel/framework": "<12.61.1|>=13,<13.12", + "laravel/laravel": ">=5.4,<5.4.22", + "laravel/passport": ">=13,<13.7.1", + "laravel/pulse": "<1.3.1", + "laravel/reverb": "<1.7", + "laravel/socialite": ">=1,<2.0.10", + "latte/latte": "<2.10.8", + "lavalite/cms": "<=10.1", + "lavitto/typo3-form-to-database": "<2.2.5|>=3,<3.2.2|>=4,<4.2.3|>=5,<5.0.2", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", + "league/commonmark": "<=2.8.1", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", + "leantime/leantime": "<3.3", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "libreform/libreform": ">=2,<=2.0.8", + "librenms/librenms": "<26.3", + "liftkit/database": "<2.13.2", + "lightsaml/lightsaml": "<1.3.5", + "limesurvey/limesurvey": "<=7.0.0.0-beta1", + "livehelperchat/livehelperchat": "<=3.91", + "livewire-filemanager/filemanager": "<=1.0.4", + "livewire/livewire": "<2.12.7|>=3.0.0.0-beta1,<3.6.4", + "livewire/volt": "<1.7", + "lms/routes": "<2.1.1", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "lomkit/laravel-rest-api": "<2.13", + "luracast/restler": "<3.1", + "luyadev/yii-helpers": "<1.2.1", + "macropay-solutions/laravel-crud-wizard-free": "<3.4.17", + "maestroerror/php-heic-to-jpg": "<1.0.5", + "magento/community-edition": "<2.4.6.0-patch13|>=2.4.7.0-beta1,<2.4.7.0-patch8|>=2.4.8.0-beta1,<2.4.8.0-patch3|>=2.4.9.0-alpha1,<2.4.9.0-alpha3|==2.4.9", + "magento/core": "<=1.9.4.5", + "magento/magento1ce": "<1.9.4.3-dev", + "magento/magento1ee": ">=1,<1.14.4.3-dev", + "magento/product-community-edition": "<2.4.4.0-patch9|>=2.4.5,<2.4.5.0-patch8|>=2.4.6,<2.4.6.0-patch6|>=2.4.7,<2.4.7.0-patch1", + "magento/project-community-edition": "<=2.0.2", + "magneto/core": "<1.9.4.4-dev", + "mahocommerce/maho": "<25.9", + "maikuolan/phpmussel": ">=1,<1.6", + "mainwp/mainwp": "<=4.4.3.3", + "manogi/nova-tiptap": "<=3.2.6", + "mantisbt/mantisbt": "<=2.28.3", + "marcwillmann/turn": "<0.3.3", + "markhuot/craftql": "<=1.3.7", + "marshmallow/nova-tiptap": "<5.7", + "matomo/matomo": "<1.11", + "matyhtf/framework": "<3.0.6", + "mautic/core": "<5.2.11|>=6,<6.0.9|>=7,<7.1.2", + "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", + "mautic/grapes-js-builder-bundle": ">=4,<4.4.18|>=5,<5.2.9|>=6,<6.0.7", + "maximebf/debugbar": "<1.19", + "mckenziearts/livewire-markdown-editor": "<1.3", + "mdanter/ecc": "<2", + "mediawiki/abuse-filter": "<1.39.9|>=1.40,<1.41.3|>=1.42,<1.42.2", + "mediawiki/cargo": "<3.8.3", + "mediawiki/core": "<1.39.5|==1.40", + "mediawiki/data-transfer": ">=1.39,<1.39.11|>=1.41,<1.41.3|>=1.42,<1.42.2", + "mediawiki/maps": "<12.1.3", + "mediawiki/matomo": "<2.4.3", + "mediawiki/semantic-media-wiki": "<4.0.2", + "mehrwert/phpmyadmin": "<3.2", + "melisplatform/melis-asset-manager": "<5.0.1", + "melisplatform/melis-cms": "<5.3.4", + "melisplatform/melis-cms-slider": "<5.3.1", + "melisplatform/melis-core": "<5.3.11", + "melisplatform/melis-front": "<5.0.1", + "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", + "mgallegos/laravel-jqgrid": "<=1.3", + "microsoft/microsoft-graph": ">=1.16,<1.109.1|>=2,<2.0.1", + "microsoft/microsoft-graph-beta": "<2.0.1", + "microsoft/microsoft-graph-core": "<2.0.2", + "microweber/microweber": "<2.0.20", + "mikehaertl/php-shellcommand": "<1.6.1", + "mineadmin/mineadmin": "<=3.0.9", + "miniorange/miniorange-saml": "<1.4.3", + "miraheze/ts-portal": "<=33", + "mittwald/typo3_forum": "<1.2.1", + "mix/mix": ">=2,<=2.2.17", + "mmc/ceselector": "<3.0.3|>=4,<4.0.2|>=5,<5.0.1|>=6,<6.0.1", + "mobiledetect/mobiledetectlib": "<2.8.32", + "modx/revolution": "<=3.1", + "mojo42/jirafeau": "<4.4", + "mongodb/mongodb": ">=1,<1.9.2", + "mongodb/mongodb-extension": "<1.21.2", "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<4.5.9|>=5.0.0.0-beta,<5.0.5|>=5.1.0.0-beta,<5.1.2", + "moonshine/moonshine": "<=3.12.5", + "mos/cimage": "<0.7.19", + "movim/moxl": ">=0.8,<=0.10", + "movingbytes/social-network": "<=1.2.1", + "mpdf/mpdf": "<=7.1.7", + "mtdowling/jmespath.php": "<2.9.1", + "munkireport/comment": "<4", + "munkireport/managedinstalls": "<2.6", + "munkireport/munki_facts": "<1.5", + "munkireport/reportdata": "<3.5", + "munkireport/softwareupdate": "<1.6", + "mustache/mustache": ">=2,<2.14.1", + "mwdelaney/wp-enable-svg": "<=0.2", + "nabeel/phpvms": "<7.0.6", "namshi/jose": "<2.2", - "oro/crm": ">=1.7,<1.7.4", - "oro/platform": ">=1.7,<1.7.4", + "nasirkhan/laravel-starter": "<11.11", + "nategood/httpful": "<1", + "neoan3-apps/template": "<1.1.1", + "neorazorx/facturascripts": "<2022.04", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/media-browser": "<7.3.19|>=8,<8.0.16|>=8.1,<8.1.11|>=8.2,<8.2.11|>=8.3,<8.3.9", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", + "neos/swiftmailer": "<5.4.5", + "nesbot/carbon": "<2.72.6|>=3,<3.8.4", + "netcarver/textile": "<=4.1.2", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "neuron-core/neuron-ai": "<=2.8.11", + "nilsteampassnet/teampass": "<3.1.3.1-dev", + "nitsan/ns-backup": "<13.0.1", + "nonfiction/nterchange": "<4.1.1", + "notrinos/notrinos-erp": "<=1", + "noumo/easyii": "<=0.9", + "novaksolutions/infusionsoft-php-sdk": "<1", + "novosga/novosga": "<=2.2.12", + "nukeviet/nukeviet": "<4.6.00", + "nyholm/psr7": "<1.6.1", + "nystudio107/craft-seomatic": "<3.4.12", + "nzedb/nzedb": "<0.8", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", + "october/october": "<3.7.14|>=4,<4.1.10", + "october/rain": "<=3.7.13|>=4,<=4.1.9", + "october/system": "<3.7.16|>=4,<4.1.16", + "oliverklee/phpunit": "<3.5.15", + "omeka/omeka-s": "<4.0.3", + "onelogin/php-saml": "<2.21.1|>=3,<3.8.1|>=4,<4.3.1", + "oneup/uploader-bundle": ">=1,<1.9.3|>=2,<2.1.5", + "open-web-analytics/open-web-analytics": "<1.8.1", + "opencart/opencart": ">=0", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<=20.17", + "opensolutions/vimbadmin": "<=3.0.15", + "opensource-workshop/connect-cms": "<1.41.1|>=2,<2.41.1", + "orchid/platform": ">=8,<14.43", + "oro/calendar-bundle": ">=4.2,<=4.2.6|>=5,<=5.0.6|>=5.1,<5.1.1", + "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", + "oro/crm-call-bundle": ">=4.2,<=4.2.5|>=5,<5.0.4|>=5.1,<5.1.1", + "oro/customer-portal": ">=4.1,<=4.1.13|>=4.2,<=4.2.10|>=5,<=5.0.11|>=5.1,<=5.1.3", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<=4.2.10|>=5,<=5.0.12|>=5.1,<=5.1.3", + "oveleon/contao-cookiebar": "<1.16.3|>=2,<2.1.3", + "oxid-esales/oxideshop-ce": "<4.5|>=6,<6.14.4", + "oxid-esales/oxideshop-metapackage-ce": ">=6,<6.5.5", + "oxid-esales/paymorrow-module": ">=1,<1.0.2|>=2,<2.0.1", + "oxid-esales/smarty-component": "<1.0.1", + "packbackbooks/lti-1-3-php-library": "<5", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": "<3", + "pagekit/pagekit": "<=1.0.18", + "paragonie/ecc": "<2.0.1", + "paragonie/random_compat": "<2", + "paragonie/sodium_compat": "<1.24|>=2,<2.5", + "passbolt/passbolt_api": "<4.6.2", + "paymenter/paymenter": "<=1.5.4", + "paypal/adaptivepayments-sdk-php": "<=3.9.2", + "paypal/invoice-sdk-php": "<=3.9", + "paypal/merchant-sdk-php": "<3.12", + "paypal/permissions-sdk-php": "<=3.9.1", + "pear/archive_tar": "<1.4.14", + "pear/auth": "<1.2.4", + "pear/crypt_gpg": "<1.6.7", + "pear/http_request2": "<2.7", + "pear/pear": "<=1.10.1", + "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", + "personnummer/personnummer": "<3.0.2", + "ph7software/ph7builder": "<=17.9.1", + "phanan/koel": "<=9.7", + "pheditor/pheditor": "<2.0.8", + "phenx/php-svg-lib": "<0.5.2", + "php-censor/php-censor": "<2.0.13|>=2.1,<2.1.5", + "php-mod/curl": "<2.3.2", + "php-standard-library/h2": ">=6.1,<6.1.2|>=6.2,<6.2.1", + "php-standard-library/php-standard-library": ">=6.1,<6.1.2|>=6.2,<6.2.1", + "phpbb/phpbb": "<3.3.16|==4.0.0.0-alpha1", + "phpems/phpems": ">=6,<=6.1.3", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", + "phpmailer/phpmailer": "<6.5", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<5.2.2", + "phpmyfaq/phpmyfaq": "<4.1.4", + "phpoffice/common": "<0.2.9", + "phpoffice/math": "<=0.2", + "phpoffice/phpexcel": "<=1.8.2", + "phpoffice/phpspreadsheet": "<=1.30.5|>=2,<=2.1.17|>=2.2,<=2.4.6|>=3,<=3.10.6|>=4,<=5.8", + "phppgadmin/phppgadmin": "<=7.13", + "phpseclib/phpseclib": "<=2.0.54|>=3,<=3.0.53", + "phpservermon/phpservermon": "<3.6", + "phpsysinfo/phpsysinfo": "<3.4.3", + "phpunit/phpunit": "<8.5.52|>=9,<9.6.33|>=10,<10.5.62|>=11,<11.5.50|>=12,<12.5.8|>=12.5.21,<12.5.22|>=13.1.5,<13.1.6", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "phpxmlrpc/phpxmlrpc": "<4.9.2", + "phraseanet/phraseanet": "==4.0.3", + "pi/pi": "<=2.5", + "pimcore/admin-ui-classic-bundle": "<1.7.18|>=2.0.0.0-RC1-dev,<=2.3.5", + "pimcore/customer-management-framework-bundle": "<4.2.1", + "pimcore/data-hub": "<1.2.4", + "pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3", + "pimcore/demo": "<10.3", + "pimcore/ecommerce-framework-bundle": "<1.0.10", + "pimcore/perspective-editor": "<1.5.1", + "pimcore/pimcore": "<=12.3.8|>=2026.1,<2026.1.3", + "pimcore/web2print-tools-bundle": "<=5.2.1|>=6.0.0.0-RC1-dev,<=6.1", + "piwik/piwik": "<1.11", + "pixelfed/pixelfed": "<0.12.5", + "plotly/plotly.js": "<2.25.2", + "pocketmine/bedrock-protocol": "<8.0.2", + "pocketmine/pocketmine-mp": "<5.42.1", + "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", + "pontedilana/php-weasyprint": "<=2.5.1", + "poweradmin/poweradmin": "<4.2.5|>=4.3,<4.3.4", + "pressbooks/pressbooks": "<5.18", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/blockreassurance": "<=5.1.3", + "prestashop/blockwishlist": ">=2,<2.1.1", + "prestashop/contactform": ">=1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/prestashop": "<8.2.6|>=9,<9.1.1", + "prestashop/productcomments": "<5.0.2", + "prestashop/ps_checkout": "<5.3", + "prestashop/ps_contactinfo": "<=3.3.2", + "prestashop/ps_emailsubscription": "<2.6.1", + "prestashop/ps_facetedsearch": "<4.0.4", + "prestashop/ps_linklist": "<3.1", + "privatebin/privatebin": "<1.4|>=1.5,<1.7.4|>=1.7.7,<2.0.3", + "processwire/processwire": "<=3.0.255", + "propel/propel": ">=2.0.0.0-alpha1,<2.0.0.0-alpha8", + "propel/propel1": ">=1,<1.7.2", + "psy/psysh": "<=0.11.22|>=0.12,<=0.12.18", + "pterodactyl/panel": "<=1.12.4", + "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", + "ptrofimov/beanstalk_console": "<1.7.14", + "pubnub/pubnub": "<6.1", + "punktde/pt_extbase": "<1.5.1", "pusher/pusher-php-server": "<2.2.1", - "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", - "silverstripe/cms": ">=3.1,<3.1.11|>=3,<=3.0.11", - "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": ">=3,<3.1|>=3.1,<3.2|>=3.2,<3.2.1", - "silverstripe/userforms": "<3", + "putyourlightson/craft-sprig": ">=2,<2.15.2|>=3,<3.7.2", + "pwweb/laravel-core": "<=0.3.6.0-beta", + "pxlrbt/filament-excel": "<1.1.14|>=2.0.0.0-alpha,<2.3.3", + "pyrocms/pyrocms": "<=3.9.1", + "qcubed/qcubed": "<=3.1.1", + "quickapps/cms": "<=2.0.0.0-beta2", + "rainlab/blog-plugin": "<1.4.1", + "rainlab/debugbar-plugin": "<3.1", + "rainlab/user-plugin": "<=1.4.5", + "ralffreit/mfa-email": "<1.0.7|==2", + "rankmath/seo-by-rank-math": "<=1.0.95", + "rap2hpoutre/laravel-log-viewer": "<0.13", + "react/http": ">=0.7,<1.9", + "really-simple-plugins/complianz-gdpr": "<6.4.2", + "redaxo/source": "<5.21.1", + "remdex/livehelperchat": "<4.29", + "renolit/reint-downloadmanager": "<4.0.2|>=5,<5.0.1", + "reportico-web/reportico": "<=8.1", + "rhukster/dom-sanitizer": "<1.0.10", + "rmccue/requests": ">=1.6,<1.8", + "roadiz/documents": "<2.3.42|>=2.4,<2.5.44|>=2.6,<2.6.28|>=2.7,<2.7.9", + "roadiz/openid": "<2.3.43|>=2.5,<2.5.45|>=2.6,<2.6.31|>=2.7,<2.7.18", + "robrichards/xmlseclibs": "<3.1.5", + "roots/soil": "<4.1", + "roundcube/roundcubemail": "<1.5.10|>=1.6,<1.6.11|>=1.7.0.0-beta,<1.7.0.0-RC5-dev", + "rudloff/alltube": "<3.0.3", + "rudloff/rtmpdump-bin": "<=2.3.1", + "s-cart/core": "<=9.0.5", + "s-cart/s-cart": "<6.9", + "s9y/serendipity": "<2.6", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": ">=1.6,<1.7.11|>=1.8,<1.8.9", + "saloonphp/saloon": "<4", + "samwilson/unlinked-wikibase": "<1.42", + "scheb/two-factor-bundle": "<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "setasign/fpdi": "<2.6.7", + "sfroemken/url_redirect": "<=1.2.1", + "sheng/yiicms": "<1.2.1", + "shopper/cart": "<2.8", + "shopper/framework": "<2.8", + "shopware/core": "<6.6.10.18-dev|>=6.7,<6.7.10.1-dev", + "shopware/platform": "<6.6.10.18-dev|>=6.7,<6.7.10.1-dev", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<=6.3.5.2|>=6.4.6,<6.6.10.10-dev|>=6.7,<6.7.6.1-dev", + "shopware/storefront": "<6.6.10.10-dev|>=6.7,<6.7.5.1-dev", + "shopxo/shopxo": "<=6.4", + "showdoc/showdoc": "<3.8.1", + "shuchkin/simplexlsx": ">=1.0.12,<1.1.13", + "silverstripe-australia/advancedreports": ">=1,<=2", + "silverstripe/admin": "<1.13.19|>=2,<2.1.8", + "silverstripe/assets": "<2.4.5|>=3,<3.1.3", + "silverstripe/cms": "<6.2.1", + "silverstripe/comments": ">=1.3,<3.1.1", + "silverstripe/forum": "<0.6.2|>=0.7,<0.7.4", + "silverstripe/framework": "<6.2.2", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.8.2|>=4,<4.3.7|>=5,<5.1.3", + "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", + "silverstripe/recipe-cms": ">=4.5,<4.5.3", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/reports": "<5.2.3", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4|>=2.1,<2.1.2", + "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", + "silverstripe/subsites": ">=2,<2.6.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<6.4.9|>=7,<7.0.7|>=7.1,<7.1.1", + "silverstripe/versioned": "<3.2.1", + "silverstripe/versioned-admin": ">=1,<1.11.1", + "simogeo/filemanager": "<=2.5", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<=4.20.2|>=5,<5.0.6|>=6,<6.2.1", + "simplesamlphp/saml2-legacy": "<=4.20.2", + "simplesamlphp/simplesamlphp": "<=2.4.6|>=2.5,<=2.5.1", + "simplesamlphp/simplesamlphp-module-casserver": "<=7.0.2", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplesamlphp/simplesamlphp-module-openid": "<1", + "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", + "simplesamlphp/xml-common": "<1.20", + "simplesamlphp/xml-security": "<1.13.9|>=2,<2.3.1", + "simplito/elliptic-php": "<1.0.6", + "sitegeist/fluid-components": "<3.5", + "sjbr/sr-feuser-register": "<2.6.2|>=5.1,<12.5", + "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3", + "sjbr/static-info-tables": "<2.3.1", + "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", + "slim/slim": "<2.6|>=4.4,<=4.15.1", + "slub/slub-events": "<3.0.3", + "smarty/smarty": "<4.5.3|>=5,<5.1.1", + "snipe/snipe-it": "<=8.6.1", "socalnick/scn-social-auth": "<1.15.2", - "swiftmailer/swiftmailer": ">=4,<4.99.99|>=5,<5.2.1", - "symfony/dependency-injection": ">=2,<2.0.17", - "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.5|>=2.5,<2.6|>=2.6,<2.6.12|>=2.7,<2.7.7", - "symfony/framework-bundle": ">=2,<2.1|>=2.1,<2.2|>=2.2,<2.3|>=2.3,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2", - "symfony/http-foundation": ">=2,<2.1|>=2.1,<2.2|>=2.2,<2.3|>=2.3,<2.3.27|>=2.4,<2.5|>=2.5,<2.5.11|>=2.6,<2.6.6", - "symfony/http-kernel": ">=2,<2.1|>=2.1,<2.2|>=2.2,<2.3|>=2.3,<2.3.29|>=2.4,<2.5|>=2.5,<2.5.12|>=2.6,<2.6.8", - "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2.3,<2.3.37|>=2.4,<2.5|>=2.5,<2.6|>=2.6,<2.6.13|>=2.7,<2.7.9|>=2,<2.0.25|>=2.1,<2.1.13|>=2.2,<2.2.9", - "symfony/security-core": ">=2.4,<2.5|>=2.5,<2.6|>=2.6,<2.6.13|>=2.7,<2.7.9", - "symfony/security-http": ">=2.4,<2.5|>=2.5,<2.6|>=2.6,<2.6.12|>=2.7,<2.7.7", - "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.1|>=2.1,<2.2|>=2.2,<2.3|>=2.3,<2.3.37|>=2.4,<2.5|>=2.5,<2.6|>=2.6,<2.6.13|>=2.7,<2.7.9", + "socialiteproviders/steam": "<1.1", + "solidinvoice/solidinvoice": "<=2.3.15", + "solspace/craft-freeform": "<4.1.29|>=5,<=5.14.6", + "soosyze/soosyze": "<=2", + "spatie/browsershot": "<5.0.5", + "spatie/image-optimizer": "<1.7.3", + "spatie/laravel-medialibrary": "<11.23", + "spatie/schema-org": ">=3.23.1,<3.23.2|>=4,<4.0.2", + "spencer14420/sp-php-email-handler": "<1", + "spipu/html2pdf": "<5.2.8", + "spiral/roadrunner": "<2025.1", + "spomky-labs/otphp": "<11.4.3", + "spoon/library": "<1.4.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<24.05.1", + "starcitizentools/citizen-skin": ">=1.9.4,<3.9", + "starcitizentools/short-description": ">=4,<4.0.1", + "starcitizentools/tabber-neue": ">=1.9.1,<2.7.2|>=3,<3.1.1", + "starcitizenwiki/embedvideo": "<=4", + "statamic/cms": "<5.74|>=6,<6.20.3", + "stormpath/sdk": "<9.9.99", + "studio-42/elfinder": "<=2.1.67", + "studiomitte/friendlycaptcha": "<0.1.4", + "subhh/libconnect": "<7.0.8|>=8,<8.1", + "sukohi/surpass": "<1", + "sulu/form-bundle": ">=2,<2.5.3", + "sulu/sulu": "<=2.6.22|>=3,<=3.0.5", + "sumocoders/framework-user-bundle": "<1.4", + "superbig/craft-audit": "<3.0.2", + "svewap/a21glossary": "<=0.4.10", + "swag/paypal": "<5.4.4", + "swiftmailer/swiftmailer": "<6.2.5", + "swiftyedit/swiftyedit": "<1.2", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": "<1.10.1", + "sylius/mollie-plugin": "<2.2.8|>=3,<3.2.4|>=3.3,<3.3.1", + "sylius/paypal-plugin": "<1.6.2|>=1.7,<1.7.2|>=2,<2.0.2", + "sylius/resource-bundle": ">=1,<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.9.12|>=1.10,<1.10.16|>=1.11,<1.11.17|>=1.12,<=1.12.22|>=1.13,<=1.13.14|>=1.14,<=1.14.17|>=2,<2.0.18|>=2.1,<2.1.15|>=2.2,<2.2.6", + "symbiote/silverstripe-advancedworkflow": "<6.4.5|>=7,<7.1.3|>=7.2,<7.2.1", + "symbiote/silverstripe-multivaluefield": ">=3,<3.1", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-seed": "<6.0.3", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0", + "symfony/cache": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/dom-crawler": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<5.3.15|>=5.4.3,<5.4.4|>=6.0.3,<6.0.4", + "symfony/html-sanitizer": ">=6.1,<6.4.41|>=7,<7.4.13|>=8,<8.0.13", + "symfony/http-client": ">=4.3,<5.4.53|>=6,<6.4.15|>=7,<7.1.8", + "symfony/http-foundation": "<5.4.50|>=6,<6.4.41|>=7,<7.4.13|>=8,<8.0.13", + "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6|>=7.4,<7.4.12|>=8,<8.0.12", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/json-path": ">=7.3,<7.4.12|>=8,<8.0.12", + "symfony/lox24-notifier": ">=7.1,<7.4.12|>=8,<8.0.12", + "symfony/mailer": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", + "symfony/mailjet-mailer": ">=6.4,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", + "symfony/mailomat-mailer": ">=7.2,<7.4.13|>=8,<8.0.13", + "symfony/mailtrap-mailer": ">=7.2,<7.4.12|>=8,<8.0.12", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", + "symfony/mime": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", + "symfony/monolog-bridge": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10|>=1.17.1,<1.38.1", + "symfony/polyfill-intl-idn": ">=1.17.1,<1.38.1", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/process": "<5.4.51|>=6,<6.4.33|>=7,<7.1.7|>=7.3,<7.3.11|>=7.4,<7.4.5|>=8,<8.0.5", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": "<5.4.53|>=6,<6.4.41|>=7,<7.4.13|>=8,<8.0.13", + "symfony/runtime": ">=5.3,<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", + "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.4.10|>=7,<7.0.10|>=7.1,<7.1.3", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": "<5.4.53|>=6,<6.4.41|>=7,<7.4.13|>=8,<8.0.13", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": "<5.4.53|>=6,<6.4.41|>=7,<7.4.13|>=8,<8.0.13", "symfony/translation": ">=2,<2.0.17", - "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", - "symfony/web-profiler-bundle": ">=2,<2.1|>=2.1,<2.2|>=2.2,<2.3|>=2.3,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", - "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8|>=6.4.24,<6.4.40", + "symfony/twilio-notifier": ">=6.4,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", + "symfony/ux-autocomplete": "<2.36|>=3,<3.1", + "symfony/ux-icons": ">=2.17,<2.36.1|>=3,<3.2", + "symfony/ux-live-component": "<2.36|>=3,<3.1", + "symfony/ux-toolkit": ">=2.32,<2.36.1|>=3,<3.2", + "symfony/ux-twig-component": "<2.25.1", + "symfony/validator": "<5.4.43|>=6,<6.4.11|>=7,<7.1.4", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4|>=7.2.9,<7.4.12|>=8,<8.0.12", + "symfony/webhook": ">=6.3,<6.3.8", + "symfony/yaml": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", + "symphonycms/symphony-2": "<2.6.4", + "t3/dce": "<0.11.5|>=2.2,<2.6.2", + "t3g/svg-sanitizer": "<1.0.3", + "t3s/content-consent": "<1.0.3|>=2,<2.0.2", + "tastyigniter/tastyigniter": "<4", + "tcg/voyager": "<=1.8", + "tecnickcom/tc-lib-pdf-font": "<2.6.4", + "tecnickcom/tcpdf": "<6.8", + "terminal42/contao-tablelookupwizard": "<3.3.5", "thelia/backoffice-default-template": ">=2.1,<2.1.2", - "thelia/thelia": ">=2.1.0-beta1,<2.1.3|>=2.1,<2.1.2", - "twig/twig": "<1.20", - "typo3/cms": ">=6.2,<6.2.16|>=7,<7.1|>=7.1,<7.2|>=7.2,<7.3|>=7.3,<7.4|>=7.4,<7.5|>=7.5,<7.6|>=7.6,<7.6.1", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.7|>=3,<3.0.1", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "thelia/thelia": ">=2.0.0.0-beta1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "thinkcmf/thinkcmf": "<6.0.8", + "thorsten/phpmyfaq": "<4.1.4", + "tikiwiki/tiki-manager": "<=17.1", + "timber/timber": ">=0.16.6,<1.23.1|>=1.24,<1.24.1|>=2,<2.1", + "tinymce/tinymce": "<7.9.3|>=8,<8.5.1", + "tinymighty/wiki-seo": "<1.2.2", + "titon/framework": "<9.9.99", + "tltneon/lgsl": "<7", + "tobiasbg/tablepress": "<=2.0.0.0-RC1", + "tomasnorre/crawler": "<11.0.13|>=12,<12.0.11", + "topthink/framework": "<6.0.17|>=6.1,<=8.0.4", + "topthink/think": "<=6.1.1", + "topthink/thinkphp": "<=3.2.3|>=6.1.3,<=8.0.4", + "torrentpier/torrentpier": "<=2.8.8", + "tpwd/ke_search": "<5.6.2|>=6,<6.6.1|>=7,<7.0.1", + "tribalsystems/zenario": "<=9.7.61188", + "truckersmp/phpwhois": "<=4.3.1", + "ttskch/pagination-service-provider": "<1", + "twbs/bootstrap": "<3.4.1|>=4,<4.3.1", + "twig/cssinliner-extra": "<3.26", + "twig/intl-extra": "<3.26", + "twig/markdown-extra": "<3.26", + "twig/twig": "<3.27", + "typicms/core": "<12.0.5|>=13,<13.0.9|>=14,<14.0.27|>=15,<15.0.29|>=16,<16.1.7", + "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", + "typo3/cms-backend": "<10.4.57|>=11,<11.5.51|>=12,<12.4.46|>=13,<13.4.31|>=14,<14.3.3", + "typo3/cms-belog": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", + "typo3/cms-beuser": ">=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", + "typo3/cms-core": "<10.4.57|>=11,<11.5.51|>=12,<12.4.46|>=13,<13.4.31|>=14,<14.3.3", + "typo3/cms-dashboard": ">=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", + "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", + "typo3/cms-extensionmanager": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", + "typo3/cms-felogin": ">=4.2,<4.2.3", + "typo3/cms-filelist": ">=11,<11.5.51|>=12,<12.4.46|>=13,<13.4.31|>=14,<14.3.3", + "typo3/cms-fluid": "<4.3.4|>=4.4,<4.4.1|>=8,<8.7.23|>=9,<9.5.4", + "typo3/cms-form": "<10.4.57|>=11,<11.5.51|>=12,<12.4.46|>=13,<13.4.31|>=14,<14.3.5", + "typo3/cms-frontend": "<4.3.9|>=4.4,<4.4.5", + "typo3/cms-indexed-search": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<13.4.31|>=14,<14.3.3", + "typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8|==13.4.2", + "typo3/cms-lowlevel": ">=11,<=11.5.41", + "typo3/cms-recordlist": ">=11,<11.5.48", + "typo3/cms-recycler": "<10.4.57|>=11,<11.5.51|>=12,<12.4.46|>=13,<13.4.31|>=14,<14.3.3", + "typo3/cms-redirects": ">=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1", + "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", + "typo3/cms-scheduler": ">=11,<=11.5.41", + "typo3/cms-setup": ">=9,<=9.5.50|>=10,<=10.4.49|>=11,<=11.5.43|>=12,<=12.4.30|>=13,<=13.4.11", + "typo3/cms-webhooks": ">=12,<=12.4.30|>=13,<=13.4.11", + "typo3/cms-workspaces": ">=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/html-sanitizer": "<2.3.2", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", + "ua-parser/uap-php": "<3.8", + "uasoft-indonesia/badaso": "<=2.9.7", + "unisharp/laravel-filemanager": "<2.9.1", + "universal-omega/dynamic-page-list3": "<3.6.4", + "unopim/unopim": "<=0.3", + "userfrosting/userfrosting": ">=0.3.1,<4.6.3", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "uvdesk/community-skeleton": "<=1.1.1", + "uvdesk/core-framework": "<=1.1.1", + "vanilla/safecurl": "<0.9.2", + "verbb/comments": "<1.5.5", + "verbb/formie": "<3.1.28", + "verbb/image-resizer": "<2.0.9", + "verbb/knock-knock": "<1.2.8", + "verot/class.upload.php": "<=2.1.6", + "vertexvaar/falsftp": "<0.2.6", + "villagedefrance/opencart-overclocked": "<=1.11.1", + "vova07/yii2-fileapi-widget": "<0.1.9", + "vrana/adminer": "<5.4.2", + "vufind/vufind": ">=2,<9.1.1", + "waldhacker/hcaptcha": "<2.1.2", + "wallabag/tcpdf": "<6.2.22", + "wallabag/wallabag": "<2.6.11", + "wanglelecc/laracms": "<=1.0.3", + "wapplersystems/a21glossary": "<=0.4.10", + "web-auth/webauthn-framework": ">=3.3,<3.3.4|>=4.5,<4.9|>=5.2,<5.2.4|>=5.3,<5.3.1", + "web-auth/webauthn-lib": ">=4.5,<5.3.5", + "web-auth/webauthn-symfony-bundle": "<5.3.4", + "web-feet/coastercms": "==5.5", + "web-token/jwt-bundle": "<3.4.10|>=4,<4.0.7|>=4.1,<4.1.7", + "web-token/jwt-experimental": "<4.1.7", + "web-token/jwt-framework": "<4.1.7", + "web-token/jwt-library": "<3.4.10|>=4,<4.0.7|>=4.1,<4.1.7", + "web-tp3/wec_map": "<3.0.3", + "webbuilders-group/silverstripe-kapost-bridge": "<0.4", + "webcoast/deferred-image-processing": "<1.0.2", + "webklex/laravel-imap": "<5.3", + "webklex/php-imap": "<5.3", + "webonyx/graphql-php": "<=15.32.2", + "webpa/webpa": "<3.1.2", + "webreinvent/vaahcms": "<=2.3.1", + "wikibase/wikibase": "<=1.39.3", + "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", - "yiisoft/yii": ">=1.1.14,<1.1.15", - "yiisoft/yii2": "<2.0.5", + "winter/wn-backend-module": "<1.2.12", + "winter/wn-cms-module": "<=1.2.9", + "winter/wn-dusk-plugin": "<2.1", + "winter/wn-system-module": "<1.2.4", + "wintercms/winter": "<=1.2.3", + "wireui/wireui": "<1.19.3|>=2,<2.1.3", + "wnx/laravel-backup-restore": "<=1.9.3", + "woocommerce/woocommerce": "<6.6|>=8.8,<8.8.5|>=8.9,<8.9.3", + "wp-cli/wp-cli": ">=0.12,<2.5", + "wp-coding-standards/wpcs": ">=0.14.1,<3.4.1", + "wp-graphql/wp-graphql": "<=2.6", + "wp-premium/gravityforms": "<2.4.21", + "wpanel/wpanel4-cms": "<=4.3.1", + "wpcloud/wp-stateless": "<3.2", + "wpglobus/wpglobus": "<=1.9.6", + "wpmetabox/meta-box": "<5.11.2", + "wwbn/avideo": "<=29", + "xataface/xataface": "<3", + "xpressengine/xpressengine": "<3.0.15", + "yab/quarx": "<2.4.5", + "yansongda/pay": "<=3.7.19", + "yeswiki/yeswiki": "<4.6.6", + "yetiforce/yetiforce-crm": "<6.5", + "yidashi/yii2cmf": "<=2", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": "<1.1.31", + "yiisoft/yii2": "<2.0.55", + "yiisoft/yii2-authclient": "<2.2.15", "yiisoft/yii2-bootstrap": "<2.0.4", - "yiisoft/yii2-dev": "<2.0.4", - "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-dev": "<=2.0.45", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<=2.2.4", "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.20", + "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yoast/duplicate-post": "<=4.5", + "yourls/yourls": "<=1.10.2", + "yuan1994/tpadmin": "<=1.3.12", + "yungifez/skuul": "<=2.6.5", + "z-push/z-push-dev": "<2.7.6", + "zencart/zencart": "<=1.5.7.0-beta", + "zendesk/zendesk_api_client_php": "<2.2.11", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", - "zendframework/zend-diactoros": ">=1,<1.0.4", + "zendframework/zend-db": "<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": "<1.8.4", + "zendframework/zend-feed": "<2.10.3", "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-http": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.3,<2.3.8|>=2.4,<2.4.1", + "zendframework/zend-http": "<2.8.1", "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", - "zendframework/zend-mail": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.3,<2.3.8|>=2.4,<2.4.1", + "zendframework/zend-mail": "<2.4.11|>=2.5,<2.7.2", "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-session": ">=2,<2.2.9|>=2.3,<2.3.4", "zendframework/zend-validator": ">=2.3,<2.3.6", "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zendframework": ">=2,<2.4.9|>=2.5,<2.5.1", - "zendframework/zendframework1": ">=1,<1.11.15|>=1.12,<1.12.17", - "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendframework": "<=3", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": "<2.0.2", + "zendframework/zendrest": "<2.0.2", + "zendframework/zendservice-amazon": "<2.0.3", + "zendframework/zendservice-api": "<1", + "zendframework/zendservice-audioscrobbler": "<2.0.2", + "zendframework/zendservice-nirvanix": "<2.0.2", + "zendframework/zendservice-slideshare": "<2.0.2", + "zendframework/zendservice-technorati": "<2.0.2", + "zendframework/zendservice-windowsazure": "<2.0.2", "zendframework/zendxml": ">=1,<1.0.1", + "zenstruck/collection": "<0.2.1", + "zetacomponents/mail": "<1.8.2", "zf-commons/zfc-user": "<1.2.2", "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2" + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<=6.1.53", + "zumba/json-serializer": "<3.2.3" } }