From f9bcc8e8628be68f16bb301ff0af2f17c441f31a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 7 Jan 2023 16:19:02 +0000 Subject: [PATCH 01/16] NetworkSession: added a rate-limit for incoming batches --- src/network/mcpe/NetworkSession.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 188b2fcae..47e63c37c 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -132,6 +132,7 @@ use function get_class; use function in_array; use function json_encode; use function ksort; +use function min; use function strcasecmp; use function strlen; use function strtolower; @@ -142,6 +143,19 @@ use const JSON_THROW_ON_ERROR; use const SORT_NUMERIC; class NetworkSession{ + private const INCOMING_PACKET_BATCH_PER_TICK = 2; //we should normally see only 1 per tick - 2 allows recovery of the budget after a lag spike + private const INCOMING_PACKET_BATCH_MAX_BUDGET = 100; //enough to account for a 5-second lag spike + + /** + * At most this many more packets can be received. If this reaches zero, any additional packets received will cause + * the player to be kicked from the server. + * This number is increased every tick up to a maximum limit. + * + * @see self::INCOMING_PACKET_BATCH_PER_TICK + * @see self::INCOMING_PACKET_BATCH_MAX_BUDGET + */ + private int $incomingPacketBatchBudget = self::INCOMING_PACKET_BATCH_MAX_BUDGET; + private \PrefixedLogger $logger; private ?Player $player = null; private ?PlayerInfo $info = null; @@ -339,6 +353,11 @@ class NetworkSession{ return; } + if($this->incomingPacketBatchBudget <= 0){ + throw new PacketHandlingException("Receiving packets too fast"); + } + $this->incomingPacketBatchBudget--; + if($this->cipher !== null){ Timings::$playerNetworkReceiveDecrypt->startTiming(); try{ @@ -1129,5 +1148,6 @@ class NetworkSession{ } $this->flushSendBuffer(); + $this->incomingPacketBatchBudget = min($this->incomingPacketBatchBudget + self::INCOMING_PACKET_BATCH_PER_TICK, self::INCOMING_PACKET_BATCH_MAX_BUDGET); } } From eb06535ed1d9c70cb295e26ba5c6912b08c7ce38 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 7 Jan 2023 16:22:01 +0000 Subject: [PATCH 02/16] Release 4.12.6 --- changelogs/4.12.md | 6 ++++++ src/VersionInfo.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelogs/4.12.md b/changelogs/4.12.md index 16e23dc6a..065c9c5dc 100644 --- a/changelogs/4.12.md +++ b/changelogs/4.12.md @@ -50,3 +50,9 @@ Released 6th January 2023. ## Fixes - Removed a workaround for an old client bug in custom form responses. The code contained a denial-of-service vulnerability. + +# 4.12.6 +Released 7th January 2023. + +## Changes +- Added a new security measure to `NetworkSession` to detect and ban players who flood the server with packets. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 384a63ae7..88adf1a38 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.12.6"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 653178c1fde0f69ade544c3b47afdb447ab1dddb Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 7 Jan 2023 16:22:01 +0000 Subject: [PATCH 03/16] 4.12.7 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 88adf1a38..317f0b5e6 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.12.6"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.12.7"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From 91e38d1f9729b67f030450795bec79d20ebd3b9f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 7 Jan 2023 21:33:34 +0000 Subject: [PATCH 04/16] NetworkSession: compensate for server lag in batch budgeting --- src/network/mcpe/NetworkSession.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 47e63c37c..cbeab346a 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -193,6 +193,8 @@ class NetworkSession{ */ private ObjectSet $disposeHooks; + private int $lastUpdateTimeNs; + public function __construct( private Server $server, private NetworkSessionManager $manager, @@ -213,6 +215,7 @@ class NetworkSession{ $this->disposeHooks = new ObjectSet(); $this->connectTime = time(); + $this->lastUpdateTimeNs = hrtime(true); $this->setHandler(new SessionStartPacketHandler( $this->server, @@ -1127,6 +1130,10 @@ class NetworkSession{ } public function tick() : void{ + $nowNs = hrtime(true); + $timeSinceLastUpdateNs = $nowNs - $this->lastUpdateTimeNs; + $this->lastUpdateTimeNs = $nowNs; + if($this->info === null){ if(time() >= $this->connectTime + 10){ $this->disconnect("Login timeout"); @@ -1148,6 +1155,15 @@ class NetworkSession{ } $this->flushSendBuffer(); - $this->incomingPacketBatchBudget = min($this->incomingPacketBatchBudget + self::INCOMING_PACKET_BATCH_PER_TICK, self::INCOMING_PACKET_BATCH_MAX_BUDGET); + $ticksSinceLastUpdate = intdiv($timeSinceLastUpdateNs, 50_000_000); + if($ticksSinceLastUpdate > 0){ + if($ticksSinceLastUpdate > 1){ + $this->logger->debug("Adding packet budget for $ticksSinceLastUpdate ticks (current budget is $this->incomingPacketBatchBudget)"); + } + $this->incomingPacketBatchBudget = min( + $this->incomingPacketBatchBudget + (self::INCOMING_PACKET_BATCH_PER_TICK * $ticksSinceLastUpdate), + self::INCOMING_PACKET_BATCH_MAX_BUDGET + ); + } } } From 6cecd690b22997ee1573beff907f137081d5adcc Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 7 Jan 2023 21:33:53 +0000 Subject: [PATCH 05/16] CS --- src/network/mcpe/NetworkSession.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index cbeab346a..9682b1f02 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -129,7 +129,9 @@ use function base64_encode; use function bin2hex; use function count; use function get_class; +use function hrtime; use function in_array; +use function intdiv; use function json_encode; use function ksort; use function min; From 267032cff996971d78e3a594903f103b849a2daa Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 8 Jan 2023 19:31:39 +0000 Subject: [PATCH 06/16] NetworkSession: do not rate limit packets if a debugging session is active --- src/network/mcpe/NetworkSession.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 9682b1f02..97528c819 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -358,10 +358,12 @@ class NetworkSession{ return; } - if($this->incomingPacketBatchBudget <= 0){ - throw new PacketHandlingException("Receiving packets too fast"); + if(!function_exists('xdebug_is_debugger_active') || !xdebug_is_debugger_active()){ + if($this->incomingPacketBatchBudget <= 0){ + throw new PacketHandlingException("Receiving packets too fast"); + } + $this->incomingPacketBatchBudget--; } - $this->incomingPacketBatchBudget--; if($this->cipher !== null){ Timings::$playerNetworkReceiveDecrypt->startTiming(); From dd355c58d860a398d877bf96f476eb7db0db1a36 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 8 Jan 2023 19:35:43 +0000 Subject: [PATCH 07/16] NetworkSession: fix CS --- src/network/mcpe/NetworkSession.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 97528c819..3faf24720 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -128,6 +128,7 @@ use function array_values; use function base64_encode; use function bin2hex; use function count; +use function function_exists; use function get_class; use function hrtime; use function in_array; @@ -141,6 +142,7 @@ use function strtolower; use function substr; use function time; use function ucfirst; +use function xdebug_is_debugger_active; use const JSON_THROW_ON_ERROR; use const SORT_NUMERIC; From 0233e74f4fddaceb47036cc8d7e232d6f3b3a773 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 8 Jan 2023 19:45:14 +0000 Subject: [PATCH 08/16] NetworkSession: micro optimisation - do not check if a debugger is active unless the packet limit is exceeded --- src/network/mcpe/NetworkSession.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 3faf24720..ee95d6122 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -360,12 +360,16 @@ class NetworkSession{ return; } - if(!function_exists('xdebug_is_debugger_active') || !xdebug_is_debugger_active()){ - if($this->incomingPacketBatchBudget <= 0){ + if($this->incomingPacketBatchBudget <= 0){ + if(!function_exists('xdebug_is_debugger_active') || !xdebug_is_debugger_active()){ throw new PacketHandlingException("Receiving packets too fast"); + }else{ + //when a debugging session is active, the server may halt at any point for an indefinite length of time, + //in which time the client will continue to send packets + $this->incomingPacketBatchBudget = self::INCOMING_PACKET_BATCH_MAX_BUDGET; } - $this->incomingPacketBatchBudget--; } + $this->incomingPacketBatchBudget--; if($this->cipher !== null){ Timings::$playerNetworkReceiveDecrypt->startTiming(); From 52b6f1a492de260556852763c33d7bb5812fa793 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 8 Jan 2023 20:23:15 +0000 Subject: [PATCH 09/16] Release 4.12.7 --- changelogs/4.12.md | 9 ++++++++- src/VersionInfo.php | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/changelogs/4.12.md b/changelogs/4.12.md index 065c9c5dc..77f30f554 100644 --- a/changelogs/4.12.md +++ b/changelogs/4.12.md @@ -55,4 +55,11 @@ Released 6th January 2023. Released 7th January 2023. ## Changes -- Added a new security measure to `NetworkSession` to detect and ban players who flood the server with packets. \ No newline at end of file +- Added a new security measure to `NetworkSession` to detect and ban players who flood the server with packets. + +# 4.12.7 +Released 8th January 2023. + +## Fixes +- Fixed players getting kicked when the server lags for too long. +- Fixed players getting kicked when a debugging session is active and a breakpoint is hit. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 317f0b5e6..65b86da3b 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.12.7"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From fc77b14760b3abcf58a02ce2cafa74d57558fd98 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 8 Jan 2023 20:23:18 +0000 Subject: [PATCH 10/16] 4.12.8 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 65b86da3b..94294157a 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.12.7"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.12.8"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From bb3f87f862781bdb55b946b99476521e14294eb6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 9 Jan 2023 00:00:39 +0000 Subject: [PATCH 11/16] NetworkSession: allow 2 batches per tick apparently InventoryTransactionPacket may arrive outside of the normal update cycle, since it's prioritized to reduce latency. --- src/network/mcpe/NetworkSession.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index ee95d6122..7e8ca2dd8 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -147,7 +147,7 @@ use const JSON_THROW_ON_ERROR; use const SORT_NUMERIC; class NetworkSession{ - private const INCOMING_PACKET_BATCH_PER_TICK = 2; //we should normally see only 1 per tick - 2 allows recovery of the budget after a lag spike + private const INCOMING_PACKET_BATCH_PER_TICK = 2; //usually max 1 per tick, but transactions may arrive separately private const INCOMING_PACKET_BATCH_MAX_BUDGET = 100; //enough to account for a 5-second lag spike /** @@ -1171,7 +1171,7 @@ class NetworkSession{ $this->logger->debug("Adding packet budget for $ticksSinceLastUpdate ticks (current budget is $this->incomingPacketBatchBudget)"); } $this->incomingPacketBatchBudget = min( - $this->incomingPacketBatchBudget + (self::INCOMING_PACKET_BATCH_PER_TICK * $ticksSinceLastUpdate), + $this->incomingPacketBatchBudget + (self::INCOMING_PACKET_BATCH_PER_TICK * 2 * $ticksSinceLastUpdate), self::INCOMING_PACKET_BATCH_MAX_BUDGET ); } From 992cb06da61ca76f4b3958a210a421c61ed047d8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 9 Jan 2023 00:01:56 +0000 Subject: [PATCH 12/16] NetworkSession: fixed rate limit not being increased correctly on Windows due to the 15ms scheduler interval, the server will often sleep 45ms instead of 50ms, which causes the budget not to get updated. --- src/network/mcpe/NetworkSession.php | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 7e8ca2dd8..be2158f55 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -159,6 +159,7 @@ class NetworkSession{ * @see self::INCOMING_PACKET_BATCH_MAX_BUDGET */ private int $incomingPacketBatchBudget = self::INCOMING_PACKET_BATCH_MAX_BUDGET; + private int $lastPacketBudgetUpdateTimeNs; private \PrefixedLogger $logger; private ?Player $player = null; @@ -197,8 +198,6 @@ class NetworkSession{ */ private ObjectSet $disposeHooks; - private int $lastUpdateTimeNs; - public function __construct( private Server $server, private NetworkSessionManager $manager, @@ -219,7 +218,7 @@ class NetworkSession{ $this->disposeHooks = new ObjectSet(); $this->connectTime = time(); - $this->lastUpdateTimeNs = hrtime(true); + $this->lastPacketBudgetUpdateTimeNs = hrtime(true); $this->setHandler(new SessionStartPacketHandler( $this->server, @@ -1140,10 +1139,6 @@ class NetworkSession{ } public function tick() : void{ - $nowNs = hrtime(true); - $timeSinceLastUpdateNs = $nowNs - $this->lastUpdateTimeNs; - $this->lastUpdateTimeNs = $nowNs; - if($this->info === null){ if(time() >= $this->connectTime + 10){ $this->disconnect("Login timeout"); @@ -1165,15 +1160,16 @@ class NetworkSession{ } $this->flushSendBuffer(); - $ticksSinceLastUpdate = intdiv($timeSinceLastUpdateNs, 50_000_000); - if($ticksSinceLastUpdate > 0){ - if($ticksSinceLastUpdate > 1){ - $this->logger->debug("Adding packet budget for $ticksSinceLastUpdate ticks (current budget is $this->incomingPacketBatchBudget)"); - } + + $nowNs = hrtime(true); + $timeSinceLastUpdateNs = $nowNs - $this->lastPacketBudgetUpdateTimeNs; + if($timeSinceLastUpdateNs > 50_000_000){ + $ticksSinceLastUpdate = intdiv($timeSinceLastUpdateNs, 50_000_000); $this->incomingPacketBatchBudget = min( $this->incomingPacketBatchBudget + (self::INCOMING_PACKET_BATCH_PER_TICK * 2 * $ticksSinceLastUpdate), self::INCOMING_PACKET_BATCH_MAX_BUDGET ); + $this->lastPacketBudgetUpdateTimeNs = $nowNs; } } } From bb7df60a4d6a26bffefa9fc5547a10b68bde0750 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 9 Jan 2023 00:04:40 +0000 Subject: [PATCH 13/16] Release 4.12.8 --- changelogs/4.12.md | 9 ++++++++- src/VersionInfo.php | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/changelogs/4.12.md b/changelogs/4.12.md index 77f30f554..ab233e6ca 100644 --- a/changelogs/4.12.md +++ b/changelogs/4.12.md @@ -62,4 +62,11 @@ Released 8th January 2023. ## Fixes - Fixed players getting kicked when the server lags for too long. -- Fixed players getting kicked when a debugging session is active and a breakpoint is hit. \ No newline at end of file +- Fixed players getting kicked when a debugging session is active and a breakpoint is hit. + +# 4.12.8 +Released 9th January 2023. + +## Fixes +- Fixed players getting kicked during PvP. +- Fixed players randomly getting kicked on Windows (improper rate limit handling wrt. 15ms timer resolution). \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 94294157a..a7346a476 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.12.8"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From f7930a3a0b742120f6fa7d1464ce05618cf1aa15 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 9 Jan 2023 00:04:40 +0000 Subject: [PATCH 14/16] 4.12.9 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a7346a476..90e4b50d0 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.12.8"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.12.9"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){ From a47aa50477e6a60c4eeaec7f185c1bffdaae103b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 Jan 2023 18:59:18 +0000 Subject: [PATCH 15/16] Update composer dependencies --- composer.json | 2 +- composer.lock | 127 +++++++++++++++++++++++++++----------------------- 2 files changed, 70 insertions(+), 59 deletions(-) diff --git a/composer.json b/composer.json index 68a22e7f1..0e1db9747 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.7", + "phpstan/phpstan": "1.9.10", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index a2f6c207e..025337ad8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "76c6b5521d8f88d9070e8dec1c0ae144", + "content-hash": "14f22331e4a45935b2b2134031eaa47e", "packages": [ { "name": "adhocore/json-comment", @@ -852,42 +852,53 @@ }, { "name": "ramsey/collection", - "version": "1.2.2", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "url": "https://api.github.com/repos/ramsey/collection/zipball/ad7475d1c9e70b190ecffc58f2d989416af339b4", + "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4", "shasum": "" }, "require": { - "php": "^7.3 || ^8", + "php": "^7.4 || ^8.0", "symfony/polyfill-php81": "^1.23" }, "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fakerphp/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.8", - "mockery/mockery": "^1.3", + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5 || ^9", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.4" + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" }, "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, "autoload": { "psr-4": { "Ramsey\\Collection\\": "src/" @@ -915,7 +926,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.2" + "source": "https://github.com/ramsey/collection/tree/1.3.0" }, "funding": [ { @@ -927,27 +938,27 @@ "type": "tidelift" } ], - "time": "2021-10-10T03:01:02+00:00" + "time": "2022-12-27T19:12:24+00:00" }, { "name": "ramsey/uuid", - "version": "4.6.0", + "version": "4.7.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f" + "reference": "433b2014e3979047db08a17a205f410ba3869cf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/ad63bc700e7d021039e30ce464eba384c4a1d40f", - "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/433b2014e3979047db08a17a205f410ba3869cf2", + "reference": "433b2014e3979047db08a17a205f410ba3869cf2", "shasum": "" }, "require": { "brick/math": "^0.8.8 || ^0.9 || ^0.10", "ext-json": "*", "php": "^8.0", - "ramsey/collection": "^1.0" + "ramsey/collection": "^1.2 || ^2.0" }, "replace": { "rhumsaa/uuid": "self.version" @@ -1007,7 +1018,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.6.0" + "source": "https://github.com/ramsey/uuid/tree/4.7.3" }, "funding": [ { @@ -1019,7 +1030,7 @@ "type": "tidelift" } ], - "time": "2022-11-05T23:03:38+00:00" + "time": "2023-01-12T18:13:24+00:00" }, { "name": "symfony/filesystem", @@ -1525,30 +1536,30 @@ "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^9 || ^11", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^0.16 || ^1", "phpstan/phpstan": "^1.4", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { @@ -1575,7 +1586,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" }, "funding": [ { @@ -1591,7 +1602,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2022-12-30T00:15:36+00:00" }, { "name": "myclabs/deep-copy", @@ -1821,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.7", + "version": "1.9.10", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "0501435cd342eac7664bd62155b1ef907fc60b6f" + "reference": "5d4fe21376ba8ad66ce147fbc89e4fb4b7728de4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0501435cd342eac7664bd62155b1ef907fc60b6f", - "reference": "0501435cd342eac7664bd62155b1ef907fc60b6f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5d4fe21376ba8ad66ce147fbc89e4fb4b7728de4", + "reference": "5d4fe21376ba8ad66ce147fbc89e4fb4b7728de4", "shasum": "" }, "require": { @@ -1860,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.7" + "source": "https://github.com/phpstan/phpstan/tree/1.9.10" }, "funding": [ { @@ -1876,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-01-04T21:59:57+00:00" + "time": "2023-01-12T12:57:25+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -1932,21 +1943,21 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.4.4", + "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "23e5f377ee6395a1a04842d3d6ed4bd25e7b44a6" + "reference": "361f75b06066f3fdaba87c1f57bdb1ffc28d6f1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/23e5f377ee6395a1a04842d3d6ed4bd25e7b44a6", - "reference": "23e5f377ee6395a1a04842d3d6ed4bd25e7b44a6", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/361f75b06066f3fdaba87c1f57bdb1ffc28d6f1d", + "reference": "361f75b06066f3fdaba87c1f57bdb1ffc28d6f1d", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.8.6" + "phpstan/phpstan": "^1.9.7" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -1974,22 +1985,22 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.4.4" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.4.5" }, - "time": "2022-09-21T11:38:17+00:00" + "time": "2023-01-11T14:16:29+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.22", + "version": "9.2.23", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df" + "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e4bf60d2220b4baaa0572986b5d69870226b06df", - "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", + "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", "shasum": "" }, "require": { @@ -2045,7 +2056,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.22" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23" }, "funding": [ { @@ -2053,7 +2064,7 @@ "type": "github" } ], - "time": "2022-12-18T16:40:55+00:00" + "time": "2022-12-28T12:41:10+00:00" }, { "name": "phpunit/php-file-iterator", From c5056e0a4368d150d398157962f257c1aa98f70b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 Jan 2023 19:01:57 +0000 Subject: [PATCH 16/16] phpstan 1.9.11 --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 0e1db9747..1b2679e71 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.10", + "phpstan/phpstan": "1.9.11", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 025337ad8..64e8d1cea 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "14f22331e4a45935b2b2134031eaa47e", + "content-hash": "d5ea4a4f41bf80636b678e6d3d06eac0", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.10", + "version": "1.9.11", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "5d4fe21376ba8ad66ce147fbc89e4fb4b7728de4" + "reference": "60f3d68481eef216199eae7a2603cd5fe124d464" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5d4fe21376ba8ad66ce147fbc89e4fb4b7728de4", - "reference": "5d4fe21376ba8ad66ce147fbc89e4fb4b7728de4", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/60f3d68481eef216199eae7a2603cd5fe124d464", + "reference": "60f3d68481eef216199eae7a2603cd5fe124d464", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.10" + "source": "https://github.com/phpstan/phpstan/tree/1.9.11" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-01-12T12:57:25+00:00" + "time": "2023-01-12T14:04:13+00:00" }, { "name": "phpstan/phpstan-phpunit",