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 bfe6531d..050fdbd0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,19 +2,12 @@ language: php sudo: false -cache: - directories: - - $HOME/.composer/cache/files - php: + - 5.6 + - 7.0 - 7.1 - -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)" + - 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 d23721d4..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) : void { - system('rm -rf ' . escapeshellarg($buildDir)); - system('mkdir ' . escapeshellarg($buildDir)); -}; - -$cloneAdvisories = function () use ($advisoriesRepository, $buildDir) : void { - system( - 'git clone ' - . escapeshellarg($advisoriesRepository) - . ' ' . escapeshellarg($buildDir . '/security-advisories') - ); -}; - -/** - * @param string $path - * - * @return Advisory[] - */ -$findAdvisories = function (string $path) use ($advisoriesExtension) : array { - $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) : array { - // @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) : array { - $conflicts = []; - - foreach ($components as $component) { - $conflicts[$component->getName()] = $component->getConflictConstraint(); - } - - ksort($conflicts); - - return array_filter($conflicts); -}; - -$buildConflictsJson = function (array $baseConfig, array $conflicts) : string { - return json_encode( - array_merge( - $baseConfig, - ['conflict' => $conflicts] - ), - JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE - ); -}; - -$writeJson = function (string $jsonString, string $path) : void { - file_put_contents($path, $jsonString . "\n"); -}; - -$runInPath = function (callable $function, string $path) { - $originalPath = getcwd(); - - chdir($path); - - try { - $returnValue = $function(); - } finally { - chdir($originalPath); - } - - return $returnValue; -}; - -$getComposerPhar = function (string $targetDir) use ($runInPath) : void { - $runInPath( - function () : void { - system( - 'curl -sS https://getcomposer.org/installer -o composer-installer.php && php composer-installer.php' - ); - }, - $targetDir - ); -}; - -$execute = function (string $commandString) : bool { - exec($commandString, $ignored, $result); - - return $result === 0; -}; - -$validateComposerJson = function (string $composerJsonPath) use ($runInPath, $execute) : void { - $runInPath( - function () use ($execute) { - if (! $execute('php composer.phar validate')) { - throw new UnexpectedValueException('Composer file validation failed'); - } - }, - dirname($composerJsonPath) - ); -}; - -$commitComposerJson = function (string $composerJsonPath) use ($runInPath, $execute) : void { - $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 a5373704..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.1", - "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 4767f739..00000000 --- a/build-advisories/src/Roave/SecurityAdvisories/Advisory.php +++ /dev/null @@ -1,98 +0,0 @@ -componentName = (string) $componentName; - $this->branchConstraints = $checkType(...$branchConstraints); - } - - /** - * @param array $config - * - * @return self - * - * @throws \InvalidArgumentException - */ - public static function fromArrayData(array $config) : self - { - // @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'] - )) - ); - } - - public function getComponentName() : string - { - return $this->componentName; - } - - /** - * @return VersionConstraint[] - */ - public function getVersionConstraints() : array - { - return $this->branchConstraints; - } - - public function getConstraint() : ?string - { - // @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/Boundary.php b/build-advisories/src/Roave/SecurityAdvisories/Boundary.php deleted file mode 100644 index a71ac452..00000000 --- a/build-advisories/src/Roave/SecurityAdvisories/Boundary.php +++ /dev/null @@ -1,79 +0,0 @@ -=|>)\s*((?:\d+\.)*\d+)\s*$/'; - private const VALID_ADJACENCY_MAP = [ - ['<', '='], - ['<', '>='], - ['<=', '>'], - ['=', '>'], - ]; - - /** - * @var Version - */ - private $version; - - /** - * @var string one of "<", "<=", "=", ">=", ">" - */ - private $limitType; - - private function __construct(Version $version, string $limitType) - { - $this->version = $version; - $this->limitType = $limitType; - } - - /** - * @param string $boundary - * - * @return Boundary - * - * @throws \InvalidArgumentException - */ - public static function fromString(string $boundary) : self - { - if (! preg_match(self::MATCHER, $boundary, $matches)) { - throw new \InvalidArgumentException(sprintf('The given string "%s" is not a valid boundary', $boundary)); - } - - return new self( - Version::fromString($matches[2]), - $matches[1] - ); - } - - public function limitIncluded() : bool - { - return in_array($this->limitType, ['<=', '=', '>='], true); - } - - public function adjacentTo(self $other) : bool - { - if (! $other->version->equalTo($this->version)) { - return false; - } - - return in_array([$this->limitType, $other->limitType], self::VALID_ADJACENCY_MAP, true) - || in_array([$other->limitType, $this->limitType], self::VALID_ADJACENCY_MAP, true); - } - - public function getVersion() : Version - { - return $this->version; - } - - public function getBoundaryString() : string - { - return $this->limitType . $this->version->getVersion(); - } -} diff --git a/build-advisories/src/Roave/SecurityAdvisories/Component.php b/build-advisories/src/Roave/SecurityAdvisories/Component.php deleted file mode 100644 index ee0e640c..00000000 --- a/build-advisories/src/Roave/SecurityAdvisories/Component.php +++ /dev/null @@ -1,108 +0,0 @@ -name = (string) $name; - $this->advisories = $checkAdvisories(...array_values($advisories)); - } - - public function getName() : string - { - return $this->name; - } - - /** - * @return string - * - * @throws \LogicException - */ - public function getConflictConstraint() : string - { - 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[] - * - * @throws \LogicException - */ - private function deDuplicateConstraints(array $constraints) : array - { - 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 4c907282..00000000 --- a/build-advisories/src/Roave/SecurityAdvisories/Version.php +++ /dev/null @@ -1,121 +0,0 @@ -versionNumbers = $versionNumbers; - } - - /** - * @param string $version - * - * @return self - * - * @throws \InvalidArgumentException - */ - public static function fromString(string $version) : self - { - 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)))); - } - - /** - * @param Version $other - * - * @return bool - */ - public function equalTo(self $other) : bool - { - return $other->versionNumbers === $this->versionNumbers; - } - - /** - * 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) : bool - { - foreach ($other->versionNumbers as $index => $otherVersion) { - $thisVersion = $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) : bool - { - foreach ($other->versionNumbers as $index => $otherVersion) { - $thisVersion = $this->versionNumbers[$index] ?? 0; - - if ($thisVersion === $otherVersion) { - continue; - } - - return $thisVersion > $otherVersion; - } - - return true; - } - - public function getVersion() : string - { - return implode('.', $this->versionNumbers); - } - - /** - * @param int[] $versionNumbers - * - * @return int[] - */ - private static function removeTrailingZeroes(array $versionNumbers) : array - { - 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 57b6e68f..00000000 --- a/build-advisories/src/Roave/SecurityAdvisories/VersionConstraint.php +++ /dev/null @@ -1,330 +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 Boundary|null - */ - private $lowerBoundary; - - /** - * @var Boundary|null - */ - private $upperBoundary; - - private function __construct() - { - } - - /** - * @param string $versionConstraint - * - * @return self - * - * @throws \InvalidArgumentException - */ - public static function fromString(string $versionConstraint) : self - { - $constraintString = (string) $versionConstraint; - $instance = new self(); - - if (preg_match(self::CLOSED_RANGE_MATCHER, $constraintString, $matches)) { - [$left, $right] = explode(',', $constraintString); - - $instance->lowerBoundary = Boundary::fromString($left); - $instance->upperBoundary = Boundary::fromString($right); - - return $instance; - } - - if (preg_match(self::LEFT_OPEN_RANGE_MATCHER, $constraintString, $matches)) { - $instance->upperBoundary = Boundary::fromString($constraintString); - - return $instance; - } - - if (preg_match(self::RIGHT_OPEN_RANGE_MATCHER, $constraintString, $matches)) { - $instance->lowerBoundary = Boundary::fromString($constraintString); - - return $instance; - } - - $instance->constraintString = $constraintString; - - return $instance; - } - - public function isSimpleRangeString() : bool - { - return null === $this->constraintString; - } - - public function getConstraintString() : string - { - if (null !== $this->constraintString) { - return $this->constraintString; - } - - return implode( - ',', - array_map( - function (Boundary $boundary) { - return $boundary->getBoundaryString(); - }, - array_filter([$this->lowerBoundary, $this->upperBoundary]) - ) - ); - } - - public function isLowerBoundIncluded() : bool - { - return $this->lowerBoundary ? $this->lowerBoundary->limitIncluded() : false; - } - - public function getLowerBound() : ?Version - { - return $this->lowerBoundary ? $this->lowerBoundary->getVersion() : null; - } - - public function getUpperBound() : ?Version - { - return $this->upperBoundary ? $this->upperBoundary->getVersion() : null; - } - - public function isUpperBoundIncluded() : bool - { - return $this->upperBoundary ? $this->upperBoundary->limitIncluded() : false; - } - - public function canMergeWith(self $other) : bool - { - return $this->contains($other) - || $other->contains($this) - || $this->overlapsWith($other) - || $other->overlapsWith($this) - || $this->adjacentTo($other); - } - - /** - * @param VersionConstraint $other - * - * @return VersionConstraint - * - * @throws \LogicException - */ - public function mergeWith(self $other) : self - { - 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); - } - - if ($this->adjacentTo($other)) { - return $this->mergeAdjacent($other); - } - - throw new \LogicException(sprintf( - 'Cannot merge %s "%s" with %s "%s"', - self::class, - $this->getConstraintString(), - self::class, - $other->getConstraintString() - )); - } - - private function contains(self $other) : bool - { - return $this->isSimpleRangeString() // cannot compare - too complex :-( - && $other->isSimpleRangeString() // cannot compare - too complex :-( - && $this->containsLowerBound($other->lowerBoundary) - && $this->containsUpperBound($other->upperBoundary); - } - - private function containsLowerBound(?Boundary $otherLowerBoundary) : bool - { - if (! $this->lowerBoundary) { - return true; - } - - if (! $otherLowerBoundary) { - return false; - } - - if (($this->lowerBoundary->limitIncluded() === $otherLowerBoundary->limitIncluded()) || $this->lowerBoundary->limitIncluded()) { - return $otherLowerBoundary->getVersion()->isGreaterOrEqualThan($this->lowerBoundary->getVersion()); - } - - return $otherLowerBoundary->getVersion()->isGreaterThan($this->lowerBoundary->getVersion()); - } - - private function containsUpperBound(?Boundary $otherUpperBoundary) : bool - { - if (! $this->upperBoundary) { - return true; - } - - if (! $otherUpperBoundary) { - return false; - } - - if (($this->upperBoundary->limitIncluded() === $otherUpperBoundary->limitIncluded()) || $this->upperBoundary->limitIncluded()) { - return $this->upperBoundary->getVersion()->isGreaterOrEqualThan($otherUpperBoundary->getVersion()); - } - - return $this->upperBoundary->getVersion()->isGreaterThan($otherUpperBoundary->getVersion()); - } - - private function overlapsWith(VersionConstraint $other) : bool - { - if (! $this->isSimpleRangeString() && $other->isSimpleRangeString()) { - return false; - } - - if ($this->contains($other) || $other->contains($this)) { - return false; - } - - return $this->strictlyContainsOtherBound($other->lowerBoundary) - xor $this->strictlyContainsOtherBound($other->upperBoundary); - } - - private function adjacentTo(VersionConstraint $other) : bool - { - if ($this->lowerBoundary && $other->upperBoundary && $this->lowerBoundary->adjacentTo($other->upperBoundary)) { - return true; - } - - if ($this->upperBoundary && $other->lowerBoundary && $this->upperBoundary->adjacentTo($other->lowerBoundary)) { - return true; - } - - return false; - } - - /** - * @param VersionConstraint $other - * - * @return self - * - * @throws \LogicException - */ - private function mergeWithOverlapping(VersionConstraint $other) : self - { - 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->lowerBoundary)) { - $instance = new self(); - - $instance->lowerBoundary = $this->lowerBoundary; - $instance->upperBoundary = $other->upperBoundary; - - return $instance; - } - - $instance = new self(); - - $instance->lowerBoundary = $other->lowerBoundary; - $instance->upperBoundary = $this->upperBoundary; - - return $instance; - } - - - /** - * @param VersionConstraint $other - * - * @return self - * - * @throws \LogicException - */ - private function mergeAdjacent(VersionConstraint $other) : self - { - if (! $this->adjacentTo($other)) { - throw new \LogicException(sprintf( - '%s "%s" is not adjacent to %s "%s"', - self::class, - $this->getConstraintString(), - self::class, - $other->getConstraintString() - )); - } - - if ($this->upperBoundary && $other->lowerBoundary && $this->upperBoundary->adjacentTo($other->lowerBoundary)) { - $instance = new self(); - - $instance->lowerBoundary = $this->lowerBoundary; - $instance->upperBoundary = $other->upperBoundary; - - return $instance; - } - - $instance = new self(); - - $instance->lowerBoundary = $other->lowerBoundary; - $instance->upperBoundary = $this->upperBoundary; - - return $instance; - } - - /** - * @param Boundary|null $boundary - * - * @return bool - * - * Note: most of the limitations/complication probably go away if we define a `Bound` VO - */ - private function strictlyContainsOtherBound(?Boundary $boundary) : bool - { - if (! $boundary) { - return false; - } - - $boundVersion = $boundary->getVersion(); - - if (! $this->lowerBoundary) { - return $this->upperBoundary->getVersion()->isGreaterThan($boundVersion); - } - - if (! $this->upperBoundary) { - return $boundVersion->isGreaterThan($this->lowerBoundary->getVersion()); - } - - return $boundVersion->isGreaterThan($this->lowerBoundary->getVersion()) - && $this->upperBoundary->getVersion()->isGreaterThan($boundVersion); - } -} diff --git a/build-advisories/test/RoaveTest/SecurityAdvisories/AdvisoryTest.php b/build-advisories/test/RoaveTest/SecurityAdvisories/AdvisoryTest.php deleted file mode 100644 index aa3fe65b..00000000 --- a/build-advisories/test/RoaveTest/SecurityAdvisories/AdvisoryTest.php +++ /dev/null @@ -1,62 +0,0 @@ - 'composer://foo/bar', - 'branches' => [ - '1.0.x' => [ - 'versions' => ['>=1.0', '<1.1'], - ], - '2.0.x' => [ - 'versions' => ['>=2.0', '<2.1'], - ], - ], - ]); - - self::assertInstanceOf(Advisory::class, $advisory); - - self::assertSame('foo/bar', $advisory->getComponentName()); - self::assertSame('>=1,<1.1|>=2,<2.1', $advisory->getConstraint()); - - $constraints = $advisory->getVersionConstraints(); - - self::assertCount(2, $constraints); - self::assertInstanceOf(VersionConstraint::class, $constraints[0]); - self::assertInstanceOf(VersionConstraint::class, $constraints[1]); - - self::assertSame('>=1,<1.1', $constraints[0]->getConstraintString()); - self::assertSame('>=2,<2.1', $constraints[1]->getConstraintString()); - } -} diff --git a/build-advisories/test/RoaveTest/SecurityAdvisories/BoundaryTest.php b/build-advisories/test/RoaveTest/SecurityAdvisories/BoundaryTest.php deleted file mode 100644 index ec8cb94b..00000000 --- a/build-advisories/test/RoaveTest/SecurityAdvisories/BoundaryTest.php +++ /dev/null @@ -1,239 +0,0 @@ -setExpectedException(\InvalidArgumentException::class); - - Boundary::fromString($boundaryString); - } - - /** - * @dataProvider validBoundaryStrings - * - * @param string $boundaryString - * @param string $expectedNormalizedString - * - * @return void - */ - public function testValidBoundaryString(string $boundaryString, string $expectedNormalizedString) : void - { - $boundary = Boundary::fromString($boundaryString); - - self::assertInstanceOf(Boundary::class, $boundary); - self::assertSame($expectedNormalizedString, $boundary->getBoundaryString()); - self::assertEquals($boundary, Boundary::fromString($boundary->getBoundaryString())); - } - - /** - * @dataProvider validBoundaryStrings - * - * @param string $boundaryString - * - * @return void - */ - public function testLimitIncluded(string $boundaryString) : void - { - self::assertSame( - false !== strpos($boundaryString, '='), - Boundary::fromString($boundaryString)->limitIncluded() - ); - } - - /** - * @dataProvider validBoundaryStrings - * - * @param string $boundaryString - * - * @return void - */ - public function testGetVersion(string $boundaryString) : void - { - preg_match('/((?:\d+\.)*\d+)\s*$/', $boundaryString, $matches); - - self::assertTrue( - Version::fromString($matches[1])->equalTo(Boundary::fromString($boundaryString)->getVersion()) - ); - } - - /** - * @dataProvider validBoundaryStrings - * - * @param string $boundaryString - * - * @return void - */ - public function testBoundaryNotAdjacentToItself(string $boundaryString) : void - { - self::assertFalse(Boundary::fromString($boundaryString)->adjacentTo(Boundary::fromString($boundaryString))); - } - - /** - * @dataProvider adjacentBoundaries - * - * @param string $boundary1String - * @param string $boundary2String - * - * @return void - */ - public function testAdjacentBoundaries(string $boundary1String, string $boundary2String) : void - { - $boundary1 = Boundary::fromString($boundary1String); - $boundary2 = Boundary::fromString($boundary2String); - - self::assertTrue($boundary1->adjacentTo($boundary2)); - self::assertTrue($boundary2->adjacentTo($boundary1)); - } - - /** - * @dataProvider nonAdjacentBoundaries - * - * @param string $boundary1String - * @param string $boundary2String - * - * @return void - */ - public function testNonAdjacentBoundaries(string $boundary1String, string $boundary2String) : void - { - $boundary1 = Boundary::fromString($boundary1String); - $boundary2 = Boundary::fromString($boundary2String); - - self::assertFalse($boundary1->adjacentTo($boundary2)); - self::assertFalse($boundary2->adjacentTo($boundary1)); - } - - /** - * @return string[][] - */ - public function invalidBoundaryStrings() : array - { - return [ - [''], - ['foo'], - ['1'], - ['1.2.3'], - ['1.2.3='], - ['1.2.3<='], - ['1.2.3<'], - ['1.2.3>'], - ['1.2.3>='], - ['<'], - ['>'], - ['<='], - ['>='], - ['='], - ['=='], - ['><'], - ['<>'], - ['=>'], - ['=<'], - ['=>1.2'], - ['=<1.2'], - ['1.2'], - ]; - } - - /** - * @return string[][] - */ - public function validBoundaryStrings() : array - { - return [ - ['>1.2.3', '>1.2.3'], - ['>=1.2.3', '>=1.2.3'], - ['=1.2.3', '=1.2.3'], - ['<=1.2.3', '<=1.2.3'], - ['<1.2.3', '<1.2.3'], - ['>1.2.3.0', '>1.2.3'], - ['>=1.2.3.0', '>=1.2.3'], - ['=1.2.3.0', '=1.2.3'], - ['<=1.2.3.0', '<=1.2.3'], - ['<1.2.3.0', '<1.2.3'], - ['>1.0', '>1'], - ['>=1.0', '>=1'], - ['=1.0', '=1'], - ['<=1.0', '<=1'], - ['<1.0', '<1'], - ['> 1.2.3', '>1.2.3'], - ['>= 1.2.3', '>=1.2.3'], - ['= 1.2.3', '=1.2.3'], - ['<= 1.2.3', '<=1.2.3'], - ['< 1.2.3', '<1.2.3'], - [' > 1.2.3 ', '>1.2.3'], - [' >= 1.2.3 ', '>=1.2.3'], - [' = 1.2.3 ', '=1.2.3'], - [' <= 1.2.3 ', '<=1.2.3'], - [' < 1.2.3 ', '<1.2.3'], - ]; - } - - /** - * @return string[][] - */ - public function adjacentBoundaries() : array - { - return [ - ['<1', '=1'], - ['<1', '>=1'], - ['<=1', '>1'], - ['=1', '>1'], - ]; - } - - /** - * @return string[][] - */ - public function nonAdjacentBoundaries() : array - { - return [ - ['<1', '<1'], - ['<1', '<=1'], - ['<=1', '<=1'], - ['<=1', '>=1'], - ['=1', '=1'], - ['=1', '<=1'], - ['=1', '>=1'], - ['<1', '=1.1'], - ['<1', '>=1.1'], - ['<=1', '>1.1'], - ['=1', '>1.1'], - ]; - } -} diff --git a/build-advisories/test/RoaveTest/SecurityAdvisories/ComponentTest.php b/build-advisories/test/RoaveTest/SecurityAdvisories/ComponentTest.php deleted file mode 100644 index 22680385..00000000 --- a/build-advisories/test/RoaveTest/SecurityAdvisories/ComponentTest.php +++ /dev/null @@ -1,114 +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]); - - self::assertInstanceOf(Component::class, $component); - - self::assertSame('>=1,<1.1|>=2,<2.1|>=3,<3.1|>=4,<4.1', $component->getConflictConstraint()); - self::assertSame('foo/bar', $component->getName()); - } - - public function testDeDuplicatesOverlappingAdvisories() : void - { - $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]); - - self::assertInstanceOf(Component::class, $component); - - self::assertSame('>=1,<1.1|>=2,<2.1|>=3,<3.1', $component->getConflictConstraint()); - self::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 b63ad863..00000000 --- a/build-advisories/test/RoaveTest/SecurityAdvisories/VersionConstraintTest.php +++ /dev/null @@ -1,539 +0,0 @@ -isSimpleRangeString()); - self::assertInstanceOf(Version::class, $constraint->getLowerBound()); - self::assertInstanceOf(Version::class, $constraint->getUpperBound()); - - $constraintAsString = $constraint->getConstraintString(); - - self::assertSame((bool) preg_match('/>=/', $stringConstraint), $constraint->isLowerBoundIncluded()); - self::assertSame((bool) preg_match('/<=/',$stringConstraint), $constraint->isUpperBoundIncluded()); - self::assertStringMatchesFormat('%A' . $constraint->getLowerBound()->getVersion() . '%A', $constraintAsString); - self::assertStringMatchesFormat('%A' . $constraint->getUpperBound()->getVersion() . '%A', $constraintAsString); - } - - /** - * @dataProvider normalizableRangesProvider - * - * @param string $originalRange - * @param string $normalizedRange - */ - public function testOperatesOnNormalizedRanges(string $originalRange, string $normalizedRange) : void - { - self::assertSame($normalizedRange, VersionConstraint::fromString($originalRange)->getConstraintString()); - } - - public function testLeftOpenEndedRange() : void - { - $constraint = VersionConstraint::fromString('<1'); - - self::assertTrue($constraint->isSimpleRangeString()); - self::assertSame('<1', $constraint->getConstraintString()); - self::assertNull($constraint->getLowerBound()); - self::assertInstanceOf(Version::class, $constraint->getUpperBound()); - self::assertFalse($constraint->isLowerBoundIncluded()); - self::assertFalse($constraint->isUpperBoundIncluded()); - } - - public function testRightOpenEndedRange() : void - { - $constraint = VersionConstraint::fromString('>1'); - - self::assertTrue($constraint->isSimpleRangeString()); - self::assertSame('>1', $constraint->getConstraintString()); - self::assertNull($constraint->getUpperBound()); - self::assertInstanceOf(Version::class, $constraint->getLowerBound()); - self::assertFalse($constraint->isLowerBoundIncluded()); - self::assertFalse($constraint->isUpperBoundIncluded()); - } - - public function testLeftOpenEndedRangeBoundIncluded() : void - { - $constraint = VersionConstraint::fromString('<=1'); - - self::assertTrue($constraint->isSimpleRangeString()); - self::assertSame('<=1', $constraint->getConstraintString()); - self::assertNull($constraint->getLowerBound()); - self::assertInstanceOf(Version::class, $constraint->getUpperBound()); - self::assertFalse($constraint->isLowerBoundIncluded()); - self::assertTrue($constraint->isUpperBoundIncluded()); - } - - public function testRightOpenEndedRangeBoundIncluded() : void - { - $constraint = VersionConstraint::fromString('>=1'); - - self::assertTrue($constraint->isSimpleRangeString()); - self::assertSame('>=1', $constraint->getConstraintString()); - self::assertNull($constraint->getUpperBound()); - self::assertInstanceOf(Version::class, $constraint->getLowerBound()); - self::assertTrue($constraint->isLowerBoundIncluded()); - self::assertFalse($constraint->isUpperBoundIncluded()); - } - - /** - * @dataProvider complexRangesProvider - * - * @param string $stringConstraint - */ - public function testFromRangeWithComplexRanges(string $stringConstraint) : void - { - $constraint = VersionConstraint::fromString($stringConstraint); - - self::assertInstanceOf(VersionConstraint::class, $constraint); - self::assertFalse($constraint->isSimpleRangeString()); - self::assertSame($stringConstraint, $constraint->getConstraintString()); - } - - public function testContainsWithMatchingRanges() : void - { - $constraint1 = VersionConstraint::fromString('>1.2.3,<4.5.6'); - $constraint2 = VersionConstraint::fromString('>1.2.4,<4.5.5'); - - self::assertTrue($this->callContains($constraint1, $constraint2)); - self::assertFalse($this->callContains($constraint2, $constraint1)); - } - - public function testCannotCompareComplexRanges() : void - { - $constraint1 = VersionConstraint::fromString('1|2'); - $constraint2 = VersionConstraint::fromString('1|2|3'); - - self::assertFalse($this->callContains($constraint1, $constraint2)); - self::assertFalse($this->callContains($constraint2, $constraint1)); - } - - /** - * @dataProvider rangesForComparisonProvider - * - * @param string $constraintString1 - * @param string $constraintString2 - * @param bool $constraint1ContainsConstraint2 - * @param bool $constraint2ContainsConstraint1 - */ - public function testContainsWithRanges( - string $constraintString1, - string $constraintString2, - bool $constraint1ContainsConstraint2, - bool $constraint2ContainsConstraint1 - ) : void { - $constraint1 = VersionConstraint::fromString($constraintString1); - $constraint2 = VersionConstraint::fromString($constraintString2); - - self::assertSame($constraint1ContainsConstraint2, $this->callContains($constraint1, $constraint2)); - self::assertSame($constraint2ContainsConstraint1, $this->callContains($constraint2, $constraint1)); - } - - /** - * @dataProvider mergeableRangesProvider - * - * @param string $constraintString1 - * @param string $constraintString2 - * @param bool $constraint1ContainsConstraint2 - * @param bool $constraint2ContainsConstraint1 - */ - public function testCanMergeWithContainedRanges( - string $constraintString1, - string $constraintString2, - bool $constraint1ContainsConstraint2, - bool $constraint2ContainsConstraint1 - ) : void { - $constraint1 = VersionConstraint::fromString($constraintString1); - $constraint2 = VersionConstraint::fromString($constraintString2); - $expectation = $constraint2ContainsConstraint1 || $constraint1ContainsConstraint2; - - self::assertSame($expectation, $constraint1->canMergeWith($constraint2)); - self::assertSame($expectation, $constraint1->canMergeWith($constraint2)); - } - - /** - * @dataProvider mergeableRangesProvider - * - * @param string $constraintString1 - * @param string $constraintString2 - * @param bool $constraint1ContainsConstraint2 - * @param bool $constraint2ContainsConstraint1 - */ - public function testMergeWithMergeableRanges( - string $constraintString1, - string $constraintString2, - bool $constraint1ContainsConstraint2, - bool $constraint2ContainsConstraint1 - ) : void { - $constraint1 = VersionConstraint::fromString($constraintString1); - $constraint2 = VersionConstraint::fromString($constraintString2); - - if (! ($constraint2ContainsConstraint1 || $constraint1ContainsConstraint2)) { - $this->setExpectedException(\LogicException::class); - } - - $merged1 = $constraint1->mergeWith($constraint2); - $merged2 = $constraint2->mergeWith($constraint1); - - self::assertEquals($merged1, $merged2); - - self::assertTrue($this->callContains($merged1, $constraint1)); - self::assertTrue($this->callContains($merged1, $constraint2)); - } - - /** - * @dataProvider strictlyOverlappingRangesProvider - * - * @param string $range1 - * @param string $range2 - * @param string $expected - */ - public function testCanMergeWithMergeableRanges(string $range1, string $range2, string $expected) : void - { - $constraint1 = VersionConstraint::fromString($range1); - $constraint2 = VersionConstraint::fromString($range2); - - self::assertSame($expected, $constraint1->mergeWith($constraint2)->getConstraintString()); - self::assertSame($expected, $constraint2->mergeWith($constraint1)->getConstraintString()); - } - - /** - * @dataProvider nonStrictlyOverlappingRangesProvider - * - * @param string $range1 - * @param string $range2 - */ - public function testNonMergeableRanges(string $range1, string $range2) : void - { - $constraint1 = VersionConstraint::fromString($range1); - $constraint2 = VersionConstraint::fromString($range2); - - self::assertFalse($this->callOverlapsWith($constraint1, $constraint2)); - self::assertFalse($this->callOverlapsWith($constraint2, $constraint1)); - - $this->setExpectedException(\LogicException::class); - - $this->callMergeWithOverlapping($constraint1, $constraint2); - } - - /** - * @return string[][] - */ - public function closedRangesProvider() : array - { - $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() : array - { - 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() : array - { - $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[][]|bool[][] - */ - public function mergeableRangesProvider() : array - { - $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() : array - { - 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'], - ]); - } - - /** - * @return string[][] - */ - public function strictlyOverlappingRangesProvider() : array - { - $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'], - ['>1,<2', '>=2,<3', '>1,<3'], - ['>1,<=2', '>2,<3', '>1,<3'], - ['>1,<2', '>0.1,<=1', '>0.1,<2'], - ['>=1,<2', '>0.1,<1', '>0.1,<2'], - ['>1,<=2', '>2', '>1'], - ['>1,<2', '>=2', '>1'], - ['>1,<2', '<=1', '<2'], - ['>=1,<2', '<1', '<2'], - ]; - - return array_combine( - array_map( - function (array $entry) { - return '((' . $entry[0] . ') βˆͺ (' . $entry[1] . ')) = (' . $entry[2] . ')'; - }, - $entries - ), - $entries - ); - } - - /** - * @return string[][] - */ - public function nonStrictlyOverlappingRangesProvider() : array - { - $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) : array - { - return array_combine( - array_map( - function (array $entry) { - return $entry[0]; - }, - $entries - ), - $entries - ); - } - - private function callContains(VersionConstraint $versionConstraint, VersionConstraint $other) : bool - { - $containsReflection = new ReflectionMethod($versionConstraint, 'contains'); - - $containsReflection->setAccessible(true); - - return $containsReflection->invoke($versionConstraint, $other); - } - - private function callOverlapsWith(VersionConstraint $versionConstraint, VersionConstraint $other) : bool - { - $overlapsWithReflection = new ReflectionMethod($versionConstraint, 'overlapsWith'); - - $overlapsWithReflection->setAccessible(true); - - return $overlapsWithReflection->invoke($versionConstraint, $other); - } - - private function callMergeWithOverlapping(VersionConstraint $versionConstraint, VersionConstraint $other) : VersionConstraint - { - $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 597aa217..00000000 --- a/build-advisories/test/RoaveTest/SecurityAdvisories/VersionTest.php +++ /dev/null @@ -1,273 +0,0 @@ -setExpectedException(\InvalidArgumentException::class); - - Version::fromString($versionString); - } - - /** - * @dataProvider validVersionStringProvider - * - * @param string $versionString - */ - public function testGetVersionWithValidVersion(string $versionString) : void - { - $version = Version::fromString($versionString); - - self::assertInstanceOf(Version::class, $version); - self::assertRegExp('/([0-9]*)(\\.[1-9][0-9]*)*/', $version->getVersion()); - } - - /** - * @dataProvider validVersionStringProvider - * - * @param string $versionString - */ - public function testVersionNumbersAreNormalized(string $versionString) : void - { - self::assertNotRegExp('/(\\.[0]+)+$/', Version::fromString($versionString)->getVersion()); - } - - /** - * @dataProvider greaterThanComparisonVersionsProvider - * - * @param string $version1String - * @param string $version2String - * @param bool $v1GreaterThanV2 - * @param bool $v2GreaterThanV1 - */ - public function testGreaterThanVersionWith( - string $version1String, - string $version2String, - bool $v1GreaterThanV2, - bool $v2GreaterThanV1 - ) : void { - $version1 = Version::fromString($version1String); - $version2 = Version::fromString($version2String); - - self::assertSame($v1GreaterThanV2, $version1->isGreaterThan($version2)); - self::assertSame($v2GreaterThanV1, $version2->isGreaterThan($version1)); - } - - /** - * @dataProvider greaterOrEqualThanComparisonVersionsProvider - * - * @param string $version1String - * @param string $version2String - * @param bool $v1GreaterOrEqualThanV2 - * @param bool $v2GreaterOrEqualThanV1 - */ - public function testGreaterOrEqualThanVersionWith( - string $version1String, - string $version2String, - bool $v1GreaterOrEqualThanV2, - bool $v2GreaterOrEqualThanV1 - ) : void { - $version1 = Version::fromString($version1String); - $version2 = Version::fromString($version2String); - - self::assertSame($v1GreaterOrEqualThanV2, $version1->isGreaterOrEqualThan($version2)); - self::assertSame($v2GreaterOrEqualThanV1, $version2->isGreaterOrEqualThan($version1)); - } - - /** - * @dataProvider equivalentVersionProvider - * - * @param string $version1String - * @param string $version2String - */ - public function testVersionEquivalence(string $version1String, string $version2String) : void - { - $version1 = Version::fromString($version1String); - $version2 = Version::fromString($version2String); - - self::assertEquals($version1, $version2); - self::assertTrue($version1->equalTo($version2)); - self::assertTrue($version2->equalTo($version1)); - } - - /** - * @dataProvider nonEquivalentVersionProvider - * - * @param string $version1String - * @param string $version2String - */ - public function testVersionNonEquivalence(string $version1String, string $version2String) : void - { - $version1 = Version::fromString($version1String); - $version2 = Version::fromString($version2String); - - self::assertNotEquals($version1, $version2); - self::assertFalse($version1->equalTo($version2)); - self::assertFalse($version2->equalTo($version1)); - } - - /** - * @return string[][] - */ - 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'], - ]; - } - - /** - * @return string[][]|bool[][] - */ - public function greaterThanComparisonVersionsProvider() : array - { - $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 - ); - } - - /** - * @return string[][]|bool[][] - */ - public function greaterOrEqualThanComparisonVersionsProvider() : array - { - $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 - ); - } - - /** - * @return string[][] - */ - public function invalidVersionStringsProvider() : array - { - return [ - [''], - ['12.a'], - ['12a3'], - ['alpha'], - ['beta'], - ['1-a'], - ['1.2.a'], - ['.1'], - ]; - } - - /** - * @return string[][] - */ - public function equivalentVersionProvider() : array - { - 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'], - ]; - } - - /** - * @return string[][] - */ - public function nonEquivalentVersionProvider() : array - { - return [ - ['0.1', '0.0'], - ['1.0.1', '1.0'], - ['1', '1.0.2'], - ['1.0.0.1', '1.0.0'], - ['2.0.1.1', '2.0.1'], - ['2.0.1.0.0.0', '2.0.2'], - ]; - } -} diff --git a/build-advisories/update-security-advisories.php b/build-advisories/update-security-advisories.php deleted file mode 100644 index 7331d3c8..00000000 --- a/build-advisories/update-security-advisories.php +++ /dev/null @@ -1,105 +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) : string { - return $runInPath( - function () use ($execute) : string { - return $execute('git rev-parse --verify HEAD')[0]; - }, - realpath(__DIR__ . '/..') - ); - }; - - $runInPath( - function () use ($execute) : void { - $execute('git fetch origin'); - $execute('git reset --hard origin/master'); - }, - realpath(__DIR__ . '/..') - ); - - $previousSha1 = $getCurrentSha1(); - - $runInPath( - function () use ($execute) : void { - $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) : void { - $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 521db48c..2045d184 100644 --- a/composer.json +++ b/composer.json @@ -3,110 +3,1090 @@ "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": { - "adodb/adodb-php": "<5.20.6", - "amphp/artax": ">=2,<2.0.4|>0.7.1,<1.0.4", - "aws/aws-sdk-php": ">=3,<3.2.1", + "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", - "cakephp/cakephp": ">=3,<3.0.15|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=1.3,<1.3.18|>=2.7,<2.7.6|>=3.1,<3.1.4", - "cartalyst/sentry": "<2.1", - "codeigniter/framework": "<=3.0.6", - "composer/composer": "<=1.0.0-alpha11", + "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/core": ">=2.11,<3.5.15", - "doctrine/annotations": ">=1,<1.2.7", + "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.2", - "drupal/core": ">=8,<8.1.10", - "drupal/drupal": ">=8,<8.1.10", - "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.5", - "guzzlehttp/guzzle": ">=6,<6.2.1|>=4.0.0-rc2,<4.2.4|>=5,<5.3.1", - "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", - "magento/magento2ce": ">=2,<2.2", + "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": "<6.15.4", + "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", - "phpmailer/phpmailer": ">=5,<5.2.14", + "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": "<=7.0.5", + "oxid-esales/paymorrow-module": ">=1,<1.0.2|>=2,<2.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", - "shopware/shopware": "<4.3.7|>=5,<5.1.5", - "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.3", - "silverstripe/userforms": "<3", - "simplesamlphp/simplesamlphp": "<1.14.4", + "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", + "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.6.12|>=2.7,<2.7.7", - "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2", - "symfony/http-foundation": ">=2,<2.3.27|>=2.4,<2.5.11|>=2.6,<2.6.6", - "symfony/http-kernel": ">=2,<2.3.29|>=2.4,<2.5.12|>=2.6,<2.6.8", - "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2.3,<2.3.37|>=2.4,<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.8,<2.8.6|>=3,<3.0.6|>=2.4,<2.6.13|>=2.7,<2.7.9", - "symfony/security-http": ">=2.4,<2.7.13|>=2.3,<2.3.41|>=2.8,<2.8.6|>=3,<3.0.6", - "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.3.41|>=2.4,<2.7.13|>=2.8,<2.8.6|>=3,<3.0.6", + "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/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.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.27|>=8,<8.3.1|>=7,<7.6.11", - "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": "<=1.14.5", + "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/zendframework": "<=3", "zendframework/zendframework1": "<1.12.20", - "zendframework/zendopenid": ">=2,<2.0.2", + "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" } }