From e36e73b9cf21921dee8a3ada323653563fbd17c0 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Tue, 18 Aug 2020 12:14:03 +0200 Subject: [PATCH 01/22] stop using the deprecated at() PHPUnit matcher --- .../Factory/CachingFactoryDecoratorTest.php | 142 +++++------------- .../CheckLdapCredentialsListenerTest.php | 12 +- .../Tests/Transport/ConnectionTest.php | 53 ++++--- 3 files changed, 75 insertions(+), 132 deletions(-) diff --git a/src/Symfony/Component/Form/Tests/ChoiceList/Factory/CachingFactoryDecoratorTest.php b/src/Symfony/Component/Form/Tests/ChoiceList/Factory/CachingFactoryDecoratorTest.php index 5698dfe627e08..aa73fcbfe3849 100644 --- a/src/Symfony/Component/Form/Tests/ChoiceList/Factory/CachingFactoryDecoratorTest.php +++ b/src/Symfony/Component/Form/Tests/ChoiceList/Factory/CachingFactoryDecoratorTest.php @@ -137,14 +137,10 @@ public function testCreateFromChoicesSameValueClosure() $list2 = new ArrayChoiceList([]); $closure = function () {}; - $this->decoratedFactory->expects($this->at(0)) - ->method('createListFromChoices') - ->with($choices, $closure) - ->willReturn($list1); - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createListFromChoices') ->with($choices, $closure) - ->willReturn($list2); + ->willReturnOnConsecutiveCalls($list1, $list2); $this->assertSame($list1, $this->factory->createListFromChoices($choices, $closure)); $this->assertSame($list2, $this->factory->createListFromChoices($choices, $closure)); @@ -194,14 +190,10 @@ public function testCreateFromChoicesSameFilterClosure() $list2 = new ArrayChoiceList([]); $filter = function () {}; - $this->decoratedFactory->expects($this->at(0)) - ->method('createListFromChoices') - ->with($choices, null, $filter) - ->willReturn($list1); - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createListFromChoices') ->with($choices, null, $filter) - ->willReturn($list2); + ->willReturnOnConsecutiveCalls($list1, $list2); $this->assertSame($list1, $this->factory->createListFromChoices($choices, null, $filter)); $this->assertSame($list2, $this->factory->createListFromChoices($choices, null, $filter)); @@ -232,14 +224,13 @@ public function testCreateFromChoicesDifferentFilterClosure() $closure1 = function () {}; $closure2 = function () {}; - $this->decoratedFactory->expects($this->at(0)) - ->method('createListFromChoices') - ->with($choices, null, $closure1) - ->willReturn($list1); - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createListFromChoices') - ->with($choices, null, $closure2) - ->willReturn($list2); + ->withConsecutive( + [$choices, null, $closure1], + [$choices, null, $closure2] + ) + ->willReturnOnConsecutiveCalls($list1, $list2); $this->assertSame($list1, $this->factory->createListFromChoices($choices, null, $closure1)); $this->assertSame($list2, $this->factory->createListFromChoices($choices, null, $closure2)); @@ -251,16 +242,10 @@ public function testCreateFromLoaderSameLoader() $list = new ArrayChoiceList([]); $list2 = new ArrayChoiceList([]); - $this->decoratedFactory->expects($this->at(0)) - ->method('createListFromLoader') - ->with($loader) - ->willReturn($list) - ; - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createListFromLoader') ->with($loader) - ->willReturn($list2) - ; + ->willReturnOnConsecutiveCalls($list, $list2); $this->assertSame($list, $this->factory->createListFromLoader($loader)); $this->assertSame($list2, $this->factory->createListFromLoader($loader)); @@ -309,16 +294,10 @@ public function testCreateFromLoaderSameValueClosure() $list2 = new ArrayChoiceList([]); $closure = function () {}; - $this->decoratedFactory->expects($this->at(0)) - ->method('createListFromLoader') - ->with($loader, $closure) - ->willReturn($list) - ; - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createListFromLoader') ->with($loader, $closure) - ->willReturn($list2) - ; + ->willReturnOnConsecutiveCalls($list, $list2); $this->assertSame($list, $this->factory->createListFromLoader(ChoiceList::loader($type, $loader), $closure)); $this->assertSame($list2, $this->factory->createListFromLoader(ChoiceList::loader($type, $this->createMock(ChoiceLoaderInterface::class)), $closure)); @@ -376,16 +355,10 @@ public function testCreateFromLoaderSameFilterClosure() $list2 = new ArrayChoiceList([]); $closure = function () {}; - $this->decoratedFactory->expects($this->at(0)) - ->method('createListFromLoader') - ->with($loader, null, $closure) - ->willReturn($list) - ; - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createListFromLoader') ->with($loader, null, $closure) - ->willReturn($list2) - ; + ->willReturnOnConsecutiveCalls($list, $list2); $this->assertSame($list, $this->factory->createListFromLoader(ChoiceList::loader($type, $loader), null, $closure)); $this->assertSame($list2, $this->factory->createListFromLoader(ChoiceList::loader($type, $this->createMock(ChoiceLoaderInterface::class)), null, $closure)); @@ -425,14 +398,13 @@ public function testCreateFromLoaderDifferentFilterClosure() $closure1 = function () {}; $closure2 = function () {}; - $this->decoratedFactory->expects($this->at(0)) - ->method('createListFromLoader') - ->with($loader, null, $closure1) - ->willReturn($list1); - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createListFromLoader') - ->with($loader, null, $closure2) - ->willReturn($list2); + ->withConsecutive( + [$loader, null, $closure1], + [$loader, null, $closure2] + ) + ->willReturnOnConsecutiveCalls($list1, $list2); $this->assertSame($list1, $this->factory->createListFromLoader(ChoiceList::loader($type, $loader), null, $closure1)); $this->assertSame($list2, $this->factory->createListFromLoader(ChoiceList::loader($type, $this->createMock(ChoiceLoaderInterface::class)), null, $closure2)); @@ -445,16 +417,10 @@ public function testCreateViewSamePreferredChoices() $view = new ChoiceListView(); $view2 = new ChoiceListView(); - $this->decoratedFactory->expects($this->at(0)) - ->method('createView') - ->with($list, $preferred) - ->willReturn($view) - ; - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createView') ->with($list, $preferred) - ->willReturn($view2) - ; + ->willReturnOnConsecutiveCalls($view, $view2); $this->assertSame($view, $this->factory->createView($list, $preferred)); $this->assertSame($view2, $this->factory->createView($list, $preferred)); @@ -504,16 +470,10 @@ public function testCreateViewSamePreferredChoicesClosure() $view = new ChoiceListView(); $view2 = new ChoiceListView(); - $this->decoratedFactory->expects($this->at(0)) - ->method('createView') - ->with($list, $preferred) - ->willReturn($view) - ; - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createView') ->with($list, $preferred) - ->willReturn($view2) - ; + ->willReturnOnConsecutiveCalls($view, $view2); $this->assertSame($view, $this->factory->createView($list, $preferred)); $this->assertSame($view2, $this->factory->createView($list, $preferred)); @@ -563,16 +523,10 @@ public function testCreateViewSameLabelClosure() $view = new ChoiceListView(); $view2 = new ChoiceListView(); - $this->decoratedFactory->expects($this->at(0)) - ->method('createView') - ->with($list, null, $labels) - ->willReturn($view) - ; - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createView') ->with($list, null, $labels) - ->willReturn($view2) - ; + ->willReturnOnConsecutiveCalls($view, $view2); $this->assertSame($view, $this->factory->createView($list, null, $labels)); $this->assertSame($view2, $this->factory->createView($list, null, $labels)); @@ -622,16 +576,10 @@ public function testCreateViewSameIndexClosure() $view = new ChoiceListView(); $view2 = new ChoiceListView(); - $this->decoratedFactory->expects($this->at(0)) - ->method('createView') - ->with($list, null, null, $index) - ->willReturn($view) - ; - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createView') ->with($list, null, null, $index) - ->willReturn($view2) - ; + ->willReturnOnConsecutiveCalls($view, $view2); $this->assertSame($view, $this->factory->createView($list, null, null, $index)); $this->assertSame($view2, $this->factory->createView($list, null, null, $index)); @@ -681,16 +629,10 @@ public function testCreateViewSameGroupByClosure() $view = new ChoiceListView(); $view2 = new ChoiceListView(); - $this->decoratedFactory->expects($this->at(0)) - ->method('createView') - ->with($list, null, null, null, $groupBy) - ->willReturn($view) - ; - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createView') ->with($list, null, null, null, $groupBy) - ->willReturn($view2) - ; + ->willReturnOnConsecutiveCalls($view, $view2); $this->assertSame($view, $this->factory->createView($list, null, null, null, $groupBy)); $this->assertSame($view2, $this->factory->createView($list, null, null, null, $groupBy)); @@ -740,16 +682,10 @@ public function testCreateViewSameAttributes() $view = new ChoiceListView(); $view2 = new ChoiceListView(); - $this->decoratedFactory->expects($this->at(0)) - ->method('createView') - ->with($list, null, null, null, null, $attr) - ->willReturn($view) - ; - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createView') ->with($list, null, null, null, null, $attr) - ->willReturn($view2) - ; + ->willReturnOnConsecutiveCalls($view, $view2); $this->assertSame($view, $this->factory->createView($list, null, null, null, null, $attr)); $this->assertSame($view2, $this->factory->createView($list, null, null, null, null, $attr)); @@ -798,16 +734,10 @@ public function testCreateViewSameAttributesClosure() $view = new ChoiceListView(); $view2 = new ChoiceListView(); - $this->decoratedFactory->expects($this->at(0)) - ->method('createView') - ->with($list, null, null, null, null, $attr) - ->willReturn($view) - ; - $this->decoratedFactory->expects($this->at(1)) + $this->decoratedFactory->expects($this->exactly(2)) ->method('createView') ->with($list, null, null, null, null, $attr) - ->willReturn($view2) - ; + ->willReturnOnConsecutiveCalls($view, $view2); $this->assertSame($view, $this->factory->createView($list, null, null, null, null, $attr)); $this->assertSame($view2, $this->factory->createView($list, null, null, null, null, $attr)); diff --git a/src/Symfony/Component/Ldap/Tests/Security/CheckLdapCredentialsListenerTest.php b/src/Symfony/Component/Ldap/Tests/Security/CheckLdapCredentialsListenerTest.php index abc964eb851f1..ba37992092363 100644 --- a/src/Symfony/Component/Ldap/Tests/Security/CheckLdapCredentialsListenerTest.php +++ b/src/Symfony/Component/Ldap/Tests/Security/CheckLdapCredentialsListenerTest.php @@ -152,7 +152,11 @@ public function testQueryForDn() $query = $this->getMockBuilder(QueryInterface::class)->getMock(); $query->expects($this->once())->method('execute')->willReturn($collection); - $this->ldap->expects($this->at(0))->method('bind')->with('elsa', 'test1234A$'); + $this->ldap + ->method('bind') + ->withConsecutive( + ['elsa', 'test1234A$'] + ); $this->ldap->expects($this->any())->method('escape')->with('Wouter', '', LdapInterface::ESCAPE_FILTER)->willReturn('wouter'); $this->ldap->expects($this->once())->method('query')->with('{username}', 'wouter_test')->willReturn($query); @@ -170,7 +174,11 @@ public function testEmptyQueryResultShouldThrowAnException() $query = $this->getMockBuilder(QueryInterface::class)->getMock(); $query->expects($this->once())->method('execute')->willReturn($collection); - $this->ldap->expects($this->at(0))->method('bind')->with('elsa', 'test1234A$'); + $this->ldap + ->method('bind') + ->withConsecutive( + ['elsa', 'test1234A$'] + ); $this->ldap->expects($this->once())->method('query')->willReturn($query); $listener = $this->createListener(); diff --git a/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/ConnectionTest.php b/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/ConnectionTest.php index 8d1ccdfe4403d..eda709d7d12cc 100644 --- a/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/ConnectionTest.php +++ b/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/ConnectionTest.php @@ -198,31 +198,36 @@ public function testKeepGettingPendingMessages() ->method('getQueueUrl') ->with(['QueueName' => 'queue', 'QueueOwnerAWSAccountId' => 123]) ->willReturn(ResultMockFactory::create(GetQueueUrlResult::class, ['QueueUrl' => 'https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue'])); - $client->expects($this->at(1)) + $client->expects($this->exactly(2)) ->method('receiveMessage') - ->with([ - 'QueueUrl' => 'https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue', - 'MaxNumberOfMessages' => 9, - 'WaitTimeSeconds' => 20, - 'MessageAttributeNames' => ['All'], - 'VisibilityTimeout' => null, - ]) - ->willReturn(ResultMockFactory::create(ReceiveMessageResult::class, ['Messages' => [ - new Message(['MessageId' => 1, 'Body' => 'this is a test']), - new Message(['MessageId' => 2, 'Body' => 'this is a test']), - new Message(['MessageId' => 3, 'Body' => 'this is a test']), - ]])); - $client->expects($this->at(2)) - ->method('receiveMessage') - ->with([ - 'QueueUrl' => 'https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue', - 'MaxNumberOfMessages' => 9, - 'WaitTimeSeconds' => 20, - 'MessageAttributeNames' => ['All'], - 'VisibilityTimeout' => null, - ]) - ->willReturn(ResultMockFactory::create(ReceiveMessageResult::class, ['Messages' => [ - ]])); + ->withConsecutive( + [ + [ + 'QueueUrl' => 'https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue', + 'MaxNumberOfMessages' => 9, + 'WaitTimeSeconds' => 20, + 'MessageAttributeNames' => ['All'], + 'VisibilityTimeout' => null, + ], + ], + [ + [ + 'QueueUrl' => 'https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue', + 'MaxNumberOfMessages' => 9, + 'WaitTimeSeconds' => 20, + 'MessageAttributeNames' => ['All'], + 'VisibilityTimeout' => null, + ], + ] + ) + ->willReturnOnConsecutiveCalls( + ResultMockFactory::create(ReceiveMessageResult::class, ['Messages' => [ + new Message(['MessageId' => 1, 'Body' => 'this is a test']), + new Message(['MessageId' => 2, 'Body' => 'this is a test']), + new Message(['MessageId' => 3, 'Body' => 'this is a test']), + ]]), + ResultMockFactory::create(ReceiveMessageResult::class, ['Messages' => []]) + ); $connection = new Connection(['queue_name' => 'queue', 'account' => 123, 'auto_setup' => false], $client); $this->assertNotNull($connection->get()); From 0defe5380b01032b73929f1a744b1d657f1ab9bf Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 31 Aug 2020 07:51:46 +0200 Subject: [PATCH 02/22] Update CHANGELOG for 3.4.44 --- CHANGELOG-3.4.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG-3.4.md b/CHANGELOG-3.4.md index a8fbf76a367ca..e32e4d36d74b9 100644 --- a/CHANGELOG-3.4.md +++ b/CHANGELOG-3.4.md @@ -7,6 +7,24 @@ in 3.4 minor versions. To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v3.4.0...v3.4.1 +* 3.4.44 (2020-08-31) + + * bug #37949 [Yaml] fix more numeric cases changing in PHP 8 (xabbuh) + * bug #37921 [Yaml] account for is_numeric() behavior changes in PHP 8 (xabbuh) + * bug #37912 [ExpressionLanguage] fix passing arguments to call_user_func_array() on PHP 8 (xabbuh) + * bug #37853 [Validator] ensure that the validator is a mock object for backwards-compatibility (xabbuh) + * bug #37845 [Serializer] Fix variadic support when using type hints (fabpot) + * bug #37725 [Form] Fix Guess phpdoc return type (franmomu) + * bug #37771 Use PHPUnit 9.3 on php 8 (derrabus) + * bug #35843 [Validator] Add target guards for Composite nested constraints (ogizanagi) + * bug #37744 [Yaml] Fix for #36624; Allow PHP constant as first key in block (jnye) + * bug #37767 [Form] fix mapping errors from unmapped forms (xabbuh) + * bug #37763 Fix deprecated libxml_disable_entity_loader (jderusse) + * bug #37774 [Console] Make sure we pass a numeric array of arguments to call_user_func_array() (derrabus) + * bug #37701 [Serializer] Fix that it will never reach DOMNode (TNAJanssen) + * bug #37671 [Cache] fix saving no-expiry items with ArrayAdapter (philipp-kolesnikov) + * bug #37700 [VarDumper] Improve previous fix on light array coloration (l-vo) + * 3.4.43 (2020-07-24) * bug #37635 [Cache] fix catching auth errors (nicolas-grekas) From 7981fe0a0467a475e1f214178ba485473cda0ef1 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 31 Aug 2020 07:52:54 +0200 Subject: [PATCH 03/22] Update CONTRIBUTORS for 3.4.44 --- CONTRIBUTORS.md | 167 +++++++++++++++++++++++++++++------------------- 1 file changed, 102 insertions(+), 65 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 7b94a4e1e090e..2f0057002ffac 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -13,8 +13,8 @@ Symfony is the result of the work of many people who made the code better - Christophe Coevoet (stof) - Kévin Dunglas (dunglas) - Jordi Boggiano (seldaek) - - Victor Berchet (victor) - Maxime Steinhausser (ogizanagi) + - Victor Berchet (victor) - Grégoire Pineau (lyrixx) - Ryan Weaver (weaverryan) - Javier Eguiluz (javier.eguiluz) @@ -33,11 +33,11 @@ Symfony is the result of the work of many people who made the code better - Pascal Borreli (pborreli) - Joseph Bielawski (stloyd) - Karma Dordrak (drak) - - Lukas Kahwe Smith (lsmith) - Jules Pietri (heah) + - Lukas Kahwe Smith (lsmith) + - Jérémy DERUSSÉ (jderusse) - Martin Hasoň (hason) - Hamza Amrouche (simperfit) - - Jérémy DERUSSÉ (jderusse) - Jeremy Mikola (jmikola) - Jean-François Simon (jfsimon) - Benjamin Eberlei (beberlei) @@ -53,6 +53,7 @@ Symfony is the result of the work of many people who made the code better - Pierre du Plessis (pierredup) - Alexandre Salomé (alexandresalome) - William Durand (couac) + - Valentin Udaltsov (vudaltsov) - ornicar - Dany Maillard (maidmaid) - Francis Besset (francisbesset) @@ -60,10 +61,9 @@ Symfony is the result of the work of many people who made the code better - Alexander Mols (asm89) - Konstantin Myakshin (koc) - Grégoire Paris (greg0ire) - - Valentin Udaltsov (vudaltsov) - Bulat Shakirzyanov (avalanche123) - - Kevin Bond (kbond) - Jan Schädlich (jschaedl) + - Kevin Bond (kbond) - Saša Stamenković (umpirsky) - Peter Rehm (rpet) - Gabriel Ostrolucký (gadelat) @@ -87,21 +87,22 @@ Symfony is the result of the work of many people who made the code better - Christian Raue - Douglas Greenshields (shieldo) - Arnout Boks (aboks) + - Jérôme Tamarelle (gromnan) - Deni - Henrik Westphal (snc) - Dariusz Górecki (canni) - - David Buchmann (dbu) - - Jérôme Tamarelle (gromnan) - Graham Campbell (graham) + - David Buchmann (dbu) - Dariusz Ruminski + - Fran Moreno (franmomu) - Lee McDermott - Brandon Turner - Luis Cordova (cordoval) - Daniel Holmes (dholmes) - Toni Uebernickel (havvg) - - Fran Moreno (franmomu) - Bart van den Burg (burgov) - Jordan Alliot (jalliot) + - Laurent VOULLEMIER (lvo) - John Wards (johnwards) - Antoine Hérault (herzult) - Paráda József (paradajozsef) @@ -114,14 +115,15 @@ Symfony is the result of the work of many people who made the code better - Chris Wilkinson (thewilkybarkid) - Brice BERNARD (brikou) - Jérôme Vasseur (jvasseur) + - Alex Pott - marc.weistroff - Tomáš Votruba (tomas_votruba) - Peter Kokot (maastermedia) - - Alex Pott - lenar - Alexander Schwenn (xelaris) - Włodzimierz Gajda (gajdaw) - Adrien Brault (adrienbrault) + - Massimiliano Arione (garak) - Jacob Dreesen (jdreesen) - Florian Voutzinos (florianv) - Teoh Han Hui (teohhanhui) @@ -132,26 +134,26 @@ Symfony is the result of the work of many people who made the code better - Daniel Wehner (dawehner) - Tugdual Saunier (tucksaun) - excelwebzone - - Massimiliano Arione (garak) - Gordon Franke (gimler) - Joel Wurtz (brouznouf) - - Fabien Pennequin (fabienpennequin) - - Théo FIDRY (theofidry) - Alexander Schranz (alexander-schranz) - Przemysław Bogusz (przemyslaw-bogusz) + - Fabien Pennequin (fabienpennequin) + - Théo FIDRY (theofidry) - Eric GELOEN (gelo) + - Antoine Makdessi (amakdessi) - Lars Strojny (lstrojny) + - Julien Falque (julienfalque) - Jannik Zschiesche (apfelbox) + - jeremyFreeAgent (jeremyfreeagent) - Robert Schönthal (digitalkaoz) - Gregor Harlan (gharlan) - Florian Lonqueu-Brochard (florianlb) - Gabriel Caruso (carusogabriel) - Stefano Sala (stefano.sala) - Evgeniy (ewgraf) - - Julien Falque (julienfalque) - Vincent AUBERT (vincent) - Juti Noppornpitak (shiroyuki) - - Laurent VOULLEMIER (lvo) - Anthony MARTIN (xurudragon) - Tigran Azatyan (tigranazatyan) - Sebastian Hörl (blogsh) @@ -172,7 +174,6 @@ Symfony is the result of the work of many people who made the code better - Rafael Dohms (rdohms) - jwdeitch - Ahmed TAILOULOUTE (ahmedtai) - - jeremyFreeAgent (jeremyfreeagent) - Mikael Pajunen - Arman Hosseini (arman) - Niels Keurentjes (curry684) @@ -184,10 +185,11 @@ Symfony is the result of the work of many people who made the code better - Rouven Weßling (realityking) - Jérôme Parmentier (lctrs) - Ben Davies (bendavies) + - Gary PEGEOT (gary-p) + - Matthieu Napoli (mnapoli) - Andreas Schempp (aschempp) - Clemens Tolboom - Helmer Aaviksoo - - Antoine M (amakdessi) - Hiromi Hishida (77web) - Matthieu Ouellette-Vachon (maoueh) - Michał Pipa (michal.pipa) @@ -199,9 +201,7 @@ Symfony is the result of the work of many people who made the code better - GDIBass - Samuel NELA (snela) - Saif (╯°□°)╯ (azjezz) - - Gary PEGEOT (gary-p) - James Halsall (jaitsu) - - Matthieu Napoli (mnapoli) - Florent Mata (fmata) - Warnar Boekkooi (boekkooi) - Dmitrii Chekaliuk (lazyhammer) @@ -220,6 +220,8 @@ Symfony is the result of the work of many people who made the code better - Dennis Benkert (denderello) - DQNEO - Andre Rømcke (andrerom) + - Fabien Bourigault (fbourigault) + - Smaine Milianni (ismail1432) - Mathias Arlaud (mtarld) - mcfedr (mcfedr) - Ruben Gonzalez (rubenrua) @@ -227,6 +229,7 @@ Symfony is the result of the work of many people who made the code better - Jan Rosier (rosier) - Andreas Braun - Mathieu Lemoine (lemoinem) + - Rémon van de Kamp (rpkamp) - Christian Schmidt - Andreas Hucks (meandmymonkey) - Tom Van Looy (tvlooy) @@ -238,7 +241,9 @@ Symfony is the result of the work of many people who made the code better - bronze1man - sun (sun) - Larry Garfield (crell) + - Leo Feyer (leofeyer) - Nikolay Labinskiy (e-moe) + - Tomas Norkūnas (norkunas) - Martin Schuhfuß (usefulthink) - apetitpa - Maxime Helias (maxhelias) @@ -251,9 +256,9 @@ Symfony is the result of the work of many people who made the code better - Hidde Wieringa (hiddewie) - Jeremy Livingston (jeremylivingston) - Michael Lee (zerustech) + - Dmitrii Poddubnyi (karser) - Matthieu Auger (matthieuauger) - Leszek Prabucki (l3l0) - - Fabien Bourigault (fbourigault) - François Zaninotto (fzaninotto) - Dustin Whittle (dustinwhittle) - jeff @@ -271,11 +276,8 @@ Symfony is the result of the work of many people who made the code better - Pascal Montoya - Julien Brochet (mewt) - François Pluchino (francoispluchino) - - Leo Feyer - Tristan Darricau (nicofuma) - Victor Bocharsky (bocharsky_bw) - - Tomas Norkūnas (norkunas) - - Smaine Milianni (ismail1432) - Marcel Beerta (mazen) - Christopher Hertel (chertel) - Ruud Kamphuis (ruudk) @@ -284,14 +286,17 @@ Symfony is the result of the work of many people who made the code better - Loïc Faugeron - dFayet - Marco Pivetta (ocramius) + - Antonio Pauletich (x-coder264) + - Jeroen Spee (jeroens) + - Olivier Dolbeau (odolbeau) - Rob Frawley 2nd (robfrawley) - julien pauli (jpauli) - Lorenz Schori - Sébastien Lavoie (lavoiesl) - Dariusz - - Dmitrii Poddubnyi (karser) - Michael Babker (mbabker) - Francois Zaninotto + - Colin O'Dell (colinodell) - Alexander Kotynia (olden) - Daniel Tschinder - Christian Schmidt @@ -305,7 +310,6 @@ Symfony is the result of the work of many people who made the code better - Maciej Malarz (malarzm) - Roman Marintšenko (inori) - Xavier Montaña Carreras (xmontana) - - Rémon van de Kamp (rpkamp) - Mickaël Andrieu (mickaelandrieu) - Xavier Perez - Arjen Brouwer (arjenjb) @@ -336,12 +340,11 @@ Symfony is the result of the work of many people who made the code better - Bob den Otter (bopp) - Thomas Schulz (king2500) - Frank de Jonge (frenkynet) - - Jeroen Spee (jeroens) - Nikita Konstantinov - Wodor Wodorski - - Olivier Dolbeau (odolbeau) + - Joe Bennett (kralos) - Thomas Lallement (raziel057) - - Colin O'Dell (colinodell) + - soyuka - Giorgio Premi - renanbr - Alex Rock (pierstoval) @@ -353,11 +356,11 @@ Symfony is the result of the work of many people who made the code better - Emanuele Panzeri (thepanz) - Kim Hemsø Rasmussen (kimhemsoe) - Alessandro Lai (jean85) + - Langlet Vincent (deviling) - Pascal Luna (skalpa) - Wouter Van Hecke - Peter Kruithof (pkruithof) - Michael Holm (hollo) - - Antonio Pauletich (x-coder264) - Arjen van der Meijden - Mathieu Lechat - Damien Alexandre (damienalexandre) @@ -367,6 +370,7 @@ Symfony is the result of the work of many people who made the code better - MatTheCat - Vilius Grigaliūnas - David Badura (davidbadura) + - Gocha Ossinkine (ossinkine) - Chad Sikorra (chadsikorra) - Alan Poulain (alanpoulain) - Chris Smith (cs278) @@ -391,6 +395,7 @@ Symfony is the result of the work of many people who made the code better - Emmanuel BORGES (eborges78) - Aurelijus Valeiša (aurelijus) - Jan Decavele (jandc) + - Chi-teck - Gustavo Piltcher - Jesse Rushlow (geeshoe) - Stepan Tanasiychuk (stfalcon) @@ -402,6 +407,7 @@ Symfony is the result of the work of many people who made the code better - Francesc Rosàs (frosas) - Romain Pierre (romain-pierre) - Julien Galenski (ruian) + - Thomas Landauer (thomas-landauer) - Michael Käfer (michael_kaefer) - Bongiraud Dominique - janschoenherr @@ -413,8 +419,10 @@ Symfony is the result of the work of many people who made the code better - Sebastien Morel (plopix) - Ricard Clau (ricardclau) - Mark Challoner (markchalloner) + - Ahmed Raafat - Philippe Segatori - Gennady Telegin (gtelegin) + - Thibaut Cheymol (tcheymol) - Erin Millard - Artur Melo (restless) - Matthew Lewinski (lewinski) @@ -423,7 +431,6 @@ Symfony is the result of the work of many people who made the code better - Nicolas LEFEVRE (nicoweb) - alquerci - Oleg Andreyev - - Langlet Vincent (deviling) - Mateusz Sip (mateusz_sip) - Francesco Levorato - Vitaliy Zakharov (zakharovvi) @@ -439,15 +446,17 @@ Symfony is the result of the work of many people who made the code better - Thomas Perez (scullwm) - Felix Labrecque - Yaroslav Kiliba + - Christian Scheb - Terje Bråten + - Gonzalo Vilaseca (gonzalovilaseca) - Daniel STANCU - Robbert Klarenbeek (robbertkl) - - soyuka - Eric Masoero (eric-masoero) - Ion Bazan (ionbazan) - Denis Brumann (dbrumann) - - Gocha Ossinkine (ossinkine) + - HypeMC - JhonnyL + - Clara van Miert - Haralan Dobrev (hkdobrev) - hossein zolfi (ocean) - Clément Gautier (clementgautier) @@ -513,7 +522,7 @@ Symfony is the result of the work of many people who made the code better - Sander Toonen (xatoo) - Anthon Pang (robocoder) - Marko Kaznovac (kaznovac) - - Thomas Landauer (thomas-landauer) + - Guilliam Xavier - Sébastien Santoro (dereckson) - Brian King - Michel Salib (michelsalib) @@ -526,8 +535,8 @@ Symfony is the result of the work of many people who made the code better - Jeanmonod David (jeanmonod) - Christopher Davis (chrisguitarguy) - Webnet team (webnet) - - Joe Bennett (kralos) - - Ahmed Raafat + - Marcin Szepczynski (czepol) + - Mohammad Emran Hasan (phpfour) - Farhad Safarov - Jan Schumann - Niklas Fiekas @@ -540,7 +549,9 @@ Symfony is the result of the work of many people who made the code better - Mihai Stancu - Ivan Nikolaev (destillat) - Gildas Quéméner (gquemener) + - Laurent Masforné (heisenberg) - Claude Khedhiri (ck-developer) + - YaFou - Desjardins Jérôme (jewome62) - Arturs Vonda - Josip Kruslin @@ -572,32 +583,32 @@ Symfony is the result of the work of many people who made the code better - Tim Goudriaan (codedmonkey) - Jonas Flodén (flojon) - Tobias Weichart - - Gonzalo Vilaseca (gonzalovilaseca) - Tarmo Leppänen (tarlepp) - Marcin Sikoń (marphi) + - Bohan Yang (brentybh) - Dominik Zogg (dominik.zogg) - Marek Pietrzak - Luc Vieillescazes (iamluc) - franek (franek) - Raulnet + - Marco Petersen (ocrampete16) - Christian Wahler - Giso Stallenberg (gisostallenberg) - Gintautas Miselis - Rob Bast - Roberto Espinoza (respinoza) - - HypeMC - Soufian EZ-ZANTAR (soezz) - Zander Baldwin - Adam Harvey - Anton Bakai - Martin Auswöger - - Christian Scheb - Rhodri Pugh (rodnaph) - battye - Sam Fleming (sam_fleming) - Alex Bakhturin - Patrick Reimers (preimers) - Pol Dellaiera (drupol) + - - insekticid - Alexander Obuhovich (aik099) - boombatower @@ -611,6 +622,7 @@ Symfony is the result of the work of many people who made the code better - Yoshio HANAWA - Jan van Thoor (janvt) - Gladhon + - Joshua Nye - Sebastian Bergmann - Miroslav Sustek - Pablo Díez (pablodip) @@ -696,12 +708,10 @@ Symfony is the result of the work of many people who made the code better - Lenar Lõhmus - Benjamin Laugueux (yzalis) - Zach Badgett (zachbadgett) - - Chi-teck - Aurélien Fredouelle - Pavel Campr (pcampr) - Andrii Dembitskyi - Johnny Robeson (johnny) - - Guilliam Xavier - Disquedur - Michiel Boeckaert (milio) - Geoffrey Tran (geoff) @@ -716,11 +726,15 @@ Symfony is the result of the work of many people who made the code better - Julien Maulny - Jean-Christophe Cuvelier [Artack] - Julien Montel (julienmgel) + - Mátyás Somfai (smatyas) + - Bastien DURAND (deamon) + - Ben Ramsey (ramsey) - Simon DELICATA - Artem Henvald (artemgenvald) - Dmitry Simushev - alcaeus - Thomas Talbot (ioni) + - Nate Wiebe (natewiebe13) - Fred Cox - vitaliytv - Philippe Segatori @@ -734,10 +748,10 @@ Symfony is the result of the work of many people who made the code better - Marvin Butkereit - Renan - Ricky Su (ricky) - - Marcin Szepczynski (czepol) - Kyle Evans (kevans91) - Charles-Henri Bruyand - Max Rath (drak3) + - marie - Stéphane Escandell (sescandell) - Baptiste Leduc (korbeil) - Konstantin S. M. Möllers (ksmmoellers) @@ -751,6 +765,7 @@ Symfony is the result of the work of many people who made the code better - Simeon Kolev (simeon_kolev9) - Joost van Driel (j92) - Jonas Elfering + - Hugo Monteiro (monteiro) - Nahuel Cuesta (ncuesta) - Chris Boden (cboden) - Christophe Villeger (seragan) @@ -773,8 +788,10 @@ Symfony is the result of the work of many people who made the code better - Vladimir Tsykun - Dustin Dobervich (dustin10) - dantleech + - Philipp Kolesnikov - Anne-Sophie Bachelard (annesophie) - Sebastian Marek (proofek) + - Carlos Pereira De Amorim (epitre) - zenmate - Michal Trojanowski - David Fuhr @@ -792,6 +809,7 @@ Symfony is the result of the work of many people who made the code better - Tristan Maindron (tmaindron) - Behnoush Norouzali (behnoush) - Wesley Lancel + - Xavier Briand (xavierbriand) - Ke WANG (yktd26) - Ivo Bathke (ivoba) - Strate @@ -802,7 +820,6 @@ Symfony is the result of the work of many people who made the code better - umpirski - M. Vondano - Quentin de Longraye (quentinus95) - - Bohan Yang (brentybh) - Chris Heng (gigablah) - Shaun Simmons (simshaun) - Richard Bradley @@ -821,7 +838,6 @@ Symfony is the result of the work of many people who made the code better - Szijarto Tamas - Robin Lehrmann (robinlehrmann) - Catalin Dan - - Marco Petersen (ocrampete16) - Soner Sayakci - Jaroslav Kuba - Kristijan Kanalas @@ -831,6 +847,7 @@ Symfony is the result of the work of many people who made the code better - Simon Schick (simonsimcity) - redstar504 - Tristan Roussel + - Niklas Keller - Cameron Porter - Hossein Bukhamsin - Oliver Hoff @@ -839,6 +856,7 @@ Symfony is the result of the work of many people who made the code better - Disparity - origaminal - Matteo Beccati (matteobeccati) + - Vitaliy Ryaboy (vitaliy) - Kevin (oxfouzer) - Paweł Wacławczyk (pwc) - Oleg Zinchenko (cystbear) @@ -850,7 +868,6 @@ Symfony is the result of the work of many people who made the code better - Thomas Ploch - Benjamin Grandfond (benjamin) - Tiago Brito (blackmx) - - - Richard van den Brand (ricbra) - develop - flip111 @@ -875,6 +892,7 @@ Symfony is the result of the work of many people who made the code better - Toni Peric (tperic) - yclian - Aleksey Prilipko + - Jelle Raaijmakers (gmta) - Andrew Berry - twifty - Indra Gunawan (guind) @@ -889,6 +907,8 @@ Symfony is the result of the work of many people who made the code better - Pascal Helfenstein - Baldur Rensch (brensch) - Pierre Rineau + - Fritz Michael Gschwantner + - Jeroen Noten (jeroennoten) - Vladyslav Petrovych - Alex Xandra Albert Sim - Carson Full @@ -901,7 +921,6 @@ Symfony is the result of the work of many people who made the code better - Jose Gonzalez - Jonathan (jls-esokia) - Dariusz Ruminski - - Joshua Nye - Claudio Zizza - Dave Marshall (davedevelopment) - Jakub Kulhan (jakubkulhan) @@ -921,7 +940,6 @@ Symfony is the result of the work of many people who made the code better - Nykopol (nykopol) - Jordan Deitch - Casper Valdemar Poulsen - - Laurent Masforné (heisenberg) - Josiah (josiah) - Guillaume Verstraete (versgui) - Greg ORIOL @@ -949,12 +967,14 @@ Symfony is the result of the work of many people who made the code better - Denis Zunke (donalberto) - Phil Taylor (prazgod) - Ahmadou Waly Ndiaye (waly) + - Evert Harmeling (evertharmeling) - Jonathan Johnson (jrjohnson) - Olivier Maisonneuve (olineuve) - Pedro Miguel Maymone de Resende (pedroresende) - Masterklavi - Franco Traversaro (belinde) - Francis Turmel (fturmel) + - Yannick Ihmels (ihmels) - Nikita Nefedov (nikita2206) - Alex Bacart - cgonzalez @@ -979,6 +999,7 @@ Symfony is the result of the work of many people who made the code better - Vincent CHALAMON (vincentchalamon) - Reen Lokum - Andreas Möller (localheinz) + - Dennis Langen (nijusan) - Martin Parsiegla (spea) - Ivan - Quentin Schuler @@ -1046,10 +1067,11 @@ Symfony is the result of the work of many people who made the code better - Jérémy M (th3mouk) - Simone Di Maulo (toretto460) - Christian Morgan - - YaFou + - Daniël Brekelmans (dbrekelmans) - Alexander Miehe (engerim) - Morgan Auchede (mauchede) - Sascha Dens (saschadens) + - Morten Wulff (wulff) - Don Pinkster - Maksim Muruev - Emil Einarsson @@ -1111,16 +1133,16 @@ Symfony is the result of the work of many people who made the code better - Patrick Kaufmann - Anton Dyshkant - Reece Fowell (reecefowell) - - Mátyás Somfai (smatyas) - stefan.r - Guillaume Gammelin - Valérian Galliat - d-ph + - Stewart Malik - Renan Taranto (renan-taranto) - Rikijs Murgs + - Mihail Krasilnikov (krasilnikovm) - Uladzimir Tsykun - iamvar - - Ben Ramsey (ramsey) - Amaury Leroux de Lens (amo__) - Christian Jul Jensen - Alexandre GESLIN (alexandregeslin) @@ -1132,6 +1154,7 @@ Symfony is the result of the work of many people who made the code better - Liverbool (liverbool) - Malte Schlüter - Jules Matsounga (hyoa) + - khoptynskyi - Sam Malone - Phan Thanh Ha (haphan) - Chris Jones (leek) @@ -1139,6 +1162,7 @@ Symfony is the result of the work of many people who made the code better - xaav - Mahmoud Mostafa (mahmoud) - Antonio Jose Cerezo (ajcerezo) + - Alexandre Tranchant (alexandre_t) - Anthony Moutte - Ahmed Abdou - Daniel Iwaniec @@ -1177,7 +1201,6 @@ Symfony is the result of the work of many people who made the code better - Lorenzo Millucci - Andreas Kleemann - Manuele Menozzi - - Philipp Kolesnikov - zairig imad (zairigimad) - Anton Babenko (antonbabenko) - Irmantas Šiupšinskas (irmantas) @@ -1195,7 +1218,6 @@ Symfony is the result of the work of many people who made the code better - johnstevenson - hamza - dantleech - - Bastien DURAND (deamon) - Kajetan Kołtuniak (kajtii) - Sander Goossens (sandergo90) - Rudy Onfroy @@ -1226,7 +1248,6 @@ Symfony is the result of the work of many people who made the code better - Máximo Cuadros (mcuadros) - Lukas Mencl - tamirvs - - Mohammad Emran Hasan (phpfour) - gauss - julien.galenski - Christian Neff @@ -1260,6 +1281,7 @@ Symfony is the result of the work of many people who made the code better - Thomas - j.schmitt - Maximilian Berghoff (electricmaxxx) + - Evgeny Anisiforov - nacho - Piotr Antosik (antek88) - Vedran Mihočinec (v-m-i) @@ -1271,6 +1293,7 @@ Symfony is the result of the work of many people who made the code better - Viktor Novikov (panzer_commander) - Paul Mitchum (paul-m) - Angel Koilov (po_taka) + - RevZer0 (rav) - Dan Finnie - Ken Marfilla (marfillaster) - benatespina (benatespina) @@ -1282,7 +1305,6 @@ Symfony is the result of the work of many people who made the code better - Nikita Konstantinov - Martijn Evers - Philipp Fritsche - - Vitaliy Ryaboy (vitaliy) - Benjamin Paap (benjaminpaap) - Claus Due (namelesscoder) - Christian @@ -1295,6 +1317,7 @@ Symfony is the result of the work of many people who made the code better - Marc Duboc (icemad) - Matthias Krauser (mkrauser) - Martynas Narbutas + - Timothée BARRAY - Nilmar Sanchez Muguercia - Toon Verwerft (veewee) - Bailey Parker @@ -1337,7 +1360,6 @@ Symfony is the result of the work of many people who made the code better - James Hudson - Stephen Clouse - e-ivanov - - Carlos Pereira De Amorim (epitre) - Benjamin Dos Santos - Einenlum - Jérémy Jarrié (gagnar) @@ -1350,7 +1372,6 @@ Symfony is the result of the work of many people who made the code better - Thomason, James - Dario Savella - Gordienko Vladislav - - marie - Viacheslav Sychov - Alexandre Quercia (alquerci) - Helmut Hummel (helhum) @@ -1378,6 +1399,7 @@ Symfony is the result of the work of many people who made the code better - rchoquet - gitlost - Taras Girnyk + - cthulhu - Arun Philip - Rémi Leclerc - Jan Vernarsky @@ -1440,6 +1462,7 @@ Symfony is the result of the work of many people who made the code better - tsufeki - dangkhoagms - Philipp Strube + - Andrii Serdiuk (andreyserdjuk) - Clement Herreman (clemherreman) - Dan Ionut Dumitriu (danionut90) - Vladislav Rastrusny (fractalizer) @@ -1514,6 +1537,7 @@ Symfony is the result of the work of many people who made the code better - Marc J. Schmidt (marcjs) - František Maša - Sebastian Schwarz + - Jason Tan - Marco Jantke - Saem Ghani - Clément LEFEBVRE @@ -1530,8 +1554,10 @@ Symfony is the result of the work of many people who made the code better - Ruud Arentsen - Harald Tollefsen - Matthieu + - Arend-Jan Tetteroo - Albin Kerouaton - Sébastien HOUZÉ + - Mbechezi Nawo - Jingyu Wang - steveYeah - Samy Dindane (dinduks) @@ -1601,10 +1627,10 @@ Symfony is the result of the work of many people who made the code better - Daniel Rotter (danrot) - Frédéric Bouchery (fbouchery) - Patrick Daley (padrig) - - Xavier Briand (xavierbriand) - Max Summe - WedgeSama - Felds Liscia + - Randy Geraads - Chihiro Adachi (chihiro-adachi) - Raphaëll Roussel - Tadcka @@ -1635,6 +1661,7 @@ Symfony is the result of the work of many people who made the code better - Mathieu Morlon - Daniel Tschinder - Arnaud CHASSEUX + - Zlatoslav Desyatnikov - tuqqu - Wojciech Gorczyca - Neagu Cristian-Doru (cristian-neagu) @@ -1645,6 +1672,7 @@ Symfony is the result of the work of many people who made the code better - Rick Prent - skalpa - Martin Eckhardt + - Bartłomiej Zając - Pieter Jordaan - Damien Tournoud - Jon Gotlin (jongotlin) @@ -1670,6 +1698,7 @@ Symfony is the result of the work of many people who made the code better - Klaus Silveira (klaussilveira) - Pedro Casado (pdr33n) - Pierre Grimaud (pgrimaud) + - Alexander Janssen (tnajanssen) - Thomas Chmielowiec (chmielot) - Jānis Lukss - rkerner @@ -1766,8 +1795,8 @@ Symfony is the result of the work of many people who made the code better - mlievertz - Radosław Kowalewski - Enrico Schultz - - Evert Harmeling - mschop + - Juraj Surman - Martin Eckhardt - natechicago - Sergei Gorjunov @@ -1823,6 +1852,7 @@ Symfony is the result of the work of many people who made the code better - Sander van der Vlugt - Nicolas Appriou - stloyd + - Tito Costa - Andreas - Chris Tickner - Andrew Coulton @@ -1856,12 +1886,14 @@ Symfony is the result of the work of many people who made the code better - Gunther Konig - Joe Springe - Mickael GOETZ + - Flinsch - Maciej Schmidt - Dennis Væversted - Timon van der Vorm - nuncanada - František Bereň - Kamil Madejski + - Quentin Dreyer - Jeremiah VALERIE - Mike Francis - Vladimir Khramtsov (chrome) @@ -1880,6 +1912,7 @@ Symfony is the result of the work of many people who made the code better - David Stone - jjanvier - Julius Beckmann + - shreypuranik - loru88 - Thibaut Salanon - Romain Dorgueil @@ -1930,6 +1963,7 @@ Symfony is the result of the work of many people who made the code better - Florent Olivaud - Eric Hertwig - JakeFr + - Niels Robin-Aubertin - Simon Sargeant - efeen - Jan Christoph Beyer @@ -1943,7 +1977,6 @@ Symfony is the result of the work of many people who made the code better - Brian Graham (incognito) - Kevin Vergauwen (innocenzo) - Alessio Baglio (ioalessio) - - Jeroen Noten (jeroennoten) - Johannes Müller (johmue) - Jordi Llonch (jordillonch) - Nicholas Ruunu (nicholasruunu) @@ -1990,6 +2023,7 @@ Symfony is the result of the work of many people who made the code better - mcorteel - Michael van Tricht - ReScO + - JohJohan - Tim Strehle - Sébastien COURJEAN - Sam Ward @@ -2013,7 +2047,6 @@ Symfony is the result of the work of many people who made the code better - Tischoi - Andreas Hasenack - J Bruni - - Fritz Michael Gschwantner - Alexey Prilipko - Dmitriy Fedorenko - vlakoff @@ -2021,6 +2054,7 @@ Symfony is the result of the work of many people who made the code better - thib92 - Rudolf Ratusiński - Bertalan Attila + - Arek Bochinski - Rafael Tovar - Amin Hosseini (aminh) - AmsTaFF (amstaff) @@ -2168,7 +2202,6 @@ Symfony is the result of the work of many people who made the code better - Damien Harper (damien.harper) - Darius Leskauskas (darles) - david perez (davidpv) - - Daniël Brekelmans (dbrekelmans) - David Joos (djoos) - Denis Klementjev (dklementjev) - Dominik Pesch (dombn) @@ -2180,7 +2213,6 @@ Symfony is the result of the work of many people who made the code better - Christophe BECKER (goabonga) - gondo (gondo) - Gusakov Nikita (hell0w0rd) - - Yannick Ihmels (ihmels) - Osman Üngür (import) - Jaap van Otterdijk (jaapio) - Javier Núñez Berrocoso (javiernuber) @@ -2190,6 +2222,7 @@ Symfony is the result of the work of many people who made the code better - Joeri Verdeyen (jverdeyen) - Kevin Verschaeve (keversc) - Kevin Herrera (kherge) + - Simon Leblanc (leblanc_simon) - Luis Ramón López López (lrlopez) - Mehdi Mabrouk (mehdidev) - Bart Reunes (metalarend) @@ -2207,6 +2240,7 @@ Symfony is the result of the work of many people who made the code better - Jimmy Leger (redpanda) - Dmitry (staratel) - Marcin Szepczynski (szepczynski) + - Tito Miguel Costa (titomiguelcosta) - Cyrille Jouineau (tuxosaurus) - Vladimir Chernyshev (volch) - Wim Godden (wimg) @@ -2250,15 +2284,14 @@ Symfony is the result of the work of many people who made the code better - Ismail Asci (ismailasci) - Jeffrey Moelands (jeffreymoelands) - Simon CONSTANS (kosssi) - - Dennis Langen (nijusan) - Paulius Jarmalavičius (pjarmalavicius) - Ramon Henrique Ornelas (ramonornela) - Ricardo de Vries (ricknox) + - Simon Heimberg (simon_heimberg) - Thomas Dutrion (theocrite) - Till Klampaeckel (till) - Tobias Weinert (tweini) - Ulf Reimers (ureimers) - - Morten Wulff (wulff) - Wotre - goohib - Tom Counsell @@ -2295,7 +2328,6 @@ Symfony is the result of the work of many people who made the code better - Jens Schulze - Matt Fields - Olatunbosun Egberinde - - Niklas Keller - Andras Debreczeni - Vladimir Sazhin - Michel Bardelmeijer @@ -2324,6 +2356,7 @@ Symfony is the result of the work of many people who made the code better - Eric J. Duran - Alexandru Bucur - cmfcmf + - Michal Forbak - Drew Butler - Alexey Berezuev - Steve Müller @@ -2364,6 +2397,7 @@ Symfony is the result of the work of many people who made the code better - Markus Staab - Pierre-Louis LAUNAY - djama + - Vladyslav Startsev - Michael Gwynne - Eduardo Conceição - changmin.keum @@ -2372,6 +2406,7 @@ Symfony is the result of the work of many people who made the code better - Abdulkadir N. A. - Adam Klvač - Bruno Nogueira Nascimento Wowk + - Matthias Dötsch - jonmldr - Yevgen Kovalienia - Lebnik @@ -2404,6 +2439,7 @@ Symfony is the result of the work of many people who made the code better - jspee - Ilya Bulakh - David Soria Parra + - Simon Frost - Sergiy Sokolenko - detinkin - Ahmed Abdulrahman @@ -2458,6 +2494,7 @@ Symfony is the result of the work of many people who made the code better - Juan Ases García (ases) - Siragusa (asiragusa) - Daniel Basten (axhm3a) + - Dude (b1rdex) - Bernd Matzner (bmatzner) - Bram Tweedegolf (bram_tweedegolf) - Brandon Kelly (brandonkelly) @@ -2515,8 +2552,8 @@ Symfony is the result of the work of many people who made the code better - Matt Drollette (mdrollette) - Adam Monsen (meonkeys) - Mike Milano (mmilano) + - Youssef Benhssaien (moghreb) - diego aguiar (mollokhan) - - Hugo Monteiro (monteiro) - Ala Eddine Khefifi (nayzo) - emilienbouard (neime) - Nicholas Byfleet (nickbyfleet) @@ -2589,7 +2626,6 @@ Symfony is the result of the work of many people who made the code better - Sergey Fedotov - Konstantin Scheumann - Michael - - Nate Wiebe - fh-github@fholzhauer.de - AbdElKader Bouadjadja - DSeemiller @@ -2607,6 +2643,7 @@ Symfony is the result of the work of many people who made the code better - Gregório Bonfante Borba (bonfante) - Bogdan Rancichi (devck) - Daniel Kolvik (dkvk) + - Dragos Protung (dragosprotung) - Marc Lemay (flug) - Gabriel Solomon (gabrielsolomon) - Henne Van Och (hennevo) From b1e65241caa2a449bd174541976bf11111258176 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 31 Aug 2020 07:53:42 +0200 Subject: [PATCH 04/22] Update VERSION for 3.4.44 --- src/Symfony/Component/HttpKernel/Kernel.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index 1b270bfdeca25..e0aa029eb659b 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -67,12 +67,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl private $requestStackSize = 0; private $resetServices = false; - const VERSION = '3.4.44-DEV'; + const VERSION = '3.4.44'; const VERSION_ID = 30444; const MAJOR_VERSION = 3; const MINOR_VERSION = 4; const RELEASE_VERSION = 44; - const EXTRA_VERSION = 'DEV'; + const EXTRA_VERSION = ''; const END_OF_MAINTENANCE = '11/2020'; const END_OF_LIFE = '11/2021'; From f4f7683861daa977b9a0488d3f0def64dda3dddd Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 31 Aug 2020 07:58:19 +0200 Subject: [PATCH 05/22] Bump Symfony version to 3.4.45 --- src/Symfony/Component/HttpKernel/Kernel.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index e0aa029eb659b..4c52d2e18e92a 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -67,12 +67,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl private $requestStackSize = 0; private $resetServices = false; - const VERSION = '3.4.44'; - const VERSION_ID = 30444; + const VERSION = '3.4.45-DEV'; + const VERSION_ID = 30445; const MAJOR_VERSION = 3; const MINOR_VERSION = 4; - const RELEASE_VERSION = 44; - const EXTRA_VERSION = ''; + const RELEASE_VERSION = 45; + const EXTRA_VERSION = 'DEV'; const END_OF_MAINTENANCE = '11/2020'; const END_OF_LIFE = '11/2021'; From 3b0112b521967ef71a2d6aa897736025274b6479 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 31 Aug 2020 08:09:33 +0200 Subject: [PATCH 06/22] Update CHANGELOG for 4.4.12 --- CHANGELOG-4.4.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/CHANGELOG-4.4.md b/CHANGELOG-4.4.md index f899cac51ac7f..ce1903a9587b8 100644 --- a/CHANGELOG-4.4.md +++ b/CHANGELOG-4.4.md @@ -7,6 +7,48 @@ in 4.4 minor versions. To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v4.4.0...v4.4.1 +* 4.4.12 (2020-08-31) + + * bug #37966 [HttpClient][MockHttpClient][DX] Throw when the response factory callable does not return a valid response (fancyweb) + * bug #37971 [PropertyInfo] Backport support for typed properties (PHP 7.4) (dunglas) + * bug #37970 [PhpUnitBridge] Polyfill new phpunit 9.1 assertions (phpfour) + * bug #37960 [PhpUnit] Add polyfill for assertMatchesRegularExpression() (dunglas) + * bug #37949 [Yaml] fix more numeric cases changing in PHP 8 (xabbuh) + * bug #37921 [Yaml] account for is_numeric() behavior changes in PHP 8 (xabbuh) + * bug #37912 [ExpressionLanguage] fix passing arguments to call_user_func_array() on PHP 8 (xabbuh) + * bug #37907 [Messenger] stop using the deprecated schema synchronizer API (xabbuh) + * bug #37900 [Mailer] Fixed mandrill api header structure (wulff) + * bug #37888 [Mailer] Reorder headers used to determine Sender (cvmiert) + * bug #37872 [Sendgrid-Mailer] Fixed envelope recipients on sendgridApiTransport (arendjantetteroo) + * bug #37860 [Serializer][ClassDiscriminatorMapping] Fix getMappedObjectType() when a discriminator child extends another one (fancyweb) + * bug #37853 [Validator] ensure that the validator is a mock object for backwards-compatibility (xabbuh) + * bug #36340 [Serializer] Fix configuration of the cache key (dunglas) + * bug #36810 [Messenger] Do not stack retry stamp (jderusse) + * bug #37849 [FrameworkBundle] Add missing mailer transports in xsd (l-vo) + * bug #37586 [ErrorHandler][DebugClassLoader] Add mixed and static return types support (fancyweb) + * bug #37845 [Serializer] Fix variadic support when using type hints (fabpot) + * bug #37841 [VarDumper] Backport handler lock when using VAR_DUMPER_FORMAT (ogizanagi) + * bug #37725 [Form] Fix Guess phpdoc return type (franmomu) + * bug #37771 Use PHPUnit 9.3 on php 8 (derrabus) + * bug #36140 [Validator] Add BC layer for notInRangeMessage when min and max are set (l-vo) + * bug #35843 [Validator] Add target guards for Composite nested constraints (ogizanagi) + * bug #37803 Fix for issue #37681 (Rav) + * bug #37744 [Yaml] Fix for #36624; Allow PHP constant as first key in block (jnye) + * bug #37767 [Form] fix mapping errors from unmapped forms (xabbuh) + * bug #37731 [Console] Table: support cells with newlines after a cell with colspan >= 2 (GMTA) + * bug #37791 Fix redis connect with empty password (alexander-schranz) + * bug #37790 Fix deprecated libxml_disable_entity_loader (fabpot) + * bug #37763 Fix deprecated libxml_disable_entity_loader (jderusse) + * bug #37774 [Console] Make sure we pass a numeric array of arguments to call_user_func_array() (derrabus) + * bug #37729 [FrameworkBundle] fail properly when the required service is not defined (xabbuh) + * bug #37701 [Serializer] Fix that it will never reach DOMNode (TNAJanssen) + * bug #37671 [Cache] fix saving no-expiry items with ArrayAdapter (philipp-kolesnikov) + * bug #37102 [WebProfilerBundle] Fix error with custom function and web profiler routing tab (JakeFr) + * bug #37560 [Finder] Fix GitIgnore parser when dealing with (sub)directories and take order of lines into account (Jeroeny) + * bug #37700 [VarDumper] Improve previous fix on light array coloration (l-vo) + * bug #37705 [Mailer] Added the missing reset tag to mailer.logger_message_listener (vudaltsov) + * bug #37697 [Messenger] reduce column length for MySQL 5.6 compatibility (xabbuh) + * 4.4.11 (2020-07-24) * bug #37590 Allows RedisClusterProxy instance in Lock RedisStore (jderusse) From 529eac9795089fb6d4f4952c902441c568233c02 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 31 Aug 2020 08:09:42 +0200 Subject: [PATCH 07/22] Update VERSION for 4.4.12 --- src/Symfony/Component/HttpKernel/Kernel.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index 7c89e610fa673..77806d80cae05 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -76,12 +76,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl private static $freshCache = []; - const VERSION = '4.4.12-DEV'; + const VERSION = '4.4.12'; const VERSION_ID = 40412; const MAJOR_VERSION = 4; const MINOR_VERSION = 4; const RELEASE_VERSION = 12; - const EXTRA_VERSION = 'DEV'; + const EXTRA_VERSION = ''; const END_OF_MAINTENANCE = '11/2022'; const END_OF_LIFE = '11/2023'; From 6e59396ff92ed63985f43bdc4785dbfea883f9cd Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 31 Aug 2020 08:14:12 +0200 Subject: [PATCH 08/22] Bump Symfony version to 4.4.13 --- src/Symfony/Component/HttpKernel/Kernel.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index 77806d80cae05..e7c70c8fd4ad7 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -76,12 +76,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl private static $freshCache = []; - const VERSION = '4.4.12'; - const VERSION_ID = 40412; + const VERSION = '4.4.13-DEV'; + const VERSION_ID = 40413; const MAJOR_VERSION = 4; const MINOR_VERSION = 4; - const RELEASE_VERSION = 12; - const EXTRA_VERSION = ''; + const RELEASE_VERSION = 13; + const EXTRA_VERSION = 'DEV'; const END_OF_MAINTENANCE = '11/2022'; const END_OF_LIFE = '11/2023'; From 0b6563443949a93831f0372a7cab6740700ba3ef Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 31 Aug 2020 08:22:19 +0200 Subject: [PATCH 09/22] Bump Symfony version to 5.1.5 --- src/Symfony/Component/HttpKernel/Kernel.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index 421b68d895152..b6788a40464b5 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -73,12 +73,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl private static $freshCache = []; - const VERSION = '5.1.4'; - const VERSION_ID = 50104; + const VERSION = '5.1.5-DEV'; + const VERSION_ID = 50105; const MAJOR_VERSION = 5; const MINOR_VERSION = 1; - const RELEASE_VERSION = 4; - const EXTRA_VERSION = ''; + const RELEASE_VERSION = 5; + const EXTRA_VERSION = 'DEV'; const END_OF_MAINTENANCE = '01/2021'; const END_OF_LIFE = '01/2021'; From 1055a7f29b5b5af7b0a96ce6b326cf50e62ed573 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Mon, 31 Aug 2020 11:01:51 +0200 Subject: [PATCH 10/22] [Validator] Fix PhpUnitBridge version constraint. --- src/Symfony/Component/Validator/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Validator/composer.json b/src/Symfony/Component/Validator/composer.json index 0137f5ac4b60f..28838de199868 100644 --- a/src/Symfony/Component/Validator/composer.json +++ b/src/Symfony/Component/Validator/composer.json @@ -34,6 +34,7 @@ "symfony/expression-language": "^5.1", "symfony/cache": "^4.4|^5.0", "symfony/mime": "^4.4|^5.0", + "symfony/phpunit-bridge": "^5.1", "symfony/property-access": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", "symfony/translation": "^4.4|^5.0", @@ -48,7 +49,6 @@ "symfony/expression-language": "<5.1", "symfony/http-kernel": "<4.4", "symfony/intl": "<4.4", - "symfony/phpunit-bridge": "^5.1", "symfony/translation": "<4.4", "symfony/yaml": "<4.4" }, From 15643642a335f3b68df8b9fadd46ec00c927e3a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Jusi=C4=99ga?= Date: Mon, 31 Aug 2020 09:54:17 +0200 Subject: [PATCH 11/22] Fix symfony/amazon-mailer constraint --- src/Symfony/Component/Mailer/Bridge/Amazon/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/composer.json b/src/Symfony/Component/Mailer/Bridge/Amazon/composer.json index 8860768ce0e47..56397920eceac 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/composer.json +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", - "symfony/mailer": "^5.2" + "symfony/mailer": "^4.4.12|^5.1.4" }, "require-dev": { "async-aws/ses": "^1.0", From 3a4675359d7b0ec9636618519cfe26e07b22c64b Mon Sep 17 00:00:00 2001 From: Michael Zangerle Date: Tue, 25 Aug 2020 11:11:10 +0200 Subject: [PATCH 12/22] [Serializer] fixed fix encoding of cache keys with anonymous classes --- .../Factory/CacheClassMetadataFactory.php | 3 +-- .../Mapping/Factory/CacheMetadataFactoryTest.php | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Serializer/Mapping/Factory/CacheClassMetadataFactory.php b/src/Symfony/Component/Serializer/Mapping/Factory/CacheClassMetadataFactory.php index 0b904c14400d0..081917c68750f 100644 --- a/src/Symfony/Component/Serializer/Mapping/Factory/CacheClassMetadataFactory.php +++ b/src/Symfony/Component/Serializer/Mapping/Factory/CacheClassMetadataFactory.php @@ -44,8 +44,7 @@ public function __construct(ClassMetadataFactoryInterface $decorated, CacheItemP public function getMetadataFor($value) { $class = $this->getClass($value); - // Key cannot contain backslashes according to PSR-6 - $key = strtr($class, '\\', '_'); + $key = rawurlencode(strtr($class, '\\', '_')); $item = $this->cacheItemPool->getItem($key); if ($item->isHit()) { diff --git a/src/Symfony/Component/Serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php b/src/Symfony/Component/Serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php index 723dc9b0494f2..907311d435012 100644 --- a/src/Symfony/Component/Serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php +++ b/src/Symfony/Component/Serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php @@ -63,4 +63,20 @@ public function testInvalidClassThrowsException() $factory->getMetadataFor('Not\Exist'); } + + public function testAnonymousClass() + { + $anonymousObject = new class() { + }; + + $metadata = new ClassMetadata(\get_class($anonymousObject)); + $decorated = $this->getMockBuilder(ClassMetadataFactoryInterface::class)->getMock(); + $decorated + ->expects($this->once()) + ->method('getMetadataFor') + ->willReturn($metadata); + + $factory = new CacheClassMetadataFactory($decorated, new ArrayAdapter()); + $this->assertEquals($metadata, $factory->getMetadataFor($anonymousObject)); + } } From e525fa10550f95e4ce41fdeed97e4c4711b40032 Mon Sep 17 00:00:00 2001 From: Alexandre Parent Date: Mon, 31 Aug 2020 10:08:37 -0400 Subject: [PATCH 13/22] [Cache] Psr16Cache does not handle Proxy cache items --- src/Symfony/Component/Cache/Psr16Cache.php | 1 + .../Cache/Tests/Psr16CacheProxyTest.php | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/Symfony/Component/Cache/Tests/Psr16CacheProxyTest.php diff --git a/src/Symfony/Component/Cache/Psr16Cache.php b/src/Symfony/Component/Cache/Psr16Cache.php index 7358bf5184f6a..ba8b5b37f9a26 100644 --- a/src/Symfony/Component/Cache/Psr16Cache.php +++ b/src/Symfony/Component/Cache/Psr16Cache.php @@ -44,6 +44,7 @@ public function __construct(CacheItemPoolInterface $pool) $createCacheItem = \Closure::bind( static function ($key, $value, $allowInt = false) use (&$cacheItemPrototype) { $item = clone $cacheItemPrototype; + $item->poolHash = $item->innerItem = null; $item->key = $allowInt && \is_int($key) ? (string) $key : CacheItem::validateKey($key); $item->value = $value; $item->isHit = false; diff --git a/src/Symfony/Component/Cache/Tests/Psr16CacheProxyTest.php b/src/Symfony/Component/Cache/Tests/Psr16CacheProxyTest.php new file mode 100644 index 0000000000000..f5347bf9bf168 --- /dev/null +++ b/src/Symfony/Component/Cache/Tests/Psr16CacheProxyTest.php @@ -0,0 +1,30 @@ +assertNull($cache->get('some-key')); + $this->assertTrue($cache->set('some-other-key', 'value')); + + $item = $pool->getItem('my-namespace.some-other-key', 'value'); + $this->assertTrue($item->isHit()); + $this->assertSame('value', $item->get()); + } +} From 1c789e87aa7536828249cdd51ea9f33856f5354d Mon Sep 17 00:00:00 2001 From: SnakePin <18491360+SnakePin@users.noreply.github.com> Date: Thu, 27 Aug 2020 14:14:43 +0300 Subject: [PATCH 14/22] [Mailer] Fixed 'verify_peer' option in mailer DSN being ignored --- .../Smtp/EsmtpTransportFactoryTest.php | 17 +++++++++++++++++ .../Transport/Smtp/EsmtpTransportFactory.php | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Mailer/Tests/Transport/Smtp/EsmtpTransportFactoryTest.php b/src/Symfony/Component/Mailer/Tests/Transport/Smtp/EsmtpTransportFactoryTest.php index cd410f89cc619..108921e0250c4 100644 --- a/src/Symfony/Component/Mailer/Tests/Transport/Smtp/EsmtpTransportFactoryTest.php +++ b/src/Symfony/Component/Mailer/Tests/Transport/Smtp/EsmtpTransportFactoryTest.php @@ -81,5 +81,22 @@ public function createProvider(): iterable new Dsn('smtps', 'example.com', '', '', 465, ['verify_peer' => false]), $transport, ]; + + yield [ + new Dsn('smtps', 'example.com', '', '', 465, ['verify_peer' => 'false']), + $transport, + ]; + + yield [ + Dsn::fromString('smtps://:@example.com?verify_peer=0'), + $transport, + ]; + + $transport = new EsmtpTransport('example.com', 465, true, $eventDispatcher, $logger); + + yield [ + Dsn::fromString('smtps://:@example.com?verify_peer='), + $transport, + ]; } } diff --git a/src/Symfony/Component/Mailer/Transport/Smtp/EsmtpTransportFactory.php b/src/Symfony/Component/Mailer/Transport/Smtp/EsmtpTransportFactory.php index e09963652b425..aab222b55b68c 100644 --- a/src/Symfony/Component/Mailer/Transport/Smtp/EsmtpTransportFactory.php +++ b/src/Symfony/Component/Mailer/Transport/Smtp/EsmtpTransportFactory.php @@ -29,7 +29,7 @@ public function create(Dsn $dsn): TransportInterface $transport = new EsmtpTransport($host, $port, $tls, $this->dispatcher, $this->logger); - if (!$dsn->getOption('verify_peer', true)) { + if ('' !== $dsn->getOption('verify_peer') && !filter_var($dsn->getOption('verify_peer', true), FILTER_VALIDATE_BOOLEAN)) { /** @var SocketStream $stream */ $stream = $transport->getStream(); $streamOptions = $stream->getStreamOptions(); From f0067c106cd83bc86a349b8166265102c104b404 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Mon, 31 Aug 2020 17:41:58 +0200 Subject: [PATCH 15/22] swallow deprecations --- .../Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php b/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php index 62e09c461cca5..daab2d2ad57a1 100644 --- a/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php +++ b/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php @@ -62,7 +62,9 @@ public function __construct($message, array $trace, $file) $this->triggeringFile = $file; if (isset($line['object']) || isset($line['class'])) { if (isset($line['class']) && 0 === strpos($line['class'], SymfonyTestsListenerFor::class)) { + set_error_handler(function () {}); $parsedMsg = unserialize($this->message); + restore_error_handler(); $this->message = $parsedMsg['deprecation']; $this->originClass = $parsedMsg['class']; $this->originMethod = $parsedMsg['method']; From b5a47dac528cc9c6b5ae8ed7ecc5fed8b6d09150 Mon Sep 17 00:00:00 2001 From: Zmey Date: Tue, 1 Sep 2020 15:23:56 +0300 Subject: [PATCH 16/22] Missed AbstractArgument --- .../Loader/Configurator/AbstractConfigurator.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractConfigurator.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractConfigurator.php index 23e64bb94f821..9527a3cbefb81 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractConfigurator.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractConfigurator.php @@ -11,6 +11,7 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator; +use Symfony\Component\DependencyInjection\Argument\AbstractArgument; use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; @@ -85,6 +86,7 @@ public static function processValue($value, $allowServices = false) case $value instanceof Definition: case $value instanceof Expression: case $value instanceof Parameter: + case $value instanceof AbstractArgument: case $value instanceof Reference: if ($allowServices) { return $value; From 380cb10587727f0dc1b51fbecb79018c1d0b078e Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 1 Sep 2020 16:31:57 +0200 Subject: [PATCH 17/22] [DI] fix inlining of non-shared services --- .../Compiler/InlineServiceDefinitionsPass.php | 8 ++ .../DependencyInjection/Dumper/PhpDumper.php | 4 + .../Tests/Dumper/PhpDumperTest.php | 19 ++++ .../php/services_non_shared_duplicates.php | 88 +++++++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_non_shared_duplicates.php diff --git a/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php index ac3b4fe352f2b..68baf3c0893c2 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php @@ -30,6 +30,7 @@ class InlineServiceDefinitionsPass extends AbstractRecursivePass implements Repe private $connectedIds = []; private $notInlinedIds = []; private $inlinedIds = []; + private $notInlinableIds = []; private $graph; public function __construct(AnalyzeServiceReferencesPass $analyzingPass = null) @@ -99,6 +100,10 @@ public function process(ContainerBuilder $container) } foreach ($remainingInlinedIds as $id) { + if (isset($this->notInlinableIds[$id])) { + continue; + } + $definition = $container->getDefinition($id); if (!$definition->isShared() && !$definition->isPublic()) { @@ -108,6 +113,7 @@ public function process(ContainerBuilder $container) } finally { $this->container = null; $this->connectedIds = $this->notInlinedIds = $this->inlinedIds = []; + $this->notInlinableIds = []; $this->graph = null; } } @@ -138,6 +144,8 @@ protected function processValue($value, $isRoot = false) $definition = $this->container->getDefinition($id); if (!$this->isInlineableDefinition($id, $definition)) { + $this->notInlinableIds[$id] = true; + return $value; } diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index d8b31dc18ddf3..6bd5f8350a710 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -885,6 +885,10 @@ private function addInlineReference(string $id, Definition $definition, string $ return ''; } + if ($this->container->hasDefinition($targetId) && ($def = $this->container->getDefinition($targetId)) && !$def->isShared()) { + return ''; + } + $hasSelfRef = isset($this->circularReferences[$id][$targetId]) && !isset($this->definitionVariables[$definition]); if ($hasSelfRef && !$forConstructor && !$forConstructor = !$this->circularReferences[$id][$targetId]) { diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php index 58a186f009097..de88e8b22f19d 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php @@ -19,6 +19,7 @@ use Symfony\Component\DependencyInjection\Argument\RewindableGenerator; use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; use Symfony\Component\DependencyInjection\Argument\ServiceLocator as ArgumentServiceLocator; +use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Compiler\PassConfig; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -714,6 +715,24 @@ public function testNonSharedLazyDefinitionReferences() $this->assertStringEqualsFile(self::$fixturesPath.'/php/services_non_shared_lazy.php', $dumper->dump()); } + public function testNonSharedDuplicates() + { + $container = new ContainerBuilder(); + $container->register('foo', 'stdClass')->setShared(false); + $container->register('baz', 'stdClass')->setPublic(true) + ->addArgument(new ServiceLocatorArgument(['foo' => new Reference('foo')])); + $container->register('bar', 'stdClass')->setPublic(true) + ->addArgument(new Reference('foo')) + ->addArgument(new Reference('foo')) + ; + $container->compile(); + + $dumper = new PhpDumper($container); + $dumper->setProxyDumper(new \DummyProxyDumper()); + + $this->assertStringEqualsFile(self::$fixturesPath.'/php/services_non_shared_duplicates.php', $dumper->dump()); + } + public function testInitializePropertiesBeforeMethodCalls() { require_once self::$fixturesPath.'/includes/classes.php'; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_non_shared_duplicates.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_non_shared_duplicates.php new file mode 100644 index 0000000000000..2ae7b4cea9999 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_non_shared_duplicates.php @@ -0,0 +1,88 @@ +getService = \Closure::fromCallable([$this, 'getService']); + $this->services = $this->privates = []; + $this->methodMap = [ + 'bar' => 'getBarService', + 'baz' => 'getBazService', + ]; + + $this->aliases = []; + } + + public function compile(): void + { + throw new LogicException('You cannot compile a dumped container that was already compiled.'); + } + + public function isCompiled(): bool + { + return true; + } + + public function getRemovedIds(): array + { + return [ + '.service_locator.BHJD0.a' => true, + 'Psr\\Container\\ContainerInterface' => true, + 'Symfony\\Component\\DependencyInjection\\ContainerInterface' => true, + 'foo' => true, + ]; + } + + /** + * Gets the public 'bar' shared service. + * + * @return \stdClass + */ + protected function getBarService() + { + return $this->services['bar'] = new \stdClass((new \stdClass()), (new \stdClass())); + } + + /** + * Gets the public 'baz' shared service. + * + * @return \stdClass + */ + protected function getBazService() + { + return $this->services['baz'] = new \stdClass(new \Symfony\Component\DependencyInjection\Argument\ServiceLocator($this->getService, [ + 'foo' => [false, 'foo', 'getFooService', false], + ], [ + 'foo' => '?', + ])); + } + + /** + * Gets the private 'foo' service. + * + * @return \stdClass + */ + protected function getFooService() + { + return new \stdClass(); + } +} From d59140e857a5dc0ec54f42daaee8a3c9b9270529 Mon Sep 17 00:00:00 2001 From: Robin Chalas Date: Tue, 1 Sep 2020 19:03:51 +0200 Subject: [PATCH 18/22] Fix undefined index for inconsistent command name definition --- src/Symfony/Component/Console/Application.php | 5 +++++ .../Component/Console/Tests/ApplicationTest.php | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/Symfony/Component/Console/Application.php b/src/Symfony/Component/Console/Application.php index c576ec050aa6b..320d53919ebb3 100644 --- a/src/Symfony/Component/Console/Application.php +++ b/src/Symfony/Component/Console/Application.php @@ -490,6 +490,11 @@ public function get($name) throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name)); } + // When the command has a different name than the one used at the command loader level + if (!isset($this->commands[$name])) { + throw new CommandNotFoundException(sprintf('The "%s" command cannot be found because it is registered under multiple names. Make sure you don\'t set a different name via constructor or "setName()".', $name)); + } + $command = $this->commands[$name]; if ($this->wantHelps) { diff --git a/src/Symfony/Component/Console/Tests/ApplicationTest.php b/src/Symfony/Component/Console/Tests/ApplicationTest.php index f813083985f36..212379a7c39db 100644 --- a/src/Symfony/Component/Console/Tests/ApplicationTest.php +++ b/src/Symfony/Component/Console/Tests/ApplicationTest.php @@ -1715,6 +1715,20 @@ public function testErrorIsRethrownIfNotHandledByConsoleErrorEventWithCatchingEn $this->assertSame('Something went wrong.', $e->getMessage()); } } + + public function testCommandNameMismatchWithCommandLoaderKeyThrows() + { + $this->expectException(CommandNotFoundException::class); + $this->expectExceptionMessage('The "test" command cannot be found because it is registered under multiple names. Make sure you don\'t set a different name via constructor or "setName()".'); + + $app = new Application(); + $loader = new FactoryCommandLoader([ + 'test' => static function () { return new Command('test-command'); }, + ]); + + $app->setCommandLoader($loader); + $app->get('test'); + } } class CustomApplication extends Application From ba3975329149cddebfe969f70b2577b0e37d1e76 Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Mon, 15 Jun 2020 07:28:47 +0000 Subject: [PATCH 19/22] Remove headers with internal meaning from HttpClient responses --- .../Tests/CachingHttpClientTest.php | 68 +++++++++++++++++++ .../Tests/Fixtures/assertion_failure.php | 3 + .../Component/HttpKernel/HttpClientKernel.php | 4 ++ 3 files changed, 75 insertions(+) create mode 100644 src/Symfony/Component/HttpClient/Tests/Fixtures/assertion_failure.php diff --git a/src/Symfony/Component/HttpClient/Tests/CachingHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/CachingHttpClientTest.php index 4d1ca6de17822..0525feed6c042 100644 --- a/src/Symfony/Component/HttpClient/Tests/CachingHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/CachingHttpClientTest.php @@ -16,6 +16,7 @@ use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\HttpClient\Response\MockResponse; use Symfony\Component\HttpKernel\HttpCache\Store; +use Symfony\Contracts\HttpClient\ResponseInterface; class CachingHttpClientTest extends TestCase { @@ -39,4 +40,71 @@ public function testRequestHeaders() self::assertSame($response->getRequestOptions()['normalized_headers']['application-name'][0], 'Application-Name: test1234'); self::assertSame($response->getRequestOptions()['normalized_headers']['test-name-header'][0], 'Test-Name-Header: test12345'); } + + public function testDoesNotEvaluateResponseBody() + { + $body = file_get_contents(__DIR__.'/Fixtures/assertion_failure.php'); + $response = $this->runRequest(new MockResponse($body, ['response_headers' => ['X-Body-Eval' => true]])); + $headers = $response->getHeaders(); + + $this->assertSame($body, $response->getContent()); + $this->assertArrayNotHasKey('x-body-eval', $headers); + } + + public function testDoesNotIncludeFile() + { + $file = __DIR__.'/Fixtures/assertion_failure.php'; + + $response = $this->runRequest(new MockResponse( + 'test', ['response_headers' => [ + 'X-Body-Eval' => true, + 'X-Body-File' => $file, + ]] + )); + $headers = $response->getHeaders(); + + $this->assertSame('test', $response->getContent()); + $this->assertArrayNotHasKey('x-body-eval', $headers); + $this->assertArrayNotHasKey('x-body-file', $headers); + } + + public function testDoesNotReadFile() + { + $file = __DIR__.'/Fixtures/assertion_failure.php'; + + $response = $this->runRequest(new MockResponse( + 'test', ['response_headers' => [ + 'X-Body-File' => $file, + ]] + )); + $headers = $response->getHeaders(); + + $this->assertSame('test', $response->getContent()); + $this->assertArrayNotHasKey('x-body-file', $headers); + } + + public function testRemovesXContentDigest() + { + $response = $this->runRequest(new MockResponse( + 'test', [ + 'response_headers' => [ + 'X-Content-Digest' => 'some-hash', + ] + ])); + $headers = $response->getHeaders(); + + $this->assertArrayNotHasKey('x-content-digest', $headers); + } + + private function runRequest(MockResponse $mockResponse): ResponseInterface + { + $mockClient = new MockHttpClient($mockResponse); + + $store = new Store(sys_get_temp_dir() . '/sf_http_cache'); + $client = new CachingHttpClient($mockClient, $store); + + $response = $client->request('GET', 'http://test'); + + return $response; + } } diff --git a/src/Symfony/Component/HttpClient/Tests/Fixtures/assertion_failure.php b/src/Symfony/Component/HttpClient/Tests/Fixtures/assertion_failure.php new file mode 100644 index 0000000000000..52f31b45a2ad2 --- /dev/null +++ b/src/Symfony/Component/HttpClient/Tests/Fixtures/assertion_failure.php @@ -0,0 +1,3 @@ +getContent(!$catch), $response->getStatusCode(), $response->getHeaders(!$catch)); + $response->headers->remove('X-Body-File'); + $response->headers->remove('X-Body-Eval'); + $response->headers->remove('X-Content-Digest'); + $response->headers = new class($response->headers->all()) extends ResponseHeaderBag { protected function computeCacheControlValue(): string { From 55f451e49cb5b5aaf6ac6dfa742b9c9044fedbf5 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Wed, 2 Sep 2020 10:01:15 +0200 Subject: [PATCH 20/22] [HttpClient] Fix deps=low --- src/Symfony/Component/HttpClient/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/HttpClient/composer.json b/src/Symfony/Component/HttpClient/composer.json index 979feb83171f5..2fa79adc826d3 100644 --- a/src/Symfony/Component/HttpClient/composer.json +++ b/src/Symfony/Component/HttpClient/composer.json @@ -33,7 +33,7 @@ "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", "symfony/dependency-injection": "^4.3|^5.0", - "symfony/http-kernel": "^4.4", + "symfony/http-kernel": "^4.4.13", "symfony/process": "^4.2|^5.0" }, "autoload": { From c3409cd709a7a7e42f3c829be9c7bc80bbfa2efc Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Wed, 2 Sep 2020 10:15:01 +0200 Subject: [PATCH 21/22] Update CHANGELOG for 5.1.5 --- CHANGELOG-5.1.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG-5.1.md b/CHANGELOG-5.1.md index 224809fbdbad0..cae872acb5e51 100644 --- a/CHANGELOG-5.1.md +++ b/CHANGELOG-5.1.md @@ -7,6 +7,19 @@ in 5.1 minor versions. To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v5.1.0...v5.1.1 +* 5.1.5 (2020-09-02) + + * security #cve-2020-15094 Remove headers with internal meaning from HttpClient responses (mpdude) + * bug #38024 [Console] Fix undefined index for inconsistent command name definition (chalasr) + * bug #38023 [DI] fix inlining of non-shared services (nicolas-grekas) + * bug #38022 Missed AbstractArgument (a-menshchikov) + * bug #38020 [PhpUnitBridge] swallow deprecations (xabbuh) + * bug #37961 [Mailer] Fixed 'verify_peer' option in mailer DSN being ignored (SnakePin) + * bug #38010 [Cache] Psr16Cache does not handle Proxy cache items (alex-dev) + * bug #37937 [Serializer] fixed fix encoding of cache keys with anonymous classes (michaelzangerle) + * bug #38002 [Validator] Fix PhpUnitBridge version constraint (derrabus) + * bug #38001 Fix symfony/amazon-mailer constraint (Michał Jusięga) + * 5.1.4 (2020-08-31) * bug #37966 [HttpClient][MockHttpClient][DX] Throw when the response factory callable does not return a valid response (fancyweb) From cc3335244cd55d04b61ad98d40bec91b40c6114f Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Wed, 2 Sep 2020 10:15:18 +0200 Subject: [PATCH 22/22] Update VERSION for 5.1.5 --- src/Symfony/Component/HttpKernel/Kernel.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index b6788a40464b5..c90c77ae7757e 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -73,12 +73,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl private static $freshCache = []; - const VERSION = '5.1.5-DEV'; + const VERSION = '5.1.5'; const VERSION_ID = 50105; const MAJOR_VERSION = 5; const MINOR_VERSION = 1; const RELEASE_VERSION = 5; - const EXTRA_VERSION = 'DEV'; + const EXTRA_VERSION = ''; const END_OF_MAINTENANCE = '01/2021'; const END_OF_LIFE = '01/2021';