From c12039b1c3b3ee267b6fa01118ee3bfdc60421f9 Mon Sep 17 00:00:00 2001 From: Vladimir Vasilev Date: Tue, 17 May 2022 00:33:45 +0300 Subject: [PATCH 01/68] Fix for missing sender name in case with usage of the EnvelopeListener --- src/Symfony/Component/Mailer/EventListener/EnvelopeListener.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Mailer/EventListener/EnvelopeListener.php b/src/Symfony/Component/Mailer/EventListener/EnvelopeListener.php index b439b2f0bf41d..b2980bc5cf6bc 100644 --- a/src/Symfony/Component/Mailer/EventListener/EnvelopeListener.php +++ b/src/Symfony/Component/Mailer/EventListener/EnvelopeListener.php @@ -48,7 +48,7 @@ public function onMessage(MessageEvent $event): void $message = $event->getMessage(); if ($message instanceof Message) { if (!$message->getHeaders()->has('Sender') && !$message->getHeaders()->has('From')) { - $message->getHeaders()->addMailboxHeader('Sender', $this->sender->getAddress()); + $message->getHeaders()->addMailboxHeader('Sender', $this->sender); } } } From 8053ba1049aac403b6c3196da8d0312bf21f1340 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 27 May 2022 09:04:11 +0200 Subject: [PATCH 02/68] Update CHANGELOG for 4.4.42 --- CHANGELOG-4.4.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/CHANGELOG-4.4.md b/CHANGELOG-4.4.md index 6d426f3b98105..823de8fa24c9f 100644 --- a/CHANGELOG-4.4.md +++ b/CHANGELOG-4.4.md @@ -7,6 +7,41 @@ 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.42 (2022-05-27) + + * bug #46448 [DependencyInjection] Fix "proxy" tag: resolve its parameters and pass it to child definitions (nicolas-grekas) + * bug #46442 [FrameworkBundle] Revert "bug #46125 Always add CacheCollectorPass (fancyweb)" (chalasr) + * bug #46443 [DoctrineBridge] Don't reinit managers when they are proxied as ghost objects (nicolas-grekas) + * bug #46427 [FrameworkBundle] fix wiring of annotations.cached_reader (nicolas-grekas) + * bug #46434 [FrameworkBundle] Fix BC break in abstract config commands (yceruto) + * bug #46424 [Form] do not accept array input when a form is not multiple (xabbuh) + * bug #46367 [Mime] Throw exception when body in Email attach method is not ok (alamirault) + * bug #46421 [VarDumper][VarExporter] Deal with DatePeriod->include_end_date on PHP 8.2 (nicolas-grekas) + * bug #46401 [Cache] Throw when "redis_sentinel" is used with a non-Predis "class" option (buffcode) + * bug #46414 Bootstrap 4 fieldset for row errors (konradkozaczenko) + * bug #46412 [FrameworkBundle] Fix dumping extension config without bundle (yceruto) + * bug #46407 [Filesystem] Safeguard (sym)link calls (derrabus) + * bug #46098 [Form] Fix same choice loader with different choice values (HeahDude) + * bug #46380 [HttpClient] Add missing HttpOptions::setMaxDuration() (nicolas-grekas) + * bug #46249 [HttpFoundation] [Session] Regenerate invalid session id (peter17) + * bug #46366 [Mime] Add null check for EmailHeaderSame (magikid) + * bug #46364 [Config] Fix looking for single files in phars with GlobResource (nicolas-grekas) + * bug #46365 [HttpKernel] Revert "bug #46327 Allow ErrorHandler ^5.0 to be used" (nicolas-grekas) + * bug #46114 Fixes "Incorrectly nested style tag found" error when using multi-line header content (Perturbatio) + * bug #46325 [Ldap] Fix LDAP connection options (buffcode) + * bug #46317 [Security/Http] Ignore invalid URLs found in failure/success paths (nicolas-grekas) + * bug #46327 [HttpKernel] Allow ErrorHandler ^5.0 to be used in HttpKernel 4.4 (mpdude) + * bug #46297 [Serializer] Fix JsonSerializableNormalizer ignores circular reference handler in $context (BreyndotEchse) + * bug #45981 [Serializer][PropertyInfo] Fix support for "false" built-in type on PHP 8.2 (alexandre-daubois) + * bug #46277 [HttpKernel] Fix SessionListener without session in request (edditor) + * bug #46282 [DoctrineBridge] Treat firstResult === 0 like null (derrabus) + * bug #46278 [Workflow] Fix deprecated syntax for interpolated strings (nicolas-grekas) + * bug #46264 [Console] Better required argument check in InputArgument (jnoordsij) + * bug #46262 [EventDispatcher] Fix removing listeners when using first-class callable syntax (javer) + * bug #46216 [Form] fix populating single widget time view data with different timezones (xabbuh) + * bug #46221 [DomCrawler][VarDumper] Fix html-encoding emojis (nicolas-grekas) + * bug #46167 [VarExporter] Fix exporting DateTime objects on PHP 8.2 (nicolas-grekas) + * 4.4.41 (2022-04-27) * bug #46154 [Mailer] Restore X-Transport after failure (zenas1210) From da6af7c371655c777182a79f2d88c90e86da98a5 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 27 May 2022 09:04:18 +0200 Subject: [PATCH 03/68] Update CONTRIBUTORS for 4.4.42 --- CONTRIBUTORS.md | 1690 +++++++++++++++++++++++------------------------ 1 file changed, 833 insertions(+), 857 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index bd30bf752af21..b20e486f89471 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -7,471 +7,437 @@ The Symfony Connect username in parenthesis allows to get more information - Fabien Potencier (fabpot) - Nicolas Grekas (nicolas-grekas) - Christian Flothmann (xabbuh) - - Alexander M. Turek (derrabus) - Bernhard Schussek (bschussek) - - Tobias Schultze (tobion) + - Alexander M. Turek (derrabus) - Robin Chalas (chalas_r) + - Tobias Schultze (tobion) - Christophe Coevoet (stof) - - Jérémy DERUSSÉ (jderusse) - - Wouter De Jong (wouterj) + - Jordi Boggiano (seldaek) - Grégoire Pineau (lyrixx) - Maxime Steinhausser (ogizanagi) - Kévin Dunglas (dunglas) - - Thomas Calvet (fancyweb) - - Jordi Boggiano (seldaek) - Victor Berchet (victor) - - Javier Eguiluz (javier.eguiluz) - - Ryan Weaver (weaverryan) + - Jérémy DERUSSÉ (jderusse) + - Thomas Calvet (fancyweb) - Roland Franssen (ro0) - - Jakub Zalas (jakubzalas) + - Wouter de Jong (wouterj) - Johannes S (johannes) + - Ryan Weaver (weaverryan) - Kris Wallsmith (kriswallsmith) + - Jakub Zalas (jakubzalas) + - Javier Eguiluz (javier.eguiluz) + - Yonel Ceruto (yonelceruto) - Tobias Nyholm (tobias) - - Yonel Ceruto González (yonelceruto) - - Oskar Stark (oskarstark) - Hugo Hamon (hhamon) - - Ait Boudad Abdellatif (aitboudad) - Samuel ROZE (sroze) - - Romain Neutron (romain) + - Oskar Stark (oskarstark) - Pascal Borreli (pborreli) - - Jules Pietri (heah) + - Romain Neutron - Joseph Bielawski (stloyd) - - Amrouche Hamza (simperfit) - - Karma Dordrak (drak) + - Drak (drak) + - Abdellatif Ait boudad (aitboudad) - Lukas Kahwe Smith (lsmith) + - Hamza Amrouche (simperfit) - Martin Hasoň (hason) - Jeremy Mikola (jmikola) - Jean-François Simon (jfsimon) - Benjamin Eberlei (beberlei) + - Igor Wiedler + - Jules Pietri - Jan Schädlich (jschaedl) - - Igor Wiedler (igorw) - - Eriksen Costa (eriksencosta) - Kevin Bond (kbond) - - Ener-Getick (energetick) - - Sarah Khalil (saro0h) + - Jonathan Wage (jwage) - Jérôme Tamarelle (gromnan) - - Pierre du Plessis (pierredup) - - Vasilij Duško (staff) - Valentin Udaltsov (vudaltsov) - - Iltar van der Berg (kjarli) - - Jonathan Wage (jwage) - Matthias Pigulla (mpdude) - - Diego Saint Esteben (dosten) - - Grégoire Paris (greg0ire) - Alexandre Salomé (alexandresalome) - - William Durand (couac) + - Grégoire Paris (greg0ire) + - William DURAND - ornicar - - Titouan Galopin (tgalopin) - - Konstantin Myakshin (koc) - Dany Maillard (maidmaid) - - Francis Besset (francisbesset) + - Eriksen Costa + - Diego Saint Esteben (dosten) - stealth35 ‏ (stealth35) - Alexander Mols (asm89) - - Laurent VOULLEMIER (lvo) - - Vasilij Dusko | CREATION + - Pierre du Plessis (pierredup) + - Francis Besset (francisbesset) - Bulat Shakirzyanov (avalanche123) + - Iltar van der Berg - David Maicher (dmaicher) - - Gábor Egyed (1ed) - - gadelat (gadelat) + - Gabriel Ostrolucký (gadelat) + - Miha Vrhovnik (mvrhov) - Saša Stamenković (umpirsky) - - Peter Rehm (rpet) - - Henrik Bjørnskov (henrikbjorn) - - Antoine M (amakdessi) - - Miha Vrhovnik + - Titouan Galopin (tgalopin) + - Gábor Egyed (1ed) - Mathieu Piot (mpiot) - - Diego Saint Esteben (dii3g0) + - Sarah Khalil (saro0h) - Konstantin Kudryashov (everzet) - - Vladimir Reznichenko (kalessil) + - Guilhem N (guilhemn) - Bilal Amarni (bamarni) + - Eriksen Costa - Florin Patan (florinpatan) - - Jáchym Toušek (enumag) - - Alex Pott - - Michel Weimerskirch (mweimerskirch) + - Vladimir Reznichenko (kalessil) + - Peter Rehm (rpet) + - Vasilij Duško (staff) + - Henrik Bjørnskov (henrikbjorn) + - Antoine Makdessi (amakdessi) + - Laurent VOULLEMIER (lvo) - Andrej Hudec (pulzarraider) - Christian Raue - - Issei Murasawa (issei_m) - Eric Clemmons (ericclemmons) - - Graham Campbell (graham) - - Charles Sarrazin (csarrazi) - - Alexander Schranz (alexander-schranz) - - Vasilij Dusko + - Michel Weimerskirch (mweimerskirch) + - Issei Murasawa (issei_m) - Douglas Greenshields (shieldo) - - David Buchmann (dbu) + - Jáchym Toušek (enumag) + - Alexander Schranz (alexander-schranz) + - Denis (yethee) - Arnout Boks (aboks) - - Deni + - Charles Sarrazin (csarrazi) + - David Buchmann (dbu) - Henrik Westphal (snc) - Dariusz Górecki (canni) + - Ener-Getick + - Alex Pott - Fran Moreno (franmomu) + - Graham Campbell (graham) - HypeMC (hypemc) - - Jérôme Vasseur (jvasseur) - - Mathieu Santostefano (welcomattic) - - Dariusz Ruminski - Lee McDermott - Brandon Turner - Luis Cordova (cordoval) - Daniel Holmes (dholmes) - - Sebastiaan Stok (sstok) - - Alexandre Daubois (alexandre-daubois) - Toni Uebernickel (havvg) - Bart van den Burg (burgov) + - Vasilij Dusko | CREATION - Jordan Alliot (jalliot) + - Mathieu Santostefano (welcomattic) - John Wards (johnwards) - - Tomas Norkūnas (norkunas) - - Julien Falque (julienfalque) - - Vincent Langlet (deviling) - - Baptiste Clavié (talus) - - Massimiliano Arione (garak) - - Mathias Arlaud (mtarld) + - Dariusz Ruminski + - Konstantin Myakshin (koc) - Antoine Hérault (herzult) - - Paráda József (paradajozsef) + - Alexandre Daubois (alexandre-daubois) + - Julien Falque (julienfalque) + - Konstantin.Myakshin - Arnaud Le Blanc (arnaud-lb) - - Przemysław Bogusz (przemyslaw-bogusz) + - Sebastiaan Stok (sstok) - Maxime STEINHAUSSER - - Michal Piotrowski (eventhorizon) - - Tomáš Votruba (tomas_votruba) + - Massimiliano Arione (garak) - Tim Nagel (merk) - Chris Wilkinson (thewilkybarkid) - - Peter Kokot (maastermedia) - - Lars Strojny (lstrojny) + - Jérôme Vasseur (jvasseur) - Brice BERNARD (brikou) - - Ahmed TAILOULOUTE (ahmedtai) - - Gregor Harlan (gharlan) + - Jules Pietri + - Tomas Norkūnas (norkunas) + - Michal Piotrowski - marc.weistroff + - Peter Kokot (maastermedia) + - Lars Strojny (lstrojny) - lenar - - Alexander Schwenn (xelaris) - - Jérémy Romey (jeremyfreeagent) - Włodzimierz Gajda (gajdaw) - - Christian Scheb - Adrien Brault (adrienbrault) - - Maxime Helias (maxhelias) - - Yanick Witschi (toflar) - Jacob Dreesen (jdreesen) - - Malte Schlüter (maltemaltesich) - - Joel Wurtz (brouznouf) - - Théo FIDRY (theofidry) + - Théo FIDRY - Florian Voutzinos (florianv) - Teoh Han Hui (teohhanhui) + - Przemysław Bogusz (przemyslaw-bogusz) - Colin Frei - Javier Spagnoletti (phansys) - - Gary PEGEOT (gary-p) + - Vincent Langlet (deviling) + - excelwebzone + - HeahDude + - Joel Wurtz (brouznouf) + - Paráda József (paradajozsef) + - Baptiste Clavié (talus) + - Alexander Schwenn (xelaris) + - Fabien Pennequin (fabienpennequin) + - Gordon Franke (gimler) + - Malte Schlüter (maltemaltesich) - Ruud Kamphuis (ruudk) - - Joshua Thijssen + - Vasilij Dusko + - Yanick Witschi (toflar) - Daniel Wehner (dawehner) - Tugdual Saunier (tucksaun) - - excelwebzone - - Gordon Franke (gimler) - - Saif Eddin Gmati (azjezz) - - Richard van Laak (rvanlaak) - - Jesse Rushlow (geeshoe) - - Fabien Pennequin (fabienpennequin) - - Olivier Dolbeau (odolbeau) - - Smaine Milianni (ismail1432) - - Eric GELOEN (gelo) - - Matthieu Napoli (mnapoli) - - Ion Bazan (ionbazan) - - Jannik Zschiesche (apfelbox) + - Mathias Arlaud (mtarld) - Robert Schönthal (digitalkaoz) - - Florian Lonqueu-Brochard (florianlb) - - Tigran Azatyan (tigranazatyan) - - YaFou - - Gabriel Caruso (carusogabriel) + - Eric GELOEN (gelo) + - Gary PEGEOT (gary-p) + - Gabriel Caruso + - Joshua Thijssen - Stefano Sala (stefano.sala) - - Andréia Bohner (andreia) - - Evgeniy (ewgraf) - - Vincent AUBERT (vincent) + - Mathieu Lechat (mat_the_cat) + - Maxime Helias (maxhelias) + - OGAWA Katsuhiro (fivestar) + - Jhonny Lidfors (jhonne) + - jeremyFreeAgent (jeremyfreeagent) - Juti Noppornpitak (shiroyuki) - - Simon Berger - - Anthony MARTIN (xurudragon) - - Alexander Menshchikov (zmey_kk) + - Gregor Harlan (gharlan) + - Smaine Milianni (ismail1432) + - Anthony MARTIN - Sebastian Hörl (blogsh) + - Tigran Azatyan (tigranazatyan) + - Ion Bazan (ionbazan) - Daniel Gomes (danielcsgomes) - Hidenori Goto (hidenorigoto) - - Jan Rosier (rosier) - - Alessandro Chitolina (alekitto) - - Albert Casademont (acasademont) - Arnaud Kleinpeter (nanocom) - Guilherme Blanco (guilhermeblanco) - - Marco Pivetta (ocramius) - SpacePossum - - Pablo Godel (pgodel) + - Richard van Laak (rvanlaak) - Andreas Braun - - Jérémie Augustin (jaugustin) + - Pablo Godel (pgodel) + - Tomáš Votruba (tomas_votruba) - François-Xavier de Guillebon (de-gui_f) - - Oleg Voronkovich - - hacfi (hifi) + - Alessandro Chitolina (alekitto) - Rafael Dohms (rdohms) - - George Mponos (gmponos) - jwdeitch - - Jeroen Spee (jeroens) + - Saif Eddin Gmati (azjezz) - Jérôme Parmentier (lctrs) - - Fabien Bourigault (fbourigault) - - Joe Bennett (kralos) + - Ahmed TAILOULOUTE (ahmedtai) - Michael Babker (mbabker) - - Mikael Pajunen - - Andreas Schempp (aschempp) - - Alessandro Lai (jean85) - - Romaric Drigon (romaricdrigon) - - Christopher Hertel (chertel) + - Jérémy Derussé + - Matthieu Napoli (mnapoli) - Arman Hosseini (arman) + - Sokolov Evgeniy (ewgraf) - Rokas Mikalkėnas (rokasm) + - Andréia Bohner (andreia) - Niels Keurentjes (curry684) - Vyacheslav Pavlov - - Andreas Möller (localheinz) + - Albert Casademont (acasademont) + - George Mponos (gmponos) - Richard Shank (iampersistent) - - Wouter J - - Thomas Rabaix (rande) - - Chi-teck - - Baptiste Leduc (korbeil) - - Timo Bakx (timobakx) + - Marco Pivetta (ocramius) - Vincent Touzet (vincenttouzet) - - Nate Wiebe (natewiebe13) + - Simon Berger + - Olivier Dolbeau (odolbeau) - Rouven Weßling (realityking) - - Ben Davies (bendavies) + - YaFou - Clemens Tolboom + - Oleg Voronkovich - Helmer Aaviksoo - - Remon van de Kamp (rpkamp) - - Filippo Tessarotto (slamdunk) - - Hiromi Hishida (77web) - - Michael Käfer (michael_kaefer) + - 77web - Matthieu Ouellette-Vachon (maoueh) - Michał Pipa (michal.pipa) - Dawid Nowak - - Martin Hujer (martinhujer) + - Jannik Zschiesche - Roman Martinuk (a2a4) - Amal Raghav (kertz) - - Jonathan Ingram (jonathaningram) + - Jonathan Ingram - Artur Kotyrba + - Wouter J - Tyson Andre - GDIBass - Samuel NELA (snela) - - David Prévot - - Hugo Monteiro (monteiro) - - Dmitrii Poddubnyi (karser) + - Vincent AUBERT (vincent) + - Fabien Bourigault (fbourigault) - zairig imad (zairigimad) - - Tien Vo (tienvx) - Colin O'Dell (colinodell) - - Timothée Barray (tyx) + - Ben Davies (bendavies) - James Halsall (jaitsu) + - Christian Scheb + - Guillaume (guill) - Florent Mata (fmata) + - Christopher Hertel (chertel) + - Mikael Pajunen - Warnar Boekkooi (boekkooi) - - Benjamin Leveque (benji07) + - Justin Hileman (bobthecow) + - Alessandro Lai (jean85) + - Anthony GRASSIOT (antograssiot) - Dmitrii Chekaliuk (lazyhammer) - Clément JOBEILI (dator) - - Mathieu Lechat (mat_the_cat) - - Jeroen Noten (jeroennoten) + - Tom Van Looy (tvlooy) - Marek Štípek (maryo) + - Jesse Rushlow (geeshoe) - Daniel Espendiller - - Possum + - Arnaud PETITPAS (apetitpa) - Dorian Villet (gnutix) - - Michaël Perrin (michael.perrin) + - Martin Hujer (martinhujer) - Sergey Linnik (linniksa) - - Richard Miller (mr_r_miller) + - Richard Miller - Mario A. Alvarez Garcia (nomack84) - - Dennis Benkert (denderello) + - Thomas Rabaix (rande) + - D (denderello) - DQNEO - - Hidde Wieringa (hiddewie) - - Antonio Pauletich (x-coder264) + - David Prévot - Andre Rømcke (andrerom) - - Philippe Segatori - - Thibaut Cheymol (tcheymol) - - Sebastien Morel (plopix) - - mcfedr (mcfedr) - - Nicolas Philippe (nikophil) + - Jeroen Spee (jeroens) + - Andreas Schempp (aschempp) - Ruben Gonzalez (rubenrua) - Benjamin Dulau (dbenjamin) - - Baptiste Lafontaine (magnetik) + - mcfedr (mcfedr) + - Remon van de Kamp - Mathieu Lemoine (lemoinem) - - Justin Hileman (bobthecow) - - Denis Brumann (dbrumann) - Christian Schmidt - Andreas Hucks (meandmymonkey) - - Tom Van Looy (tvlooy) - - Guillaume Pédelagrabe + - Jan Rosier (rosier) - Noel Guilbert (noel) - - Anthony GRASSIOT (antograssiot) - Stadly - Stepan Anchugov (kix) - - François Pluchino (francoispluchino) - bronze1man - sun (sun) - Larry Garfield (crell) - - Edi Modrić (emodric) - - Gocha Ossinkine (ossinkine) + - Michael Käfer (michael_kaefer) + - Andreas Möller (localheinz) - Leo Feyer (leofeyer) + - Philipp Wahala (hifi) - Nikolay Labinskiy (e-moe) - Martin Schuhfuß (usefulthink) - apetitpa - - Matthieu Bontemps (mbontemps) - - apetitpa - - Guilliam Xavier - Pierre Minnieur (pminnieur) - - fivestar - Dominique Bongiraud - - dFayet - - Jeremy Livingston (jeremylivingston) - - Karoly Gossler (connorhu) - - soyuka - - Michael Lee (zerustech) - - Matthieu Auger (matthieuauger) + - Hugo Monteiro (monteiro) + - Baptiste Leduc (korbeil) + - Timo Bakx (timobakx) + - Dmitrii Poddubnyi (karser) + - Julien Pauli + - Florian Lonqueu-Brochard (florianlb) + - Joe Bennett (kralos) - Leszek Prabucki (l3l0) - - Emanuele Panzeri (thepanz) - François Zaninotto (fzaninotto) - Dustin Whittle (dustinwhittle) - jeff - John Kary (johnkary) + - Võ Xuân Tiến (tienvx) - fd6130 (fdtvui) - - Blanchon Vincent (blanchonvincent) - Maciej Malarz (malarzm) - Michele Orselli (orso) + - Denis Brumann (dbrumann) - Sven Paulus (subsven) - - Daniel STANCU - Maxime Veber (nek-) - - Sylvain Fabre (sylfabre) - - Loick Piera (pyrech) - - Clara van Miert - Valentine Boineau (valentineboineau) - - Bastien Jaillot (bastnic) - Rui Marinho (ruimarinho) - Patrick Landolt (scube) - - Michał (bambucha15) - - Eugene Wissner - - Bohan Yang (brentybh) + - Filippo Tessarotto (slamdunk) + - Jeroen Noten (jeroennoten) + - Possum + - Jérémie Augustin (jaugustin) + - Edi Modrić (emodric) - Pascal Montoya - - Julien Brochet (mewt) - - Tristan Darricau (nicofuma) + - Julien Brochet + - Gocha Ossinkine (ossinkine) + - François Pluchino (francoispluchino) + - Tristan Darricau (tristandsensio) - Victor Bocharsky (bocharsky_bw) - - Bozhidar Hristov (warxcell) + - henrikbjorn + - Fritz Michael Gschwantner (fritzmg) - Marcel Beerta (mazen) - - Thomas Landauer (thomas-landauer) - - Pavel Batanov (scaytrase) + - Chi-teck - Mantis Development - - Loïc Faugeron - - quentin neyrat (qneyrat) - - Marcin Szepczynski (czepol) + - Guilliam Xavier + - Hidde Wieringa (hiddewie) + - dFayet + - Antonio Pauletich (x-coder264) - Rob Frawley 2nd (robfrawley) - - Ahmed Raafat - - julien pauli (jpauli) - - Lorenz Schori - - Sébastien Lavoie (lavoiesl) + - Nikita Konstantinov (unkind) + - Michael Lee (zerustech) - Dariusz + - soyuka - Farhad Safarov (safarov) + - Nate Wiebe (natewiebe13) - Hugo Alliaume (kocal) - - BoShurik - - Thomas Lallement (raziel057) - Michael Voříšek - Francois Zaninotto - - Claude Khedhiri (ck-developer) - - Alexander Kotynia (olden) - Daniel Tschinder - Christian Schmidt - - Marcos Sánchez + - Alexander Kotynia (olden) - Elnur Abdurrakhimov (elnur) - Manuel Reinhard (sprain) - - Harm van Tilborg (hvt) - - Danny Berger (dpb587) - - Antonio J. García Lagar (ajgarlag) + - Nicolas Philippe (nikophil) - Adam Prager (padam87) - - Judicaël RUFFIEUX (axanagor) - Benoît Burnichon (bburnichon) - - Roman Marintšenko (inori) + - maxime.steinhausser + - Roman Ring (inori) - Xavier Montaña Carreras (xmontana) - - Mickaël Andrieu (mickaelandrieu) + - Timothée Barray (tyx) + - Romaric Drigon (romaricdrigon) + - Sylvain Fabre (sylfabre) - Soner Sayakci - Xavier Perez - Arjen Brouwer (arjenjb) - - Katsuhiro OGAWA - Artem Lopata - Patrick McDougle (patrick-mcdougle) - Marc Weistroff (futurecat) + - Danny Berger (dpb587) - Alif Rachmawadi - Anton Chernikov (anton_ch1989) - - Kristen Gilden (kgilden) - - Pierre-Yves LEBECQ (pylebecq) + - Pierre-Yves Lebecq (pylebecq) + - Benjamin Leveque (benji07) - Jordan Samouh (jordansamouh) - - Jakub Kucharovic (jkucharovic) - Sullivan SENECHAL (soullivaneuh) - - Thomas Bisignani (toma) + - Loick Piera (pyrech) - Uwe Jäger (uwej711) - Dāvis Zālītis (k0d3r1s) + - Lynn van der Berg (kjarli) + - Michaël Perrin (michael.perrin) - Eugene Leonovich (rybakit) - Joseph Rouff (rouffj) - Félix Labrecque (woodspire) - GordonsLondon - - Nguyen Xuan Quynh (xuanquynh) - Jan Sorgalla (jsor) - Ray + - Philipp Cordes (corphi) - Chekote - Aleksandar Jakovljevic (ajakov) - Thomas Adam - - Jhonny Lidfors (jhonne) - - Diego Agulló (aeoris) + - Thomas Landauer (thomas-landauer) - jdhoek - Jurica Vlahoviček (vjurica) - Bob den Otter (bopp) - Thomas Schulz (king2500) - - Frank de Jonge (frenkynet) - - Artem Henvald (artemgenvald) - - Lescot Edouard (idetox) - - Nikita Konstantinov - - Wodor Wodorski - - Guilhem N (guilhemn) - - Mohammad Emran Hasan (phpfour) + - Frank de Jonge + - Jules Pietri + - Sebastien Morel (plopix) - Christopher Davis (chrisguitarguy) - - Dmitriy Mamontov (mamontovdmitriy) - - Ben Ramsey (ramsey) - - Laurent Masforné (heisenberg) + - Karoly Gossler (connorhu) + - Matthieu Auger (matthieuauger) + - Josip Kruslin (jkruslin) + - Thomas Lallement (raziel057) - Sergey (upyx) - Giorgio Premi - - Guillaume (guill) - renanbr - - Matthew Smeets - - Alex Rock Ancelet (pierstoval) + - Sébastien Lavoie (lavoiesl) + - Alex Rock (pierstoval) + - Wodor Wodorski - Beau Simensen (simensen) - - Johann Pardanaud - - Michael Hirschler (mvhirsch) - Robert Kiss (kepten) - - Zan Baldwin (zanderbaldwin) - - Roumen Damianoff (roumen) + - Zan Baldwin (zanbaldwin) + - Antonio J. García Lagar (ajgarlag) + - Alexandre Quercia (alquerci) + - Marcos Sánchez + - BoShurik + - Zmey - Kim Hemsø Rasmussen (kimhemsoe) - - Oleg Andreyev - - Martin Herndl (herndlm) - - Pavel Kirpitsov (pavel-kirpichyov) + - Oleg Andreyev (oleg.andreyev) + - jaugustin - Pascal Luna (skalpa) - Wouter Van Hecke + - Baptiste Lafontaine (magnetik) - Iker Ibarguren (ikerib) - - Bob van de Vijver (bobvandevijver) + - Indra Gunawan (indragunawan) - Peter Kruithof (pkruithof) - Antoine Lamirault - Michael Holm (hollo) - Arjen van der Meijden - - Markus Fasselt (digilist) - - Damien Alexandre (damienalexandre) - - Simon Mönch (sm) + - Blanchon Vincent (blanchonvincent) + - Michał (bambucha15) - Christian Schmidt - Marcin Sikoń (marphi) - - Gonzalo Vilaseca (gonzalovilaseca) - Ben Hakim - - Haralan Dobrev (hkdobrev) - Marco Petersen (ocrampete16) - - MatTheCat + - Bohan Yang (brentybh) + - Bastien Jaillot (bastnic) - Vilius Grigaliūnas - David Badura (davidbadura) - - Chad Sikorra (chadsikorra) - Alan Poulain (alanpoulain) - Chris Smith (cs278) + - Thomas Bisignani (toma) - Florian Klein (docteurklein) - W0rma - Manuel Kiessling (manuelkiessling) - - Dimitri Gritsajuk (ottaviano) - Alexey Kopytko (sanmai) - - Gijs van Lammeren - - Pol Dellaiera (drupol) - Atsuhiro KUBO (iteman) - - Alireza Mirsepassi (alirezamirsepassi) - rudy onfroy (ronfroy) - Serkan Yildiz (srknyldz) - Andrew Moore (finewolf) - Bertrand Zuchuat (garfield-fr) + - Marc Morera (mmoreram) - Sébastien Alfaiate (seb33300) - Gabor Toth (tgabi333) - realmfoo @@ -479,216 +445,198 @@ The Symfony Connect username in parenthesis allows to get more information - Andrey Esaulov (andremaha) - Grégoire Passault (gregwar) - Jerzy Zawadzki (jzawadzki) - - Phil Taylor (prazgod) - Ismael Ambrosi (iambrosi) - Craig Duncan (duncan3dc) - Emmanuel BORGES (eborges78) - Aurelijus Valeiša (aurelijus) - Jan Decavele (jandc) - Gustavo Piltcher - - flack (flack) - Stepan Tanasiychuk (stfalcon) - Ivan Kurnosov - Tiago Ribeiro (fixe) - - Hidde Boomsma (hboomsma) - - John Bafford (jbafford) - Raul Fraile (raulfraile) - Adrian Rudnik (kreischweide) + - Pavel Batanov (scaytrase) - Francesc Rosàs (frosas) - - Romain Pierre (romain-pierre) - - Julien Galenski (ruian) - - Dieter - Bongiraud Dominique - Kyle - janschoenherr - Emanuele Gaspari (inmarelibero) - Dariusz Rumiński - - Chris Tanaskoski - - James Hemery - - Berny Cantos (xphere81) - Andrii Bodnar - - Thierry Thuon (lepiaf) - - Antonio Jose Cerezo (ajcerezo) - - Ricard Clau (ricardclau) - - Mark Challoner (markchalloner) - - Loïc Frémont (loic425) - - Oleksandr Barabolia (oleksandrbarabolia) + - Artem (artemgenvald) + - Thierry T (lepiaf) + - Lorenz Schori + - Jeremy Livingston (jeremylivingston) - ivan - - Greg Anderson - - Tri Pham (phamuyentri) - Urinbayev Shakhobiddin (shokhaa) - - Gennady Telegin (gtelegin) - - Krystian Marcisz (simivar) - - Toni Rudolf (toooni) - - Dalibor Karlović (dkarlovi) + - Ahmed Raafat + - Philippe Segatori + - Thibaut Cheymol (tcheymol) - Erin Millard - - Artur Melo (restless) - Matthew Lewinski (lewinski) - Magnus Nordlander (magnusnordlander) - - Carlos Pereira De Amorim (epitre) - - Rodrigo Aguilera - - Vladimir Varlamov (iamvar) + - Islam Israfilov (islam93) + - Ricard Clau (ricardclau) + - Roumen Damianoff - Thomas Royer (cydonia7) - Nicolas LEFEVRE (nicoweb) - - alquerci + - Emanuele Panzeri (thepanz) - Mateusz Sip (mateusz_sip) - Francesco Levorato - Vitaliy Zakharov (zakharovvi) - Tobias Sjösten (tobiassjosten) - Gyula Sallai (salla) - - Benjamin Cremer (bcremer) + - Bob van de Vijver (bobvandevijver) - Hendrik Luup (hluup) - Inal DJAFAR (inalgnu) - Christian Gärtner (dagardner) + - Martin Herndl (herndlm) - Dmytro Borysovskyi (dmytr0) - Tomasz Kowalczyk (thunderer) + - Johann Pardanaud + - Pavel Kirpitsov (pavel-kirpichyov) - Artur Eshenbrener - - Dries Vints + - Harm van Tilborg (hvt) - Thomas Perez (scullwm) - Yoann RENARD (yrenard) + - smoench - Felix Labrecque - Yaroslav Kiliba - Terje Bråten - - Renan Gonçalves (renan_saddam) + - Gonzalo Vilaseca (gonzalovilaseca) + - Markus Fasselt (digilist) - Tim Goudriaan (codedmonkey) - Tarmo Leppänen (tarlepp) - Martin Auswöger + - Jakub Kucharovic (jkucharovic) + - Daniel STANCU + - Kristen Gilden - Hubert Lenoir (hubert_lenoir) - Robbert Klarenbeek (robbertkl) - Hamza Makraz (makraz) - Eric Masoero (eric-masoero) - Vitalii Ekert (comrade42) - - JhonnyL + - Clara van Miert + - Haralan Dobrev (hkdobrev) - hossein zolfi (ocean) + - Alexander Menshchikov - Clément Gautier (clementgautier) - - Koen Reiniers (koenre) - - Sanpi + - Damien Alexandre (damienalexandre) + - Sanpi (sanpi) - Eduardo Gulias (egulias) - giulio de donato (liuggio) - - Mohamed Gamal - ShinDarth - Stéphane PY (steph_py) - Philipp Kräutli (pkraeutli) - Rhodri Pugh (rodnaph) - - Grzegorz Zdanowski (kiler129) - - Kirill chEbba Chebunin (chebba) - - Fritz Michael Gschwantner (fritzmg) + - Grzegorz (Greg) Zdanowski (kiler129) + - Dimitri Gritsajuk (ottaviano) + - Kirill chEbba Chebunin + - Pol Dellaiera (drupol) - + - Alex (aik099) - Fabien Villepinte - SiD (plbsid) - - Matthew Grasmick - Greg Thornton (xdissent) - - BENOIT POLASZEK (bpolaszek) - Alex Bowers - - Piotr Kugla (piku235) - - Philipp Cordes - - Jeroen Thora (bolle) + - Quynh Xuan Nguyen (seriquynh) - Costin Bereveanu (schniper) - - Loïc Chardonnet (gnusat) - Marek Kalnik (marekkalnik) - Vyacheslav Salakhutdinov (megazoll) + - Maksym Slesarenko (maksym_slesarenko) - Hassan Amouhzi + - Warxcell (warxcell) - Daniel Gorgan - Tamas Szijarto - Michele Locati - Pavel Volokitin (pvolok) - Arthur de Moulins (4rthem) - Matthias Althaus (althaus) - - Nicolas Dewez (nicolas_dewez) - Saif Eddin G - Endre Fejes - Tobias Naumann (tna) - - Greg ORIOL - Daniel Beyer - - Manuel Alejandro Paz Cetina + - flack (flack) - Shein Alexey - - Jacek Jędrzejewski (jacek.jedrzejewski) - - Romain Gautier (mykiwi) - - Stefan Kruppa + - Phil Taylor (prazgod) - Joe Lencioni - Daniel Tschinder + - Diego Agulló (aeoris) - vladimir.reznichenko - Kai - Lee Rowlands - - Krzysztof Piasecki (krzysztek) - Maximilian Reichel (phramz) - Alain Hippolyte (aloneh) - Grenier Kévin (mcsky_biig) - Karoly Negyesi (chx) - Xavier HAUSHERR - Albert Jessurum (ajessu) + - Romain Pierre - Laszlo Korte - Jonathan Scheiber (jmsche) - - Miha Vrhovnik - Alessandro Desantis - hubert lecorche (hlecorche) - Vladyslav Loboda - - fritzmg - Marc Morales Valldepérez (kuert) - - Jean-Baptiste GOMOND (mjbgo) - - Vadim Kharitonov (virtuozzz) + - Vadim Kharitonov (vadim) - Oscar Cubo Medina (ocubom) - Karel Souffriau - Christophe L. (christophelau) - - Sander Toonen (xatoo) - Anthon Pang (robocoder) + - Julien Galenski (ruian) + - Ben Scott (bpscott) - Marko Kaznovac (kaznovac) - Pablo Lozano (arkadis) - - Marc Laporte - - Michał Jusięga - - Bernd Stellwag - - Sébastien Santoro (dereckson) - - Gennadi Janzen - Brian King - - Michel Salib (michelsalib) - - geoffrey + - quentin neyrat (qneyrat) + - Chris Tanaskoski - Steffen Roßkamp - Alexandru Furculita (afurculita) - - Valentin Jonovs (valentins-jonovs) - - Bastien DURAND (deamon) + - Michel Salib (michelsalib) + - Valentin Jonovs + - geoffrey - Jeanmonod David (jeanmonod) - - Christin Gruber (christingruber) - - Andrey Sevastianov - Webnet team (webnet) - - marie + - Ben Ramsey (ramsey) + - Berny Cantos (xphere81) + - Antonio Jose Cerezo (ajcerezo) + - Marcin Szepczynski (czepol) + - Lescot Edouard (idetox) + - Mohammad Emran Hasan (phpfour) + - Dmitriy Mamontov (mamontovdmitriy) - Jan Schumann - - Noémi Salaün (noemi-salaun) - Niklas Fiekas - - Philippe Segatori + - Mark Challoner (markchalloner) - Markus Bachmann (baachi) - Kévin THERAGE (kevin_therage) - - Michel Hunziker - Gunnstein Lye (glye) - - scyzoryck - - Matthias Krauser (mkrauser) - Erkhembayar Gantulga (erheme318) - Alexis Lefebvre - - Lorenzo Millucci (lmillucci) - - Jérôme Tamarelle (jtamarelle-prismamedia) - - Andrii Popov (andrii-popov) - - Islam93 + - Greg Anderson - lancergr - - Mihai Stancu + - Tri Pham (phamuyentri) - Ivan Nikolaev (destillat) - Gildas Quéméner (gquemener) - - Pierrick VIGNAND (pierrick) + - Laurent Masforné (heisenberg) + - Claude Khedhiri (ck-developer) - Desjardins Jérôme (jewome62) - Arturs Vonda - - Josip Kruslin - - Xavier Briand (xavierbriand) + - Matthew Smeets + - Toni Rudolf (toooni) - Asmir Mustafic (goetas) - - DerManoMann - - Stefan Gehrig (sgehrig) - vagrant - - Aurimas Niekis (gcds) - - EdgarPE - - Florian Pfitzer (marmelatze) + - Benjamin Cremer (bcremer) - Asier Illarramendi (doup) + - AKeeman (akeeman) - Martijn Cuppens + - Restless-ET - Vlad Gregurco (vgregurco) - Boris Vujicic (boris.vujicic) + - Dries Vints + - Judicaël RUFFIEUX (axanagor) - Chris Sedlmayr (catchamonkey) - - Indra Gunawan (indragunawan) + - DerManoMann - Jérôme Tanghe (deuchnord) - Mathias STRASSER (roukmoute) - simon chrzanowski (simonch) @@ -700,9 +648,8 @@ The Symfony Connect username in parenthesis allows to get more information - Marcin Michalski (marcinmichalski) - Vitaliy Tverdokhlib (vitaliytv) - Ariel Ferrandini (aferrandini) - - Niklas Keller - Dirk Pahl (dirkaholic) - - cedric lombardot (cedriclombardot) + - Cédric Lombardot (cedriclombardot) - Dane Powell - Arkadius Stefanski (arkadius) - Jonas Flodén (flojon) @@ -710,519 +657,413 @@ The Symfony Connect username in parenthesis allows to get more information - Tobias Weichart - Miro Michalicka - M. Vondano - - Dominik Zogg (dominik.zogg) - - Marek Pietrzak - - Tavo Nieves J + - Dominik Zogg + - Tavo Nieves J (tavoniievez) - Luc Vieillescazes (iamluc) - Lukáš Holeczy (holicz) - Erik Saunier (snickers) - - franek (franek) + - François Dume (franek) - Jerzy (jlekowski) - Raulnet - - Christian Wahler - Giso Stallenberg (gisostallenberg) - - Gintautas Miselis - Rob Bast - Roberto Espinoza (respinoza) - Pierre Rineau - - Andreas Leathley (iquito) - - Soufian EZ-ZANTAR (soezz) - - Arun Philip - - Zander Baldwin + - Soufian EZ ZANTAR (soezz) - Marek Zajac - Adam Harvey + - Cătălin Dan (dancatalin) + - ilyes kooli (skafandri) - Anton Bakai - - Vadim Borodavko (javer) - - Xesxen - battye - Sam Fleming (sam_fleming) - - William Arslett - Alex Bakhturin - Patrick Reimers (preimers) + - Brayden Williams (redstar504) - insekticid - - Alexander Obuhovich (aik099) - Jérémy M (th3mouk) - - Vitaliy Ryaboy (vitaliy) - boombatower - - Fabrice Bernhard (fabriceb) + - Alireza Mirsepassi (alirezamirsepassi) - Jérôme Macias (jeromemacias) - Andrey Astakhov (aast) - ReenExe - - Adrien Lucas (adrienlucas) - Fabian Lange (codingfabian) - - Frank Neff (fneff) - - Roman Lapin (memphys) - Yoshio HANAWA - - Randy Geraads - Jan van Thoor (janvt) - - Gladhon - Joshua Nye - Martin Kirilov (wucdbm) + - Koen Reiniers (koenre) - Nathan Dench (ndenc2) - - Thibault Richard (t-richard) + - Gijs van Lammeren - Sebastian Bergmann - - Miroslav Sustek + - Matthew Grasmick + - Miroslav Šustek (sustmi) - Pablo Díez (pablodip) - - Michel Roca (mroca) - Kevin McBride - Sergio Santoro - - Robin van der Vleuten (robinvdvleuten) - Philipp Rieber (bicpi) - Manuel de Ruiter (manuel) - Nathanael Noblet (gnat) - nikos.sotiropoulos + - BENOIT POLASZEK (bpolaszek) - Eduardo Oliveira (entering) - Oleksii Zhurbytskyi - Bilge - - Ilya Antipenko (aivus) + - Eugene Wissner - Ricardo Oliveira (ricardolotr) - Roy Van Ginneken (rvanginneken) - - Steve Grunwell - ondrowan - Barry vd. Heuvel (barryvdh) - - Jon Dufresne + - Chad Sikorra (chadsikorra) - Fabien S (bafs) - Evan S Kaufman (evanskaufman) - - Alex Bacart - mcben - Jérôme Vieilledent (lolautruche) - Roman Anasal - - Maks Slesarenko - Filip Procházka (fprochazka) - - mmoreram - - Yannick Ihmels (ihmels) + - Jeroen Thora (bolle) - Markus Lanthaler (lanthaler) - Remi Collet + - Piotr Kugla (piku235) - Vicent Soria Durá (vicentgodella) - Michael Moravec - - Carlos Buenosvinos (carlosbuenosvinos) - Leevi Graham (leevigraham) - Anthony Ferrara - Ioan Negulescu + - Greg ORIOL - Jakub Škvára (jskvara) - Andrew Udvare (audvare) - alexpods - - Dennis Langen (nijusan) - - Adrien Wilmet (adrienfr) - - Adam Szaraniec (mimol) + - Adam Szaraniec - Dariusz Ruminski - - Erik Trapman (eriktrapman) + - Romain Gautier (mykiwi) + - Matthieu Bontemps + - Erik Trapman - De Cock Xavier (xdecock) - - Almog Baku (almogbaku) - Evert Harmeling (evertharmeling) + - Nicolas Dewez (nicolas_dewez) - Scott Arciszewski - Xavier HAUSHERR - Norbert Orzechowicz (norzechowicz) - - stlrnz - - Denis Charrier (brucewouaigne) + - Fabrice Bernhard (fabriceb) - Matthijs van den Bos (matthijs) - - Simon Podlipsky (simpod) - - DemigodCode - bhavin (bhavin4u) - Jaik Dean (jaikdean) + - Krzysztof Piasecki (krzysztek) - Pavel Popov (metaer) - Lenard Palko - - arai - Nils Adermann (naderman) - Tom Klingenberg - Gábor Fási - - DUPUCH (bdupuch) - - Dadang NH (dadangnh) + - R. Achmad Dadang Nur Hidayanto (dadangnh) - Nate (frickenate) - - Joachim Løvgaard (loevgaard) - Stefan Kruppa - - jhonnyL + - Jacek Jędrzejewski (jacek.jedrzejewski) + - Stefan Kruppa - sasezaki - - Kristof Van Cauwenbergh (kristofvc) - Dawid Pakuła (zulusx) - - Marco Lipparini (liarco) - Florian Rey (nervo) - Rodrigo Borrego Bernabé (rodrigobb) + - John Bafford (jbafford) - Emanuele Iannone - - Jörn Lang (j.lang) - Petr Duda (petrduda) - - Marcos Rezende (rezehnde) + - Marcos Rezende (rezende79) - Denis Gorbachev (starfall) - - Peter van Dommelen - - Tim van Densen - Martin Morávek (keeo) - - Steven Surowiec - Kevin Saliou (kbsali) + - Steven Surowiec (steves) - Shawn Iwinski + - Dieter - Samuele Lilli (doncallisto) - Gawain Lynch (gawain) - - Peter Bowyer (pbowyer) - Wojciech Kania - - mmokhi - - NothingWeAre - - Andrii Dembitskyi + - mmokhi - Ryan - - Lctrs - Alexander Deruwe (aderuwe) - Dave Hulbert (dave1010) - - Konstantin Grachev (grachevko) - Ivan Rey (ivanrey) + - M. (mbontemps) - Marcin Chyłek (songoq) - - Ben Scott - Ned Schwartz - - Anderson Müller - Ziumin - - Jeremy Benoist - Lenar Lõhmus - - Daniël Brekelmans (dbrekelmans) - - Simon Heimberg (simon_heimberg) - - Benjamin Laugueux (yzalis) + - Sander Toonen (xatoo) - Zach Badgett (zachbadgett) + - Loïc Faugeron - Aurélien Fredouelle - Pavel Campr (pcampr) - Andrii Dembitskyi + - Forfarle (forfarle) - Johnny Robeson (johnny) - - Pavol Tuka - Disquedur - - Michiel Boeckaert (milio) - Benjamin Morel - - Dmitriy Derepko - Geoffrey Tran (geoff) - - Thiago Cordeiro (thiagocordeiro) - - Jan Behrens - - Dragos Protung (dragosprotung) + - Jannik Zschiesche + - Bernd Stellwag + - Jan Ole Behrens (deegital) - Romain Monteil (ker0x) - Mantas Var (mvar) - Terje Bråten - - Yann LUCAS (drixs6o9) - Sebastian Krebs - Piotr Stankowski - - Stewart Malik - - Stefan Graupner (efrane) - - Gemorroj (gemorroj) - - Baptiste Leduc (bleduc) - Julien Maulny - - Mihail Krasilnikov (krasilnikovm) - - iamvar - - Pierre Tondereau - - Alex Vo (votanlean) - - Daniel González (daniel.gonzalez) - - Piergiuseppe Longo - - Kevin Auivinet - - Aurélien MARTIN - - Malte Schlüter - - Jules Matsounga (hyoa) - - Quentin Dequippe (qdequippe) - - khoptynskyi - - Jean-Christophe Cuvelier [Artack] + - Gennadi Janzen + - James Hemery - julien57 - - Julien Montel (julienmgel) - Mátyás Somfai (smatyas) - - Alexandre Tranchant (alexandre_t) - - Anthony Moutte - - Thomas Ferney (thomasf) - - Simon DELICATA - - Hallison Boaventura (hallisonboaventura) + - Bastien DURAND (deamon) - Dmitry Simushev - alcaeus - - Thomas Talbot (ioni) - Fred Cox - - Iliya Miroslavov Iliev (i.miroslavov) - - Safonov Nikita (ns3777k) + - Simon DELICATA - vitaliytv - Egor Taranov - - Nicolas Martin (cocorambo) + - Philippe Segatori + - Loïc Frémont (loic425) - Jon Gotlin (jongotlin) - Adrian Nguyen (vuphuong87) - benjaminmal + - Andrey Sevastianov + - Oleksandr Barabolia (oleksandrbarabolia) - Khoo Yong Jun + - Christin Gruber (christingruber) - Sebastian Blum - - Laurent Clouet - - aubx + - Daniel González (daniel.gonzalez) - Julien Turby - - Marvin Butkereit - - Eduard Bulava (nonanerz) - Renan - Ricky Su (ricky) - - Igor Timoshenko (igor.timoshenko) + - scyzoryck - Kyle Evans (kevans91) - - Benoit Mallo - - Charles-Henri Bruyand - Max Rath (drak3) - - Valentin - - pizzaminded + - marie - Stéphane Escandell (sescandell) - - Konstantin S. M. Möllers (ksmmoellers) - Fractal Zombie - - linh - James Johnston + - Noémi Salaün (noemi-salaun) - Sinan Eldem - - Kajetan Kołtuniak (kajtii) - - Damien Fayet (rainst0rm) + - Gennady Telegin - Alexandre Dupuy (satchette) - - MatTheCat + - Michel Hunziker - Malte Blättermann - - Islam Israfilov (islam93) - Simeon Kolev (simeon_kolev9) - Joost van Driel (j92) - Jonas Elfering + - Mihai Stancu - Nahuel Cuesta (ncuesta) - Chris Boden (cboden) + - EStyles (insidestyles) - Christophe Villeger (seragan) + - Krystian Marcisz (simivar) + - Matthias Krauser (mkrauser) - Julien Fredon - - Jacek Wilczyński (jacekwilczynski) - Xavier Leune (xleune) - Hany el-Kerdany - Wang Jingyu - Åsmund Garfors - Maxime Douailin - - Jean Pasdeloup (pasdeloup) + - Jean Pasdeloup + - Michael Hirschler (mvhirsch) + - Lorenzo Millucci (lmillucci) - Javier López (loalf) - Reinier Kip + - Jérôme Tamarelle (jtamarelle-prismamedia) - Geoffrey Brier (geoffrey-brier) - Alexandre Parent - Roger Guasch (rogerguasch) - DT Inier (gam6itko) - Vladimir Tsykun - - Andrei O - Dustin Dobervich (dustin10) - Luis Tacón (lutacon) - Dmitrii Tarasov (dtarasov) - - Karl Shea - dantleech - Philipp Kolesnikov - - Valentin - Maxim Dovydenok (shiftby) - - Anne-Sophie Bachelard (annesophie) - Sebastian Marek (proofek) - - Jan Vernieuwe (vernija) + - Carlos Pereira De Amorim (epitre) - zenmate - - Michal Trojanowski - - j.schmitt + - Andrii Popov (andrii-popov) - David Fuhr - - Evgeny Anisiforov - - smoench - - Max Grigorian (maxakawizard) + - Rodrigo Aguilera + - Vladimir Varlamov (iamvar) + - Aurimas Niekis (gcds) - Martins Sipenko - Guilherme Augusto Henschel - Rostyslav Kinash - - Cristoforo Cervino (cristoforocervino) - Dennis Fridrich (dfridrich) - Mardari Dorel (dorumd) - Daisuke Ohata - Vincent Simonin + - Pierrick VIGNAND (pierrick) - Alex Bogomazov (alebo) - - maxime.steinhausser - - Claus Due (namelesscoder) - - adev - - Alexandru Patranescu + - aaa2000 (aaa2000) - Andy Palmer (andyexeter) - - Stefan Warman + - Stefan Warman (warmans) - Tristan Maindron (tmaindron) - - Behnoush norouzali (behnoush) + - Behnoush Norouzali (behnoush) - Marko H. Tamminen (gzumba) - Wesley Lancel + - Xavier Briand (xavierbriand) - Ke WANG (yktd26) - - Timothée BARRAY - - Nilmar Sanchez Muguercia - Ivo Bathke (ivoba) - - Ippei SUmida (ippey_s) + - Ippei Sumida (ippey_s) - David Molineus - Strate - - Jon Green - Anton A. Sumin - Israel J. Carberry - Miquel Rodríguez Telep (mrtorrent) + - Stefan Gehrig (sgehrig) - Sergey Kolodyazhnyy (skolodyazhnyy) - umpirski - Quentin de Longraye (quentinus95) - Chris Heng (gigablah) - - Shaun Simmons (simshaun) - Richard Bradley - - Ulumuddin Yunus (joenoez) + - Ulumuddin Cahyadi Yunus (joenoez) - rtek - - Benjamin Dos Santos - - Jérémy Jarrié (gagnar) - - Adrien Jourdier - - Tomas Javaisis - - Ivan Grigoriev + - Adrien Jourdier (eclairia) + - Florian Pfitzer (marmelatze) + - Ivan Grigoriev (greedyivan) - Johann Saunier (prophet777) - Kevin SCHNEKENBURGER - Fabien Salles (blacked) - - Andreas Erhard - - John VanDeWeghe - - Sergey Belyshkin + - Andreas Erhard (andaris) + - Sergey Belyshkin (sbelyshkin) - Michael Devery (mickadoo) - Antoine Corcy - Ahmed Ashraf (ahmedash95) - Gert Wijnalda (cinamo) - Luca Saba (lucasaba) - - maxime.perrimond - - Sascha Grossenbacher - - cthulhu - - Rémi Leclerc - - Jonas Hünig + - Sascha Grossenbacher (berdir) + - Robin Lehrmann - Szijarto Tamas - Thomas P - - Robin Lehrmann (robinlehrmann) - - Catalin Dan - Jaroslav Kuba - - Kristijan Kanalas - - Stephan Vock - Benjamin Zikarsky (bzikarsky) + - Kristijan Kanalaš (kristijan_kanalas_infostud) + - sl_toto (sl_toto) + - Marek Pietrzak (mheki) - “Filip - - Marion Hurteau - - Dmitrii Lozhkin - - Sobhan Sharifi (50bhan) - - Stephen - - Tomasz (timitao) - - Nguyen Tuan Minh (tuanminhgp) - - Malte Schlüter + - Mickaël Andrieu (mickaelandrieu) - Simon Watiau (simonwatiau) - Ruben Jacobs (rubenj) - Simon Schick (simonsimcity) - - redstar504 - Tristan Roussel + - Niklas Keller - Cameron Porter - Hossein Bukhamsin - Oliver Hoff + - William Arslett - Christian Sciberras (uuf6429) - - Arthur Woimbée - - Théo DELCEY - - Disparity - - Andrii Serdiuk (andreyserdjuk) - - dangkhoagms (dangkhoagms) - - Floran Brutel (notFloran) (floran) - origaminal - Matteo Beccati (matteobeccati) + - Renan Gonçalves (renan_saddam) + - Vitaliy Ryaboy (vitaliy) - Kevin (oxfouzer) - Paweł Wacławczyk (pwc) - - Sagrario Meneses - Oleg Zinchenko (cystbear) - Baptiste Meyer (meyerbaptiste) - - Stefano A. (stefano93) - Tales Santos (tsantos84) - Johannes Klauss (cloppy) - Evan Villemez - - Florian Hermann (fhermann) - fzerorubigd - Thomas Ploch - Benjamin Grandfond (benjamin) - Tiago Brito (blackmx) - - Roromix - - Maxime AILLOUD (mailloud) + - Gintautas Miselis (naktibalda) - Richard van den Brand (ricbra) - Toon Verwerft (veewee) - - mohammadreza honarkhah - develop - flip111 + - Douglas Hammond (wizhippo) - VJ - RJ Garcia - - Adam Wójs (awojs) + - Adrien Lucas (adrienlucas) - Delf Tonder (leberknecht) - - Paweł Niedzielski (steveb) - - Peter Jaap Blaakmeer - Ondrej Exner - Mark Sonnabaum - - Junaid Farooq (junaidfarooq) - Massimiliano Braglia (massimilianobraglia) - - Frankie Wittevrongel - Richard Quadling + - James Hudson (mrthehud) - Raphaëll Roussel - - Anton Kroshilin - Michael Lutz - - Javier Espinosa (javespi) - jochenvdv + - Michel Roca (mroca) - Reedy - Arturas Smorgun (asarturas) - - Andrea Sprega (asprega) - - Alexander Volochnev (exelenz) - - Viktor Bajraktar (njutn95) - - Mbechezi Nawo - - Michael Piecko + - Aleksandr Volochnev (exelenz) + - Robin van der Vleuten (robinvdvleuten) + - Grinbergs Reinis (shima5) + - Michael Piecko (michael.piecko) - Toni Peric (tperic) - yclian - Aleksey Prilipko - Jelle Raaijmakers (gmta) - - Damien Fa - Andrew Berry - - twifty - - Indra Gunawan (guind) + - Wybren Koelmans (wybren_koelmans) - Roberto Nygaard - - Peter Ward - Davide Borsatto (davide.borsatto) - - Guillaume Sainthillier (guillaume-sainthillier) - - Benjamin RICHARD (rebolon) - James Gilliland (neclimdul) - Gert de Pagter - - Ilya Ch. (ilya0) - Julien DIDIER (juliendidier) - - Ilia Sergunin (maranqz) - - marbul - - Dominik Ritter (dritter) + - Dalibor Karlović + - Randy Geraads + - Andreas Leathley (iquito) + - Vadim Borodavko (javer) - Sebastian Grodzicki (sgrodzicki) - - Florian Caron (shalalalala) + - Mohamed Gamal - Eric COURTIAL - - Jeroen van den Enden (stoefke) - - Aurélien Fontaine + - Xesxen + - Jeroen van den Enden (endroid) + - Arun Philip - Pascal Helfenstein - Baldur Rensch (brensch) - Carl Casbolt (carlcasbolt) - Vladyslav Petrovych - - Hugo Sales + - Loïc Chardonnet - Alex Xandra Albert Sim - - Carson Full - Sergey Yastrebov + - Carson Full (carsonfull) - kylekatarnls (kylekatarnls) - Trent Steel (trsteel88) + - Steve Grunwell - Yuen-Chi Lian - Tarjei Huse (tarjei) - Besnik Br - Axel Guckelsberger (guite) - Jose Gonzalez - - Jonathan (jls-esokia) - - Dariusz Ruminski + - Jonathan Sui Lioung Lee Slew (jlslew) - Claudio Zizza - - Zlatoslav Desyatnikov - - Wickex - - tuqqu - - Neagu Cristian-Doru (cristian-neagu) - - Dude (b1rdex) + - Anatoly Pashin (b1rdex) - Dave Marshall (davedevelopment) - Jakub Kulhan (jakubkulhan) - Shaharia Azam - avorobiev - Gerben Oolbekkink - - Kai - - Bartłomiej Zając + - Gladhon - stoccc - Grégoire Penverne (gpenverne) - Venu - - Lars Vierbergen - Jonatan Männchen - Dennis Hotson - Andrew Tchircoff (andrewtch) + - Lars Vierbergen (vierbergenlars) + - Xav` (xavismeh) - michaelwilliams - - Romain - - Matěj Humpál - - Pierre Grimaud (pgrimaud) - Alexandre Parent - 1emming - Nykopol (nykopol) + - Thibault Richard (t-richard) - Jordan Deitch - - Raphael Hardt - Casper Valdemar Poulsen - - SnakePin + - Guillaume Verstraete - vladimir.panivko - Josiah (josiah) - Dennis Væversted (srnzitcom) - - Guillaume Verstraete (versgui) - Joschi Kuphal - John Bohn (jbohn) - - Marc Morera (mmoreram) - - Jason Tan - - Julien Pauli - - Dominik Piekarski (dompie) - - Rares Sebastian Moldovan (raresmldvn) + - Jason Tan (jt2k) - Jérémy REYNAUD (babeuloula) + - Felds Liscia (felds) - Mathieu Rochette (mathroc) - - Victor Garcia - - Marek Víger (freezy) - Andrew Hilobok (hilobok) - Noah Heck (myesain) - Christian Soronellas (theunic) @@ -1230,78 +1071,76 @@ The Symfony Connect username in parenthesis allows to get more information - fedor.f - Yosmany Garcia (yosmanyga) - Jeremiasz Major - - Wouter de Wild - Trevor North - Degory Valentine - izzyp - - Benoit Lévêque (benoit_leveque) - Jeroen Fiege (fieg) - - Krzysiek Łabuś - - Juraj Surman - - Camille Dejoye - - 1ma (jautenim) - - Douglas Hammond (wizhippo) + - Martin (meckhardt) + - Marcel Hernandez + - Krzysztof Łabuś (crozin) - Xavier Lacot (xavier) + - Jon Dufresne - possum - Denis Zunke (donalberto) - - Ahmadou Waly Ndiaye (waly) + - _sir_kane (waly) - Antonin CLAUZIER (0x346e3730) - - moldman + - Olivier Maisonneuve - Jonathan Johnson (jrjohnson) - - Olivier Maisonneuve (olineuve) + - Andrei C. (moldman) + - Mike Meier (mykon) - Pedro Miguel Maymone de Resende (pedroresende) + - stlrnz - Masterklavi + - Adrien Wilmet (adrienfr) - Franco Traversaro (belinde) - Francis Turmel (fturmel) + - Yannick Ihmels (ihmels) - Nikita Nefedov (nikita2206) + - Alex Bacart - cgonzalez - hugovms - Ben - - roromix - - Dmitry Pigin (dotty) - Vincent Composieux (eko) + - Cyril Pascal (paxal) - Jayson Xu (superjavason) + - DemigodCode - fago - - popnikos - - Tito Costa - Jan Prieser - - GDIBass - Maximilian Bösing - - Thiago Melo + - Matt Johnson (gdibass) - Zhuravlev Alexander (scif) - Stefano Degenkamp (steef) - James Michael DuPont + - Carlos Buenosvinos (carlosbuenosvinos) - Christian Gripp (core23) - Jake (jakesoft) - - Flinsch - - Quentin Dreyer + - Vincent CHALAMON - Bahman Mehrdad (bahman) - - Jordan de Laune (jdelaune) - Christopher Hall (mythmakr) - - none (nelexa) - Patrick Dawkins (pjcdawkins) - Paul Kamer (pkamer) - Rafał Wrzeszcz (rafalwrzeszcz) - - Vincent CHALAMON (vincentchalamon) + - Nguyen Xuan Quynh - Reen Lokum + - Dennis Langen (nijusan) - Martin Parsiegla (spea) - - Bernhard Rusch + - Manuel Alejandro Paz Cetina + - Denis Charrier (brucewouaigne) + - Youssef Benhssaien (moghreb) - Mario Ramundo (rammar) - Ivan - - Quentin Schuler - Nico Haase + - Philipp Scheit (pscheit) - Pierre Vanliefland (pvanliefland) - Roy Klutman (royklutman) - Sofiane HADDAG (sofhad) + - Quentin Schuler (sukei) - frost-nzcr4 - - Taylor Otwell - Shahriar56 - - Sami Mussbach - Dhananjay Goratela - Kien Nguyen - - Foxprodev - - Eric Hertwig - - Niels Robin-Aubertin + - Bozhidar Hristov + - arai - Achilles Kaloeridis (achilles) - Laurent Bassin (lbassin) - Mouad ZIANI (mouadziani) @@ -1309,107 +1148,102 @@ The Symfony Connect username in parenthesis allows to get more information - andrey1s - Abhoryo - Fabian Vogler (fabian) + - Joachim Løvgaard (loevgaard) + - Simon Podlipsky (simpod) - Shakhobiddin - Korvin Szanto - Stéphan Kochen - - Steven Dubois - Arjan Keeman - - siganushka - Alaattin Kahramanlar (alaattin) - Sergey Zolotov (enleur) + - Nicole Cordes (ichhabrecht) - Maksim Kotlyar (makasim) + - siganushka (siganushka) - Neil Ferreira - Julie Hourcade (juliehde) - Dmitry Parnas (parnas) - - Paul LE CORRE - Loïc Beurlet - - Sébastien COURJEAN - Ana Raro - Ana Raro - Tony Malzhacker - - Pchol - - Mathieu MARCHOIS + - Andreas Lutro (anlutro) + - DUPUCH (bdupuch) - Cyril Quintin (cyqui) - - Cyrille Bourgois (cyrilleb) - Gerard van Helden (drm) - Florian Wolfsjaeger (flowolf) - Ivan Sarastov (isarastov) - Johnny Peck (johnnypeck) - Jordi Sala Morales (jsala) + - Loic Chardonnet - Ivan Menshykov - David Romaní - Patrick Allaert + - Alexander Li (aweelex) - Gustavo Falco (gfalco) - Matt Robinson (inanimatt) + - Kristof Van Cauwenbergh (kristofvc) + - Marco Lipparini (liarco) + - Peter Bowyer (pbowyer) - Aleksey Podskrebyshev - Calin Mihai Pristavu - Gabrielle Langer + - Jörn Lang - David Marín Carreño (davefx) - Fabien LUCAS (flucas2) + - Konstantin Grachev (grachevko) + - Hidde Boomsma (hboomsma) + - Johan Vlaar (johjohan) - Ondrej Machulda (ondram) - - Omar Yepez (oyepez003) - - Ashura - mwsaz - - carlos-ea - - Jérémy Benoist - - Ferran Vidal - bogdan - - Jelle Kapitein - - Benoît Bourgeois - - lerminou - - mantulo - - pdragun - - corphi - - JoppeDC - Daniel Tiringer + - Geert De Deckere - grizlik + - Henry Snoek - Derek ROTH + - Jeremy Benoist - Ben Johnson + - Jan Kramer - mweimerskirch - Andrew Codispoti - - Benjamin Franzke - - baron (bastien) + - Benjamin Laugueux + - Lctrs + - Benoît Bourgeois (bierdok) - Dmytro Boiko (eagle) - Shin Ohno (ganchiku) - - Geert De Deckere (geertdd) - - Jan Kramer (jankramer) - - Kubicki Kamil (kubik) - - Simon Leblanc (leblanc_simon) + - Joppe De Cuyper (joppedc) - Matthieu Mota (matthieumota) - - Mikhail Prosalov (mprosalov) - - Ronny López (ronnylt) + - Jean-Baptiste GOMOND (mjbgo) - abdul malik ikhsan (samsonasik) - - Henry Snoek (snoek09) - - Dmitry (staratel) - - Tito Miguel Costa (titomiguelcosta) - - Simone Di Maulo (toretto460) + - Morgan Auchede - Christian Morgan - - Alexander Miehe (engerim) - - Morgan Auchede (mauchede) + - Alexander Miehe + - Andrii Dembitskyi + - Daniël Brekelmans (dbrekelmans) - Sascha Dens (saschadens) + - Simon Heimberg (simon_heimberg) - Morten Wulff (wulff) - Don Pinkster - Maksim Muruev - Emil Einarsson + - Anderson Müller - 243083df - Thibault Duplessis - Rimas Kudelis - Marc Abramowitz - Martijn Evers - Tony Tran - - Evgeniy Koval - - Jacques Moati - - Balazs Csaba (balazscsaba2006) - - Benoit Galati (benoitgalati) + - Balazs Csaba - Bill Hance (billhance) - Douglas Reith (douglas_reith) - - Forfarle (forfarle) - Harry Walter (haswalt) + - Jacques MOATI (jmoati) - Johnson Page (jwpage) - Kuba Werłos (kuba) - Ruben Gonzalez (rubenruateltek) - Michael Roterman (wtfzdotnet) - Philipp Keck + - Pavol Tuka - Arno Geurts - Adán Lobato (adanlobato) - Ian Jenkins (jenkoian) @@ -1418,114 +1252,115 @@ The Symfony Connect username in parenthesis allows to get more information - Matthew Davis (mdavis1982) - Paulo Ribeiro (paulo) - Markus S. (staabm) - - Maks - - Knallcharge - - Antoine LA + - Marc Laporte + - Michał Jusięga - den - - pawel-lewtak - - omerida - Gábor Tóth - - tsilefy - - Markus Klein - - Matthias Dötsch - - Bogdan + - ouardisoft - Daniel Cestari - Matt Janssen - - Matteo Galli - - Loenix - - Simon Frost - - David Lima - - Sean Templeton + - Dmitriy Derepko - Stéphane Delprat - - Ronny (big-r) - - Brian Freytag (brianfreytag) - - Cătălin Dan (dancatalin) - - Erwan Nader (ernadoo) - Elan Ruusamäe (glen) - - Ian Littman (iansltx) - - Arkadiusz Kondas (itcraftsmanpl) - - Joao Paulo V Martins (jpjoao) - Brunet Laurent (lbrunet) - - Jérémy (libertjeremy) - Florent Viel (luxifer) + - Maks 3w (maks3w) + - Michiel Boeckaert (milio) - Mikhail Yurasov (mym) - - LOUARDI Abdeltif (ouardisoft) - Robert Gruendler (pulse00) - Sebastian Paczkowski (sebpacz) - Simon Terrien (sterrien) - - Success Go (successgo) - Benoît Merlet (trompette) - - Aaron Piotrowski (trowski) - - Vincent MOULENE (vints24) - - Koen Kuipers - datibbaw + - Dragos Protung (dragosprotung) + - Koen Kuipers (koku) - Nicolas de Marqué (nicola) - - Antoine Leblanc - - Andre Johnson - - Marco Pfeiffer + - Thiago Cordeiro (thiagocordeiro) + - Matthieu Bontemps - Rootie - - Gabriel Solomon (gabrielsolomon) + - Sébastien Santoro (dereckson) - Daniel Alejandro Castro Arellano (lexcast) - - Aleksandar Dimitrov (netbull) - - Gary Houbre (thegarious) - - sensio - Thomas Jarrand + - Baptiste Leduc (bleduc) - Antoine Bluchet (soyuka) - Patrick Kaufmann - Anton Dyshkant - Paul Oms + - Yann LUCAS (drixs6o9) - Reece Fowell (reecefowell) - - stefan.r - Htun Htun Htet (ryanhhh91) - Guillaume Gammelin - Valérian Galliat - Sorin Pop (sorinpop) - d-ph + - Stewart Malik - Renan Taranto (renan-taranto) + - Stefan Graupner (efrane) + - Gemorroj (gemorroj) + - Thomas Talbot - Adrien Chinour - Rikijs Murgs + - Mihail Krasilnikov (krasilnikovm) - Uladzimir Tsykun + - iamvar - Amaury Leroux de Lens (amo__) - Christian Jul Jensen - - Alexandre GESLIN (alexandregeslin) + - Alexandre GESLIN - The Whole Life to Learn - - joel lusavuvu (enigma97) + - Pierre Tondereau + - Joel Lusavuvu (enigma97) + - Alex Vo (votanlean) - Mikkel Paulson - ergiegonzaga - André Matthies + - Piergiuseppe Longo + - Kevin Auivinet - Liverbool (liverbool) - Valentin Nazarov + - Dalibor Karlović + - Aurélien MARTIN + - Malte Schlüter + - Jules Matsounga (hyoa) + - Quentin Dequippe (qdequippe) + - Yewhen Khoptynskyi (khoptynskyi) - Jérôme Nadaud (jnadaud) - Sam Malone - - Phan Thanh Ha (haphan) + - Ha Phan (haphan) - Chris Jones (leek) - neghmurken + - stefan.r - xaav + - Jean-Christophe Cuvelier [Artack] - Mahmoud Mostafa (mahmoud) + - Alexandre Tranchant (alexandre_t) + - Anthony Moutte - Ahmed Abdou - shreyadenny - Daniel Iwaniec + - Thomas Ferney (thomasf) - Pieter - Michael Tibben + - Hallison Boaventura (hallisonboaventura) - Mas Iting - Billie Thompson - Albion Bame (abame) - - Ganesh Chandrasekaran + - Ganesh Chandrasekaran (gxc4795) - Sander Marechal - Ivan Nemets - Grégoire Hébert (gregoirehebert) - Franz Wilding (killerpoke) - - ProgMiner - Oleg Golovakhin (doc_tr) - Icode4Food (icode4food) - Radosław Benkel - - EStyles (insidestyles) - - kevin.nadin + - Kevin Nadin (kevinjhappy) - jean pasqualini (darkilliant) + - Iliya Miroslavov Iliev (i.miroslavov) + - Safonov Nikita (ns3777k) - Ross Motley (rossmotley) - ttomor - Mei Gwilym (meigwilym) - - Michael H. Arieli (excelwebzone) + - Michael H. Arieli + - Nicolas Martin (cocorambo) - Tom Panier (neemzy) - Fred Cox - luffy1727 @@ -1535,25 +1370,35 @@ The Symfony Connect username in parenthesis allows to get more information - Sander Coolen (scoolen) - Emil Masiakowski - Amirreza Shafaat (amirrezashafaat) + - Laurent Clouet - Adoni Pavlakis (adoni) - Nicolas Le Goff (nlegoff) - Alex Hofbauer (alexhofbauer) - Maarten Nusteling (nusje2000) + - Anne-Sophie Bachelard - Ahmed EBEN HASSINE (famas23) + - Marvin Butkereit - Ben Oman - Chris de Kok - - Andreas Kleemann + - Eduard Bulava (nonanerz) + - Andreas Kleemann (andesk) + - Igor Timoshenko (igor.timoshenko) - Manuele Menozzi - “teerasak” - Anton Babenko (antonbabenko) - Irmantas Šiupšinskas (irmantas) + - Benoit Mallo + - Charles-Henri Bruyand - Danilo Silva - Giuseppe Campanelli + - Valentin + - pizzaminded - Matthieu Calie (matth--) - - Arnaud PETITPAS (apetitpa) + - Konstantin S. M. Möllers (ksmmoellers) - Ken Stanley - ivan - Zachary Tong (polyfractal) + - linh - Oleg Krasavin (okwinza) - Mario Blažek (marioblazek) - Jure (zamzung) @@ -1564,11 +1409,13 @@ The Symfony Connect username in parenthesis allows to get more information - johnstevenson - hamza - dantleech + - Kajetan Kołtuniak (kajtii) - Sander Goossens (sandergo90) - Rudy Onfroy - Tero Alén (tero) - - Stanislav Kocanda - DerManoMann + - Damien Fayet (rainst0rm) + - MatTheCat - Guillaume Royer - Erfan Bahramali - Artem (digi) @@ -1585,22 +1432,23 @@ The Symfony Connect username in parenthesis allows to get more information - chispita - Wojciech Sznapka - Luis Pabon (luispabon) - - Gavin Staniforth - boulei_n - Anna Filina (afilina) + - Gavin (gavin-markup) - Ksaveras Šakys (xawiers) + - Shaun Simmons - Ariel J. Birnbaum - Patrick Luca Fazzi (ap3ir0n) - Danijel Obradović - Pablo Borowicz - - Arjan Keeman - Bruno Rodrigues de Araujo (brunosinister) - Máximo Cuadros (mcuadros) - Lukas Mencl + - Jacek Wilczyński (jacekwilczynski) - tamirvs - gauss - julien.galenski - - Christian Neff + - Christian Neff (secondtruth) - Chris Tiearney - Oliver Hoff - Ole Rößner (basster) @@ -1610,92 +1458,106 @@ The Symfony Connect username in parenthesis allows to get more information - tamar peled - Per Sandström (per) - Goran Juric - - Laurent Ghirardotti (laurentg) + - Laurent G. (laurentg) - Nicolas Macherey - Guido Donnari - - AKeeman (akeeman) - Mert Simsek (mrtsmsk0) - Lin Clark - - Meneses (c77men) + - Christophe Meneses (c77men) - Jeremy David (jeremy.david) + - Andrei O - Jordi Rejas - Troy McCabe - Ville Mattila - - ilyes kooli - gr1ev0us - mlazovla - Alejandro Diaz Torres + - Karl Shea + - Valentin - Max Beutel - Łukasz Chruściel (lchrusciel) + - Jan Vernieuwe (vernija) - Antanas Arvasevicius - Pierre Dudoret + - Michal Trojanowski - Thomas + - j.schmitt - Georgi Georgiev - Maximilian Berghoff (electricmaxxx) - - nacho + - Evgeny Anisiforov - TristanPouliquen - Piotr Antosik (antek88) + - Nacho Martin (nacmartin) - mwos - Volker Killesreiter (ol0lll) - Vedran Mihočinec (v-m-i) - Sergey Novikov (s12v) - creiner + - ProgMiner - Marcos Quesada (marcos_quesada) - - Matthew Vickery (mattvick) + - Matthew (mattvick) - MARYNICH Mikhail (mmarynich-ext) - - Viktor Novikov (panzer_commander) + - Viktor Novikov (nowiko) - Paul Mitchum (paul-m) - Angel Koilov (po_taka) - RevZer0 (rav) - Dan Finnie - Marek Binkowski - Ken Marfilla (marfillaster) + - Max Grigorian (maxakawizard) - benatespina (benatespina) - Denis Kop - Andrey Lebedev (alebedev) + - Cristoforo Cervino (cristoforocervino) - Jean-Guilhem Rouel (jean-gui) - Yoann MOROCUTTI + - EdgarPE - jfcixmedia - Tomasz Kusy - Dominic Tubach - - Nikita Konstantinov - Martijn Evers - Alexander Onatskiy - Philipp Fritsche - tarlepp - Benjamin Paap (benjaminpaap) + - Claus Due (namelesscoder) - Guillaume Aveline - Christian + - Alexandru Patranescu - Denis Golubovskiy (bukashk0zzz) - Arkadiusz Rzadkowolski (flies) - - Sergii Smertin (nfx) + - Serge (nfx) - Oksana Kozlova (oksanakozlova) - Quentin Moreau (sheitak) - Mikkel Paulson - Michał Strzelecki - Bert Ramakers - Angelov Dejan (angelov) - - hugofonseca (fonsecas72) + - Aurimas Niekis (aurimasniekis) + - Hugo Fonseca (fonsecas72) - Marc Duboc (icemad) - Martynas Narbutas + - Timothée BARRAY + - Nilmar Sanchez Muguercia - Bailey Parker - - Eddie Jaoude - Antanas Arvasevicius + - Eddie Abou-Jaoude (eddiejaoude) - Haritz Iturbe (hizai) - Nerijus Arlauskas (nercury) - - SPolischook - Diego Sapriza - Joan Cruz - inspiran + - Alex Demchenko - Cristobal Dabed - Daniel Mecke (daniel_mecke) - Matteo Giachino (matteosister) - - Alex Demchenko (pilot) + - Serhii Polishchuk (spolischook) - Tadas Gliaubicas (tadcka) - Thanos Polymeneas (thanos) - Atthaphon Urairat - Benoit Garret - Maximilian Ruta (deltachaos) + - Jon Green (jontjs) - Mickaël Isaert (misaert) - Jakub Sacha - Julius Kiekbusch @@ -1704,44 +1566,43 @@ The Symfony Connect username in parenthesis allows to get more information - Claude Dioudonnat - Jonathan Hedstrom - Peter Smeets (darkspartan) - - Jhonny Lidfors (jhonny) - Julien Bianchi (jubianchi) - Robert Meijers - James Sansbury - Marcin Chwedziak - Benjamin - hjkl - - Tony Cosentino (tony-co) - Dan Wilga - Oleksii Svitiashchuk - Andrew Tch - Alexander Cheprasov - Tristan Bessoussa (sf_tristanb) - Rodrigo Díez Villamuera (rodrigodiez) - - Nicolas Jourdan - - James Hudson - Stephen Clouse - e-ivanov - Nathanaël Martel (nathanaelmartel) - - Einenlum + - Nicolas Jourdan (nicolasjc) + - Benjamin Dos Santos + - Yann Rabiller (einenlum) + - GagnarTest (gagnartest) - Jochen Bayer (jocl) + - Tomas Javaisis - Patrick Carlo-Hickman - Bruno MATEU - Jeremy Bush - Lucas Bäuerle - - wizhippo - Thomason, James - Dario Savella - Gordienko Vladislav + - Ener-Getick - Viacheslav Sychov - - Alexandre Quercia (alquerci) - Helmut Hummel (helhum) - Matt Brunt - Jack Thomas - Carlos Ortega Huetos - - rpg600 - Péter Buri (burci) - Evgeny Efimov (edefimov) + - John VanDeWeghe - kaiwa - Daniel Badura - Charles Sanquer (csanquer) @@ -1764,15 +1625,19 @@ The Symfony Connect username in parenthesis allows to get more information - Kai Dederichs - Vladimir Luchaninov (luchaninov) - spdionis + - maxime.perrimond - rchoquet - rvoisin - gitlost - Taras Girnyk + - cthulhu - Dmitry Derepko + - Rémi Leclerc - Jan Vernarsky + - Sergio + - Jonas Hünig - Amine Yakoubi - Eduardo García Sanz (coma) - - Sergio (deverad) - Arend Hummeling - Makdessi Alex - fduch (fduch) @@ -1782,22 +1647,28 @@ The Symfony Connect username in parenthesis allows to get more information - Jason Schilling (chapterjason) - David de Boer (ddeboer) - Eno Mullaraj (emullaraj) + - Stephan Vock (glaubinix) - Nathan PAGE (nathix) - Ryan Rogers + - Arnaud - Klaus Purer - - arnaud (arnooo999) + - Dmitrii Lozhkin - Gilles Doge (gido) + - Marion Hurteau (marionleherisson) - Oscar Esteve (oesteve) + - Sobhan Sharifi (50bhan) - Peter Potrowl - abulford - Philipp Kretzschmar - - antograssiot - Ilya Vertakov - Brooks Boyd - - johnillo + - Stephen - Roger Webb - Dmitriy Simushev - Pawel Smolinski + - John Espiritu (johnillo) + - Tomasz (timitao) + - Nguyen Tuan Minh (tuanminhgp) - Oxan van Leeuwen - pkowalczyk - dbrekelmans @@ -1809,19 +1680,18 @@ The Symfony Connect username in parenthesis allows to get more information - mousezheng - mshavliuk - Rémy LESCALLIER - - WybrenKoelmans - - Derek Lambert - MightyBranch - Kacper Gunia (cakper) + - Derek Lambert (dlambert) - Peter Thompson (petert82) - Victor Macko (victor_m) - error56 - Felicitus - - Krzysztof Przybyszewski - alexpozzi - - Vladimir - Quentin Devos - Jorge Vahldick (jvahldick) + - Krzysztof Przybyszewski (kprzybyszewski) + - Vladimir Mantulo (mantulo) - Frederic Godfrin - Paul Matthews - aim8604 @@ -1832,71 +1702,88 @@ The Symfony Connect username in parenthesis allows to get more information - Juan Traverso - David Legatt (dlegatt) - Alain Flaus (halundra) + - Arthur Woimbée - tsufeki + - Théo DELCEY - Philipp Strube - Thomas Nunninger + - Andrii Serdiuk (andreyserdjuk) - Clement Herreman (clemherreman) + - dangkhoagms (dangkhoagms) - Dan Ionut Dumitriu (danionut90) + - Evgeny (disparity) + - Floran Brutel (notFloran) (floran) - Vladislav Rastrusny (fractalizer) - Vlad Gapanovich (gapik) - Alexander Kurilo (kamazee) - - Nyro (nyro) + - nyro (nyro) - Konstantin Bogomolov - Marco - Marc Torres - Mark Spink - - cesar - Alberto Aldegheri + - Dalibor Karlović - Cesar Scur (cesarscur) + - Sagrario Meneses - Dmitri Petmanson - heccjj - Alexandre Melard + - Stefano A. (stefano93) - PierreRebeilleau - Jay Klehr - Sergey Yuferev - Tobias Stöckler - Mario Young - Ilia (aliance) - - Chris McCafferty (cilefen) + - cilefen (cilefen) + - Florian Hermann (fhermann) - Mo Di (modi) - Pablo Schläpfer - Christian Rishøj + - Roromix - Patrick Berenschot - SuRiKmAn - rtek + - Christian Wahler (christian) - Jelte Steijaert (jelte) + - Maxime AILLOUD (mailloud) - David Négrier (moufmouf) - Quique Porta (quiqueporta) - - Artem Oliynyk (artemoliynyk) + - mohammadreza honarkhah + - Artem Oliinyk (artemoliynyk) - Ben Roberts (benr77) - Andrea Quintino (dirk39) - Tomasz Szymczyk (karion) - Alex Vasilchenko - sez-open - - Xavier Coureau - fruty - ConneXNL - Aharon Perkel - matze + - Adam Wójs (awojs) - Justin Reherman (jreherman) - Rubén Calvo (rubencm) + - Paweł Niedzielski (steveb) - Abdul.Mohsen B. A. A - - Swen van Zanten + - Cédric Girard + - Peter Jaap Blaakmeer - Agustin Gomes - - Benoît Burnichon - pthompson - Malaney J. Hill - Alexandre Pavy - Adiel Cristo (arcristo) - Artem Stepin (astepin) - Christian Flach (cmfcmf) - - Cédric Girard (enk_) - Fabian Kropfhamer (fabiank) + - Junaid Farooq (junaidfarooq) - Lars Ambrosius Wallenborn (larsborn) - Oriol Mangas Abellan (oriolman) - Sebastian Göttschkes (sgoettschkes) + - Swen van Zanten (swenvanzanten) + - Frankie Wittevrongel - Tatsuya Tsuruoka - Ross Tuck + - Zander Baldwin - Oleksiy (alexndlm) - Kévin Gomez (kevin) - Mihai Nica (redecs) @@ -1904,6 +1791,8 @@ The Symfony Connect username in parenthesis allows to get more information - Adam Prickett - azine - Luke Towers + - Anton Kroshilin + - Pierre Tachoire - Dawid Sajdak - Norman Soetbeer - Ludek Stepan @@ -1911,21 +1800,22 @@ The Symfony Connect username in parenthesis allows to get more information - Craig Menning (cmenning) - Balázs Benyó (duplabe) - Erika Heidi Reinaldo (erikaheidi) - - Kyryll Maesh (gauss) - - Pierre Tachoire (krichprollsch) + - William Thomson (gauss) + - Javier Espinosa (javespi) - Marc J. Schmidt (marcjs) - František Maša - Sebastian Schwarz + - karolsojko - Marco Jantke - Saem Ghani - - Clément LEFEBVRE - - Conrad Kleinespel - Zacharias Luiten - Sebastian Utz - Adrien Gallou (agallou) + - Andrea Sprega (asprega) - Maks Rafalko (bornfree) - - Karol Sójko (karolsojko) - - sl_toto (sl_toto) + - Conrad Kleinespel (conradk) + - Clément LEFEBVRE (nemoneph) + - Viktor Bajraktar (njutn95) - Walter Dal Mut (wdalmut) - abluchet - Ruud Arentsen @@ -1935,18 +1825,21 @@ The Symfony Connect username in parenthesis allows to get more information - Arend-Jan Tetteroo - Albin Kerouaton - Sébastien HOUZÉ + - Mbechezi Nawo - Jingyu Wang - steveYeah - - Samy Dindane (dinduks) + - Samy D (dinduks) - Keri Henare (kerihenare) - Andre Eckardt (korve) - Cédric Lahouste (rapotor) - Samuel Vogel (samuelvogel) - Osayawe Ogbemudia Terry (terdia) - AndrolGenhald + - Damien Fa - Berat Doğan - Guillaume LECERF - Juanmi Rodriguez Cerón + - twifty - Andy Raines - Anthony Ferrara - Geoffrey Pécro (gpekz) @@ -1955,41 +1848,52 @@ The Symfony Connect username in parenthesis allows to get more information - Flavien Knuchel (knuch) - Mathieu TUDISCO (mathieutu) - Dmytro Dzubenko + - Peter Ward - markusu49 - Steve Frécinaux - Constantine Shtompel - Jules Lamur - Renato Mendes Figueiredo + - Benjamin RICHARD - pdommelen - Eric Stern - ShiraNai7 - Cedrick Oka - Antal Áron (antalaron) + - Guillaume Sainthillier (guillaume-sainthillier) - Vašek Purchart (vasek-purchart) - Janusz Jabłoński (yanoosh) - Fleuv - Tayfun Aydin - - Sandro Hopf - Łukasz Makuch - Arne Groskurth + - Ilya Chekalsky - Ostrzyciel - George Giannoulopoulos - - Alexander Pasichnick + - Alexander Pasichnik (alex_brizzz) - Luis Ramirez (luisdeimos) + - Ilia Sergunin (maranqz) - Daniel Richter (richtermeister) + - Sandro Hopf (senaria) - ChrisC - - JL - - Ilya Biryukov - Kim Laï Trinh - Johan de Ruijter - Jason Desrosiers - m.chwedziak + - marbul - Filippos Karailanidis - Andreas Frömer - Philip Frank - David Brooks - Lance McNearney + - Illia Antypenko (aivus) + - Jelizaveta Lemeševa (broken_core) + - Dominik Ritter (dritter) + - Frank Neff (fneff) - Volodymyr Kupriienko (greeflas) + - Ilya Biryukov (ibiryukov) + - Roma (memphys) + - Florian Caron (shalalalala) - Serhiy Lunak (slunak) - Wojciech Błoszyk (wbloszyk) - Jiri Barous @@ -1997,6 +1901,7 @@ The Symfony Connect username in parenthesis allows to get more information - abunch - tamcy - Mikko Pesari + - Aurélien Fontaine - ncou - Ian Carroll - caponica @@ -2016,10 +1921,11 @@ The Symfony Connect username in parenthesis allows to get more information - Foxprodev - developer-av - Max Summe - - WedgeSama + - Ema Panz + - Hugo Sales - Dale.Nash - - Felds Liscia - Chihiro Adachi (chihiro-adachi) + - Benjamin Georgeault (wedgesama) - Raphaëll Roussel - Tadcka - Beth Binkovitz @@ -2030,8 +1936,8 @@ The Symfony Connect username in parenthesis allows to get more information - Romain Geissler - Adrien Moiruad - Tomaz Ahlin - - Philip Ardery - Nasim + - AnotherSymfonyUser (arderyp) - Marcus Stöhr (dafish) - Daniel González Zaballos (dem3trio) - Emmanuel Vella (emmanuel.vella) @@ -2047,23 +1953,29 @@ The Symfony Connect username in parenthesis allows to get more information - Nathaniel Catchpole - Adrien Samson (adriensamson) - Samuel Gordalina (gordalina) - - Max Romanovsky (maxromanovsky) + - Maksym Romanowski (maxromanovsky) - Nicolas Eeckeloo (neeckeloo) - Andriy Prokopenko (sleepyboy) - - Mathieu Morlon + - Dariusz Ruminski - Ivo Valchev - Daniel Tschinder - Arnaud CHASSEUX + - Zlatoslav Desyatnikov + - Wickex + - tuqqu - Wojciech Gorczyca + - Neagu Cristian-Doru (cristian-neagu) + - Mathieu Morlon (glutamatt) - Rafał Muszyński (rafmus90) - Sébastien Decrême (sebdec) - Timothy Anido (xanido) - Mara Blaga - Rick Prent - skalpa - - Martin Eckhardt + - Kai + - Bartłomiej Zając - Pieter Jordaan - - Damien Tournoud + - Tournoud (damientournoud) - Michael Dowling (mtdowling) - Karlos Presumido (oneko) - Tony Vermeiren (tony) @@ -2072,23 +1984,27 @@ The Symfony Connect username in parenthesis allows to get more information - Kirill Lazarev - Thomas Counsell - BilgeXA - - r1pp3rj4ck - - phydevs - mmokhi - Serhii Smirnov - Robert Queck - Peter Bouwdewijn - Martins Eglitis - - mlively - Wouter Diesveld + - Romain + - Matěj Humpál - Amine Matmati + - Kristen Gilden - caalholm - Nouhail AL FIDI (alfidi) - Fabian Steiner (fabstei) - - Felipy Tavares Amorim (felipyamorim) + - Felipy Amorim (felipyamorim) - Guillaume Loulier (guikingone) - Klaus Silveira (klaussilveira) + - Michael Lively (mlivelyjr) - Pedro Casado (pdr33n) + - Pierre Grimaud (pgrimaud) + - Abderrahim (phydev) + - Attila Bukor (r1pp3rj4ck) - Alexander Janssen (tnajanssen) - Thomas Chmielowiec (chmielot) - Jānis Lukss @@ -2096,21 +2012,20 @@ The Symfony Connect username in parenthesis allows to get more information - Michael Zangerle - rkerner - Alex Silcock + - Raphael Hardt - Qingshan Luo - Ergie Gonzaga - Matthew J Mucklo - AnrDaemon + - SnakePin - Matthew Covey - Anthony Massard (decap94) - Emre Akinci (emre) - Chris Maiden (matason) - - fdgdfg (psampaz) + - psampaz (psampaz) - Andrea Ruggiero (pupax) - - Stéphane Seng - Maxwell Vandervelde - kaywalker - - Mike Meier - - Tim Jabs - Sebastian Ionescu - Robert Kopera - Pablo Ogando Ferreira @@ -2119,16 +2034,20 @@ The Symfony Connect username in parenthesis allows to get more information - Valentin VALCIU - Jeremiah VALERIE - Alexandre Beaujour - - Julien Menth + - Patrik Patie Gmitter - George Yiannoulopoulos - Yannick Snobbert - Kevin Dew - James Cowgill + - sensio + - Julien Menth (cfjulien) - Nicolas Schwartz (nicoschwartz) - - Patrik Gmitter (patie) + - Tim Jabs (rubinum) + - Stéphane Seng (stephaneseng) - Peter Schultz - Jonathan Gough - Benhssaein Youssef + - Benoit Leveque - bill moll - Benjamin Bender - PaoRuby @@ -2139,14 +2058,14 @@ The Symfony Connect username in parenthesis allows to get more information - Konrad Mohrfeldt - Lance Chen - Ciaran McNulty (ciaranmcnulty) + - Dominik Piekarski (dompie) - Andrew (drew) + - j4nr6n (j4nr6n) - kor3k kor3k (kor3k) + - Rares Sebastian Moldovan (raresmldvn) - Stelian Mocanita (stelian) - - Justin (wackymole) - - Flavian (2much) - Gautier Deuette - dsech - - mike - Gilbertsoft - tadas - Bastien Picharles @@ -2156,16 +2075,13 @@ The Symfony Connect username in parenthesis allows to get more information - Mephistofeles - Hoffmann András - LubenZA - - Olivier + - Victor Garcia - Juan Mrad - Denis Yuzhanin - - Youssef BENHSSAIEN + - Flavian Sierk - knezmilos13 - alireza - - Cyril PASCAL - Michael Bessolov - - pscheit - - Wybren Koelmans - Zdeněk Drahoš - Dan Harper - moldcraft @@ -2175,75 +2091,83 @@ The Symfony Connect username in parenthesis allows to get more information - Antonio Peric-Mazar (antonioperic) - César Suárez (csuarez) - Bjorn Twachtmann (dotbjorn) + - Marek Víger (freezy) - Wahyu Kristianto (kristories) - Tobias Genberg (lorceroth) + - Michael Simonson (mikes) - Nicolas Badey (nico-b) + - Olivier Scherler (oscherler) - Shane Preece (shane) - Stephan Wentz (temp) - Johannes Goslar - Geoff - georaldc - - Maarten de Boer - - Malte Wunsch - wusuopu - Markus Staab + - Wouter de Wild - povilas - Gavin Staniforth - bahram - Alessandro Tagliapietra (alex88) - - Biji (biji) + - Nikita Starshinov (biji) - Alex Teterin (errogaht) - Gunnar Lium (gunnarlium) + - Malte Wunsch (maltewunsch) - Marie Minasyan (marie.minassyan) + - Maarten de Boer (mdeboer) - Tiago Garcia (tiagojsag) - Artiom - Jakub Simon - Bouke Haarsma - mlievertz - Radosław Kowalewski - - Stefan Kleff - Enrico Schultz - JustDylan23 - - mschop + - Juraj Surman - Martin Eckhardt - natechicago - Victor - Andreas Allacher - Alexis + - Leonid Terentyev - Sergei Gorjunov - Jonathan Poston - Adrian Olek (adrianolek) + - Camille Dejoye (cdejoye) - cybernet (cybernet2u) - Jody Mickey (jwmickey) - Przemysław Piechota (kibao) - - Leonid Terentyev (li0n) + - Martin Schophaus (m_schophaus_adcada) - Martynas Sudintas (martiis) + - Stefan Kleff (stefanxl) - Thijs-jan Veldhuizen (tjveldhuizen) - ryunosuke - Bruno BOUTAREL - - victoria - John Stevenson - Francisco Facioni (fran6co) - Stanislav Gamayunov (happyproff) - Iwan van Staveren (istaveren) - Alexander McCullagh (mccullagh) - Paul L McNeely (mcneely) - - Andrei C. (moldman) - Povilas S. (povilas) - Laurent Negre (raulnet) - Sergey Fokin (tyraelqp) + - Victoria Quirante Ruiz (victoria) - Evrard Boulou - pborreli - Bernat Llibre - Boris Betzholz - Eric Caron + - Arnau González - 2manypeople - Wing - Thomas Bibb + - Stefan Koopmanschap - Joni Halme - Matt Farmer - catch - aetxebeste + - roromix - Vitali Tsyrkin - Juga Paazmaya - Alexandre Segura @@ -2258,24 +2182,25 @@ The Symfony Connect username in parenthesis allows to get more information - WaiSkats - Morimoto Ryosuke - Ikhsan Agustian - - Arnau González (arnaugm) + - Benoit Lévêque (benoit_leveque) - Simon Bouland (bouland) - Christoph König (chriskoenig) + - Dmytro Pigin (dotty) - Jibé Barth (jibbarth) - Jm Aribau (jmaribau) - Matthew Foster (mfoster) - Reyo Stallenberg (reyostallenberg) - Paul Seiffert (seiffert) - Vasily Khayrulin (sirian) - - Stefan Koopmanschap (skoop) - Stas Soroka (stasyan) - Stefan Hüsges (tronsha) - Jake Bishop (yakobeyak) - Dan Blows + - popnikos - Matt Wells - - Sander van der Vlugt - Nicolas Appriou - stloyd + - Tito Costa - Andreas - Chris Tickner - Andrew Coulton @@ -2283,12 +2208,14 @@ The Symfony Connect username in parenthesis allows to get more information - Jeremy Benoist - Michal Gebauer - Phil Davis + - Thiago Melo - Gleb Sidora - David Stone - Giorgio Premi - Gerhard Seidel (gseidel) - Jovan Perovic (jperovic) - Pablo Maria Martelletti (pmartelletti) + - Sander van der Vlugt (stranding) - Yassine Guedidi (yguedidi) - Waqas Ahmed - Bert Hekman @@ -2297,7 +2224,6 @@ The Symfony Connect username in parenthesis allows to get more information - Houziaux mike - Phobetor - Eric Schildkamp - - Andreas - Markus - agaktr - Mostafa @@ -2313,77 +2239,82 @@ The Symfony Connect username in parenthesis allows to get more information - Gunther Konig - Joe Springe - Mickael GOETZ + - DerStoffel + - Flinsch - Maciej Schmidt - botbotbot - Timon van der Vorm - nuncanada + - Thierry Marianne - František Bereň - - Kamil Madejski - G.R.Dalenoort + - Quentin Dreyer - Jeremiah VALERIE - Mike Francis + - Almog Baku (almogbaku) - Vladimir Khramtsov (chrome) - Gerd Christian Kunze (derdu) - - Christoph Nissle (derstoffel) - Denys Voronin (hurricane) - Ionel Scutelnicu (ionelscutelnicu) + - Jordan de Laune (jdelaune) - Juan Gonzalez Montes (juanwilde) + - Kamil Madejski (kmadejski) - Mathieu Dewet (mdewet) + - none (nelexa) - Nicolas Tallefourtané (nicolab) - Botond Dani (picur) - Rémi Faivre (rfv) - - Thierry Marianne (thierrymarianne) - Nick Stemerdink + - Bernhard Rusch - David Stone - - jjanvier - - Julius Beckmann + - Grayson Koonce - Ruben Jansen - Marc Biorklund - shreypuranik - - loru88 - Thibaut Salanon - Romain Dorgueil - Christopher Parotat - Dennis Haarbrink - Urban Suppiger - - me_shaon - 蝦米 - - Grayson Koonce (breerly) + - Julius Beckmann (h4cc) - Andrey Helldar (helldar) + - Julien JANVIER (jjanvier) - Karim Cassam Chenaï (ka) - - Maksym Slesarenko (maksym_slesarenko) + - Lorenzo Adinolfi (loru88) - Marcello Mönkemeyer (marcello-moenkemeyer) + - Ahmed Shamim Hassan (me_shaon) - Michal Kurzeja (mkurzeja) - Nicolas Bastien (nicolas_bastien) - Sander De la Marche (sanderdlm) - Nikola Svitlica (thecelavi) - - Denis (yethee) - Andrew Zhilin (zhil) - Sjors Ottjes - azjezz - Andy Stanberry - Felix Marezki - Normunds - - Luiz “Felds” Liscia - Yuri Karaban - Johan - Thomas Rothe - Edwin - - Martin - nietonfir - Andriy + - Taylor Otwell - alefranz - David Barratt - Andrea Giannantonio - Pavel.Batanov - avi123 - Pavel Prischepa + - Philip Dahlstrøm + - Sami Mussbach - qzylalala - alsar - downace - Aarón Nieves Fernández - - Mike Meier - Mikolaj Czajkowski + - Ph3nol - Kirill Saksin - Shiro - Reda DAOUDI @@ -2395,10 +2326,13 @@ The Symfony Connect username in parenthesis allows to get more information - Farid Jalilov - Christiaan Wiesenekker - Florent Olivaud + - Foxprodev + - Eric Hertwig - Sergey Panteleev - JakeFr - Dmitry Hordinky - Oliver Klee + - Niels Robin-Aubertin - Simon Sargeant - efeen - Mikko Ala-Fossi @@ -2421,36 +2355,30 @@ The Symfony Connect username in parenthesis allows to get more information - Jawira Portugal (jawira) - Johannes Müller (johmue) - Jordi Llonch (jordillonch) + - julien_tempo1 (julien_tempo1) - Roman Igoshin (masterro) - Nicholas Ruunu (nicholasruunu) - Jeroen van den Nieuwenhuisen (nieuwenhuisen) - - Cyril Pascal (paxal) - - Cédric Dugat (ph3nol) - - Philip Dahlstrøm (phidah) - Pierre Rebeilleau (pierrereb) - Milos Colakovic (project2481) - Raphael de Almeida (raphaeldealmeida) - Rénald Casagraude (rcasagraude) - Robin Duval (robin-duval) - - Grinbergs Reinis (shima5) - Artem Lopata (bumz) - alex - - Nicole Cordes - - Nicolas PHILIPPE - Roman Orlov - Simon Ackermann - VolCh - Alexey Popkov - Gijs Kunze - Artyom Protaskin + - Steven Dubois - Nathanael d. Noblet - helmer - ged15 - Daan van Renterghem - - Nicole Cordes - Bálint Szekeres - amcastror - - Alexander Li (aweelex) - Bram Van der Sype (brammm) - Guile (guile) - Mark Beech (jaybizzle) @@ -2459,19 +2387,22 @@ The Symfony Connect username in parenthesis allows to get more information - Mauro Foti (skler) - Thibaut Arnoud (thibautarnoud) - Yannick Warnier (ywarnier) + - Jörn Lang - Kevin Decherf + - Paul LE CORRE - Jason Woods - Christian Weiske - Maria Grazia Patteri - klemens - dened + - jpauli - Dmitry Korotovsky - - mcorteel - Michael van Tricht - ReScO - - JohJohan - Tim Strehle + - Sébastien COURJEAN - Sam Ward + - Hans N. Hjort - Walther Lalk - Adam - Ivo @@ -2481,24 +2412,23 @@ The Symfony Connect username in parenthesis allows to get more information - devel - taiiiraaa - Ali Tavafi - - Trevor Suarez - gedrox - Viet Pham - Alan Bondarchuk + - Pchol - dropfen - Andrey Chernykh - Edvinas Klovas - Drew Butler - Peter Breuls + - Kevin EMO - Chansig - Tischoi - divinity76 - Andreas Hasenack - J Bruni - Alexey Prilipko - - Dmitriy Fedorenko - vlakoff - - bertillon - thib92 - Yiorgos Kalligeros - Rudolf Ratusiński @@ -2509,36 +2439,42 @@ The Symfony Connect username in parenthesis allows to get more information - AmsTaFF (amstaff) - Simon Müller (boscho) - Yannick Bensacq (cibou) - - Damien (damien_vauchel) + - Cyrille Bourgois (cyrilleb) + - Damien Vauchel (damien_vauchel) + - Dmitrii Fedorenko (dmifedorenko) - Frédéric G. Marand (fgm) - Freek Van der Herten (freekmurze) - Luca Genuzio (genuzio) - - Hans Nilsson (hansnilsson) - Andrew Marcinkevičius (ifdattic) - Ioana Hazsda (ioana-hazsda) - Jan Marek (janmarek) - Mark de Haan (markdehaan) + - Maxime Corteel (mcorteel) - Dan Patrick (mdpatrick) + - Mathieu MARCHOIS (mmar) - naitsirch (naitsirch) - Geoffrey Monte (numerogeek) - Martijn Boers (plebian) - Plamen Mishev (pmishev) - Pedro Magalhães (pmmaga) - Rares Vlaseanu (raresvla) + - Trevor N. Suarez (rican7) - Sergii Dolgushev (serhey) + - Clément Bertillon (skigun) - Rein Baarsma (solidwebcode) - tante kinast (tante) - Stephen Lewis (tehanomalousone) - - Ahmed Hannachi (tiecoders) + - Adam RANDI (tiecoders) - Vincent LEFORT (vlefort) - Walid BOUGHDIRI (walidboughdiri) - wicliff wolda (wickedone) - Wim Molenberghs (wimm) - Darryl Hein (xmmedia) - - Sadicov Vladimir (xtech) - - Kevin EMO (zarcox) + - Vladimir Sadicov (xtech) - Marcel Berteler - sdkawata + - Peter van Dommelen + - Tim van Densen - Andrzej - Alexander Zogheb - Rémi Blaise @@ -2548,14 +2484,12 @@ The Symfony Connect username in parenthesis allows to get more information - root - pf - Vincent Chalnot - - James Hudson - Tom Maguire - Mateusz Lerczak - Richard Quadling - Rainrider - David Zuelke - Adrian - - Oleg Andreyev - Oliver Eglseder - neFAST - zcodes @@ -2572,31 +2506,34 @@ The Symfony Connect username in parenthesis allows to get more information - John Nickell (jrnickell) - Martin Mayer (martin) - Grzegorz Łukaszewicz (newicz) + - Omar Yepez (oyepez003) - Jonny Schmid (schmidjon) - Toby Griffiths (tog) + - Ashura - Götz Gottwald - Alessandra Lai - - Veres Lajos - Ernest Hymel - Andrea Civita - Nicolás Alonso - LoginovIlya - Nick Chiu - - grifx - Robert Campbell - Matt Lehner + - carlos-ea - Olexandr Kalaidzhy - Helmut Januschka + - Jérémy Benoist - Hein Zaw Htet™ - Ruben Kruiswijk - Cosmin-Romeo TANASE + - Ferran Vidal - Michael J - youssef saoubou - Joseph Maarek - Alexander Menk - Alex Pods - - hadriengem - timaschew + - Jelle Kapitein - Jochen Mandl - elattariyassine - Marin Nicolae @@ -2605,9 +2542,13 @@ The Symfony Connect username in parenthesis allows to get more information - Carlos Tasada - Haritz - Matthieu Prat - - Grummfy + - Brieuc Thomas - zors1 - Peter Simoncic + - lerminou + - Ahmad El-Bardan + - mantulo + - pdragun - Paul Le Corre - Noel Light-Hilary - Filipe Guerra @@ -2618,28 +2559,28 @@ The Symfony Connect username in parenthesis allows to get more information - Marcos Labad - Per Modin - David Windell + - Antoine M - Frank Jogeleit - Ondřej Frei - Volodymyr Panivko - Gabriel Birke - - skafandri - Derek Bonner - martijn - Jenne van der Meer + - annesosensio + - NothingWeAre - Storkeus + - goabonga - Alan Chen - Anton Zagorskii - ging-dev - zakaria-amm - - insidestyles - Maerlyn - Even André Fiskvik - Agata - dakur - Matthias Schmidt - florian-michael-mast - - Александр Ли - - Arjan Keeman - Vlad Dumitrache - Alex Kalineskou - Erik van Wingerden @@ -2649,8 +2590,9 @@ The Symfony Connect username in parenthesis allows to get more information - Alexis MARQUIS - Gerrit Drost - Linnaea Von Lavia + - Simon Mönch - Bastien Clément - - Julius Šakalys + - Thomas Talbot - Javan Eskander - Lenar Lõhmus - Cristian Gonzalez @@ -2659,23 +2601,21 @@ The Symfony Connect username in parenthesis allows to get more information - hainey - Juan M Martínez - Gilles Gauthier + - Benjamin Franzke - Pavinthan - Sylvain METAYER - ddebree - Gyula Szucs - Tomas Liubinas - Ivo Valchev - - Alex - Jan Hort - Klaas Naaijkens - - Daniel González Cerviño - Rafał - - Ahmad El-Bardan (absahmad) - Adria Lopez (adlpz) - Aaron Scherer (aequasi) + - baron (bastien) - Rosio (ben-rosio) - Simon Paarlberg (blamh) - - Brieuc THOMAS (brieucthomas) - Masao Maeda (brtriver) - Damien Harper (damien.harper) - Darius Leskauskas (darles) @@ -2688,20 +2628,22 @@ The Symfony Connect username in parenthesis allows to get more information - Dennis Smink (dsmink) - Franz Liedke (franzliedke) - Gaylord Poillon (gaylord_p) - - Christophe BECKER (goabonga) - gondo (gondo) + - Joris Garonian (grifx) + - Grummfy (grummfy) + - Hadrien Cren (hcren) - Gusakov Nikita (hell0w0rd) - - Osman Üngür (import) + - Oz (import) - Jaap van Otterdijk (jaapio) - Javier Núñez Berrocoso (javiernuber) - Jelle Bekker (jbekker) - - Jonathan Sui Lioung Lee Slew (jlslew) - - Johan Vlaar (johjohan) - Giovanni Albero (johntree) - Jorge Martin (jorgemartind) - Joeri Verdeyen (jverdeyen) - Kevin Verschaeve (keversc) - Kevin Herrera (kherge) + - Kubicki Kamil (kubik) + - Simon Leblanc (leblanc_simon) - Luis Ramón López López (lrlopez) - Vladislav Nikolayev (luxemate) - Martin Mandl (m2mtech) @@ -2711,6 +2653,7 @@ The Symfony Connect username in parenthesis allows to get more information - Michael Pohlers (mick_the_big) - Misha Klomp (mishaklomp) - mlpo (mlpo) + - Mikhail Prosalov (mprosalov) - Ulrik Nielsen (mrbase) - Marek Šimeček (mssimi) - Dmitriy Tkachenko (neka) @@ -2722,19 +2665,23 @@ The Symfony Connect username in parenthesis allows to get more information - Pablo Monterde Perez (plebs) - Pierre-Olivier Vares (povares) - Jimmy Leger (redpanda) + - Ronny López (ronnylt) + - Julius (sakalys) - Samaël Villette (samadu61) + - Dmitry (staratel) - Marcin Szepczynski (szepczynski) + - Tito Miguel Costa (titomiguelcosta) + - Simone Di Maulo (toretto460) - Cyrille Jouineau (tuxosaurus) + - Lajos Veres (vlajos) - Vladimir Chernyshev (volch) - Wim Godden (wimg) - - Xav` (xavismeh) - Yorkie Chadwick (yorkie76) - Maxime Aknin (3m1x4m) - Geordie - Exploit.cz - GuillaumeVerdon - - Angel Fernando Quiroz Campos - - Ondrej Mirtes + - ureimers - akimsko - Youpie - Jason Stephens @@ -2747,8 +2694,8 @@ The Symfony Connect username in parenthesis allows to get more information - Matthias Derer - vladyslavstartsev - Saem Ghani + - Kévin - Stefan Oderbolz - - Curtis - Gabriel Moreira - Alexey Popkov - ChS @@ -2760,44 +2707,49 @@ The Symfony Connect username in parenthesis allows to get more information - Evgeniy Tetenchuk - Sjoerd Adema - Shrey Puranik + - Evgeniy Koval - Lars Moelleken - dasmfm - Claas Augner - Mathias Geat + - Angel Fernando Quiroz Campos (angelfqc) - Arnaud Buathier (arnapou) + - Benoit Galati (benoitgalati) + - Curtis (ccorliss) - chesteroni (chesteroni) - Mauricio Lopez (diaspar) - HADJEDJ Vincent (hadjedjvincent) - Daniele Cesarini (ijanki) - Ismail Asci (ismailasci) - Jeffrey Moelands (jeffreymoelands) - - Simon CONSTANS (kosssi) + - Simon (kosssi) + - Ondřej Mirtes (mirtes) - Paulius Jarmalavičius (pjarmalavicius) - - Ramon Henrique Ornelas (ramonornela) - - Ricardo de Vries (ricknox) + - Ramon Ornelas (ramonornela) + - Ricardo de Vries (ricardodevries) - Ruslan Zavacky (ruslanzavacky) - Stefano Cappellini (stefano_cappellini) - Thomas Dutrion (theocrite) - Till Klampaeckel (till) - Tobias Weinert (tweini) - - Ulf Reimers (ureimers) - Wotre - goohib - Tom Counsell + - Sepehr Lajevardi - George Bateman - Xavier HAUSHERR - - Ron Gähler - Edwin Hageman - Mantas Urnieža - temperatur + - Paul Andrieux - misterx - Cas - arend - Vincent Godé - - Dusan Kasan - helmi - Michael Steininger - Nardberjean + - ghazy ben ahmed - Karolis - Myke79 - jersoe @@ -2806,7 +2758,6 @@ The Symfony Connect username in parenthesis allows to get more information - Piers Warmers - Sylvain Lorinet - klyk50 - - Andreas Lutro - jc - BenjaminBeck - Aurelijus Rožėnas @@ -2820,6 +2771,7 @@ The Symfony Connect username in parenthesis allows to get more information - Matt Fields - Olatunbosun Egberinde - Andras Debreczeni + - Knallcharge - Vladimir Sazhin - Michel Bardelmeijer - Tomas Kmieliauskas @@ -2830,14 +2782,15 @@ The Symfony Connect username in parenthesis allows to get more information - Billie Thompson - lol768 - jamogon + - Antoine LA - Vyacheslav Slinko + - Benjamin Laugueux - Jakub Chábek - Johannes - Jörg Rühl - George Dietrich - jannick-holm - wesleyh - - sergey - Menno Holtkamp - Ser5 - Michael Hudson-Doyle @@ -2845,6 +2798,7 @@ The Symfony Connect username in parenthesis allows to get more information - Karim Miladi - Michael Genereux - patrick-mcdougle + - Tyler Stroud - Dariusz Czech - Clemens Krack - Bruno Baguette @@ -2859,18 +2813,18 @@ The Symfony Connect username in parenthesis allows to get more information - Michal Forbak - Drew Butler - Alexey Berezuev + - pawel-lewtak - Pierrick Charron - Steve Müller + - omerida - Andras Ratz - andreabreu98 - gechetspr - brian978 - Michael Schneider - - Cédric Bertolini - n-aleha - Talha Zekeriya Durmuş - Anatol Belski - - Şəhriyar İmanov - Alexis BOYER - bch36 - Kaipi Yann @@ -2881,22 +2835,27 @@ The Symfony Connect username in parenthesis allows to get more information - Guillaume Aveline - Adrian Philipp - James Michael DuPont + - Markus Tacker - Kasperki - dima-gr - Tammy D - Rodolfo Ruiz + - tsilefy - Enrico - Ryan Rud - - Christopher Georg - Ondrej Slinták + - Jérémie Broutier - vlechemin - Brian Corrigan - Ladislav Tánczos + - Brian Freytag - Skorney - Lucas Matte + - Success Go - fmarchalemisys - mieszko4 - Steve Preston + - ibasaw - Wojciech Skorodecki - Kevin Frantz - Neophy7e @@ -2904,6 +2863,7 @@ The Symfony Connect username in parenthesis allows to get more information - Arrilot - ampaze - Chris McGehee + - Shaun Simmons - Markus Staab - Pierre-Louis LAUNAY - djama @@ -2915,21 +2875,24 @@ The Symfony Connect username in parenthesis allows to get more information - Jon Cave - Sébastien HOUZE - Abdulkadir N. A. + - Markus Klein - Adam Klvač - Bruno Nogueira Nascimento Wowk - Tomanhez - satalaondrej + - Matthias Dötsch - jonmldr - Yevgen Kovalienia - Lebnik - - nsbx - Shude - RTUnreal - Richard Hodgson - Sven Fabricius - Ondřej Führer + - Bogdan - Sema - Thorsten Hallwas + - Brian Freytag - Marco Pfeiffer - Alex Nostadt - Michael Squires @@ -2940,17 +2903,20 @@ The Symfony Connect username in parenthesis allows to get more information - Yuriy Potemkin - Emilie Lorenzo - enomotodev - - Babichev Maxim - Edvin Hultberg + - Vincent - Benjamin Long - Kévin Gonella - Ben Miller - Peter Gribanov + - Matteo Galli + - Bart Ruysseveldt - Ash014 + - Loenix - kwiateusz - - jspee - Ilya Bulakh - David Soria Parra + - Simon Frost - Sergiy Sokolenko - Cantepie - detinkin @@ -2964,47 +2930,46 @@ The Symfony Connect username in parenthesis allows to get more information - oscartv - DanSync - Peter Zwosta + - Michal Čihař - parhs - Harry Wiseman - Diego Campoy - - TeLiXj - Oncle Tom - Sam Anthony - Christian Stocker - Oussama Elgoumri + - David Lima - Steve Marvell - Dawid Nowak - Lesnykh Ilia - Shyim - sabruss - darnel - - Karolis Daužickas - Nicolas - Sergio Santoro - tirnanog06 - Andrejs Leonovs + - Alfonso Fernández García - phc - Дмитрий Пацура - Signor Pedro - Matthias Larisch - Maxime P - - ilyes kooli - - Ilia Lazarev + - Sean Templeton - Michaël VEROUX - Julia - Lin Lu - arduanov - sualko - - Molkobain - Yendric - ADmad - Nicolas Roudaire - Matthias Meyer - Temuri Takalandze (abgeo) - Bernard van der Esch (adeptofvoltron) - - Alfonso (afgar) - Andreas Forsblom (aforsblo) - Alex Olmos (alexolmos) + - Cedric BERTOLINI (alsciende) - Antonio Mansilla (amansilla) - Robin Kanters (anddarerobin) - Juan Ases García (ases) @@ -3012,6 +2977,7 @@ The Symfony Connect username in parenthesis allows to get more information - Daniel Basten (axhm3a) - Benedict Massolle (bemas) - Gerard Berengue Llobera (bere) + - Ronny (big-r) - Bernd Matzner (bmatzner) - Anton (bonio) - Bram Tweedegolf (bram_tweedegolf) @@ -3019,67 +2985,71 @@ The Symfony Connect username in parenthesis allows to get more information - Choong Wei Tjeng (choonge) - Kousuke Ebihara (co3k) - Loïc Vernet (coil) - - Christoph Schaefer (cvschaefer) + - Christoph Vincent Schaefer (cvschaefer) - Damon Jones (damon__jones) - Alexandre Fiocre (demos77) - Łukasz Giza (destroyer) - Daniel Londero (dlondero) + - Dušan Kasan (dudo1904) - Sebastian Landwehr (dword123) - Adel ELHAIBA (eadel) - Damián Nohales (eagleoneraptor) - Jordane VASPARD (elementaire) - Elliot Anderson (elliot) + - Erwan Nader (ernadoo) - Fabien D. (fabd) - Faizan Akram Dar (faizanakram) - Carsten Eilers (fnc) - Sorin Gitlan (forapathy) - Yohan Giarelli (frequence-web) - - Gasan Gouseynov (gassan) + - Gasan Guseynov (gassan) - Gerry Vandermaesen (gerryvdm) - - Ghazy Ben Ahmed (ghazy) - - Arash Tabriziyan (ghost098) + - Arash Tabrizian (ghost098) - Greg Szczotka (greg606) - - ibasaw (ibasaw) + - Ian Littman (iansltx) - Nathan DIdier (icz) - Vladislav Krupenkin (ideea) - Ilija Tovilo (ilijatovilo) - Peter Orosz (ill_logical) + - Ilia Lazarev (ilzrv) - Imangazaliev Muhammad (imangazaliev) + - Arkadiusz Kondas (itcraftsmanpl) - j0k (j0k) - - Jeremie Broutier (jbroutier) - joris de wit (jdewit) - Jérémy CROMBEZ (jeremy) - Jose Manuel Gonzalez (jgonzalez) - Joachim Krempel (jkrempel) - Jorge Maiden (jorgemaiden) + - Joao Paulo V Martins (jpjoao) - Justin Rainbow (jrainbow) - Juan Luis (juanlugb) - JuntaTom (juntatom) - Julien Manganne (juuuuuu) - Ismail Faizi (kanafghan) + - Karolis Daužickas (kdauzickas) - Sébastien Armand (khepin) - Pierre-Chanel Gauthier (kmecnin) - Krzysztof Menżyk (krymen) - samuel laulhau (lalop) - Laurent Bachelier (laurentb) - Luís Cobucci (lcobucci) + - Jérémy (libertjeremy) - Mehdi Achour (machour) - Mamikon Arakelyan (mamikon) - - Matthieu Moquet (mattketmo) + - Matt Ketmo (mattketmo) - Moritz Borgmann (mborgmann) - Mathias Brodala (mbrodala) - - Michal Čihař (mcihar) - Matt Drollette (mdrollette) - Adam Monsen (meonkeys) - Mike Milano (mmilano) - - Youssef Benhssaien (moghreb) - - diego aguiar (mollokhan) + - Guillaume Lajarige (molkobain) + - Diego Aguiar (mollokhan) - Ala Eddine Khefifi (nayzo) - emilienbouard (neime) - Nicholas Byfleet (nickbyfleet) + - Nicolas Bondoux (nsbx) - ollie harridge (ollietb) - - Paul Andrieux (paulandrieux) - - Paweł Szczepanek (pauluz) + - Pawel Szczepanek (pauluz) - Philippe Degeeter (pdegeeter) - PLAZANET Pierre (pedrotroller) - Christian López Espínola (penyaskito) @@ -3088,35 +3058,36 @@ The Symfony Connect username in parenthesis allows to get more information - Alex Carol (picard89) - Daniel Perez Pinazo (pitiflautico) - Igor Tarasov (polosatus) - - Maxim Pustynnikov (pustynnikov) - - Ralf Kuehnel (ralfkuehnel) + - Maksym Pustynnikov (pustynnikov) + - Ralf Kühnel (ralfkuehnel) - Ramazan APAYDIN (rapaydin) - - Brayden Williams (redstar504) + - Babichev Maxim (rez1dent3) - Rich Sage (richsage) - - Bart Ruysseveldt (ruyss) - scourgen hung (scourgen) - Sebastian Busch (sebu) - - Sepehr Lajevardi (sepehr) + - Sergey Stavichenko (sergey_stavichenko) - André Filipe Gonçalves Neves (seven) - Bruno Ziegler (sfcoder) - Andrea Giuliano (shark) + - Şəhriyar İmanov (shehriyari) - Thomas Baumgartner (shoplifter) - Schuyler Jager (sjager) + - Christopher Georg (sky-chris) - Volker (skydiablo) - Francisco Alvarez (sormes) - Julien Sanchez (sumbobyboys) - Stephan Vierkant (svierkant) + - Ron Gähler (t-ronx) - Guillermo Gisinger (t3chn0r) - - Markus Tacker (tacker) - Tom Newby (tomnewbyau) - Andrew Clark (tqt_andrew_clark) + - Aaron Piotrowski (trowski) - David Lumaye (tux1124) - Roman Tymoshyk (tymoshyk) - - Tyler Stroud (tystr) - Moritz Kraft (userfriendly) - Víctor Mateo (victormateo) - - Vincent (vincent1870) - - David Herrmann (vworldat) + - Vincent MOULENE (vints24) + - David Grüner (vworldat) - Eugene Babushkin (warl) - Wouter Sioen (wouter_sioen) - Xavier Amado (xamado) @@ -3128,11 +3099,13 @@ The Symfony Connect username in parenthesis allows to get more information - Kovacs Nicolas - craigmarvelley - Stano Turza - - simpson + - Antoine Leblanc - drublic + - Andre Johnson - MaPePeR - Andreas Streichardt - Alexandre Segura + - Marco Pfeiffer - Vivien - Pascal Hofmann - david-binda @@ -3140,7 +3113,6 @@ The Symfony Connect username in parenthesis allows to get more information - Gustavo Adrian - damaya - Kevin Weber - - Ben Scott - Alexandru Năstase - Dionysis Arvanitis - Sergey Fedotov @@ -3153,9 +3125,8 @@ The Symfony Connect username in parenthesis allows to get more information - Jan Emrich - Anne-Julia Seitz - Mark Topper + - Romain - Xavier REN - - Zander Baldwin - - Philipp Scheit - max - Alexander Bauer (abauer) - Ahmad Mayahi (ahmadmayahi) @@ -3166,14 +3137,19 @@ The Symfony Connect username in parenthesis allows to get more information - Bogdan Rancichi (devck) - Daniel Kolvik (dkvk) - Marc Lemay (flug) + - Gabriel Solomon (gabrielsolomon) - Henne Van Och (hennevo) - Jeroen De Dauw (jeroendedauw) - Maxime COLIN (maximecolin) - Muharrem Demirci (mdemirci) - Evgeny Z (meze) + - Aleksandar Dimitrov (netbull) - Pierre Geyer (ptheg) - Thomas BERTRAND (sevrahk) + - Vladislav (simpson) - Matej Žilák (teo_sk) + - Gary Houbre (thegarious) - Vladislav Vlastovskiy (vlastv) - RENAUDIN Xavier (xorrox) - Yannick Vanhaeren (yvh) + - Zan Baldwin (zanderbaldwin) From 4c958d14f81e4ae5f25be00513357b68a2b108e5 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 27 May 2022 09:04:21 +0200 Subject: [PATCH 04/68] Update VERSION for 4.4.42 --- 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 444939421ac6e..46838909f9b02 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 = []; - public const VERSION = '4.4.42-DEV'; + public const VERSION = '4.4.42'; public const VERSION_ID = 40442; public const MAJOR_VERSION = 4; public const MINOR_VERSION = 4; public const RELEASE_VERSION = 42; - public const EXTRA_VERSION = 'DEV'; + public const EXTRA_VERSION = ''; public const END_OF_MAINTENANCE = '11/2022'; public const END_OF_LIFE = '11/2023'; From 5df2a7206edb4f6b300997b4e57d390fe8e839e1 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 27 May 2022 09:07:57 +0200 Subject: [PATCH 05/68] Bump Symfony version to 4.4.43 --- 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 46838909f9b02..26aa46dd24058 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 = []; - public const VERSION = '4.4.42'; - public const VERSION_ID = 40442; + public const VERSION = '4.4.43-DEV'; + public const VERSION_ID = 40443; public const MAJOR_VERSION = 4; public const MINOR_VERSION = 4; - public const RELEASE_VERSION = 42; - public const EXTRA_VERSION = ''; + public const RELEASE_VERSION = 43; + public const EXTRA_VERSION = 'DEV'; public const END_OF_MAINTENANCE = '11/2022'; public const END_OF_LIFE = '11/2023'; From a2067814b4675aba37dcd274c817a5b0975f7cef Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 27 May 2022 09:09:05 +0200 Subject: [PATCH 06/68] Update CHANGELOG for 5.4.9 --- CHANGELOG-5.4.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/CHANGELOG-5.4.md b/CHANGELOG-5.4.md index 14694594d1031..c445966b598d9 100644 --- a/CHANGELOG-5.4.md +++ b/CHANGELOG-5.4.md @@ -7,6 +7,50 @@ in 5.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/v5.4.0...v5.4.1 +* 5.4.9 (2022-05-27) + + * bug #46386 [Console]  Fix missing negative variation of negatable options in shell completion (GromNaN) + * bug #46448 [DependencyInjection] Fix "proxy" tag: resolve its parameters and pass it to child definitions (nicolas-grekas) + * bug #46442 [FrameworkBundle] Revert "bug #46125 Always add CacheCollectorPass (fancyweb)" (chalasr) + * bug #46443 [DoctrineBridge] Don't reinit managers when they are proxied as ghost objects (nicolas-grekas) + * bug #46427 [FrameworkBundle] fix wiring of annotations.cached_reader (nicolas-grekas) + * bug #46425 [DependencyInjection] Ignore unused bindings defined by attribute (nicolas-grekas) + * bug #46434 [FrameworkBundle] Fix BC break in abstract config commands (yceruto) + * bug #46424 [Form] do not accept array input when a form is not multiple (xabbuh) + * bug #46367 [Mime] Throw exception when body in Email attach method is not ok (alamirault) + * bug #46421 [VarDumper][VarExporter] Deal with DatePeriod->include_end_date on PHP 8.2 (nicolas-grekas) + * bug #46401 [Cache] Throw when "redis_sentinel" is used with a non-Predis "class" option (buffcode) + * bug #46414 Bootstrap 4 fieldset for row errors (konradkozaczenko) + * bug #46412 [FrameworkBundle] Fix dumping extension config without bundle (yceruto) + * bug #46382 [HttpClient] Honor "max_duration" when replacing requests with async decorators (nicolas-grekas) + * bug #46407 [Filesystem] Safeguard (sym)link calls (derrabus) + * bug #46098 [Form] Fix same choice loader with different choice values (HeahDude) + * bug #46380 [HttpClient] Add missing HttpOptions::setMaxDuration() (nicolas-grekas) + * bug #46249 [HttpFoundation] [Session] Regenerate invalid session id (peter17) + * bug #46328 [Config] Allow scalar configuration in PHP Configuration (jderusse, HypeMC) + * bug #46366 [Mime] Add null check for EmailHeaderSame (magikid) + * bug #46364 [Config] Fix looking for single files in phars with GlobResource (nicolas-grekas) + * bug #46365 [HttpKernel] Revert "bug #46327 Allow ErrorHandler ^5.0 to be used" (nicolas-grekas) + * bug #46114 Fixes "Incorrectly nested style tag found" error when using multi-line header content (Perturbatio) + * bug #46325 [Ldap] Fix LDAP connection options (buffcode) + * bug #46341 Fix aliases handling in command name completion (Seldaek) + * bug #46317 [Security/Http] Ignore invalid URLs found in failure/success paths (nicolas-grekas) + * bug #46309 [Security] Fix division by zero (tvlooy) + * bug #46327 [HttpKernel] Allow ErrorHandler ^5.0 to be used in HttpKernel 4.4 (mpdude) + * bug #46297 [Serializer] Fix JsonSerializableNormalizer ignores circular reference handler in $context (BreyndotEchse) + * bug #46291 [Console] Suppress unhandled error in some specific use-cases. (rw4lll) + * bug #46302 [ErrorHandler] Fix list of tentative return types (nicolas-grekas) + * bug #45981 [Serializer][PropertyInfo] Fix support for "false" built-in type on PHP 8.2 (alexandre-daubois) + * bug #46277 [HttpKernel] Fix SessionListener without session in request (edditor) + * bug #46282 [DoctrineBridge] Treat firstResult === 0 like null (derrabus) + * bug #46239 [Translation] Refresh local translations on PushCommand if the provider has domains (Florian-B) + * bug #46278 [Workflow] Fix deprecated syntax for interpolated strings (nicolas-grekas) + * bug #46264 [Console] Better required argument check in InputArgument (jnoordsij) + * bug #46262 [EventDispatcher] Fix removing listeners when using first-class callable syntax (javer) + * bug #46216 [Form] fix populating single widget time view data with different timezones (xabbuh) + * bug #46221 [DomCrawler][VarDumper] Fix html-encoding emojis (nicolas-grekas) + * bug #46167 [VarExporter] Fix exporting DateTime objects on PHP 8.2 (nicolas-grekas) + * 5.4.8 (2022-04-27) * bug #46154 [Mailer] Restore X-Transport after failure (zenas1210) From eb7aca969fc9391b67081f8df83732aa6d756aa4 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 27 May 2022 09:09:08 +0200 Subject: [PATCH 07/68] Update VERSION for 5.4.9 --- 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 e3004cf4f70ae..ab99b29ec5a34 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -78,12 +78,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ private static $freshCache = []; - public const VERSION = '5.4.9-DEV'; + public const VERSION = '5.4.9'; public const VERSION_ID = 50409; public const MAJOR_VERSION = 5; public const MINOR_VERSION = 4; public const RELEASE_VERSION = 9; - public const EXTRA_VERSION = 'DEV'; + public const EXTRA_VERSION = ''; public const END_OF_MAINTENANCE = '11/2024'; public const END_OF_LIFE = '11/2025'; From b0c9736b169dd5ce70b02b4abb478955fa30e54c Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 27 May 2022 09:14:02 +0200 Subject: [PATCH 08/68] Bump Symfony version to 5.4.10 --- 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 ab99b29ec5a34..3962146803f5b 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -78,12 +78,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ private static $freshCache = []; - public const VERSION = '5.4.9'; - public const VERSION_ID = 50409; + public const VERSION = '5.4.10-DEV'; + public const VERSION_ID = 50410; public const MAJOR_VERSION = 5; public const MINOR_VERSION = 4; - public const RELEASE_VERSION = 9; - public const EXTRA_VERSION = ''; + public const RELEASE_VERSION = 10; + public const EXTRA_VERSION = 'DEV'; public const END_OF_MAINTENANCE = '11/2024'; public const END_OF_LIFE = '11/2025'; From 5d871d62d86ab22923c3f148e6a2d4174ea6a991 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 27 May 2022 09:20:29 +0200 Subject: [PATCH 09/68] Bump Symfony version to 6.0.10 --- 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 68988b82b628f..a8cf9f212e5cd 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -78,12 +78,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ private static array $freshCache = []; - public const VERSION = '6.0.9'; - public const VERSION_ID = 60009; + public const VERSION = '6.0.10-DEV'; + public const VERSION_ID = 60010; public const MAJOR_VERSION = 6; public const MINOR_VERSION = 0; - public const RELEASE_VERSION = 9; - public const EXTRA_VERSION = ''; + public const RELEASE_VERSION = 10; + public const EXTRA_VERSION = 'DEV'; public const END_OF_MAINTENANCE = '01/2023'; public const END_OF_LIFE = '01/2023'; From 297c3d7891594b921c3e3d74bf58fee8bbb00b71 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Fri, 27 May 2022 11:16:18 +0200 Subject: [PATCH 10/68] CS fix --- src/Symfony/Component/VarExporter/Internal/Exporter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/VarExporter/Internal/Exporter.php b/src/Symfony/Component/VarExporter/Internal/Exporter.php index 8e03755d87078..a8b271bda4295 100644 --- a/src/Symfony/Component/VarExporter/Internal/Exporter.php +++ b/src/Symfony/Component/VarExporter/Internal/Exporter.php @@ -110,7 +110,7 @@ public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount $arrayValue = (array) $value; } elseif ($value instanceof \Serializable || $value instanceof \__PHP_Incomplete_Class - || PHP_VERSION_ID < 80200 && $value instanceof \DatePeriod + || \PHP_VERSION_ID < 80200 && $value instanceof \DatePeriod ) { ++$objectsCount; $objectsPool[$value] = [$id = \count($objectsPool), serialize($value), [], 0]; From 5c29d512519a06c5c2fb787abba68e520ba72138 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Fri, 27 May 2022 13:44:32 +0200 Subject: [PATCH 11/68] Fix typo --- src/Symfony/Component/VarExporter/Instantiator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/VarExporter/Instantiator.php b/src/Symfony/Component/VarExporter/Instantiator.php index 06abbc75a6954..46457bdeb94af 100644 --- a/src/Symfony/Component/VarExporter/Instantiator.php +++ b/src/Symfony/Component/VarExporter/Instantiator.php @@ -39,10 +39,10 @@ final class Instantiator * Bar::class => ['privateBarProperty' => $propertyValue], * ]); * - * Instances of ArrayObject, ArrayIterator and SplObjectHash can be created + * Instances of ArrayObject, ArrayIterator and SplObjectStorage can be created * by using the special "\0" property name to define their internal value: * - * // creates an SplObjectHash where $info1 is attached to $obj1, etc. + * // creates an SplObjectStorage where $info1 is attached to $obj1, etc. * Instantiator::instantiate(SplObjectStorage::class, ["\0" => [$obj1, $info1, $obj2, $info2...]]); * * // creates an ArrayObject populated with $inputArray From d0843be177de584d4e00e7bf9a428d03b8146ba0 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Fri, 27 May 2022 09:53:40 -0400 Subject: [PATCH 12/68] [DependencyInjection] remove static cache from `ServiceSubscriberTrait` --- src/Symfony/Contracts/Service/ServiceSubscriberTrait.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Symfony/Contracts/Service/ServiceSubscriberTrait.php b/src/Symfony/Contracts/Service/ServiceSubscriberTrait.php index 020887b3f5736..48c610ab17144 100644 --- a/src/Symfony/Contracts/Service/ServiceSubscriberTrait.php +++ b/src/Symfony/Contracts/Service/ServiceSubscriberTrait.php @@ -29,12 +29,6 @@ trait ServiceSubscriberTrait */ public static function getSubscribedServices(): array { - static $services; - - if (null !== $services) { - return $services; - } - $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { From a5c2e1d2fb222f748147f24b8417f00b52743b66 Mon Sep 17 00:00:00 2001 From: Tugdual Saunier Date: Mon, 30 May 2022 10:29:00 -0400 Subject: [PATCH 13/68] [WebProfilerBundle] Fix AJAX requests info are truncated in the WDT --- .../WebProfilerBundle/Resources/views/Profiler/toolbar.css.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar.css.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar.css.twig index 126bdd7458243..5d0e3c928a10e 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar.css.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar.css.twig @@ -324,7 +324,7 @@ div.sf-toolbar .sf-toolbar-block a:hover { .sf-toolbar-block.hover .sf-toolbar-info { display: block; padding: 10px; - max-width: 480px; + max-width: 525px; max-height: 480px; word-wrap: break-word; overflow: hidden; From 16dbefa4f25a483a6074cbd697bce2b9ae008429 Mon Sep 17 00:00:00 2001 From: Tomas Date: Tue, 31 May 2022 08:11:17 +0300 Subject: [PATCH 14/68] [PropertyInfo] Fix extracting int range type --- .../Tests/Extractor/PhpStanExtractorTest.php | 17 +++++++++++ .../Tests/Fixtures/IntRangeDummy.php | 30 +++++++++++++++++++ .../PropertyInfo/Util/PhpStanTypeHelper.php | 4 +++ 3 files changed, 51 insertions(+) create mode 100644 src/Symfony/Component/PropertyInfo/Tests/Fixtures/IntRangeDummy.php diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php index d3c2c950963b1..467c076e2575e 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php @@ -401,6 +401,23 @@ public function testDummyNamespaceWithProperty() $this->assertEquals('A\Property', $phpStanTypes[0]->getClassName()); $this->assertEquals($phpDocTypes[0]->getClassName(), $phpStanTypes[0]->getClassName()); } + + /** + * @dataProvider intRangeTypeProvider + */ + public function testExtractorIntRangeType(string $property, ?array $types) + { + $this->assertEquals($types, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\IntRangeDummy', $property)); + } + + public function intRangeTypeProvider(): array + { + return [ + ['a', [new Type(Type::BUILTIN_TYPE_INT)]], + ['b', [new Type(Type::BUILTIN_TYPE_INT, true)]], + ['c', [new Type(Type::BUILTIN_TYPE_INT)]], + ]; + } } class PhpStanOmittedParamTagTypeDocBlock diff --git a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/IntRangeDummy.php b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/IntRangeDummy.php new file mode 100644 index 0000000000000..12b3784726e82 --- /dev/null +++ b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/IntRangeDummy.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\PropertyInfo\Tests\Fixtures; + +class IntRangeDummy +{ + /** + * @var int<0, 100> + */ + public $a; + + /** + * @var int|null + */ + public $b; + + /** + * @var int<50, max> + */ + public $c; +} diff --git a/src/Symfony/Component/PropertyInfo/Util/PhpStanTypeHelper.php b/src/Symfony/Component/PropertyInfo/Util/PhpStanTypeHelper.php index f3812ea0f35f4..256122af759b7 100644 --- a/src/Symfony/Component/PropertyInfo/Util/PhpStanTypeHelper.php +++ b/src/Symfony/Component/PropertyInfo/Util/PhpStanTypeHelper.php @@ -117,6 +117,10 @@ private function extractTypes(TypeNode $node, NameScope $nameScope): array if ($node instanceof GenericTypeNode) { [$mainType] = $this->extractTypes($node->type, $nameScope); + if (Type::BUILTIN_TYPE_INT === $mainType->getBuiltinType()) { + return [$mainType]; + } + $collectionKeyTypes = $mainType->getCollectionKeyTypes(); $collectionKeyValues = []; if (1 === \count($node->genericTypes)) { From 48c47df601798cdc2192a23f281f8251a03c9bd0 Mon Sep 17 00:00:00 2001 From: zenas1210 Date: Tue, 31 May 2022 17:58:40 +0300 Subject: [PATCH 15/68] [Serializer] Get attributeContext after converting name --- .../Normalizer/AbstractObjectNormalizer.php | 6 ++--- .../Features/ContextMetadataTestTrait.php | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index 951eb9d4a59b8..7a5c1bf9d0522 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -359,12 +359,12 @@ public function denormalize($data, string $type, string $format = null, array $c $resolvedClass = $this->objectClassResolver ? ($this->objectClassResolver)($object) : \get_class($object); foreach ($normalizedData as $attribute => $value) { - $attributeContext = $this->getAttributeDenormalizationContext($resolvedClass, $attribute, $context); - if ($this->nameConverter) { - $attribute = $this->nameConverter->denormalize($attribute, $resolvedClass, $format, $attributeContext); + $attribute = $this->nameConverter->denormalize($attribute, $resolvedClass, $format, $context); } + $attributeContext = $this->getAttributeDenormalizationContext($resolvedClass, $attribute, $context); + if ((false !== $allowedAttributes && !\in_array($attribute, $allowedAttributes)) || !$this->isAllowedAttribute($resolvedClass, $attribute, $format, $context)) { if (!($context[self::ALLOW_EXTRA_ATTRIBUTES] ?? $this->defaultContext[self::ALLOW_EXTRA_ATTRIBUTES])) { $extraAttributes[] = $attribute; diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/Features/ContextMetadataTestTrait.php b/src/Symfony/Component/Serializer/Tests/Normalizer/Features/ContextMetadataTestTrait.php index 374cacaf79d02..4dbba913b7272 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/Features/ContextMetadataTestTrait.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/Features/ContextMetadataTestTrait.php @@ -17,6 +17,7 @@ use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; +use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter; use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; use Symfony\Component\Serializer\Serializer; @@ -70,6 +71,17 @@ public function testContextMetadataContextDenormalize() ]); self::assertEquals('2011-07-28', $dummy->date->format('Y-m-d'), 'a specific denormalization context is used for this group'); } + + public function testContextDenormalizeWithNameConverter() + { + $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); + $normalizer = new ObjectNormalizer($classMetadataFactory, new CamelCaseToSnakeCaseNameConverter(), null, new PhpDocExtractor()); + new Serializer([new DateTimeNormalizer(), $normalizer]); + + /** @var ContextMetadataNamingDummy $dummy */ + $dummy = $normalizer->denormalize(['created_at' => '28/07/2011'], ContextMetadataNamingDummy::class); + self::assertEquals('2011-07-28', $dummy->createdAt->format('Y-m-d')); + } } class ContextMetadataDummy @@ -90,3 +102,13 @@ class ContextMetadataDummy */ public $date; } + +class ContextMetadataNamingDummy +{ + /** + * @var \DateTime + * + * @Context({ DateTimeNormalizer::FORMAT_KEY = "d/m/Y" }) + */ + public $createdAt; +} From 7bffa1e0563b269125c5c8fe953bbf1b22beacd9 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 31 May 2022 18:48:23 +0200 Subject: [PATCH 16/68] [Workflow] Add ZEturf as backer --- src/Symfony/Component/Workflow/README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/Symfony/Component/Workflow/README.md b/src/Symfony/Component/Workflow/README.md index 66fb6013a59ed..6cc5440dc8a37 100644 --- a/src/Symfony/Component/Workflow/README.md +++ b/src/Symfony/Component/Workflow/README.md @@ -4,6 +4,19 @@ Workflow Component The Workflow component provides tools for managing a workflow or finite state machine. +Sponsor +------- + +The Workflow component for Symfony 5.4/6.0 is [backed][1] by [ZEturf][2]. + +The ZEturf group is an online gaming operator licensed in 6 markets in Europe and +Africa. It operates two brands, ZEturf on horse racing betting, and ZEbet on +sports betting. In parallel with the development of its betting activities, the +group is also investing in Entertainment / gaming with Free-to-Play and +Play-to-Earn projects. + +Help Symfony by [sponsoring][3] its development! + Resources --------- @@ -12,3 +25,7 @@ Resources * [Report issues](https://github.com/symfony/symfony/issues) and [send Pull Requests](https://github.com/symfony/symfony/pulls) in the [main Symfony repository](https://github.com/symfony/symfony) + +[1]: https://symfony.com/backers +[2]: https://zeturf.com +[3]: https://symfony.com/sponsor From 115a078008372d3e02a60480a7446c0c35394598 Mon Sep 17 00:00:00 2001 From: Robin Chalas Date: Tue, 31 May 2022 23:03:42 +0200 Subject: [PATCH 17/68] [Security] Fix some phpdoc --- .../Passport/Credentials/PasswordCredentials.php | 2 +- .../Http/Authenticator/Passport/Passport.php | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Security/Http/Authenticator/Passport/Credentials/PasswordCredentials.php b/src/Symfony/Component/Security/Http/Authenticator/Passport/Credentials/PasswordCredentials.php index 1c27ac9e4592a..50d47fc732682 100644 --- a/src/Symfony/Component/Security/Http/Authenticator/Passport/Credentials/PasswordCredentials.php +++ b/src/Symfony/Component/Security/Http/Authenticator/Passport/Credentials/PasswordCredentials.php @@ -16,7 +16,7 @@ /** * Implements password credentials. * - * These plaintext passwords are checked by the UserPasswordEncoder during + * These plaintext passwords are checked by the UserPasswordHasher during * authentication. * * @author Wouter de Jong diff --git a/src/Symfony/Component/Security/Http/Authenticator/Passport/Passport.php b/src/Symfony/Component/Security/Http/Authenticator/Passport/Passport.php index 24ed0290e9c4e..23bb33c927252 100644 --- a/src/Symfony/Component/Security/Http/Authenticator/Passport/Passport.php +++ b/src/Symfony/Component/Security/Http/Authenticator/Passport/Passport.php @@ -17,7 +17,11 @@ use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\CredentialsInterface; /** - * The default implementation for passports. + * A Passport contains all security-related information that needs to be + * validated during authentication. + * + * A passport badge can be used to add any additional information to the + * passport. * * @author Wouter de Jong */ @@ -59,6 +63,12 @@ public function getUser(): UserInterface } /** + * Adds a new security badge. + * + * A passport can hold only one instance of the same security badge. + * This method replaces the current badge if it is already set on this + * passport. + * * @return $this */ public function addBadge(BadgeInterface $badge): PassportInterface From 5d76dbb3cde28d6f91d0a2fbae769b3620aea66f Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Wed, 1 Jun 2022 14:29:35 +0200 Subject: [PATCH 18/68] [Mailer] Sort transports alphabetically --- .../DependencyInjection/FrameworkExtension.php | 2 +- .../Mailer/Exception/UnsupportedSchemeException.php | 8 ++++---- .../Tests/Exception/UnsupportedSchemeExceptionTest.php | 4 ++-- src/Symfony/Component/Mailer/Transport.php | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index df425dc5e1dca..9c1410419d066 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -2437,11 +2437,11 @@ private function registerMailerConfiguration(array $config, ContainerBuilder $co MailgunTransportFactory::class => 'mailer.transport_factory.mailgun', MailjetTransportFactory::class => 'mailer.transport_factory.mailjet', MandrillTransportFactory::class => 'mailer.transport_factory.mailchimp', + OhMySmtpTransportFactory::class => 'mailer.transport_factory.ohmysmtp', PostmarkTransportFactory::class => 'mailer.transport_factory.postmark', SendgridTransportFactory::class => 'mailer.transport_factory.sendgrid', SendinblueTransportFactory::class => 'mailer.transport_factory.sendinblue', SesTransportFactory::class => 'mailer.transport_factory.amazon', - OhMySmtpTransportFactory::class => 'mailer.transport_factory.ohmysmtp', ]; foreach ($classToServices as $class => $service) { diff --git a/src/Symfony/Component/Mailer/Exception/UnsupportedSchemeException.php b/src/Symfony/Component/Mailer/Exception/UnsupportedSchemeException.php index 452b8ba3508a8..e47a129dc7e90 100644 --- a/src/Symfony/Component/Mailer/Exception/UnsupportedSchemeException.php +++ b/src/Symfony/Component/Mailer/Exception/UnsupportedSchemeException.php @@ -36,6 +36,10 @@ class UnsupportedSchemeException extends LogicException 'class' => Bridge\Mailchimp\Transport\MandrillTransportFactory::class, 'package' => 'symfony/mailchimp-mailer', ], + 'ohmysmtp' => [ + 'class' => Bridge\OhMySmtp\Transport\OhMySmtpTransportFactory::class, + 'package' => 'symfony/oh-my-smtp-mailer', + ], 'postmark' => [ 'class' => Bridge\Postmark\Transport\PostmarkTransportFactory::class, 'package' => 'symfony/postmark-mailer', @@ -52,10 +56,6 @@ class UnsupportedSchemeException extends LogicException 'class' => Bridge\Amazon\Transport\SesTransportFactory::class, 'package' => 'symfony/amazon-mailer', ], - 'ohmysmtp' => [ - 'class' => Bridge\OhMySmtp\Transport\OhMySmtpTransportFactory::class, - 'package' => 'symfony/oh-my-smtp-mailer', - ], ]; public function __construct(Dsn $dsn, string $name = null, array $supported = []) diff --git a/src/Symfony/Component/Mailer/Tests/Exception/UnsupportedSchemeExceptionTest.php b/src/Symfony/Component/Mailer/Tests/Exception/UnsupportedSchemeExceptionTest.php index 54685da7cb772..54ce6dbe5a38c 100644 --- a/src/Symfony/Component/Mailer/Tests/Exception/UnsupportedSchemeExceptionTest.php +++ b/src/Symfony/Component/Mailer/Tests/Exception/UnsupportedSchemeExceptionTest.php @@ -38,10 +38,10 @@ public static function setUpBeforeClass(): void MailgunTransportFactory::class => false, MailjetTransportFactory::class => false, MandrillTransportFactory::class => false, + OhMySmtpTransportFactory::class => false, PostmarkTransportFactory::class => false, SendgridTransportFactory::class => false, SendinblueTransportFactory::class => false, - OhMySmtpTransportFactory::class => false, SesTransportFactory::class => false, ]); } @@ -65,10 +65,10 @@ public function messageWhereSchemeIsPartOfSchemeToPackageMapProvider(): \Generat yield ['mailgun', 'symfony/mailgun-mailer']; yield ['mailjet', 'symfony/mailjet-mailer']; yield ['mandrill', 'symfony/mailchimp-mailer']; + yield ['ohmysmtp', 'symfony/oh-my-smtp-mailer']; yield ['postmark', 'symfony/postmark-mailer']; yield ['sendgrid', 'symfony/sendgrid-mailer']; yield ['sendinblue', 'symfony/sendinblue-mailer']; - yield ['ohmysmtp', 'symfony/oh-my-smtp-mailer']; yield ['ses', 'symfony/amazon-mailer']; } diff --git a/src/Symfony/Component/Mailer/Transport.php b/src/Symfony/Component/Mailer/Transport.php index 3334b4068e553..920ffc416979d 100644 --- a/src/Symfony/Component/Mailer/Transport.php +++ b/src/Symfony/Component/Mailer/Transport.php @@ -49,10 +49,10 @@ class Transport MailgunTransportFactory::class, MailjetTransportFactory::class, MandrillTransportFactory::class, + OhMySmtpTransportFactory::class, PostmarkTransportFactory::class, SendgridTransportFactory::class, SendinblueTransportFactory::class, - OhMySmtpTransportFactory::class, SesTransportFactory::class, ]; From 4a9d6a547539f5b27832603bf62288957fa70b9b Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Wed, 1 Jun 2022 15:42:50 +0200 Subject: [PATCH 19/68] [Cache] do not pass null to strlen() --- src/Symfony/Component/Cache/Traits/RedisTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Cache/Traits/RedisTrait.php b/src/Symfony/Component/Cache/Traits/RedisTrait.php index c27e0df689493..dabdde4e705ce 100644 --- a/src/Symfony/Component/Cache/Traits/RedisTrait.php +++ b/src/Symfony/Component/Cache/Traits/RedisTrait.php @@ -373,7 +373,7 @@ protected function doClear($namespace) { if ($this->redis instanceof \Predis\ClientInterface) { $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : ''; - $prefixLen = \strlen($prefix); + $prefixLen = \strlen($prefix ?? ''); } $cleared = true; From 633007649be336e941dea9adb936ddbce3b21488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Fr=C3=A9mont?= Date: Wed, 1 Jun 2022 18:17:21 +0200 Subject: [PATCH 20/68] Fix getting class constraints on debug command --- .../Validator/Command/DebugCommand.php | 30 ++++- .../Tests/Command/DebugCommandTest.php | 125 +++++++++++------- 2 files changed, 102 insertions(+), 53 deletions(-) diff --git a/src/Symfony/Component/Validator/Command/DebugCommand.php b/src/Symfony/Component/Validator/Command/DebugCommand.php index ad0ebba021396..be2c3fe96337e 100644 --- a/src/Symfony/Component/Validator/Command/DebugCommand.php +++ b/src/Symfony/Component/Validator/Command/DebugCommand.php @@ -90,7 +90,19 @@ private function dumpValidatorsForClass(InputInterface $input, OutputInterface $ $rows = []; $dump = new Dumper($output); - foreach ($this->getConstrainedPropertiesData($class) as $propertyName => $constraintsData) { + /** @var ClassMetadataInterface $classMetadata */ + $classMetadata = $this->validator->getMetadataFor($class); + + foreach ($this->getClassConstraintsData($classMetadata) as $data) { + $rows[] = [ + '-', + $data['class'], + implode(', ', $data['groups']), + $dump($data['options']), + ]; + } + + foreach ($this->getConstrainedPropertiesData($classMetadata) as $propertyName => $constraintsData) { foreach ($constraintsData as $data) { $rows[] = [ $propertyName, @@ -121,12 +133,20 @@ private function dumpValidatorsForClass(InputInterface $input, OutputInterface $ $table->render(); } - private function getConstrainedPropertiesData(string $class): array + private function getClassConstraintsData(ClassMetadataInterface $classMetadata): iterable { - $data = []; + foreach ($classMetadata->getConstraints() as $constraint) { + yield [ + 'class' => \get_class($constraint), + 'groups' => $constraint->groups, + 'options' => $this->getConstraintOptions($constraint), + ]; + } + } - /** @var ClassMetadataInterface $classMetadata */ - $classMetadata = $this->validator->getMetadataFor($class); + private function getConstrainedPropertiesData(ClassMetadataInterface $classMetadata): array + { + $data = []; foreach ($classMetadata->getConstrainedProperties() as $constrainedProperty) { $data[$constrainedProperty] = $this->getPropertyData($classMetadata, $constrainedProperty); diff --git a/src/Symfony/Component/Validator/Tests/Command/DebugCommandTest.php b/src/Symfony/Component/Validator/Tests/Command/DebugCommandTest.php index f6d1691662e3f..be1691454615d 100644 --- a/src/Symfony/Component/Validator/Tests/Command/DebugCommandTest.php +++ b/src/Symfony/Component/Validator/Tests/Command/DebugCommandTest.php @@ -15,6 +15,7 @@ use Symfony\Component\Console\Tester\CommandTester; use Symfony\Component\Validator\Command\DebugCommand; use Symfony\Component\Validator\Constraints\Email; +use Symfony\Component\Validator\Constraints\Expression; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Mapping\ClassMetadataInterface; use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface; @@ -38,6 +39,11 @@ public function testOutputWithClassArgument() ->with(DummyClassOne::class) ->willReturn($classMetadata); + $classMetadata + ->expects($this->once()) + ->method('getConstraints') + ->willReturn([new Expression('1 + 1 = 2')]); + $classMetadata ->expects($this->once()) ->method('getConstrainedProperties') @@ -68,22 +74,28 @@ public function testOutputWithClassArgument() Symfony\Component\Validator\Tests\Dummy\DummyClassOne ----------------------------------------------------- -+---------------+--------------------------------------------------+---------+------------------------------------------------------------+ -| Property | Name | Groups | Options | -+---------------+--------------------------------------------------+---------+------------------------------------------------------------+ -| firstArgument | Symfony\Component\Validator\Constraints\NotBlank | Default | [ | -| | | | "allowNull" => false, | -| | | | "message" => "This value should not be blank.", | -| | | | "normalizer" => null, | -| | | | "payload" => null | -| | | | ] | -| firstArgument | Symfony\Component\Validator\Constraints\Email | Default | [ | -| | | | "message" => "This value is not a valid email address.", | -| | | | "mode" => null, | -| | | | "normalizer" => null, | -| | | | "payload" => null | -| | | | ] | -+---------------+--------------------------------------------------+---------+------------------------------------------------------------+ ++---------------+----------------------------------------------------+---------+------------------------------------------------------------+ +| Property | Name | Groups | Options | ++---------------+----------------------------------------------------+---------+------------------------------------------------------------+ +| - | Symfony\Component\Validator\Constraints\Expression | Default | [ | +| | | | "expression" => "1 + 1 = 2", | +| | | | "message" => "This value is not valid.", | +| | | | "payload" => null, | +| | | | "values" => [] | +| | | | ] | +| firstArgument | Symfony\Component\Validator\Constraints\NotBlank | Default | [ | +| | | | "allowNull" => false, | +| | | | "message" => "This value should not be blank.", | +| | | | "normalizer" => null, | +| | | | "payload" => null | +| | | | ] | +| firstArgument | Symfony\Component\Validator\Constraints\Email | Default | [ | +| | | | "message" => "This value is not a valid email address.", | +| | | | "mode" => null, | +| | | | "normalizer" => null, | +| | | | "payload" => null | +| | | | ] | ++---------------+----------------------------------------------------+---------+------------------------------------------------------------+ TXT , $tester->getDisplay(true) @@ -108,6 +120,11 @@ public function testOutputWithPathArgument() 'firstArgument', ]); + $classMetadata + ->expects($this->exactly(2)) + ->method('getConstraints') + ->willReturn([new Expression('1 + 1 = 2')]); + $classMetadata ->method('getPropertyMetadata') ->with('firstArgument') @@ -129,42 +146,54 @@ public function testOutputWithPathArgument() Symfony\Component\Validator\Tests\Dummy\DummyClassOne ----------------------------------------------------- -+---------------+--------------------------------------------------+---------+------------------------------------------------------------+ -| Property | Name | Groups | Options | -+---------------+--------------------------------------------------+---------+------------------------------------------------------------+ -| firstArgument | Symfony\Component\Validator\Constraints\NotBlank | Default | [ | -| | | | "allowNull" => false, | -| | | | "message" => "This value should not be blank.", | -| | | | "normalizer" => null, | -| | | | "payload" => null | -| | | | ] | -| firstArgument | Symfony\Component\Validator\Constraints\Email | Default | [ | -| | | | "message" => "This value is not a valid email address.", | -| | | | "mode" => null, | -| | | | "normalizer" => null, | -| | | | "payload" => null | -| | | | ] | -+---------------+--------------------------------------------------+---------+------------------------------------------------------------+ ++---------------+----------------------------------------------------+---------+------------------------------------------------------------+ +| Property | Name | Groups | Options | ++---------------+----------------------------------------------------+---------+------------------------------------------------------------+ +| - | Symfony\Component\Validator\Constraints\Expression | Default | [ | +| | | | "expression" => "1 + 1 = 2", | +| | | | "message" => "This value is not valid.", | +| | | | "payload" => null, | +| | | | "values" => [] | +| | | | ] | +| firstArgument | Symfony\Component\Validator\Constraints\NotBlank | Default | [ | +| | | | "allowNull" => false, | +| | | | "message" => "This value should not be blank.", | +| | | | "normalizer" => null, | +| | | | "payload" => null | +| | | | ] | +| firstArgument | Symfony\Component\Validator\Constraints\Email | Default | [ | +| | | | "message" => "This value is not a valid email address.", | +| | | | "mode" => null, | +| | | | "normalizer" => null, | +| | | | "payload" => null | +| | | | ] | ++---------------+----------------------------------------------------+---------+------------------------------------------------------------+ Symfony\Component\Validator\Tests\Dummy\DummyClassTwo ----------------------------------------------------- -+---------------+--------------------------------------------------+---------+------------------------------------------------------------+ -| Property | Name | Groups | Options | -+---------------+--------------------------------------------------+---------+------------------------------------------------------------+ -| firstArgument | Symfony\Component\Validator\Constraints\NotBlank | Default | [ | -| | | | "allowNull" => false, | -| | | | "message" => "This value should not be blank.", | -| | | | "normalizer" => null, | -| | | | "payload" => null | -| | | | ] | -| firstArgument | Symfony\Component\Validator\Constraints\Email | Default | [ | -| | | | "message" => "This value is not a valid email address.", | -| | | | "mode" => null, | -| | | | "normalizer" => null, | -| | | | "payload" => null | -| | | | ] | -+---------------+--------------------------------------------------+---------+------------------------------------------------------------+ ++---------------+----------------------------------------------------+---------+------------------------------------------------------------+ +| Property | Name | Groups | Options | ++---------------+----------------------------------------------------+---------+------------------------------------------------------------+ +| - | Symfony\Component\Validator\Constraints\Expression | Default | [ | +| | | | "expression" => "1 + 1 = 2", | +| | | | "message" => "This value is not valid.", | +| | | | "payload" => null, | +| | | | "values" => [] | +| | | | ] | +| firstArgument | Symfony\Component\Validator\Constraints\NotBlank | Default | [ | +| | | | "allowNull" => false, | +| | | | "message" => "This value should not be blank.", | +| | | | "normalizer" => null, | +| | | | "payload" => null | +| | | | ] | +| firstArgument | Symfony\Component\Validator\Constraints\Email | Default | [ | +| | | | "message" => "This value is not a valid email address.", | +| | | | "mode" => null, | +| | | | "normalizer" => null, | +| | | | "payload" => null | +| | | | ] | ++---------------+----------------------------------------------------+---------+------------------------------------------------------------+ TXT , $tester->getDisplay(true) From a807523f57d4984ffbe48c01abd9dd6b8b677a30 Mon Sep 17 00:00:00 2001 From: Wojciech Kania Date: Tue, 31 May 2022 23:20:05 +0200 Subject: [PATCH 21/68] [Mime] Check that the path is a file in the DataPart::fromPath --- src/Symfony/Component/Mime/Part/DataPart.php | 2 +- src/Symfony/Component/Mime/Tests/Part/DataPartTest.php | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Mime/Part/DataPart.php b/src/Symfony/Component/Mime/Part/DataPart.php index 75bcb64a9a9cb..e80a83946ef2e 100644 --- a/src/Symfony/Component/Mime/Part/DataPart.php +++ b/src/Symfony/Component/Mime/Part/DataPart.php @@ -61,7 +61,7 @@ public static function fromPath(string $path, string $name = null, string $conte $contentType = self::$mimeTypes->getMimeTypes($ext)[0] ?? 'application/octet-stream'; } - if (false === is_readable($path)) { + if (!is_file($path) || !is_readable($path)) { throw new InvalidArgumentException(sprintf('Path "%s" is not readable.', $path)); } diff --git a/src/Symfony/Component/Mime/Tests/Part/DataPartTest.php b/src/Symfony/Component/Mime/Tests/Part/DataPartTest.php index d8a08a24303c2..4d5b692744327 100644 --- a/src/Symfony/Component/Mime/Tests/Part/DataPartTest.php +++ b/src/Symfony/Component/Mime/Tests/Part/DataPartTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Mime\Tests\Part; use PHPUnit\Framework\TestCase; +use Symfony\Component\Mime\Exception\InvalidArgumentException; use Symfony\Component\Mime\Header\Headers; use Symfony\Component\Mime\Header\IdentificationHeader; use Symfony\Component\Mime\Header\ParameterizedHeader; @@ -127,6 +128,12 @@ public function testFromPathWithMeta() ), $p->getPreparedHeaders()); } + public function testFromPathWithNotAFile() + { + $this->expectException(InvalidArgumentException::class); + DataPart::fromPath(__DIR__.'/../Fixtures/mimetypes/'); + } + public function testHasContentId() { $p = new DataPart('content'); From 12bf8cb09278a711af21f1e5579be86996991101 Mon Sep 17 00:00:00 2001 From: Wojciech Kania Date: Wed, 1 Jun 2022 21:35:40 +0200 Subject: [PATCH 22/68] [Mime] Allow url as a path in the DataPart::fromPath --- src/Symfony/Component/Mime/Part/DataPart.php | 9 ++++++- .../Mime/Tests/Part/DataPartTest.php | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Mime/Part/DataPart.php b/src/Symfony/Component/Mime/Part/DataPart.php index e80a83946ef2e..4247ce798d868 100644 --- a/src/Symfony/Component/Mime/Part/DataPart.php +++ b/src/Symfony/Component/Mime/Part/DataPart.php @@ -61,13 +61,20 @@ public static function fromPath(string $path, string $name = null, string $conte $contentType = self::$mimeTypes->getMimeTypes($ext)[0] ?? 'application/octet-stream'; } - if (!is_file($path) || !is_readable($path)) { + if ((is_file($path) && !is_readable($path)) || is_dir($path)) { throw new InvalidArgumentException(sprintf('Path "%s" is not readable.', $path)); } if (false === $handle = @fopen($path, 'r', false)) { throw new InvalidArgumentException(sprintf('Unable to open path "%s".', $path)); } + + if (!is_file($path)) { + $cache = fopen('php://temp', 'r+'); + stream_copy_to_stream($handle, $cache); + $handle = $cache; + } + $p = new self($handle, $name ?: basename($path), $contentType); $p->handle = $handle; diff --git a/src/Symfony/Component/Mime/Tests/Part/DataPartTest.php b/src/Symfony/Component/Mime/Tests/Part/DataPartTest.php index 4d5b692744327..34a379c2a983f 100644 --- a/src/Symfony/Component/Mime/Tests/Part/DataPartTest.php +++ b/src/Symfony/Component/Mime/Tests/Part/DataPartTest.php @@ -134,6 +134,30 @@ public function testFromPathWithNotAFile() DataPart::fromPath(__DIR__.'/../Fixtures/mimetypes/'); } + /** + * @group network + */ + public function testFromPathWithUrl() + { + if (!\in_array('https', stream_get_wrappers())) { + $this->markTestSkipped('"https" stream wrapper is not enabled.'); + } + + $p = DataPart::fromPath($file = 'https://symfony.com/images/common/logo/logo_symfony_header.png'); + $content = file_get_contents($file); + $this->assertEquals($content, $p->getBody()); + $maxLineLength = 76; + $this->assertEquals(substr(base64_encode($content), 0, $maxLineLength), substr($p->bodyToString(), 0, $maxLineLength)); + $this->assertEquals(substr(base64_encode($content), 0, $maxLineLength), substr(implode('', iterator_to_array($p->bodyToIterable())), 0, $maxLineLength)); + $this->assertEquals('image', $p->getMediaType()); + $this->assertEquals('png', $p->getMediaSubType()); + $this->assertEquals(new Headers( + new ParameterizedHeader('Content-Type', 'image/png', ['name' => 'logo_symfony_header.png']), + new UnstructuredHeader('Content-Transfer-Encoding', 'base64'), + new ParameterizedHeader('Content-Disposition', 'attachment', ['name' => 'logo_symfony_header.png', 'filename' => 'logo_symfony_header.png']) + ), $p->getPreparedHeaders()); + } + public function testHasContentId() { $p = new DataPart('content'); From 5514bdf4877f72b9b9d73ed6f30ff7d38bb69e46 Mon Sep 17 00:00:00 2001 From: Maxime Steinhausser Date: Fri, 3 Jun 2022 09:47:22 +0200 Subject: [PATCH 23/68] [WebProfilerBundle] Fix dark theme selected line highlight color & reuse css vars --- .../Resources/views/Profiler/profiler.css.twig | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/profiler.css.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/profiler.css.twig index e5a731cf19ca8..db21abf886c85 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/profiler.css.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/profiler.css.twig @@ -39,6 +39,7 @@ --highlight-default: #222222; --highlight-keyword: #a71d5d; --highlight-string: #183691; + --highlight-selected-line: rgba(255, 255, 153, 0.5); --base-0: #fff; --base-1: #f5f5f5; --base-2: #e0e0e0; @@ -80,6 +81,7 @@ --highlight-default: var(--base-6); --highlight-keyword: #ff413c; --highlight-string: #70a6fd; + --highlight-selected-line: rgba(14, 14, 14, 0.5); --base-0: #2e3136; --base-1: #444; --base-2: #666; @@ -1091,15 +1093,15 @@ table.logs .metadata { padding: 0; } #collector-content .sf-validator .trace li.selected { - background: rgba(255, 255, 153, 0.5); + background: var(--highlight-selected-line); } {# Messenger panel ========================================================================= #} #collector-content .message-bus .trace { - border: 1px solid #DDD; - background: #FFF; + border: var(--border); + background: var(--base-0); padding: 10px; margin: 0.5em 0; overflow: auto; @@ -1112,7 +1114,7 @@ table.logs .metadata { padding: 0; } #collector-content .message-bus .trace li.selected { - background: rgba(255, 255, 153, 0.5); + background: var(--highlight-selected-line); } {# Dump panel From 7b6a48562421785687387eda833c078c06589aaa Mon Sep 17 00:00:00 2001 From: Maxime Steinhausser Date: Fri, 3 Jun 2022 14:46:29 +0200 Subject: [PATCH 24/68] [Console] Escape % in command name & description from getDefault*() --- .../AddConsoleCommandPass.php | 4 +-- .../AddConsoleCommandPassTest.php | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php index 743e306d07b9a..2c9ebe668e517 100644 --- a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php +++ b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php @@ -67,7 +67,7 @@ public function process(ContainerBuilder $container) if (!$r->isSubclassOf(Command::class)) { throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); } - $aliases = $class::getDefaultName(); + $aliases = str_replace('%', '%%', $class::getDefaultName()); } $aliases = explode('|', $aliases ?? ''); @@ -124,7 +124,7 @@ public function process(ContainerBuilder $container) if (!$r->isSubclassOf(Command::class)) { throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); } - $description = $class::getDefaultDescription(); + $description = str_replace('%', '%%', $class::getDefaultDescription()); } if ($description) { diff --git a/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php b/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php index aa92c76f159c3..eec4eff438eef 100644 --- a/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php +++ b/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php @@ -153,6 +153,33 @@ public function testProcessFallsBackToDefaultDescription() $this->assertSame(1 + $initCounter, DescribedCommand::$initCounter); } + public function testEscapesDefaultFromPhp() + { + $container = new ContainerBuilder(); + $container + ->register('to-escape', EscapedDefaultsFromPhpCommand::class) + ->addTag('console.command') + ; + + $pass = new AddConsoleCommandPass(); + $pass->process($container); + + $commandLoader = $container->getDefinition('console.command_loader'); + $commandLocator = $container->getDefinition((string) $commandLoader->getArgument(0)); + + $this->assertSame(ContainerCommandLoader::class, $commandLoader->getClass()); + $this->assertSame(['%%cmd%%' => 'to-escape', '%%cmdalias%%' => 'to-escape'], $commandLoader->getArgument(1)); + $this->assertEquals([['to-escape' => new ServiceClosureArgument(new Reference('.to-escape.lazy'))]], $commandLocator->getArguments()); + $this->assertSame([], $container->getParameter('console.command.ids')); + + $command = $container->get('console.command_loader')->get('%%cmd%%'); + + $this->assertInstanceOf(LazyCommand::class, $command); + $this->assertSame('%cmd%', $command->getName()); + $this->assertSame(['%cmdalias%'], $command->getAliases()); + $this->assertSame('Creates a 80% discount', $command->getDescription()); + } + public function testProcessThrowAnExceptionIfTheServiceIsAbstract() { $this->expectException(\InvalidArgumentException::class); @@ -286,6 +313,12 @@ class NamedCommand extends Command protected static $defaultName = 'default'; } +class EscapedDefaultsFromPhpCommand extends Command +{ + protected static $defaultName = '%cmd%|%cmdalias%'; + protected static $defaultDescription = 'Creates a 80% discount'; +} + class DescribedCommand extends Command { public static $initCounter = 0; From 6cdcb1bb9436503451104bf0f45e216fabf45d36 Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Fri, 3 Jun 2022 22:09:54 +0200 Subject: [PATCH 25/68] [Serializer] Fix ignore attribute in Xml files --- .../Component/Serializer/Mapping/Loader/XmlFileLoader.php | 2 +- .../Component/Serializer/Tests/Fixtures/serialization.xml | 1 + .../Serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Serializer/Mapping/Loader/XmlFileLoader.php b/src/Symfony/Component/Serializer/Mapping/Loader/XmlFileLoader.php index d023402f74ade..5ef21fb370683 100644 --- a/src/Symfony/Component/Serializer/Mapping/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/Serializer/Mapping/Loader/XmlFileLoader.php @@ -72,7 +72,7 @@ public function loadClassMetadata(ClassMetadataInterface $classMetadata) } if (isset($attribute['ignore'])) { - $attributeMetadata->setIgnore((bool) $attribute['ignore']); + $attributeMetadata->setIgnore(XmlUtils::phpize($attribute['ignore'])); } foreach ($attribute->context as $node) { diff --git a/src/Symfony/Component/Serializer/Tests/Fixtures/serialization.xml b/src/Symfony/Component/Serializer/Tests/Fixtures/serialization.xml index da61e0acce8dc..69243cfddb5ae 100644 --- a/src/Symfony/Component/Serializer/Tests/Fixtures/serialization.xml +++ b/src/Symfony/Component/Serializer/Tests/Fixtures/serialization.xml @@ -37,6 +37,7 @@ + diff --git a/src/Symfony/Component/Serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php b/src/Symfony/Component/Serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php index 201cb68ba8ff8..47d6305a898f2 100644 --- a/src/Symfony/Component/Serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php +++ b/src/Symfony/Component/Serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php @@ -107,6 +107,7 @@ public function testLoadIgnore() $attributesMetadata = $classMetadata->getAttributesMetadata(); $this->assertTrue($attributesMetadata['ignored1']->isIgnored()); $this->assertTrue($attributesMetadata['ignored2']->isIgnored()); + $this->assertFalse($attributesMetadata['notIgnored']->isIgnored()); } protected function getLoaderForContextMapping(): LoaderInterface From 8989377e3c4d3808449a472f54256bb3706a27ca Mon Sep 17 00:00:00 2001 From: Robert Fischer Date: Fri, 3 Jun 2022 22:31:15 +0200 Subject: [PATCH 26/68] Improve DE translations for Form/Validator --- .../Component/Form/Resources/translations/validators.de.xlf | 2 +- .../Validator/Resources/translations/validators.de.xlf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Form/Resources/translations/validators.de.xlf b/src/Symfony/Component/Form/Resources/translations/validators.de.xlf index bc8e46d1ec089..7b30839f9183d 100644 --- a/src/Symfony/Component/Form/Resources/translations/validators.de.xlf +++ b/src/Symfony/Component/Form/Resources/translations/validators.de.xlf @@ -12,7 +12,7 @@ The CSRF token is invalid. Please try to resubmit the form. - Der CSRF-Token ist ungültig. Versuchen Sie bitte das Formular erneut zu senden. + Der CSRF-Token ist ungültig. Versuchen Sie bitte, das Formular erneut zu senden. This value is not a valid HTML5 color. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.de.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.de.xlf index 00be24fb8ac5f..1c6d0c6c95873 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.de.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.de.xlf @@ -220,7 +220,7 @@ Unsupported card type or invalid card number. - Nicht unterstützer Kartentyp oder ungültige Kartennummer. + Nicht unterstützter Kartentyp oder ungültige Kartennummer. This is not a valid International Bank Account Number (IBAN). @@ -312,7 +312,7 @@ This is not a valid Business Identifier Code (BIC). - Dieser Wert ist kein gültiger BIC. + Dieser Wert ist keine gültige internationale Bankleitzahl (BIC). Error From d976b24b171276e37b634cf741fd7847b805e071 Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Mon, 6 Jun 2022 13:51:59 +0200 Subject: [PATCH 27/68] [FrameworkBundle] Fix XML cache config --- .../Resources/config/schema/symfony-1.0.xsd | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd index faa88efbbf7a2..0d5e45f9c2b7e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd @@ -267,7 +267,14 @@ - + + + + + + + + From 2ace20a2350ebdd02871fc23768c5cf5324b7099 Mon Sep 17 00:00:00 2001 From: Maxime Steinhausser Date: Fri, 3 Jun 2022 14:46:29 +0200 Subject: [PATCH 28/68] [Console] Escape % in command name & description from getDefault*() --- .../AddConsoleCommandPass.php | 2 +- .../AddConsoleCommandPassTest.php | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php index 666c8fa5987cf..aff892cc25b7e 100644 --- a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php +++ b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php @@ -55,7 +55,7 @@ public function process(ContainerBuilder $container) if (!$r->isSubclassOf(Command::class)) { throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); } - $commandName = $class::getDefaultName(); + $commandName = $class::getDefaultName() !== null ? str_replace('%', '%%', $class::getDefaultName()) : null; } if (null === $commandName) { diff --git a/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php b/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php index 5e59f8fab3746..9c86fa98f298d 100644 --- a/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php +++ b/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php @@ -118,6 +118,30 @@ public function visibilityProvider() ]; } + public function testEscapesDefaultFromPhp() + { + $container = new ContainerBuilder(); + $container + ->register('to-escape', EscapedDefaultsFromPhpCommand::class) + ->addTag('console.command') + ; + + $pass = new AddConsoleCommandPass(); + $pass->process($container); + + $commandLoader = $container->getDefinition('console.command_loader'); + $commandLocator = $container->getDefinition((string) $commandLoader->getArgument(0)); + + $this->assertSame(ContainerCommandLoader::class, $commandLoader->getClass()); + $this->assertSame(['%%cmd%%' => 'to-escape'], $commandLoader->getArgument(1)); + $this->assertEquals([['to-escape' => new ServiceClosureArgument(new TypedReference('to-escape', EscapedDefaultsFromPhpCommand::class))]], $commandLocator->getArguments()); + $this->assertSame([], $container->getParameter('console.command.ids')); + + $command = $container->get('console.command_loader')->get('%%cmd%%'); + + $this->assertSame('%cmd%', $command->getName()); + } + public function testProcessThrowAnExceptionIfTheServiceIsAbstract() { $this->expectException(\InvalidArgumentException::class); @@ -250,3 +274,8 @@ class NamedCommand extends Command { protected static $defaultName = 'default'; } + +class EscapedDefaultsFromPhpCommand extends Command +{ + protected static $defaultName = '%cmd%'; +} From deb04f2b14288d940127e8aefad9349d9f1a8c78 Mon Sep 17 00:00:00 2001 From: Maxime Steinhausser Date: Mon, 6 Jun 2022 14:28:06 +0200 Subject: [PATCH 29/68] [Console] Prevent PHP 8.1 str_replace deprec on null Prevents: > Deprecated: str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated on `getDefaultName()` returning `null` --- .../Console/DependencyInjection/AddConsoleCommandPass.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php index 2c9ebe668e517..c55c5db4e3be8 100644 --- a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php +++ b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php @@ -67,7 +67,7 @@ public function process(ContainerBuilder $container) if (!$r->isSubclassOf(Command::class)) { throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); } - $aliases = str_replace('%', '%%', $class::getDefaultName()); + $aliases = str_replace('%', '%%', $class::getDefaultName() ?? ''); } $aliases = explode('|', $aliases ?? ''); From 7a08b52048af0704d4010986f392c62909dd1f9e Mon Sep 17 00:00:00 2001 From: HypeMC Date: Tue, 7 Jun 2022 04:10:23 +0200 Subject: [PATCH 30/68] [Console] Fix deprecation when description is null str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated --- .../Console/DependencyInjection/AddConsoleCommandPass.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php index c55c5db4e3be8..1fbb212e78a26 100644 --- a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php +++ b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php @@ -124,7 +124,7 @@ public function process(ContainerBuilder $container) if (!$r->isSubclassOf(Command::class)) { throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); } - $description = str_replace('%', '%%', $class::getDefaultDescription()); + $description = str_replace('%', '%%', $class::getDefaultDescription() ?? ''); } if ($description) { From 417824424780471ea12a7ee6e1e0fe8418fb2fe3 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Tue, 7 Jun 2022 10:09:27 +0200 Subject: [PATCH 31/68] use the outermost wrapping DBAL connection --- .../Bridge/Doctrine/Transport/PostgreSqlConnection.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/PostgreSqlConnection.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/PostgreSqlConnection.php index 130ca0f9b4195..5227df8ded5d0 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/PostgreSqlConnection.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/PostgreSqlConnection.php @@ -11,7 +11,6 @@ namespace Symfony\Component\Messenger\Bridge\Doctrine\Transport; -use Doctrine\DBAL\Driver\PDO\Connection as DoctrinePdoConnection; use Doctrine\DBAL\Schema\Table; /** @@ -73,8 +72,8 @@ public function get(): ?array if (method_exists($this->driverConnection, 'getNativeConnection')) { $wrappedConnection = $this->driverConnection->getNativeConnection(); } else { - $wrappedConnection = $this->driverConnection->getWrappedConnection(); - if (!$wrappedConnection instanceof \PDO && $wrappedConnection instanceof DoctrinePdoConnection) { + $wrappedConnection = $this->driverConnection; + while (method_exists($wrappedConnection, 'getWrappedConnection')) { $wrappedConnection = $wrappedConnection->getWrappedConnection(); } } From 24c65bf8a84732c7a98a1df2e45a2044ef6fe26e Mon Sep 17 00:00:00 2001 From: Marvin Feldmann Date: Fri, 3 Jun 2022 18:53:44 +0200 Subject: [PATCH 32/68] Fix choice filter error when loading mix of grouped and non-grouped choices --- .../Loader/FilterChoiceLoaderDecorator.php | 13 ++++++++--- .../FilterChoiceLoaderDecoratorTest.php | 23 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Form/ChoiceList/Loader/FilterChoiceLoaderDecorator.php b/src/Symfony/Component/Form/ChoiceList/Loader/FilterChoiceLoaderDecorator.php index a52f3b82e432e..250d6d2a146db 100644 --- a/src/Symfony/Component/Form/ChoiceList/Loader/FilterChoiceLoaderDecorator.php +++ b/src/Symfony/Component/Form/ChoiceList/Loader/FilterChoiceLoaderDecorator.php @@ -36,10 +36,17 @@ protected function loadChoices(): iterable } foreach ($structuredValues as $group => $values) { - if ($values && $filtered = array_filter($list->getChoicesForValues($values), $this->filter)) { - $choices[$group] = $filtered; + if (is_array($values)) { + if ($values && $filtered = array_filter($list->getChoicesForValues($values), $this->filter)) { + $choices[$group] = $filtered; + } + continue; + // filter empty groups + } + + if ($filtered = array_filter($list->getChoicesForValues([$values]), $this->filter)) { + $choices[$group] = $filtered[0]; } - // filter empty groups } return $choices ?? []; diff --git a/src/Symfony/Component/Form/Tests/ChoiceList/Loader/FilterChoiceLoaderDecoratorTest.php b/src/Symfony/Component/Form/Tests/ChoiceList/Loader/FilterChoiceLoaderDecoratorTest.php index d4cc3ce72a4d0..1f91a47275a33 100644 --- a/src/Symfony/Component/Form/Tests/ChoiceList/Loader/FilterChoiceLoaderDecoratorTest.php +++ b/src/Symfony/Component/Form/Tests/ChoiceList/Loader/FilterChoiceLoaderDecoratorTest.php @@ -47,6 +47,29 @@ public function testLoadChoiceListWithGroupedChoices() ]), $loader->loadChoiceList()); } + public function testLoadChoiceListMixedWithGroupedAndNonGroupedChoices() + { + $filter = function ($choice) { + return 0 === $choice % 2; + }; + + $choices = array_merge(range(1, 9), ['grouped' => range(10, 40, 5)]); + $loader = new FilterChoiceLoaderDecorator(new ArrayChoiceLoader($choices), $filter); + + $this->assertEquals(new ArrayChoiceList([ + 1 => 2, + 3 => 4, + 5 => 6, + 7 => 8, + 'grouped' => [ + 0 => 10, + 2 => 20, + 4 => 30, + 6 => 40, + ], + ]), $loader->loadChoiceList()); + } + public function testLoadValuesForChoices() { $evenValues = [1 => '2', 3 => '4']; From 66795292494be054ec4744078e3df7b325522b0c Mon Sep 17 00:00:00 2001 From: Robin Chalas Date: Wed, 8 Jun 2022 00:10:37 +0200 Subject: [PATCH 33/68] fix merge --- .../Component/Security/Http/Authenticator/Passport/Passport.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Security/Http/Authenticator/Passport/Passport.php b/src/Symfony/Component/Security/Http/Authenticator/Passport/Passport.php index 0180bd8916898..75feb599c3543 100644 --- a/src/Symfony/Component/Security/Http/Authenticator/Passport/Passport.php +++ b/src/Symfony/Component/Security/Http/Authenticator/Passport/Passport.php @@ -68,7 +68,7 @@ public function getUser(): UserInterface * * @return $this */ - public function addBadge(BadgeInterface $badge): PassportInterface + public function addBadge(BadgeInterface $badge): static { $this->badges[\get_class($badge)] = $badge; From 2dc8e6d7e6a06dfdb5219370e0447f86a8ef5471 Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Thu, 9 Jun 2022 13:29:45 +0200 Subject: [PATCH 34/68] [Messenger] Remove redundant interface in DoctrineReceiver --- .../Messenger/Transport/Doctrine/DoctrineReceiver.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Symfony/Component/Messenger/Transport/Doctrine/DoctrineReceiver.php b/src/Symfony/Component/Messenger/Transport/Doctrine/DoctrineReceiver.php index 3624a875218ae..b582e484013a7 100644 --- a/src/Symfony/Component/Messenger/Transport/Doctrine/DoctrineReceiver.php +++ b/src/Symfony/Component/Messenger/Transport/Doctrine/DoctrineReceiver.php @@ -21,14 +21,13 @@ use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Receiver\ListableReceiverInterface; use Symfony\Component\Messenger\Transport\Receiver\MessageCountAwareInterface; -use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; /** * @author Vincent Touzet */ -class DoctrineReceiver implements ReceiverInterface, MessageCountAwareInterface, ListableReceiverInterface +class DoctrineReceiver implements ListableReceiverInterface, MessageCountAwareInterface { private const MAX_RETRIES = 3; private $retryingSafetyCounter = 0; From 05be7b2102c379b3258849213ee1e0a61d7fe7d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Deruss=C3=A9?= Date: Thu, 9 Jun 2022 14:59:41 +0200 Subject: [PATCH 35/68] Fix tests related to Doctrine method renaming --- .../Component/Lock/Tests/Store/DoctrineDbalStoreTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Lock/Tests/Store/DoctrineDbalStoreTest.php b/src/Symfony/Component/Lock/Tests/Store/DoctrineDbalStoreTest.php index f44c2fd5cfc6e..3f46311ffe9ce 100644 --- a/src/Symfony/Component/Lock/Tests/Store/DoctrineDbalStoreTest.php +++ b/src/Symfony/Component/Lock/Tests/Store/DoctrineDbalStoreTest.php @@ -120,7 +120,7 @@ public function testCreatesTableInTransaction(string $platform) ->willReturn(true); $platform = $this->createMock($platform); - $platform->method('getCreateTableSQL') + $platform->method(method_exists(AbstractPlatform::class, 'getCreateTablesSQL') ? 'getCreateTablesSQL' : 'getCreateTableSQL') ->willReturn(['create sql stmt']); $conn->method('getDatabasePlatform') @@ -165,7 +165,7 @@ public function testTableCreationInTransactionNotSupported() ->willReturn(true); $platform = $this->createMock(AbstractPlatform::class); - $platform->method('getCreateTableSQL') + $platform->method(method_exists(AbstractPlatform::class, 'getCreateTablesSQL') ? 'getCreateTablesSQL' : 'getCreateTableSQL') ->willReturn(['create sql stmt']); $conn->expects($this->atLeast(2)) @@ -202,7 +202,7 @@ public function testCreatesTableOutsideTransaction() ->willReturn(false); $platform = $this->createMock(AbstractPlatform::class); - $platform->method('getCreateTableSQL') + $platform->method(method_exists(AbstractPlatform::class, 'getCreateTablesSQL') ? 'getCreateTablesSQL' : 'getCreateTableSQL') ->willReturn(['create sql stmt']); $conn->method('getDatabasePlatform') From 3bebc645bc654740cf5ece0829af10a302a03da8 Mon Sep 17 00:00:00 2001 From: Paul Oms Date: Mon, 6 Jun 2022 16:49:04 +0100 Subject: [PATCH 36/68] [Mailer] Fix Error Handling for OhMySMTP Bridge --- .../Transport/OhMySmtpApiTransportTest.php | 28 +++++++++++++++++-- .../Transport/OhMySmtpApiTransport.php | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Mailer/Bridge/OhMySmtp/Tests/Transport/OhMySmtpApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/OhMySmtp/Tests/Transport/OhMySmtpApiTransportTest.php index 7f64a8c997fdb..6fc5c5ba9d215 100644 --- a/src/Symfony/Component/Mailer/Bridge/OhMySmtp/Tests/Transport/OhMySmtpApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/OhMySmtp/Tests/Transport/OhMySmtpApiTransportTest.php @@ -101,7 +101,7 @@ public function testSend() public function testSendThrowsForErrorResponse() { $client = new MockHttpClient(static function (string $method, string $url, array $options): ResponseInterface { - return new MockResponse(json_encode(['Message' => 'i\'m a teapot', 'ErrorCode' => 418]), [ + return new MockResponse(json_encode(['error' => 'i\'m a teapot']), [ 'http_code' => 418, 'response_headers' => [ 'content-type' => 'application/json', @@ -118,7 +118,31 @@ public function testSendThrowsForErrorResponse() ->text('Hello There!'); $this->expectException(HttpTransportException::class); - $this->expectExceptionMessage('Unable to send an email: i\'m a teapot (code 418).'); + $this->expectExceptionMessage('Unable to send an email: {"error":"i\'m a teapot"}'); + $transport->send($mail); + } + + public function testSendThrowsForMultipleErrorResponses() + { + $client = new MockHttpClient(static function (string $method, string $url, array $options): ResponseInterface { + return new MockResponse(json_encode(['errors' => ["to" => "undefined field" ]]), [ + 'http_code' => 418, + 'response_headers' => [ + 'content-type' => 'application/json', + ], + ]); + }); + $transport = new OhMySmtpApiTransport('KEY', $client); + $transport->setPort(8984); + + $mail = new Email(); + $mail->subject('Hello!') + ->to(new Address('saif.gmati@symfony.com', 'Saif Eddin')) + ->from(new Address('fabpot@symfony.com', 'Fabien')) + ->text('Hello There!'); + + $this->expectException(HttpTransportException::class); + $this->expectExceptionMessage('Unable to send an email: {"errors":{"to":"undefined field"}}'); $transport->send($mail); } diff --git a/src/Symfony/Component/Mailer/Bridge/OhMySmtp/Transport/OhMySmtpApiTransport.php b/src/Symfony/Component/Mailer/Bridge/OhMySmtp/Transport/OhMySmtpApiTransport.php index a70fc3448e1c2..e4e6bddfc103d 100644 --- a/src/Symfony/Component/Mailer/Bridge/OhMySmtp/Transport/OhMySmtpApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/OhMySmtp/Transport/OhMySmtpApiTransport.php @@ -67,7 +67,7 @@ protected function doSendApi(SentMessage $sentMessage, Email $email, Envelope $e } if (200 !== $statusCode) { - throw new HttpTransportException('Unable to send an email: '.$result['Message'].sprintf(' (code %d).', $result['ErrorCode']), $response); + throw new HttpTransportException('Unable to send an email: '.$response->getContent(false), $response); } $sentMessage->setMessageId($result['id']); From 16cf4fc4d0617df32cdeb334d2f791f711539a09 Mon Sep 17 00:00:00 2001 From: Thomas Talbot Date: Sat, 11 Jun 2022 15:17:48 +0200 Subject: [PATCH 37/68] [Messenger] move resetting services at worker stopped into ResetServicesListener --- .../EventListener/ResetServicesListener.php | 8 ++++ .../Command/ConsumeMessagesCommandTest.php | 19 ++++----- .../ResetServicesListenerTest.php | 12 ++++++ .../Component/Messenger/Tests/WorkerTest.php | 39 ++++++++++++++++++- src/Symfony/Component/Messenger/Worker.php | 10 ----- 5 files changed, 66 insertions(+), 22 deletions(-) diff --git a/src/Symfony/Component/Messenger/EventListener/ResetServicesListener.php b/src/Symfony/Component/Messenger/EventListener/ResetServicesListener.php index b57ee728981b6..dd170e0e433a1 100644 --- a/src/Symfony/Component/Messenger/EventListener/ResetServicesListener.php +++ b/src/Symfony/Component/Messenger/EventListener/ResetServicesListener.php @@ -14,6 +14,8 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter; use Symfony\Component\Messenger\Event\WorkerRunningEvent; +use Symfony\Component\Messenger\Event\WorkerStoppedEvent; +use Symfony\Contracts\Service\ResetInterface; /** * @author Grégoire Pineau @@ -34,10 +36,16 @@ public function resetServices(WorkerRunningEvent $event): void } } + public function resetServicesAtStop(WorkerStoppedEvent $event): void + { + $this->servicesResetter->reset(); + } + public static function getSubscribedEvents(): array { return [ WorkerRunningEvent::class => ['resetServices', -1024], + WorkerStoppedEvent::class => ['resetServicesAtStop', -1024], ]; } } diff --git a/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php b/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php index 8a6f5a7d608cf..1bcfeb04a987a 100644 --- a/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php +++ b/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php @@ -26,6 +26,7 @@ use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\RoutableMessageBus; use Symfony\Component\Messenger\Stamp\BusNameStamp; +use Symfony\Component\Messenger\Tests\ResettableDummyReceiver; use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface; class ConsumeMessagesCommandTest extends TestCase @@ -116,15 +117,11 @@ public function testRunWithResetServicesOption(bool $shouldReset) { $envelope = new Envelope(new \stdClass()); - $receiver = $this->createMock(ReceiverInterface::class); - $receiver - ->expects($this->exactly(3)) - ->method('get') - ->willReturnOnConsecutiveCalls( - [$envelope], - [/* idle */], - [$envelope, $envelope] - ); + $receiver = new ResettableDummyReceiver([ + [$envelope], + [/* idle */], + [$envelope, $envelope], + ]); $msgCount = 3; $receiverLocator = $this->createMock(ContainerInterface::class); @@ -134,8 +131,7 @@ public function testRunWithResetServicesOption(bool $shouldReset) $bus = $this->createMock(RoutableMessageBus::class); $bus->expects($this->exactly($msgCount))->method('dispatch'); - $servicesResetter = $this->createMock(ServicesResetter::class); - $servicesResetter->expects($this->exactly($shouldReset ? $msgCount : 0))->method('reset'); + $servicesResetter = new ServicesResetter(new \ArrayIterator([$receiver]), ['reset']); $command = new ConsumeMessagesCommand($bus, $receiverLocator, new EventDispatcher(), null, [], new ResetServicesListener($servicesResetter)); @@ -148,6 +144,7 @@ public function testRunWithResetServicesOption(bool $shouldReset) '--limit' => $msgCount, ], $shouldReset ? [] : ['--no-reset' => null])); + $this->assertEquals($shouldReset, $receiver->hasBeenReset(), '$receiver->reset() should have been called'); $tester->assertCommandIsSuccessful(); $this->assertStringContainsString('[OK] Consuming messages from transports "dummy-receiver"', $tester->getDisplay()); } diff --git a/src/Symfony/Component/Messenger/Tests/EventListener/ResetServicesListenerTest.php b/src/Symfony/Component/Messenger/Tests/EventListener/ResetServicesListenerTest.php index ce8f771a0952f..12f86ec6c83cb 100644 --- a/src/Symfony/Component/Messenger/Tests/EventListener/ResetServicesListenerTest.php +++ b/src/Symfony/Component/Messenger/Tests/EventListener/ResetServicesListenerTest.php @@ -14,6 +14,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter; use Symfony\Component\Messenger\Event\WorkerRunningEvent; +use Symfony\Component\Messenger\Event\WorkerStoppedEvent; use Symfony\Component\Messenger\EventListener\ResetServicesListener; use Symfony\Component\Messenger\Worker; @@ -38,4 +39,15 @@ public function testResetServices(bool $shouldReset) $resetListener = new ResetServicesListener($servicesResetter); $resetListener->resetServices($event); } + + public function testResetServicesAtStop() + { + $servicesResetter = $this->createMock(ServicesResetter::class); + $servicesResetter->expects($this->once())->method('reset'); + + $event = new WorkerStoppedEvent($this->createMock(Worker::class)); + + $resetListener = new ResetServicesListener($servicesResetter); + $resetListener->resetServicesAtStop($event); + } } diff --git a/src/Symfony/Component/Messenger/Tests/WorkerTest.php b/src/Symfony/Component/Messenger/Tests/WorkerTest.php index f09d2648798bf..4d0f79b10e41a 100644 --- a/src/Symfony/Component/Messenger/Tests/WorkerTest.php +++ b/src/Symfony/Component/Messenger/Tests/WorkerTest.php @@ -14,6 +14,7 @@ use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventDispatcher; +use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent; use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent; @@ -21,6 +22,7 @@ use Symfony\Component\Messenger\Event\WorkerRunningEvent; use Symfony\Component\Messenger\Event\WorkerStartedEvent; use Symfony\Component\Messenger\Event\WorkerStoppedEvent; +use Symfony\Component\Messenger\EventListener\ResetServicesListener; use Symfony\Component\Messenger\EventListener\StopWorkerOnMessageLimitListener; use Symfony\Component\Messenger\Exception\RuntimeException; use Symfony\Component\Messenger\Handler\Acknowledger; @@ -103,15 +105,50 @@ public function testWorkerResetsConnectionIfReceiverIsResettable() { $resettableReceiver = new ResettableDummyReceiver([]); - $bus = $this->createMock(MessageBusInterface::class); $dispatcher = new EventDispatcher(); + $dispatcher->addSubscriber(new ResetServicesListener(new ServicesResetter(new \ArrayIterator([$resettableReceiver]), ['reset']))); + $bus = $this->createMock(MessageBusInterface::class); $worker = new Worker([$resettableReceiver], $bus, $dispatcher); $worker->stop(); $worker->run(); $this->assertTrue($resettableReceiver->hasBeenReset()); } + public function testWorkerResetsTransportsIfResetServicesListenerIsCalled() + { + $envelope = new Envelope(new DummyMessage('Hello')); + $resettableReceiver = new ResettableDummyReceiver([[$envelope]]); + + $dispatcher = new EventDispatcher(); + $dispatcher->addSubscriber(new ResetServicesListener(new ServicesResetter(new \ArrayIterator([$resettableReceiver]), ['reset']))); + $dispatcher->addListener(WorkerRunningEvent::class, function (WorkerRunningEvent $event) { + $event->getWorker()->stop(); + }); + + $bus = $this->createMock(MessageBusInterface::class); + $worker = new Worker([$resettableReceiver], $bus, $dispatcher); + $worker->run(); + $this->assertTrue($resettableReceiver->hasBeenReset()); + } + + public function testWorkerDoesNotResetTransportsIfResetServicesListenerIsNotCalled() + { + $envelope = new Envelope(new DummyMessage('Hello')); + $resettableReceiver = new ResettableDummyReceiver([[$envelope]]); + + $bus = $this->createMock(MessageBusInterface::class); + + $dispatcher = new EventDispatcher(); + $dispatcher->addListener(WorkerRunningEvent::class, function (WorkerRunningEvent $event) { + $event->getWorker()->stop(); + }); + + $worker = new Worker([$resettableReceiver], $bus, $dispatcher); + $worker->run(); + $this->assertFalse($resettableReceiver->hasBeenReset()); + } + public function testWorkerDoesNotSendNullMessagesToTheBus() { $receiver = new DummyReceiver([ diff --git a/src/Symfony/Component/Messenger/Worker.php b/src/Symfony/Component/Messenger/Worker.php index f670b564f8fcc..34473bac32267 100644 --- a/src/Symfony/Component/Messenger/Worker.php +++ b/src/Symfony/Component/Messenger/Worker.php @@ -136,7 +136,6 @@ public function run(array $options = []): void $this->flush(true); $this->dispatchEvent(new WorkerStoppedEvent($this)); - $this->resetReceiverConnections(); } private function handleMessage(Envelope $envelope, string $transportName): void @@ -260,15 +259,6 @@ public function getMetadata(): WorkerMetadata return $this->metadata; } - private function resetReceiverConnections(): void - { - foreach ($this->receivers as $receiver) { - if ($receiver instanceof ResetInterface) { - $receiver->reset(); - } - } - } - private function dispatchEvent(object $event): void { if (null === $this->eventDispatcher) { From 3fcfc205006c8503700c1452747deb6a612b14ab Mon Sep 17 00:00:00 2001 From: Albert Prat Date: Tue, 14 Jun 2022 14:07:47 +0200 Subject: [PATCH 38/68] [FrameworkBundle] Lower JsonSerializableNormalizer priority --- .../Bundle/FrameworkBundle/Resources/config/serializer.xml | 2 +- .../Tests/DependencyInjection/FrameworkExtensionTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml index c3eea28b8c2b9..19defd885259c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml @@ -60,7 +60,7 @@ - + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index c2c7bc6b851cc..e86e22a201d53 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -1297,7 +1297,7 @@ public function testJsonSerializableNormalizerRegistered() $tag = $definition->getTag('serializer.normalizer'); $this->assertEquals(JsonSerializableNormalizer::class, $definition->getClass()); - $this->assertEquals(-900, $tag[0]['priority']); + $this->assertEquals(-950, $tag[0]['priority']); } public function testObjectNormalizerRegistered() From a9b0f43366ca0b8752df02eff65e1d1b5d7e443a Mon Sep 17 00:00:00 2001 From: Gigino Chianese Date: Wed, 15 Jun 2022 08:50:33 +0200 Subject: [PATCH 39/68] [DoctrineBridge] Extend type guessing on enum fields Doctrine supports enumType on array values. In those cases the guessed type should be of type array with collection information. --- .../PropertyInfo/DoctrineExtractor.php | 24 ++++++++++++++----- .../PropertyInfo/DoctrineExtractorTest.php | 3 +++ .../PropertyInfo/Fixtures/DoctrineEnum.php | 15 ++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index 9add7946fbea5..8ebd5fbe00b34 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -152,17 +152,18 @@ public function getTypes($class, $property, array $context = []) } if ($metadata->hasField($property)) { - $nullable = $metadata instanceof ClassMetadataInfo && $metadata->isNullable($property); - if (null !== $enumClass = $metadata->getFieldMapping($property)['enumType'] ?? null) { - return [new Type(Type::BUILTIN_TYPE_OBJECT, $nullable, $enumClass)]; - } - $typeOfField = $metadata->getTypeOfField($property); if (!$builtinType = $this->getPhpType($typeOfField)) { return null; } + $nullable = $metadata instanceof ClassMetadataInfo && $metadata->isNullable($property); + $enumType = null; + if (null !== $enumClass = $metadata->getFieldMapping($property)['enumType'] ?? null) { + $enumType = new Type(Type::BUILTIN_TYPE_OBJECT, $nullable, $enumClass); + } + switch ($builtinType) { case Type::BUILTIN_TYPE_OBJECT: switch ($typeOfField) { @@ -192,11 +193,22 @@ public function getTypes($class, $property, array $context = []) case self::$useDeprecatedConstants ? DBALType::TARRAY : Types::ARRAY: // no break case 'json_array': + // return null if $enumType is set, because we can't determine if collectionKeyType is string or int + if ($enumType) { + return null; + } + return [new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true)]; case self::$useDeprecatedConstants ? DBALType::SIMPLE_ARRAY : Types::SIMPLE_ARRAY: - return [new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_STRING))]; + return [new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, new Type(Type::BUILTIN_TYPE_INT), $enumType ?? new Type(Type::BUILTIN_TYPE_STRING))]; + } + case Type::BUILTIN_TYPE_INT: + case Type::BUILTIN_TYPE_STRING: + if ($enumType !== null) { + return [$enumType]; } + // no break } return [new Type($builtinType, $nullable)]; diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php index b1e327968242a..32caea8bd3093 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php @@ -185,6 +185,9 @@ public function testExtractEnum() } $this->assertEquals([new Type(Type::BUILTIN_TYPE_OBJECT, false, EnumString::class)], $this->createExtractor()->getTypes(DoctrineEnum::class, 'enumString', [])); $this->assertEquals([new Type(Type::BUILTIN_TYPE_OBJECT, false, EnumInt::class)], $this->createExtractor()->getTypes(DoctrineEnum::class, 'enumInt', [])); + $this->assertEquals(null, $this->createExtractor()->getTypes(DoctrineEnum::class, 'enumStringArray', [])); + $this->assertEquals([new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_OBJECT, false, EnumInt::class))], $this->createExtractor()->getTypes(DoctrineEnum::class, 'enumIntArray', [])); + $this->assertEquals(null, $this->createExtractor()->getTypes(DoctrineEnum::class, 'enumCustom', [])); } public function typesProvider() diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineEnum.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineEnum.php index 467522cbd3914..fd5271fc47730 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineEnum.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineEnum.php @@ -35,4 +35,19 @@ class DoctrineEnum * @Column(type="integer", enumType="Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\EnumInt") */ protected $enumInt; + + /** + * @Column(type="array", enumType="Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\EnumString") + */ + protected $enumStringArray; + + /** + * @Column(type="simple_array", enumType="Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\EnumInt") + */ + protected $enumIntArray; + + /** + * @Column(type="custom_foo", enumType="Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\EnumInt") + */ + protected $enumCustom; } From e14cea92be7544f9fe429b0350052b6644782618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Pineau?= Date: Wed, 15 Jun 2022 18:57:10 +0200 Subject: [PATCH 40/68] [MonologBridge] Fixed support of elasticsearch 7.+ in ElasticsearchLogstashHandler --- .../Handler/ElasticsearchLogstashHandler.php | 26 ++++++++--- .../ElasticsearchLogstashHandlerTest.php | 43 +++++++++++++++++++ 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Bridge/Monolog/Handler/ElasticsearchLogstashHandler.php b/src/Symfony/Bridge/Monolog/Handler/ElasticsearchLogstashHandler.php index a59825f6ab1f4..9826bb525773c 100644 --- a/src/Symfony/Bridge/Monolog/Handler/ElasticsearchLogstashHandler.php +++ b/src/Symfony/Bridge/Monolog/Handler/ElasticsearchLogstashHandler.php @@ -48,11 +48,12 @@ class ElasticsearchLogstashHandler extends AbstractHandler private $index; private $client; private $responses; + private $elasticsearchVersion; /** * @param string|int $level The minimum logging level at which this handler will be triggered */ - public function __construct(string $endpoint = 'http://127.0.0.1:9200', string $index = 'monolog', HttpClientInterface $client = null, $level = Logger::DEBUG, bool $bubble = true) + public function __construct(string $endpoint = 'http://127.0.0.1:9200', string $index = 'monolog', HttpClientInterface $client = null, $level = Logger::DEBUG, bool $bubble = true, string $elasticsearchVersion = '1.0.0') { if (!interface_exists(HttpClientInterface::class)) { throw new \LogicException(sprintf('The "%s" handler needs an HTTP client. Try running "composer require symfony/http-client".', __CLASS__)); @@ -63,6 +64,7 @@ public function __construct(string $endpoint = 'http://127.0.0.1:9200', string $ $this->index = $index; $this->client = $client ?: HttpClient::create(['timeout' => 1]); $this->responses = new \SplObjectStorage(); + $this->elasticsearchVersion = $elasticsearchVersion; } public function handle(array $record): bool @@ -100,18 +102,28 @@ private function sendToElasticsearch(array $records) { $formatter = $this->getFormatter(); + if (version_compare($this->elasticsearchVersion, '7', '>=')) { + $headers = json_encode([ + 'index' => [ + '_index' => $this->index, + ], + ]); + } else { + $headers = json_encode([ + 'index' => [ + '_index' => $this->index, + '_type' => '_doc', + ], + ]); + } + $body = ''; foreach ($records as $record) { foreach ($this->processors as $processor) { $record = $processor($record); } - $body .= json_encode([ - 'index' => [ - '_index' => $this->index, - '_type' => '_doc', - ], - ]); + $body .= $headers; $body .= "\n"; $body .= $formatter->format($record); $body .= "\n"; diff --git a/src/Symfony/Bridge/Monolog/Tests/Handler/ElasticsearchLogstashHandlerTest.php b/src/Symfony/Bridge/Monolog/Tests/Handler/ElasticsearchLogstashHandlerTest.php index 2940f0440ff8f..0a30fb3c63bc6 100644 --- a/src/Symfony/Bridge/Monolog/Tests/Handler/ElasticsearchLogstashHandlerTest.php +++ b/src/Symfony/Bridge/Monolog/Tests/Handler/ElasticsearchLogstashHandlerTest.php @@ -64,6 +64,49 @@ public function testHandle() $this->assertSame(1, $callCount); } + public function testHandleWithElasticsearch8() + { + $callCount = 0; + $responseFactory = function ($method, $url, $options) use (&$callCount) { + $body = <<assertSame('POST', $method); + $this->assertSame('http://es:9200/_bulk', $url); + $this->assertSame($body, $options['body']); + $this->assertSame('Content-Type: application/json', $options['normalized_headers']['content-type'][0]); + ++$callCount; + + return new MockResponse(); + }; + + $handler = new ElasticsearchLogstashHandlerWithHardCodedHostname('http://es:9200', 'log', new MockHttpClient($responseFactory), Logger::DEBUG, true, '8.0.0'); + + $record = [ + 'message' => 'My info message', + 'context' => [], + 'level' => Logger::INFO, + 'level_name' => Logger::getLevelName(Logger::INFO), + 'channel' => 'app', + 'datetime' => new \DateTime('2020-01-01T00:00:00+01:00'), + 'extra' => [], + ]; + + $handler->handle($record); + + $this->assertSame(1, $callCount); + } + public function testBandleBatch() { $callCount = 0; From 2ad3f305868b5f7c7988a1e46bd42d83e56c4601 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Thu, 16 Jun 2022 16:31:53 +0200 Subject: [PATCH 41/68] [HttpKernel] Disable session tracking while collecting profiler data --- .../EventListener/ProfilerListener.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php b/src/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php index b8464f1627353..32e809229a9ed 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php @@ -12,8 +12,10 @@ namespace Symfony\Component\HttpKernel\EventListener; use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; use Symfony\Component\HttpKernel\Event\PostResponseEvent; @@ -87,8 +89,21 @@ public function onKernelResponse(FilterResponseEvent $event) return; } - if (!$profile = $this->profiler->collect($request, $event->getResponse(), $exception)) { - return; + $session = method_exists(Request::class, 'getPreferredFormat') && $request->hasPreviousSession() && $request->hasSession() ? $request->getSession() : null; + + if ($session instanceof Session) { + $usageIndexValue = $usageIndexReference = &$session->getUsageIndex(); + $usageIndexReference = \PHP_INT_MIN; + } + + try { + if (!$profile = $this->profiler->collect($request, $event->getResponse(), $exception)) { + return; + } + } finally { + if ($session instanceof Session) { + $usageIndexReference = $usageIndexValue; + } } $this->profiles[$request] = $profile; From 5e8de1e21122eaf2a4e27fb202102d0d4b6a1f56 Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Fri, 17 Jun 2022 01:00:30 -0700 Subject: [PATCH 42/68] [Cache] Respect $save option in ArrayAdapter When $save is passed as the second option to the callback it should be respected, even in the ephemeral array adapter. --- .../Component/Cache/Adapter/ArrayAdapter.php | 5 +++- .../Cache/Tests/Adapter/AdapterTestCase.php | 25 +++++++++++++++++++ .../Tests/Adapter/PhpArrayAdapterTest.php | 1 + 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php b/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php index 157043abef188..20043dec18c5e 100644 --- a/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php @@ -60,7 +60,10 @@ public function get(string $key, callable $callback, float $beta = null, array & // ArrayAdapter works in memory, we don't care about stampede protection if (\INF === $beta || !$item->isHit()) { $save = true; - $this->save($item->set($callback($item, $save))); + $item->set($callback($item, $save)); + if ($save) { + $this->save($item); + } } return $item->get(); diff --git a/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php b/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php index 123cda89b8728..da55270348224 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php @@ -98,6 +98,31 @@ public function testRecursiveGet() $this->assertSame(1, $cache->get('k2', function () { return 2; })); } + public function testDontSaveWhenAskedNotTo() + { + if (isset($this->skippedTests[__FUNCTION__])) { + $this->markTestSkipped($this->skippedTests[__FUNCTION__]); + } + + $cache = $this->createCachePool(0, __FUNCTION__); + + $v1 = $cache->get('some-key', function($item, &$save){ + $save = false; + return 1; + }); + $this->assertSame($v1, 1); + + $v2 = $cache->get('some-key', function(){ + return 2; + }); + $this->assertSame($v2, 2, 'First value was cached and should not have been'); + + $v3 = $cache->get('some-key', function(){ + $this->fail('Value should have come from cache'); + }); + $this->assertSame($v3, 2); + } + public function testGetMetadata() { if (isset($this->skippedTests[__FUNCTION__])) { diff --git a/src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php b/src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php index 58318f6a25294..b7ced48abf7c9 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php @@ -24,6 +24,7 @@ class PhpArrayAdapterTest extends AdapterTestCase { protected $skippedTests = [ 'testGet' => 'PhpArrayAdapter is read-only.', + 'testDontSaveWhenAskedNotTo' => 'PhpArrayAdapter is read-only.', 'testRecursiveGet' => 'PhpArrayAdapter is read-only.', 'testBasicUsage' => 'PhpArrayAdapter is read-only.', 'testBasicUsageWithLongKey' => 'PhpArrayAdapter is read-only.', From 0186ecb30e954603894cf2eb66c9ce9f33213d22 Mon Sep 17 00:00:00 2001 From: Thomas Lallement Date: Fri, 17 Jun 2022 17:20:52 +0200 Subject: [PATCH 43/68] Allow passing null in twig_is_selected_choice In the cached file of my application I can see the following code fragment that have been generated by Symfony: ```php if (( !((array_key_exists("render_preferred_choices", $context)) ? (_twig_default_filter((isset($context["render_preferred_choices"]) || array_key_exists("render_preferred_choices", $context) ? $context["render_preferred_choices"] : (function () { throw new RuntimeError('Variable "render_preferred_choices" does not exist.', 88, $this->source); })()), false)) : (false)) && Symfony\Bridge\Twig\Extension\twig_is_selected_choice($context["choice"], (isset($context["value"]) || array_key_exists("value", $context) ? $context["value"] : (function () { throw new RuntimeError('Variable "value" does not exist.', 88, $this->source); })())))) { echo " selected=\"selected\""; } ``` The 2nd Arg passed when calling ``twig_is_selected_choice`` if the result of ``(isset($context["value"]) || array_key_exists("value", $context) ? $context["value"]``. In that condition, if ``$context['value'] = null, we pass the null Currently I got the following error: ``` Symfony\Bridge\Twig\Extension\twig_is_selected_choice(): Argument #2 ($selectedValue) must be of type array|string, null given, called in X:\workspace-novento\novento-vip-lounge\var\cache\admin_dev\twig\01\01615438ee40292438687b29025d08a9.php on line 534 ``` --- src/Symfony/Bridge/Twig/Extension/FormExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Twig/Extension/FormExtension.php b/src/Symfony/Bridge/Twig/Extension/FormExtension.php index f7d82e042138d..c726b0584d140 100644 --- a/src/Symfony/Bridge/Twig/Extension/FormExtension.php +++ b/src/Symfony/Bridge/Twig/Extension/FormExtension.php @@ -188,7 +188,7 @@ private function createFieldTranslation(?string $value, array $parameters, strin * * @see ChoiceView::isSelected() */ -function twig_is_selected_choice(ChoiceView $choice, string|array $selectedValue): bool +function twig_is_selected_choice(ChoiceView $choice, string|array|null $selectedValue): bool { if (\is_array($selectedValue)) { return \in_array($choice->value, $selectedValue, true); From 57a46e012a9e5214029dae140af04ce56f0141ab Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sun, 19 Jun 2022 11:24:30 +0200 Subject: [PATCH 44/68] [ExpressionLanguage] fix tests --- .../ExpressionLanguage/Tests/Node/BinaryNodeTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/ExpressionLanguage/Tests/Node/BinaryNodeTest.php b/src/Symfony/Component/ExpressionLanguage/Tests/Node/BinaryNodeTest.php index 2be8b4aecc076..ec17e4ce34cf0 100644 --- a/src/Symfony/Component/ExpressionLanguage/Tests/Node/BinaryNodeTest.php +++ b/src/Symfony/Component/ExpressionLanguage/Tests/Node/BinaryNodeTest.php @@ -173,7 +173,7 @@ public function testEvaluateMatchesWithInvalidRegexp() { $node = new BinaryNode('matches', new ConstantNode('abc'), new ConstantNode('this is not a regexp')); - $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric or backslash')); + $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric')); $node->evaluate([], []); } @@ -181,7 +181,7 @@ public function testEvaluateMatchesWithInvalidRegexpAsExpression() { $node = new BinaryNode('matches', new ConstantNode('abc'), new NameNode('regexp')); - $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric or backslash')); + $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric')); $node->evaluate([], ['regexp' => 'this is not a regexp']); } @@ -189,7 +189,7 @@ public function testCompileMatchesWithInvalidRegexp() { $node = new BinaryNode('matches', new ConstantNode('abc'), new ConstantNode('this is not a regexp')); - $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric or backslash')); + $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric')); $compiler = new Compiler([]); $node->compile($compiler); } @@ -198,7 +198,7 @@ public function testCompileMatchesWithInvalidRegexpAsExpression() { $node = new BinaryNode('matches', new ConstantNode('abc'), new NameNode('regexp')); - $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric or backslash')); + $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric')); $compiler = new Compiler([]); $node->compile($compiler); eval('$regexp = "this is not a regexp"; '.$compiler->getSource().';'); From e28d378a4fdcc6e4385f08799d6a5f77e1c795ea Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sun, 19 Jun 2022 11:33:27 +0200 Subject: [PATCH 45/68] [ExpressionLanguage] fix tests (bis) --- .../ExpressionLanguage/Tests/Node/BinaryNodeTest.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/ExpressionLanguage/Tests/Node/BinaryNodeTest.php b/src/Symfony/Component/ExpressionLanguage/Tests/Node/BinaryNodeTest.php index ec17e4ce34cf0..fe3115a225df9 100644 --- a/src/Symfony/Component/ExpressionLanguage/Tests/Node/BinaryNodeTest.php +++ b/src/Symfony/Component/ExpressionLanguage/Tests/Node/BinaryNodeTest.php @@ -173,7 +173,8 @@ public function testEvaluateMatchesWithInvalidRegexp() { $node = new BinaryNode('matches', new ConstantNode('abc'), new ConstantNode('this is not a regexp')); - $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric')); + $this->expectException(SyntaxError::class); + $this->expectExceptionMessage('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric'); $node->evaluate([], []); } @@ -181,7 +182,8 @@ public function testEvaluateMatchesWithInvalidRegexpAsExpression() { $node = new BinaryNode('matches', new ConstantNode('abc'), new NameNode('regexp')); - $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric')); + $this->expectException(SyntaxError::class); + $this->expectExceptionMessage('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric'); $node->evaluate([], ['regexp' => 'this is not a regexp']); } @@ -189,7 +191,8 @@ public function testCompileMatchesWithInvalidRegexp() { $node = new BinaryNode('matches', new ConstantNode('abc'), new ConstantNode('this is not a regexp')); - $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric')); + $this->expectException(SyntaxError::class); + $this->expectExceptionMessage('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric'); $compiler = new Compiler([]); $node->compile($compiler); } @@ -198,7 +201,8 @@ public function testCompileMatchesWithInvalidRegexpAsExpression() { $node = new BinaryNode('matches', new ConstantNode('abc'), new NameNode('regexp')); - $this->expectExceptionObject(new SyntaxError('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric')); + $this->expectException(SyntaxError::class); + $this->expectExceptionMessage('Regexp "this is not a regexp" passed to "matches" is not valid: Delimiter must not be alphanumeric'); $compiler = new Compiler([]); $node->compile($compiler); eval('$regexp = "this is not a regexp"; '.$compiler->getSource().';'); From b14aa77e4debf903507899bb85ec6015a7382cad Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sun, 19 Jun 2022 13:27:12 +0200 Subject: [PATCH 46/68] [Cache] Respect $save option in ChainAdapter --- src/Symfony/Component/Cache/Adapter/ChainAdapter.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Cache/Adapter/ChainAdapter.php b/src/Symfony/Component/Cache/Adapter/ChainAdapter.php index 39d9afd0e057d..257b0734095d5 100644 --- a/src/Symfony/Component/Cache/Adapter/ChainAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/ChainAdapter.php @@ -91,9 +91,17 @@ static function ($sourceItem, $item, $sourceMetadata = null) use ($defaultLifeti */ public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { + $doSave = true; + $callback = static function (CacheItem $item, bool &$save) use ($callback, &$doSave) { + $value = $callback($item, $save); + $doSave = $save; + + return $value; + }; + $lastItem = null; $i = 0; - $wrap = function (CacheItem $item = null) use ($key, $callback, $beta, &$wrap, &$i, &$lastItem, &$metadata) { + $wrap = function (CacheItem $item = null, bool &$save = true) use ($key, $callback, $beta, &$wrap, &$i, &$doSave, &$lastItem, &$metadata) { $adapter = $this->adapters[$i]; if (isset($this->adapters[++$i])) { $callback = $wrap; @@ -107,6 +115,7 @@ public function get(string $key, callable $callback, float $beta = null, array & if (null !== $item) { ($this->syncItem)($lastItem = $lastItem ?? $item, $item, $metadata); } + $save = $doSave; return $value; }; From 79239feaab194c32b39680da3f9adcd1e949ea21 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sun, 19 Jun 2022 13:38:50 +0200 Subject: [PATCH 47/68] CS fix --- .../Doctrine/Form/DoctrineOrmTypeGuesser.php | 5 ----- .../PropertyInfo/DoctrineExtractor.php | 19 +------------------ .../Form/Extension/Core/Type/FileType.php | 3 --- .../Component/Form/Util/ServerParams.php | 3 --- .../HttpFoundation/File/UploadedFile.php | 3 --- .../DataCollector/MemoryDataCollector.php | 3 --- .../Command/ConsumeMessagesCommand.php | 3 --- 7 files changed, 1 insertion(+), 38 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php b/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php index 944c305ab70a7..c5ff1aa3674f1 100644 --- a/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php +++ b/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php @@ -60,15 +60,12 @@ public function guessType($class, $property) switch ($metadata->getTypeOfField($property)) { case self::$useDeprecatedConstants ? Type::TARRAY : Types::ARRAY: - // no break case self::$useDeprecatedConstants ? Type::SIMPLE_ARRAY : Types::SIMPLE_ARRAY: return new TypeGuess('Symfony\Component\Form\Extension\Core\Type\CollectionType', [], Guess::MEDIUM_CONFIDENCE); case self::$useDeprecatedConstants ? Type::BOOLEAN : Types::BOOLEAN: return new TypeGuess('Symfony\Component\Form\Extension\Core\Type\CheckboxType', [], Guess::HIGH_CONFIDENCE); case self::$useDeprecatedConstants ? Type::DATETIME : Types::DATETIME_MUTABLE: - // no break case self::$useDeprecatedConstants ? Type::DATETIMETZ : Types::DATETIMETZ_MUTABLE: - // no break case 'vardatetime': return new TypeGuess('Symfony\Component\Form\Extension\Core\Type\DateTimeType', [], Guess::HIGH_CONFIDENCE); case 'datetime_immutable': @@ -89,9 +86,7 @@ public function guessType($class, $property) case self::$useDeprecatedConstants ? Type::FLOAT : Types::FLOAT: return new TypeGuess('Symfony\Component\Form\Extension\Core\Type\NumberType', [], Guess::MEDIUM_CONFIDENCE); case self::$useDeprecatedConstants ? Type::INTEGER : Types::INTEGER: - // no break case self::$useDeprecatedConstants ? Type::BIGINT : Types::BIGINT: - // no break case self::$useDeprecatedConstants ? Type::SMALLINT : Types::SMALLINT: return new TypeGuess('Symfony\Component\Form\Extension\Core\Type\IntegerType', [], Guess::MEDIUM_CONFIDENCE); case self::$useDeprecatedConstants ? Type::STRING : Types::STRING: diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index 8ebd5fbe00b34..c0528defcd9e7 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -168,11 +168,8 @@ public function getTypes($class, $property, array $context = []) case Type::BUILTIN_TYPE_OBJECT: switch ($typeOfField) { case self::$useDeprecatedConstants ? DBALType::DATE : Types::DATE_MUTABLE: - // no break case self::$useDeprecatedConstants ? DBALType::DATETIME : Types::DATETIME_MUTABLE: - // no break case self::$useDeprecatedConstants ? DBALType::DATETIMETZ : Types::DATETIMETZ_MUTABLE: - // no break case 'vardatetime': case self::$useDeprecatedConstants ? DBALType::TIME : Types::TIME_MUTABLE: return [new Type(Type::BUILTIN_TYPE_OBJECT, $nullable, 'DateTime')]; @@ -191,7 +188,6 @@ public function getTypes($class, $property, array $context = []) case Type::BUILTIN_TYPE_ARRAY: switch ($typeOfField) { case self::$useDeprecatedConstants ? DBALType::TARRAY : Types::ARRAY: - // no break case 'json_array': // return null if $enumType is set, because we can't determine if collectionKeyType is string or int if ($enumType) { @@ -208,7 +204,7 @@ public function getTypes($class, $property, array $context = []) if ($enumType !== null) { return [$enumType]; } - // no break + break; } return [new Type($builtinType, $nullable)]; @@ -282,7 +278,6 @@ private function getPhpType(string $doctrineType): ?string { switch ($doctrineType) { case self::$useDeprecatedConstants ? DBALType::SMALLINT : Types::SMALLINT: - // no break case self::$useDeprecatedConstants ? DBALType::INTEGER : Types::INTEGER: return Type::BUILTIN_TYPE_INT; @@ -290,13 +285,9 @@ private function getPhpType(string $doctrineType): ?string return Type::BUILTIN_TYPE_FLOAT; case self::$useDeprecatedConstants ? DBALType::BIGINT : Types::BIGINT: - // no break case self::$useDeprecatedConstants ? DBALType::STRING : Types::STRING: - // no break case self::$useDeprecatedConstants ? DBALType::TEXT : Types::TEXT: - // no break case self::$useDeprecatedConstants ? DBALType::GUID : Types::GUID: - // no break case self::$useDeprecatedConstants ? DBALType::DECIMAL : Types::DECIMAL: return Type::BUILTIN_TYPE_STRING; @@ -304,21 +295,15 @@ private function getPhpType(string $doctrineType): ?string return Type::BUILTIN_TYPE_BOOL; case self::$useDeprecatedConstants ? DBALType::BLOB : Types::BLOB: - // no break case 'binary': return Type::BUILTIN_TYPE_RESOURCE; case self::$useDeprecatedConstants ? DBALType::OBJECT : Types::OBJECT: - // no break case self::$useDeprecatedConstants ? DBALType::DATE : Types::DATE_MUTABLE: - // no break case self::$useDeprecatedConstants ? DBALType::DATETIME : Types::DATETIME_MUTABLE: - // no break case self::$useDeprecatedConstants ? DBALType::DATETIMETZ : Types::DATETIMETZ_MUTABLE: - // no break case 'vardatetime': case self::$useDeprecatedConstants ? DBALType::TIME : Types::TIME_MUTABLE: - // no break case 'date_immutable': case 'datetime_immutable': case 'datetimetz_immutable': @@ -327,9 +312,7 @@ private function getPhpType(string $doctrineType): ?string return Type::BUILTIN_TYPE_OBJECT; case self::$useDeprecatedConstants ? DBALType::TARRAY : Types::ARRAY: - // no break case self::$useDeprecatedConstants ? DBALType::SIMPLE_ARRAY : Types::SIMPLE_ARRAY: - // no break case 'json_array': return Type::BUILTIN_TYPE_ARRAY; } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FileType.php b/src/Symfony/Component/Form/Extension/Core/Type/FileType.php index 343fc76d475e0..b610d4c65edc3 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FileType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FileType.php @@ -200,11 +200,8 @@ private static function getMaxFilesize() switch (substr($iniMax, -1)) { case 't': $max *= 1024; - // no break case 'g': $max *= 1024; - // no break case 'm': $max *= 1024; - // no break case 'k': $max *= 1024; } diff --git a/src/Symfony/Component/Form/Util/ServerParams.php b/src/Symfony/Component/Form/Util/ServerParams.php index b6ce9d1065617..446e9cfed3707 100644 --- a/src/Symfony/Component/Form/Util/ServerParams.php +++ b/src/Symfony/Component/Form/Util/ServerParams.php @@ -62,11 +62,8 @@ public function getPostMaxSize() switch (substr($iniMax, -1)) { case 't': $max *= 1024; - // no break case 'g': $max *= 1024; - // no break case 'm': $max *= 1024; - // no break case 'k': $max *= 1024; } diff --git a/src/Symfony/Component/HttpFoundation/File/UploadedFile.php b/src/Symfony/Component/HttpFoundation/File/UploadedFile.php index 6e035a55cdcb0..3e482b8a830fa 100644 --- a/src/Symfony/Component/HttpFoundation/File/UploadedFile.php +++ b/src/Symfony/Component/HttpFoundation/File/UploadedFile.php @@ -273,11 +273,8 @@ private static function parseFilesize(string $size) switch (substr($size, -1)) { case 't': $max *= 1024; - // no break case 'g': $max *= 1024; - // no break case 'm': $max *= 1024; - // no break case 'k': $max *= 1024; } diff --git a/src/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php b/src/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php index ff0ccd9fa9eb3..7119bf31ada8a 100644 --- a/src/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php +++ b/src/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php @@ -114,11 +114,8 @@ private function convertToBytes(string $memoryLimit) switch (substr($memoryLimit, -1)) { case 't': $max *= 1024; - // no break case 'g': $max *= 1024; - // no break case 'm': $max *= 1024; - // no break case 'k': $max *= 1024; } diff --git a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php index defa1a4385b64..8873f43cd44e8 100644 --- a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php +++ b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php @@ -219,11 +219,8 @@ private function convertToBytes(string $memoryLimit): int switch (substr(rtrim($memoryLimit, 'b'), -1)) { case 't': $max *= 1024; - // no break case 'g': $max *= 1024; - // no break case 'm': $max *= 1024; - // no break case 'k': $max *= 1024; } From bd623b9466aa0e4e18fecfeb930c9e0ea0ecd4f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Nagy=20=28T-bond=29?= Date: Sun, 27 Mar 2022 01:51:41 +0100 Subject: [PATCH 48/68] [Serializer] Try all possible denormalization route with union types when ALLOW_EXTRA_ATTRIBUTES=false --- .../Normalizer/AbstractObjectNormalizer.php | 15 ++++- .../Serializer/Tests/SerializerTest.php | 55 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index 5977d994987c4..36198fcb5468f 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -370,7 +370,7 @@ public function denormalize($data, $type, $format = null, array $context = []) } } - if (!empty($extraAttributes)) { + if ($extraAttributes) { throw new ExtraAttributesException($extraAttributes); } @@ -405,6 +405,7 @@ private function validateAndDenormalize(string $currentClass, string $attribute, $expectedTypes = []; $isUnionType = \count($types) > 1; + $extraAttributesException = null; foreach ($types as $type) { if (null === $data && $type->isNullable()) { return null; @@ -494,9 +495,21 @@ private function validateAndDenormalize(string $currentClass, string $attribute, if (!$isUnionType) { throw $e; } + } catch (ExtraAttributesException $e) { + if (!$isUnionType) { + throw $e; + } + + if (!$extraAttributesException) { + $extraAttributesException = $e; + } } } + if ($extraAttributesException) { + throw $extraAttributesException; + } + if ($context[self::DISABLE_TYPE_ENFORCEMENT] ?? $this->defaultContext[self::DISABLE_TYPE_ENFORCEMENT] ?? false) { return $data; } diff --git a/src/Symfony/Component/Serializer/Tests/SerializerTest.php b/src/Symfony/Component/Serializer/Tests/SerializerTest.php index 06eda94f53609..b5a0f19390f07 100644 --- a/src/Symfony/Component/Serializer/Tests/SerializerTest.php +++ b/src/Symfony/Component/Serializer/Tests/SerializerTest.php @@ -19,6 +19,7 @@ use Symfony\Component\Serializer\Encoder\DecoderInterface; use Symfony\Component\Serializer\Encoder\EncoderInterface; use Symfony\Component\Serializer\Encoder\JsonEncoder; +use Symfony\Component\Serializer\Exception\ExtraAttributesException; use Symfony\Component\Serializer\Exception\InvalidArgumentException; use Symfony\Component\Serializer\Exception\LogicException; use Symfony\Component\Serializer\Exception\NotNormalizableValueException; @@ -31,6 +32,7 @@ use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface; use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; +use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer; use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer; use Symfony\Component\Serializer\Normalizer\CustomNormalizer; @@ -573,6 +575,35 @@ public function testUnionTypeDeserializable() $this->assertEquals(new DummyUnionType(), $actual, 'Union type denormalization third case failed.'); } + public function testUnionTypeDeserializableWithoutAllowedExtraAttributes() + { + $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); + $extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]); + $serializer = new Serializer( + [ + new ObjectNormalizer($classMetadataFactory, null, null, $extractor, new ClassDiscriminatorFromClassMetadata($classMetadataFactory)), + ], + ['json' => new JsonEncoder()] + ); + + $actual = $serializer->deserialize('{ "v": { "a": 0 }}', DummyUnionWithAAndB::class, 'json', [ + AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false, + ]); + + $this->assertEquals(new DummyUnionWithAAndB(new DummyATypeForUnion()), $actual); + + $actual = $serializer->deserialize('{ "v": { "b": 1 }}', DummyUnionWithAAndB::class, 'json', [ + AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false, + ]); + + $this->assertEquals(new DummyUnionWithAAndB(new DummyBTypeForUnion()), $actual); + + $this->expectException(ExtraAttributesException::class); + $serializer->deserialize('{ "v": { "b": 1, "c": "i am not allowed" }}', DummyUnionWithAAndB::class, 'json', [ + AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false, + ]); + } + /** * @requires PHP 8.2 */ @@ -678,6 +709,30 @@ public function setChanged($changed): self } } +class DummyATypeForUnion +{ + public $a = 0; +} + +class DummyBTypeForUnion +{ + public $b = 1; +} + +class DummyUnionWithAAndB +{ + /** @var DummyATypeForUnion|DummyBTypeForUnion */ + public $v; + + /** + * @param DummyATypeForUnion|DummyBTypeForUnion $v + */ + public function __construct($v) + { + $this->v = $v; + } +} + interface NormalizerAwareNormalizer extends NormalizerInterface, NormalizerAwareInterface { } From 7fc7acb1e4448762f438af03cadb2ce54e3918e0 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sun, 19 Jun 2022 13:59:55 +0200 Subject: [PATCH 49/68] [PropertyInfo] CS fix --- src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index c0528defcd9e7..681aa24e327a9 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -201,7 +201,7 @@ public function getTypes($class, $property, array $context = []) } case Type::BUILTIN_TYPE_INT: case Type::BUILTIN_TYPE_STRING: - if ($enumType !== null) { + if ($enumType) { return [$enumType]; } break; From 445b78a9b97fe4f551448c7c01313b8e6a4c346b Mon Sep 17 00:00:00 2001 From: Gigino Chianese Date: Sun, 19 Jun 2022 14:09:58 +0200 Subject: [PATCH 50/68] [DoctrineBridge] Add missing break --- src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index 681aa24e327a9..0c7c48d1c0968 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -199,6 +199,7 @@ public function getTypes($class, $property, array $context = []) case self::$useDeprecatedConstants ? DBALType::SIMPLE_ARRAY : Types::SIMPLE_ARRAY: return [new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, new Type(Type::BUILTIN_TYPE_INT), $enumType ?? new Type(Type::BUILTIN_TYPE_STRING))]; } + break; case Type::BUILTIN_TYPE_INT: case Type::BUILTIN_TYPE_STRING: if ($enumType) { From 12460fa0819c4b71c63148dd6a62466b1387c799 Mon Sep 17 00:00:00 2001 From: Alex Pott Date: Wed, 15 Jun 2022 09:12:29 +0100 Subject: [PATCH 51/68] [HttpFoundation] Update "[Session] Overwrite invalid session id" to only validate when files session storage is used --- .../Session/Storage/NativeSessionStorage.php | 2 +- .../Storage/NativeSessionStorageTest.php | 23 +++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php b/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php index 76ebfa08a482d..4caba27dbc2df 100644 --- a/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php +++ b/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php @@ -153,7 +153,7 @@ public function start() } $sessionId = $_COOKIE[session_name()] ?? null; - if ($sessionId && !preg_match('/^[a-zA-Z0-9,-]{22,}$/', $sessionId)) { + if ($sessionId && $this->saveHandler instanceof AbstractProxy && 'files' === $this->saveHandler->getSaveHandlerName() && !preg_match('/^[a-zA-Z0-9,-]{22,}$/', $sessionId)) { // the session ID in the header is invalid, create a new one session_id(session_create_id()); } diff --git a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php index 776da2adc27f1..86b4dd505567b 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php @@ -294,12 +294,31 @@ public function testGetBagsOnceSessionStartedIsIgnored() $this->assertEquals($storage->getBag('flashes'), $bag); } - public function testRegenerateInvalidSessionId() + public function testRegenerateInvalidSessionIdForNativeFileSessionHandler() { $_COOKIE[session_name()] = '&~['; - $started = (new NativeSessionStorage())->start(); + session_id('&~['); + $storage = new NativeSessionStorage([], new NativeFileSessionHandler()); + $started = $storage->start(); $this->assertTrue($started); $this->assertMatchesRegularExpression('/^[a-zA-Z0-9,-]{22,}$/', session_id()); + $storage->save(); + + $_COOKIE[session_name()] = '&~['; + session_id('&~['); + $storage = new NativeSessionStorage([], new SessionHandlerProxy(new NativeFileSessionHandler())); + $started = $storage->start(); + + $this->assertTrue($started); + $this->assertMatchesRegularExpression('/^[a-zA-Z0-9,-]{22,}$/', session_id()); + $storage->save(); + + $_COOKIE[session_name()] = '&~['; + session_id('&~['); + $storage = new NativeSessionStorage([], new NullSessionHandler()); + $started = $storage->start(); + $this->assertTrue($started); + $this->assertSame('&~[', session_id()); } } From 4f96afe3ab077fb557d2fdd5e1e7fad8ec265ab2 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 18 Jun 2022 21:42:44 +0200 Subject: [PATCH 52/68] Exclude from baseline generation deprecations triggered in legacy test --- .../Bridge/PhpUnit/DeprecationErrorHandler/Configuration.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Configuration.php b/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Configuration.php index 4420ef3d0e46c..bc46e4f447912 100644 --- a/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Configuration.php +++ b/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Configuration.php @@ -170,6 +170,10 @@ public function tolerates(array $deprecationGroups) */ public function isBaselineDeprecation(Deprecation $deprecation) { + if ($deprecation->isLegacy()) { + return false; + } + if ($deprecation->originatesFromAnObject()) { $location = $deprecation->originatingClass().'::'.$deprecation->originatingMethod(); } else { From 07ec2de641a7acd10159c2a8a3b32e17c57d1579 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sun, 19 Jun 2022 15:24:10 +0200 Subject: [PATCH 53/68] [Messenger] CS fix --- .../Component/Messenger/EventListener/ResetServicesListener.php | 1 - src/Symfony/Component/Messenger/Worker.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Symfony/Component/Messenger/EventListener/ResetServicesListener.php b/src/Symfony/Component/Messenger/EventListener/ResetServicesListener.php index dd170e0e433a1..d5266f3669f5e 100644 --- a/src/Symfony/Component/Messenger/EventListener/ResetServicesListener.php +++ b/src/Symfony/Component/Messenger/EventListener/ResetServicesListener.php @@ -15,7 +15,6 @@ use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter; use Symfony\Component\Messenger\Event\WorkerRunningEvent; use Symfony\Component\Messenger\Event\WorkerStoppedEvent; -use Symfony\Contracts\Service\ResetInterface; /** * @author Grégoire Pineau diff --git a/src/Symfony/Component/Messenger/Worker.php b/src/Symfony/Component/Messenger/Worker.php index 34473bac32267..754d1c1b1e75a 100644 --- a/src/Symfony/Component/Messenger/Worker.php +++ b/src/Symfony/Component/Messenger/Worker.php @@ -31,7 +31,6 @@ use Symfony\Component\Messenger\Transport\Receiver\QueueReceiverInterface; use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; -use Symfony\Contracts\Service\ResetInterface; /** * @author Samuel Roze From caddb276441fc5c7c1b668b6c3383cdb5f5ce670 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Mon, 20 Jun 2022 10:12:38 +0200 Subject: [PATCH 54/68] [PhpUnitBridge] fix tests --- .../Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline.phpt | 1 + .../Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline2.phpt | 2 ++ .../Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline3.phpt | 2 +- .../Tests/DeprecationErrorHandler/generate_baseline.phpt | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline.phpt b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline.phpt index 533912c106cbd..83d448ea8ca7b 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline.phpt +++ b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline.phpt @@ -78,3 +78,4 @@ print "Cannot test baselineFile contents because it is generated in a shutdown f ?> --EXPECT-- Cannot test baselineFile contents because it is generated in a shutdown function registered by another shutdown function. +Legacy deprecation notices (1) diff --git a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline2.phpt b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline2.phpt index f520912694a1e..925d5c2384901 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline2.phpt +++ b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline2.phpt @@ -66,6 +66,8 @@ $foo->testLegacyFoo(); $foo->testNonLegacyBar(); ?> --EXPECTF-- +Legacy deprecation notices (1) + Other deprecation notices (2) 1x: root deprecation diff --git a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline3.phpt b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline3.phpt index 28d1a74ffd427..d814c02b555b3 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline3.phpt +++ b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/baseline3.phpt @@ -69,7 +69,7 @@ $foo->testLegacyFoo(); $foo->testNonLegacyBar(); ?> --EXPECTF-- -Legacy deprecation notices (1) +Legacy deprecation notices (2) Other deprecation notices (2) diff --git a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/generate_baseline.phpt b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/generate_baseline.phpt index 112a02b4c41a0..5b80791a15112 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/generate_baseline.phpt +++ b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/generate_baseline.phpt @@ -62,3 +62,4 @@ print "Cannot test baselineFile contents because it is generated in a shutdown f ?> --EXPECT-- Cannot test baselineFile contents because it is generated in a shutdown function registered by another shutdown function. +Legacy deprecation notices (1) From c5834becf38f3d0743f4038ef82b9ffe744ee712 Mon Sep 17 00:00:00 2001 From: Andreas Hennings Date: Mon, 20 Jun 2022 05:03:35 +0200 Subject: [PATCH 55/68] [Yaml] Enhance coverage in yaml DumperTest. --- .../Component/Yaml/Tests/DumperTest.php | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/Symfony/Component/Yaml/Tests/DumperTest.php b/src/Symfony/Component/Yaml/Tests/DumperTest.php index 6329aec86ccff..2ebbbd047313c 100644 --- a/src/Symfony/Component/Yaml/Tests/DumperTest.php +++ b/src/Symfony/Component/Yaml/Tests/DumperTest.php @@ -28,7 +28,7 @@ class DumperTest extends TestCase '' => 'bar', 'foo' => '#bar', 'foo\'bar' => [], - 'bar' => [1, 'foo'], + 'bar' => [1, 'foo', ['a' => 'A']], 'foobar' => [ 'foo' => 'bar', 'bar' => [1, 'foo'], @@ -64,6 +64,8 @@ public function testIndentationInConstructor() bar: - 1 - foo + - + a: A foobar: foo: bar bar: @@ -107,7 +109,7 @@ public function testSpecifications() public function testInlineLevel() { $expected = <<<'EOF' -{ '': bar, foo: '#bar', 'foo''bar': { }, bar: [1, foo], foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } } +{ '': bar, foo: '#bar', 'foo''bar': { }, bar: [1, foo, { a: A }], foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } } EOF; $this->assertEquals($expected, $this->dumper->dump($this->array, -10), '->dump() takes an inline level argument'); $this->assertEquals($expected, $this->dumper->dump($this->array, 0), '->dump() takes an inline level argument'); @@ -116,7 +118,7 @@ public function testInlineLevel() '': bar foo: '#bar' 'foo''bar': { } -bar: [1, foo] +bar: [1, foo, { a: A }] foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } EOF; @@ -129,6 +131,7 @@ public function testInlineLevel() bar: - 1 - foo + - { a: A } foobar: foo: bar bar: [1, foo] @@ -144,6 +147,8 @@ public function testInlineLevel() bar: - 1 - foo + - + a: A foobar: foo: bar bar: @@ -163,6 +168,8 @@ public function testInlineLevel() bar: - 1 - foo + - + a: A foobar: foo: bar bar: @@ -379,8 +386,9 @@ public function testDumpingTaggedValueSequenceRespectsInlineLevel() new TaggedValue('user', [ 'username' => 'jane', ]), - new TaggedValue('user', [ - 'username' => 'john', + new TaggedValue('names', [ + 'john', + 'claire', ]), ]; @@ -389,8 +397,9 @@ public function testDumpingTaggedValueSequenceRespectsInlineLevel() $expected = <<assertSame($expected, $yaml); @@ -402,8 +411,9 @@ public function testDumpingTaggedValueSequenceWithInlinedTagValues() new TaggedValue('user', [ 'username' => 'jane', ]), - new TaggedValue('user', [ - 'username' => 'john', + new TaggedValue('names', [ + 'john', + 'claire', ]), ]; @@ -411,7 +421,7 @@ public function testDumpingTaggedValueSequenceWithInlinedTagValues() $expected = <<assertSame($expected, $yaml); @@ -423,8 +433,9 @@ public function testDumpingTaggedValueMapRespectsInlineLevel() 'user1' => new TaggedValue('user', [ 'username' => 'jane', ]), - 'user2' => new TaggedValue('user', [ - 'username' => 'john', + 'names1' => new TaggedValue('names', [ + 'john', + 'claire', ]), ]; @@ -433,8 +444,9 @@ public function testDumpingTaggedValueMapRespectsInlineLevel() $expected = <<assertSame($expected, $yaml); @@ -446,8 +458,9 @@ public function testDumpingTaggedValueMapWithInlinedTagValues() 'user1' => new TaggedValue('user', [ 'username' => 'jane', ]), - 'user2' => new TaggedValue('user', [ - 'username' => 'john', + 'names1' => new TaggedValue('names', [ + 'john', + 'claire', ]), ]; @@ -455,7 +468,7 @@ public function testDumpingTaggedValueMapWithInlinedTagValues() $expected = <<assertSame($expected, $yaml); From 953c09c91998f7c6eb475ec19279d60eca11d622 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 20 Jun 2022 13:50:03 +0200 Subject: [PATCH 56/68] Stick to PHPUnit 8.5.26 --- phpunit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpunit b/phpunit index 7ca6ceeccbee8..e26fecd73cc9d 100755 --- a/phpunit +++ b/phpunit @@ -13,7 +13,7 @@ if (!getenv('SYMFONY_PHPUNIT_VERSION')) { if (\PHP_VERSION_ID < 70200) { putenv('SYMFONY_PHPUNIT_VERSION=7.5'); } elseif (\PHP_VERSION_ID < 70300) { - putenv('SYMFONY_PHPUNIT_VERSION=8.5'); + putenv('SYMFONY_PHPUNIT_VERSION=8.5.26'); } else { putenv('SYMFONY_PHPUNIT_VERSION=9.5'); } From 637599095196f3eb3e0881ef64f35b0fe7ff5b7a Mon Sep 17 00:00:00 2001 From: Gigino Chianese Date: Mon, 20 Jun 2022 20:33:41 +0200 Subject: [PATCH 57/68] [DoctrineBridge] Fix value type for simple_array --- src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index 79951e427d4b8..e01554cea6eca 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -180,7 +180,7 @@ public function getTypes(string $class, string $property, array $context = []) return [new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true)]; case Types::SIMPLE_ARRAY: - return [new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_STRING))]; + return [new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, new Type(Type::BUILTIN_TYPE_INT), $enumType ?? new Type(Type::BUILTIN_TYPE_STRING))]; } break; case Type::BUILTIN_TYPE_INT: From 22cd9cbc86b20985bd65a6f6e4fc2f020b0b0947 Mon Sep 17 00:00:00 2001 From: Damien ALEXANDRE Date: Tue, 21 Jun 2022 14:42:24 +0200 Subject: [PATCH 58/68] [Intl] Fix the IntlDateFormatter::formatObject signature --- src/Symfony/Component/Intl/DateFormatter/IntlDateFormatter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Intl/DateFormatter/IntlDateFormatter.php b/src/Symfony/Component/Intl/DateFormatter/IntlDateFormatter.php index 4da012f52073c..9e31312517638 100644 --- a/src/Symfony/Component/Intl/DateFormatter/IntlDateFormatter.php +++ b/src/Symfony/Component/Intl/DateFormatter/IntlDateFormatter.php @@ -243,7 +243,7 @@ public function format($timestamp) * * @throws MethodNotImplementedException */ - public function formatObject($object, $format = null, $locale = null) + public static function formatObject($object, $format = null, $locale = null) { throw new MethodNotImplementedException(__METHOD__); } From f1604e60367438bffbddc26a559134ae27edfcfd Mon Sep 17 00:00:00 2001 From: Alexandre Jardin Date: Wed, 22 Jun 2022 09:18:33 +0200 Subject: [PATCH 59/68] [Messenger] Do not log the message object itself In order to avoid the leak of sensitive data (e.g. credentials) or the overflow of third-party services. --- .../EventListener/SendFailedMessageForRetryListener.php | 1 - .../Component/Messenger/Middleware/HandleMessageMiddleware.php | 1 - .../Component/Messenger/Middleware/SendMessageMiddleware.php | 1 - src/Symfony/Component/Messenger/Worker.php | 1 - 4 files changed, 4 deletions(-) diff --git a/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php b/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php index b355df8b7fcbf..dab74b203f795 100644 --- a/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php +++ b/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php @@ -56,7 +56,6 @@ public function onMessageFailed(WorkerMessageFailedEvent $event) $message = $envelope->getMessage(); $context = [ - 'message' => $message, 'class' => \get_class($message), ]; diff --git a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php index 3daa659f7e86f..149f304467057 100644 --- a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php @@ -53,7 +53,6 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope $message = $envelope->getMessage(); $context = [ - 'message' => $message, 'class' => \get_class($message), ]; diff --git a/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php index 792eaa95f1063..669fe7652f86a 100644 --- a/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php @@ -46,7 +46,6 @@ public function __construct(SendersLocatorInterface $sendersLocator, EventDispat public function handle(Envelope $envelope, StackInterface $stack): Envelope { $context = [ - 'message' => $envelope->getMessage(), 'class' => \get_class($envelope->getMessage()), ]; diff --git a/src/Symfony/Component/Messenger/Worker.php b/src/Symfony/Component/Messenger/Worker.php index 754d1c1b1e75a..33358d3d61b4d 100644 --- a/src/Symfony/Component/Messenger/Worker.php +++ b/src/Symfony/Component/Messenger/Worker.php @@ -208,7 +208,6 @@ private function ack(): bool if (null !== $this->logger) { $message = $envelope->getMessage(); $context = [ - 'message' => $message, 'class' => \get_class($message), ]; $this->logger->info('{class} was handled successfully (acknowledging to transport).', $context); From d2aaf51404dac043d8425a29d9c67045e8949947 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Wed, 22 Jun 2022 17:01:38 +0200 Subject: [PATCH 60/68] =?UTF-8?q?=C2=B5cs=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DependencyInjection/Tests/Dumper/PhpDumperTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php index d5b0056efae54..059e83a71085b 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php @@ -805,7 +805,7 @@ public function testLazyArgumentProvideGenerator() switch (++$i) { case 0: $this->assertEquals('k1', $k); - $this->assertInstanceOf(\stdCLass::class, $v); + $this->assertInstanceOf(\stdClass::class, $v); break; case 1: $this->assertEquals('k2', $k); From f4c81f13caffb66d7ef383a7b1dc0b8f2cba1655 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 23 Jun 2022 12:21:08 +0200 Subject: [PATCH 61/68] Fix global state pollution between tests run with ApplicationTester --- .../Console/Tester/ApplicationTester.php | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/Symfony/Component/Console/Tester/ApplicationTester.php b/src/Symfony/Component/Console/Tester/ApplicationTester.php index 4f99da18d5f8b..ce4e5c18dcaf6 100644 --- a/src/Symfony/Component/Console/Tester/ApplicationTester.php +++ b/src/Symfony/Component/Console/Tester/ApplicationTester.php @@ -54,17 +54,37 @@ public function __construct(Application $application) */ public function run(array $input, $options = []) { - $this->input = new ArrayInput($input); - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } + $prevShellVerbosity = getenv('SHELL_VERBOSITY'); - if ($this->inputs) { - $this->input->setStream(self::createStream($this->inputs)); - } + try { + $this->input = new ArrayInput($input); + if (isset($options['interactive'])) { + $this->input->setInteractive($options['interactive']); + } - $this->initOutput($options); + if ($this->inputs) { + $this->input->setStream(self::createStream($this->inputs)); + } - return $this->statusCode = $this->application->run($this->input, $this->output); + $this->initOutput($options); + + return $this->statusCode = $this->application->run($this->input, $this->output); + } finally { + // SHELL_VERBOSITY is set by Application::configureIO so we need to unset/reset it + // to its previous value to avoid one test's verbosity to spread to the following tests + if (false === $prevShellVerbosity) { + if (\function_exists('putenv')) { + @putenv('SHELL_VERBOSITY'); + } + unset($_ENV['SHELL_VERBOSITY']); + unset($_SERVER['SHELL_VERBOSITY']); + } else { + if (\function_exists('putenv')) { + @putenv('SHELL_VERBOSITY='.$prevShellVerbosity); + } + $_ENV['SHELL_VERBOSITY'] = $prevShellVerbosity; + $_SERVER['SHELL_VERBOSITY'] = $prevShellVerbosity; + } + } } } From 4d44563a13dd57e55a926045e82e2ffda7b70f4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Thu, 23 Jun 2022 13:46:06 +0200 Subject: [PATCH 62/68] [Security] Fix legacy impersonation system When using the legacy authentication system with a user class not implementing `EquatableInterface` (for instance, the default when using Sylius) a bug prevents the impersonation system to work properly. The switch is done correctly, but then the user is disconnected on the next request because `SecurityContext::hasUserChanged()` compares the roles of the token in session with the roles of the temporary token, and they aren't equal. `ROLE_PREVIOUS_ADMIN` is added in `SwitchUserListener::attemptSwitchUser()`, but then removed if the legacy system is still enabled in `UserAuthenticationProvider`. It looks like this bug has been introduced while deprecating support for role classes: https://github.com/symfony/symfony/commit/d64372df8c8d63e124d14de5c08fcbbb4674a12e#diff-914ec544d4f7b26fda540aea3d7bc57cc5057d76bfb9ad72047d77739e3bb5a3L115 This patch fixes the issue (tested on a real Sylius project). --- .../Authentication/Provider/UserAuthenticationProvider.php | 5 ++++- .../Provider/UserAuthenticationProviderTest.php | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php b/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php index c038c769a553c..81731e8dd0b67 100644 --- a/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php +++ b/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php @@ -94,7 +94,10 @@ public function authenticate(TokenInterface $token) } if ($token instanceof SwitchUserToken) { - $authenticatedToken = new SwitchUserToken($user, $token->getCredentials(), $this->providerKey, $user->getRoles(), $token->getOriginalToken()); + $roles = $user->getRoles(); + $roles[] = 'ROLE_PREVIOUS_ADMIN'; + + $authenticatedToken = new SwitchUserToken($user, $token->getCredentials(), $this->providerKey, $roles, $token->getOriginalToken()); } else { $authenticatedToken = new UsernamePasswordToken($user, $token->getCredentials(), $this->providerKey, $user->getRoles()); } diff --git a/src/Symfony/Component/Security/Core/Tests/Authentication/Provider/UserAuthenticationProviderTest.php b/src/Symfony/Component/Security/Core/Tests/Authentication/Provider/UserAuthenticationProviderTest.php index c4bcd8f580100..446a04061d091 100644 --- a/src/Symfony/Component/Security/Core/Tests/Authentication/Provider/UserAuthenticationProviderTest.php +++ b/src/Symfony/Component/Security/Core/Tests/Authentication/Provider/UserAuthenticationProviderTest.php @@ -225,6 +225,7 @@ public function testAuthenticatePreservesOriginalToken() $this->assertSame($originalToken, $authToken->getOriginalToken()); $this->assertSame($user, $authToken->getUser()); $this->assertContains('ROLE_FOO', $authToken->getRoleNames()); + $this->assertContains('ROLE_PREVIOUS_ADMIN', $authToken->getRoleNames()); $this->assertEquals('foo', $authToken->getCredentials()); $this->assertEquals(['foo' => 'bar'], $authToken->getAttributes(), '->authenticate() copies token attributes'); } From 33fb1533c191739511f630418a787ea0ab95d414 Mon Sep 17 00:00:00 2001 From: Thibault Buathier Date: Fri, 24 Jun 2022 12:01:15 +0200 Subject: [PATCH 63/68] [Serializer] Fix denormalization union types with constructor --- .../Normalizer/AbstractObjectNormalizer.php | 16 ++++++++++ .../Serializer/Tests/SerializerTest.php | 32 ++++++++++++++----- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index 36198fcb5468f..fbe5d25d479a9 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -20,6 +20,7 @@ use Symfony\Component\Serializer\Encoder\XmlEncoder; use Symfony\Component\Serializer\Exception\ExtraAttributesException; use Symfony\Component\Serializer\Exception\LogicException; +use Symfony\Component\Serializer\Exception\MissingConstructorArgumentsException; use Symfony\Component\Serializer\Exception\NotNormalizableValueException; use Symfony\Component\Serializer\Exception\RuntimeException; use Symfony\Component\Serializer\Mapping\AttributeMetadataInterface; @@ -395,6 +396,8 @@ abstract protected function setAttributeValue($object, $attribute, $value, $form * @return mixed * * @throws NotNormalizableValueException + * @throws ExtraAttributesException + * @throws MissingConstructorArgumentsException * @throws LogicException */ private function validateAndDenormalize(string $currentClass, string $attribute, $data, ?string $format, array $context) @@ -406,6 +409,7 @@ private function validateAndDenormalize(string $currentClass, string $attribute, $expectedTypes = []; $isUnionType = \count($types) > 1; $extraAttributesException = null; + $missingConstructorArgumentException = null; foreach ($types as $type) { if (null === $data && $type->isNullable()) { return null; @@ -503,6 +507,14 @@ private function validateAndDenormalize(string $currentClass, string $attribute, if (!$extraAttributesException) { $extraAttributesException = $e; } + } catch (MissingConstructorArgumentsException $e) { + if (!$isUnionType) { + throw $e; + } + + if (!$missingConstructorArgumentException) { + $missingConstructorArgumentException = $e; + } } } @@ -510,6 +522,10 @@ private function validateAndDenormalize(string $currentClass, string $attribute, throw $extraAttributesException; } + if ($missingConstructorArgumentException) { + throw $missingConstructorArgumentException; + } + if ($context[self::DISABLE_TYPE_ENFORCEMENT] ?? $this->defaultContext[self::DISABLE_TYPE_ENFORCEMENT] ?? false) { return $data; } diff --git a/src/Symfony/Component/Serializer/Tests/SerializerTest.php b/src/Symfony/Component/Serializer/Tests/SerializerTest.php index b5a0f19390f07..df8732d29e342 100644 --- a/src/Symfony/Component/Serializer/Tests/SerializerTest.php +++ b/src/Symfony/Component/Serializer/Tests/SerializerTest.php @@ -586,20 +586,26 @@ public function testUnionTypeDeserializableWithoutAllowedExtraAttributes() ['json' => new JsonEncoder()] ); - $actual = $serializer->deserialize('{ "v": { "a": 0 }}', DummyUnionWithAAndB::class, 'json', [ + $actual = $serializer->deserialize('{ "v": { "a": 0 }}', DummyUnionWithAAndCAndB::class, 'json', [ AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false, ]); - $this->assertEquals(new DummyUnionWithAAndB(new DummyATypeForUnion()), $actual); + $this->assertEquals(new DummyUnionWithAAndCAndB(new DummyATypeForUnion()), $actual); - $actual = $serializer->deserialize('{ "v": { "b": 1 }}', DummyUnionWithAAndB::class, 'json', [ + $actual = $serializer->deserialize('{ "v": { "b": 1 }}', DummyUnionWithAAndCAndB::class, 'json', [ AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false, ]); - $this->assertEquals(new DummyUnionWithAAndB(new DummyBTypeForUnion()), $actual); + $this->assertEquals(new DummyUnionWithAAndCAndB(new DummyBTypeForUnion()), $actual); + + $actual = $serializer->deserialize('{ "v": { "c": 3 }}', DummyUnionWithAAndCAndB::class, 'json', [ + AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false, + ]); + + $this->assertEquals(new DummyUnionWithAAndCAndB(new DummyCTypeForUnion(3)), $actual); $this->expectException(ExtraAttributesException::class); - $serializer->deserialize('{ "v": { "b": 1, "c": "i am not allowed" }}', DummyUnionWithAAndB::class, 'json', [ + $serializer->deserialize('{ "v": { "b": 1, "d": "i am not allowed" }}', DummyUnionWithAAndCAndB::class, 'json', [ AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false, ]); } @@ -719,13 +725,23 @@ class DummyBTypeForUnion public $b = 1; } -class DummyUnionWithAAndB +class DummyCTypeForUnion +{ + public $c = 2; + + public function __construct($c) + { + $this->c = $c; + } +} + +class DummyUnionWithAAndCAndB { - /** @var DummyATypeForUnion|DummyBTypeForUnion */ + /** @var DummyATypeForUnion|DummyCTypeForUnion|DummyBTypeForUnion */ public $v; /** - * @param DummyATypeForUnion|DummyBTypeForUnion $v + * @param DummyATypeForUnion|DummyCTypeForUnion|DummyBTypeForUnion $v */ public function __construct($v) { From 4dff49ff34d0e3037ba1957a5a5d2e34847a6055 Mon Sep 17 00:00:00 2001 From: Andreas Heigl Date: Fri, 24 Jun 2022 09:03:23 +0200 Subject: [PATCH 64/68] Fix double authentication via RememberMe resulting in wrong RememberMe cookie being set in client --- .../PersistentRememberMeHandler.php | 1 + .../PersistentRememberMeHandlerTest.php | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/Symfony/Component/Security/Http/RememberMe/PersistentRememberMeHandler.php b/src/Symfony/Component/Security/Http/RememberMe/PersistentRememberMeHandler.php index 191d2ede852b8..8a5db07e5e8ab 100644 --- a/src/Symfony/Component/Security/Http/RememberMe/PersistentRememberMeHandler.php +++ b/src/Symfony/Component/Security/Http/RememberMe/PersistentRememberMeHandler.php @@ -75,6 +75,7 @@ public function processRememberMe(RememberMeDetails $rememberMeDetails, UserInte if ($this->tokenVerifier) { $isTokenValid = $this->tokenVerifier->verifyToken($persistentToken, $tokenValue); + $tokenValue = $persistentToken->getTokenValue(); } else { $isTokenValid = hash_equals($persistentToken->getTokenValue(), $tokenValue); } diff --git a/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentRememberMeHandlerTest.php b/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentRememberMeHandlerTest.php index 7448520497eaf..770a1c634abe6 100644 --- a/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentRememberMeHandlerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentRememberMeHandlerTest.php @@ -17,6 +17,7 @@ use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken; use Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface; +use Symfony\Component\Security\Core\Authentication\RememberMe\TokenVerifierInterface; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Core\Exception\CookieTheftException; use Symfony\Component\Security\Core\User\InMemoryUser; @@ -102,6 +103,42 @@ public function testConsumeRememberMeCookieValid() $this->assertSame(explode(':', $rememberParts[3])[0], explode(':', $cookieParts[3])[0]); // series } + public function testConsumeRememberMeCookieValidByValidatorWithoutUpdate() + { + $verifier = $this->createMock(TokenVerifierInterface::class); + $handler = new PersistentRememberMeHandler($this->tokenProvider, 'secret', $this->userProvider, $this->requestStack, [], null, $verifier); + + $persistentToken = new PersistentToken(InMemoryUser::class, 'wouter', 'series1', 'tokenvalue', new \DateTime('30 seconds')); + + $this->tokenProvider->expects($this->any()) + ->method('loadTokenBySeries') + ->with('series1') + ->willReturn($persistentToken) + ; + + $verifier->expects($this->any()) + ->method('verifyToken') + ->with($persistentToken, 'oldTokenValue') + ->willReturn(true) + ; + + $rememberMeDetails = new RememberMeDetails(InMemoryUser::class, 'wouter', 360, 'series1:oldTokenValue'); + $handler->consumeRememberMeCookie($rememberMeDetails); + + // assert that the cookie has been updated with a new base64 encoded token value + $this->assertTrue($this->request->attributes->has(ResponseListener::COOKIE_ATTR_NAME)); + + /** @var Cookie $cookie */ + $cookie = $this->request->attributes->get(ResponseListener::COOKIE_ATTR_NAME); + + $cookieParts = explode(':', base64_decode($cookie->getValue()), 4); + + $this->assertSame(InMemoryUser::class, $cookieParts[0]); // class + $this->assertSame(base64_encode('wouter'), $cookieParts[1]); // identifier + $this->assertSame('360', $cookieParts[2]); // expire + $this->assertSame('series1:tokenvalue', $cookieParts[3]); // value + } + public function testConsumeRememberMeCookieInvalidToken() { $this->expectException(CookieTheftException::class); From 9ed79ce0f69a7071066344fa37ae2c6cc4635352 Mon Sep 17 00:00:00 2001 From: Francois Martin Date: Sun, 26 Jun 2022 17:57:47 +0200 Subject: [PATCH 65/68] Add an invariable word in french --- src/Symfony/Component/String/Inflector/FrenchInflector.php | 2 +- .../Component/String/Tests/Inflector/FrenchInflectorTest.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/String/Inflector/FrenchInflector.php b/src/Symfony/Component/String/Inflector/FrenchInflector.php index 42f6125aae663..f58f7c0c0e234 100644 --- a/src/Symfony/Component/String/Inflector/FrenchInflector.php +++ b/src/Symfony/Component/String/Inflector/FrenchInflector.php @@ -108,7 +108,7 @@ final class FrenchInflector implements InflectorInterface * A list of words which should not be inflected. * This list is only used by singularize. */ - private const UNINFLECTED = '/^(abcès|accès|abus|albatros|anchois|anglais|autobus|bois|brebis|carquois|cas|chas|colis|concours|corps|cours|cyprès|décès|devis|discours|dos|embarras|engrais|entrelacs|excès|fils|fois|gâchis|gars|glas|héros|intrus|jars|jus|kermès|lacis|legs|lilas|marais|mars|matelas|mépris|mets|mois|mors|obus|os|palais|paradis|parcours|pardessus|pays|plusieurs|poids|pois|pouls|printemps|processus|progrès|puits|pus|rabais|radis|recors|recours|refus|relais|remords|remous|rictus|rhinocéros|repas|rubis|sas|secours|sens|souris|succès|talus|tapis|tas|taudis|temps|tiers|univers|velours|verglas|vernis|virus)$/i'; + private const UNINFLECTED = '/^(abcès|accès|abus|albatros|anchois|anglais|autobus|bois|brebis|carquois|cas|chas|colis|concours|corps|cours|cyprès|décès|devis|discours|dos|embarras|engrais|entrelacs|excès|fils|fois|gâchis|gars|glas|héros|intrus|jars|jus|kermès|lacis|legs|lilas|marais|mars|matelas|mépris|mets|mois|mors|obus|os|palais|paradis|parcours|pardessus|pays|plusieurs|poids|pois|pouls|printemps|processus|progrès|puits|pus|rabais|radis|recors|recours|refus|relais|remords|remous|rictus|rhinocéros|repas|rubis|sans|sas|secours|sens|souris|succès|talus|tapis|tas|taudis|temps|tiers|univers|velours|verglas|vernis|virus)$/i'; /** * {@inheritdoc} diff --git a/src/Symfony/Component/String/Tests/Inflector/FrenchInflectorTest.php b/src/Symfony/Component/String/Tests/Inflector/FrenchInflectorTest.php index ff4deb4eac9aa..9122281c27c84 100644 --- a/src/Symfony/Component/String/Tests/Inflector/FrenchInflectorTest.php +++ b/src/Symfony/Component/String/Tests/Inflector/FrenchInflectorTest.php @@ -31,6 +31,7 @@ public function pluralizeProvider() ['héros', 'héros'], ['nez', 'nez'], ['rictus', 'rictus'], + ['sans', 'sans'], ['souris', 'souris'], ['tas', 'tas'], ['toux', 'toux'], From d0955c2c6a5290037cd31a9b19222f7baeb39e6c Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Fri, 24 Jun 2022 15:11:10 +0200 Subject: [PATCH 66/68] [HttpKernel] Fix a PHP 8.1 deprecation notice in HttpCache --- src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php b/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php index 7deda42fc7186..84b77c518a3f4 100644 --- a/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php +++ b/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php @@ -718,7 +718,7 @@ private function mayServeStaleWhileRevalidate(Response $entry): bool $timeout = $this->options['stale_while_revalidate']; } - return abs($entry->getTtl()) < $timeout; + return abs($entry->getTtl() ?? 0) < $timeout; } /** From 0861798f1121c6dfdfdc671634f40490fbdfa578 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sun, 26 Jun 2022 19:02:13 +0200 Subject: [PATCH 67/68] Update CHANGELOG for 6.0.10 --- CHANGELOG-6.0.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/CHANGELOG-6.0.md b/CHANGELOG-6.0.md index 94dd5df1efe5d..4416525001ff2 100644 --- a/CHANGELOG-6.0.md +++ b/CHANGELOG-6.0.md @@ -7,6 +7,44 @@ in 6.0 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/v6.0.0...v6.0.1 +* 6.0.10 (2022-06-26) + + * bug #46779 [String] Add an invariable word in french (lemonlab) + * bug #46765 [Serializer] Fix denormalization union types with constructor (Gwemox) + * bug #46769 [HttpKernel] Fix a PHP 8.1 deprecation notice in HttpCache (mpdude) + * bug #46760 Fix double authentication via RememberMe resulting in wrong RememberMe cookie being set in client (heiglandreas) + * bug #46735 [Messenger] Do not log the message object itself (ajardin) + * bug #46748 [Security] Fix legacy impersonation system (dunglas) + * bug #46747 Fix global state pollution between tests run with ApplicationTester (Seldaek) + * bug #46730 [Intl] Fix the IntlDateFormatter::formatObject signature (damienalexandre) + * bug #46668 [FrameworkBundle] Lower JsonSerializableNormalizer priority (aprat84) + * bug #46711 [PhpUnitBridge] Exclude from baseline generation deprecations triggered in legacy test (mondrake) + * bug #46678 [HttpFoundation] Update "[Session] Overwrite invalid session id" to only validate when files session storage is used (alexpott) + * bug #45861 [Serializer] Try all possible denormalization route with union types when ALLOW_EXTRA_ATTRIBUTES=false (T-bond) + * bug #46676 [DoctrineBridge] Extend type guessing on enum fields (Gigino Chianese) + * bug #46699 [Cache] Respect $save option in all adapters (jrjohnson) + * bug #46697 [HttpKernel] Disable session tracking while collecting profiler data (nicolas-grekas) + * bug #46704 Allow passing null in twig_is_selected_choice (raziel057) + * bug #46684 [MonologBridge] Fixed support of elasticsearch 7.+ in ElasticsearchLogstashHandler (lyrixx) + * bug #46646 [Messenger] move resetting services at worker stopped into listener (Thomas Talbot) + * bug #46368 [Mailer] Fix for missing sender name in case with usage of the EnvelopeListener (bobahvas) + * bug #46603 [Mailer] Fix Error Handling for OhMySMTP Bridge (paul-oms) + * bug #46545 Fix getting class constraints on debug command (loic425) + * bug #46548 [Mime] Allow url as a path in the DataPart::fromPath (wkania) + * bug #46576 Fix choice filter error when loading mix of grouped and non-grouped choices (BreyndotEchse) + * bug #46594 [FrameworkBundle] Fix XML cache config (HeahDude) + * bug #46610 [Messenger] use the outermost wrapping DBAL connection (xabbuh) + * bug #46595 [Console] Escape in command name & description from getDefaultName() (ogizanagi) + * bug #46608 [Console] Fix deprecation when description is null (HypeMC) + * bug #46574 [Console] Escape in command name & description from PHP (getDefault* methods) (ogizanagi) + * bug #46577 [Serializer] Fix ignore attribute in Xml files (alamirault) + * bug #46565 [WebProfilerBundle] Fix dark theme selected line highlight color & reuse css vars (ogizanagi) + * bug #46525 [Serializer] Get attributeContext after converting name (zenas1210) + * bug #46535 [Mime] Check that the path is a file in the DataPart::fromPath (wkania) + * bug #46543 [Cache] do not pass null to strlen() (xabbuh) + * bug #46515 [PropertyInfo] Fix extracting int range type (norkunas) + * bug #46478 [Contracts] remove static cache from `ServiceSubscriberTrait` (kbond) + * 6.0.9 (2022-05-27) * bug #46386 [Console]  Fix missing negative variation of negatable options in shell completion (GromNaN) From 6f20e51288be1b2a33a58357e29abbd9da055ec0 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sun, 26 Jun 2022 19:02:18 +0200 Subject: [PATCH 68/68] Update VERSION for 6.0.10 --- 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 a8cf9f212e5cd..7892031a721ee 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -78,12 +78,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ private static array $freshCache = []; - public const VERSION = '6.0.10-DEV'; + public const VERSION = '6.0.10'; public const VERSION_ID = 60010; public const MAJOR_VERSION = 6; public const MINOR_VERSION = 0; public const RELEASE_VERSION = 10; - public const EXTRA_VERSION = 'DEV'; + public const EXTRA_VERSION = ''; public const END_OF_MAINTENANCE = '01/2023'; public const END_OF_LIFE = '01/2023';