diff --git a/CHANGELOG-4.4.md b/CHANGELOG-4.4.md
index b1baa0f18dd9f..40d08340ad617 100644
--- a/CHANGELOG-4.4.md
+++ b/CHANGELOG-4.4.md
@@ -7,6 +7,12 @@ 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.29 (2021-07-29)
+
+ * bug #42307 [Mailer] Fixed decode exception when sendgrid response is 202 (rubanooo)
+ * bug #42296 [Dotenv][Yaml] Remove PHP 8.0 polyfill (derrabus)
+ * bug #42289 [HttpFoundation] Fixed type mismatch (Toflar)
+
* 4.4.28 (2021-07-27)
* bug #42270 [WebProfilerBundle] [WebProfiler] "empty" filter bugfix. Filter with name "empty" is not … (luzrain)
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 8e58e8b338eb2..5c9b27862671f 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -139,6 +139,7 @@ The Symfony Connect username in parenthesis allows to get more information
- Włodzimierz Gajda (gajdaw)
- Christian Scheb
- Adrien Brault (adrienbrault)
+ - Yanick Witschi (toflar)
- Julien Falque (julienfalque)
- Jacob Dreesen (jdreesen)
- Malte Schlüter (maltemaltesich)
@@ -148,13 +149,12 @@ The Symfony Connect username in parenthesis allows to get more information
- Colin Frei
- Javier Spagnoletti (phansys)
- Joshua Thijssen
- - Yanick Witschi (toflar)
+ - HypeMC (hypemc)
- Daniel Wehner (dawehner)
- Tugdual Saunier (tucksaun)
- excelwebzone
- Gordon Franke (gimler)
- Saif Eddin Gmati (azjezz)
- - HypeMC (hypemc)
- Jesse Rushlow (geeshoe)
- Fabien Pennequin (fabienpennequin)
- Théo FIDRY (theofidry)
@@ -163,10 +163,12 @@ The Symfony Connect username in parenthesis allows to get more information
- Eric GELOEN (gelo)
- Matthieu Napoli (mnapoli)
- Jannik Zschiesche (apfelbox)
+ - Mathieu Santostefano (welcomattic)
- Robert Schönthal (digitalkaoz)
- Florian Lonqueu-Brochard (florianlb)
- Richard van Laak (rvanlaak)
- Tigran Azatyan (tigranazatyan)
+ - YaFou
- Gary PEGEOT (gary-p)
- Gabriel Caruso (carusogabriel)
- Stefano Sala (stefano.sala)
@@ -184,12 +186,10 @@ The Symfony Connect username in parenthesis allows to get more information
- Albert Casademont (acasademont)
- Arnaud Kleinpeter (nanocom)
- Guilherme Blanco (guilhermeblanco)
- - Mathieu Santostefano (welcomattic)
- Smaine Milianni (ismail1432)
- SpacePossum
- Pablo Godel (pgodel)
- Andreas Braun
- - YaFou
- Jérémie Augustin (jaugustin)
- François-Xavier de Guillebon (de-gui_f)
- Oleg Voronkovich
@@ -291,6 +291,7 @@ The Symfony Connect username in parenthesis allows to get more information
- sun (sun)
- Larry Garfield (crell)
- Edi Modrić (emodric)
+ - Roman Martinuk (a2a4)
- Leo Feyer (leofeyer)
- Nikolay Labinskiy (e-moe)
- Martin Schuhfuß (usefulthink)
@@ -330,7 +331,6 @@ The Symfony Connect username in parenthesis allows to get more information
- Pascal Montoya
- Julien Brochet (mewt)
- Gocha Ossinkine (ossinkine)
- - Roman Martinuk (a2a4)
- Tristan Darricau (nicofuma)
- Victor Bocharsky (bocharsky_bw)
- Bozhidar Hristov (warxcell)
@@ -453,6 +453,7 @@ The Symfony Connect username in parenthesis allows to get more information
- Serkan Yildiz (srknyldz)
- Andrew Moore (finewolf)
- Bertrand Zuchuat (garfield-fr)
+ - Sébastien Alfaiate (seb33300)
- Gabor Toth (tgabi333)
- realmfoo
- Thomas Tourlourat (armetiz)
@@ -556,7 +557,6 @@ The Symfony Connect username in parenthesis allows to get more information
- Loïc Chardonnet (gnusat)
- Marek Kalnik (marekkalnik)
- Vyacheslav Salakhutdinov (megazoll)
- - Sébastien Alfaiate (seb33300)
- Phil Taylor (prazgod)
- Hassan Amouhzi
- Tamas Szijarto
@@ -632,6 +632,7 @@ The Symfony Connect username in parenthesis allows to get more information
- Gunnstein Lye (glye)
- Matthias Krauser (mkrauser)
- Erkhembayar Gantulga (erheme318)
+ - Lorenzo Millucci (lmillucci)
- Jérôme Tamarelle (jtamarelle-prismamedia)
- Andrii Popov (andrii-popov)
- Islam93
@@ -887,7 +888,6 @@ The Symfony Connect username in parenthesis allows to get more information
- Julien Turby
- Marvin Butkereit
- Eduard Bulava (nonanerz)
- - Lorenzo Millucci (lmillucci)
- Renan
- Ricky Su (ricky)
- Igor Timoshenko (igor.timoshenko)
@@ -1418,6 +1418,7 @@ The Symfony Connect username in parenthesis allows to get more information
- Valérian Galliat
- d-ph
- Renan Taranto (renan-taranto)
+ - Adrien Chinour
- Rikijs Murgs
- Uladzimir Tsykun
- Amaury Leroux de Lens (amo__)
@@ -1710,6 +1711,7 @@ The Symfony Connect username in parenthesis allows to get more information
- Nicolas Fabre (nfabre)
- Raul Rodriguez (raul782)
- Piet Steinhart
+ - mousezheng
- mshavliuk
- Rémy LESCALLIER
- WybrenKoelmans
@@ -2099,6 +2101,7 @@ The Symfony Connect username in parenthesis allows to get more information
- Andrei C. (moldman)
- Povilas S. (povilas)
- Laurent Negre (raulnet)
+ - Sergey Fokin (tyraelqp)
- Evrard Boulou
- pborreli
- Boris Betzholz
@@ -2796,6 +2799,7 @@ The Symfony Connect username in parenthesis allows to get more information
- Benedict Massolle (bemas)
- Gerard Berengue Llobera (bere)
- Bernd Matzner (bmatzner)
+ - Anton (bonio)
- Bram Tweedegolf (bram_tweedegolf)
- Brandon Kelly (brandonkelly)
- Choong Wei Tjeng (choonge)
diff --git a/src/Symfony/Component/Console/Input/InputOption.php b/src/Symfony/Component/Console/Input/InputOption.php
index c40e0da3445fa..c7729db20b8f4 100644
--- a/src/Symfony/Component/Console/Input/InputOption.php
+++ b/src/Symfony/Component/Console/Input/InputOption.php
@@ -48,9 +48,11 @@ class InputOption
private $description;
/**
- * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
- * @param int|null $mode The option mode: One of the VALUE_* constants
- * @param string|bool|int|float|array|null $default The default value (must be null for self::VALUE_NONE)
+ * @param string $name The option name
+ * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
+ * @param int|null $mode The option mode: One of the VALUE_* constants
+ * @param string $description A description text
+ * @param string|bool|int|float|array|null $default The default value (must be null for self::VALUE_NONE)
*
* @throws InvalidArgumentException If option mode is invalid or incompatible
*/
diff --git a/src/Symfony/Component/Dotenv/Dotenv.php b/src/Symfony/Component/Dotenv/Dotenv.php
index 09e847cb9e25f..57128b4ec73f4 100644
--- a/src/Symfony/Component/Dotenv/Dotenv.php
+++ b/src/Symfony/Component/Dotenv/Dotenv.php
@@ -135,7 +135,7 @@ public function populate(array $values, bool $overrideExistingVars = false): voi
$loadedVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? ''));
foreach ($values as $name => $value) {
- $notHttpName = !str_starts_with($name, 'HTTP_');
+ $notHttpName = 0 !== strpos($name, 'HTTP_');
// don't check existence with getenv() because of thread safety issues
if (!isset($loadedVars[$name]) && (!$overrideExistingVars && (isset($_ENV[$name]) || (isset($_SERVER[$name]) && $notHttpName)))) {
continue;
@@ -372,7 +372,7 @@ private function skipEmptyLines()
private function resolveCommands(string $value, array $loadedVars): string
{
- if (!str_contains($value, '$')) {
+ if (false === strpos($value, '$')) {
return $value;
}
@@ -408,7 +408,7 @@ private function resolveCommands(string $value, array $loadedVars): string
$env = [];
foreach ($this->values as $name => $value) {
- if (isset($loadedVars[$name]) || (!isset($_ENV[$name]) && !(isset($_SERVER[$name]) && !str_starts_with($name, 'HTTP_')))) {
+ if (isset($loadedVars[$name]) || (!isset($_ENV[$name]) && !(isset($_SERVER[$name]) && 0 !== strpos($name, 'HTTP_')))) {
$env[$name] = $value;
}
}
@@ -426,7 +426,7 @@ private function resolveCommands(string $value, array $loadedVars): string
private function resolveVariables(string $value, array $loadedVars): string
{
- if (!str_contains($value, '$')) {
+ if (false === strpos($value, '$')) {
return $value;
}
@@ -461,7 +461,7 @@ private function resolveVariables(string $value, array $loadedVars): string
$value = $this->values[$name];
} elseif (isset($_ENV[$name])) {
$value = $_ENV[$name];
- } elseif (isset($_SERVER[$name]) && !str_starts_with($name, 'HTTP_')) {
+ } elseif (isset($_SERVER[$name]) && 0 !== strpos($name, 'HTTP_')) {
$value = $_SERVER[$name];
} elseif (isset($this->values[$name])) {
$value = $this->values[$name];
diff --git a/src/Symfony/Component/Dotenv/composer.json b/src/Symfony/Component/Dotenv/composer.json
index 037d039f4a921..a6f7fdd7904aa 100644
--- a/src/Symfony/Component/Dotenv/composer.json
+++ b/src/Symfony/Component/Dotenv/composer.json
@@ -16,8 +16,7 @@
}
],
"require": {
- "php": ">=7.1.3",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=7.1.3"
},
"require-dev": {
"symfony/process": "^3.4.2|^4.0|^5.0"
diff --git a/src/Symfony/Component/HttpFoundation/Response.php b/src/Symfony/Component/HttpFoundation/Response.php
index a9cea09b39f05..e6b913f416508 100644
--- a/src/Symfony/Component/HttpFoundation/Response.php
+++ b/src/Symfony/Component/HttpFoundation/Response.php
@@ -311,7 +311,7 @@ public function prepare(Request $request)
}
// Check if we need to send extra expire info headers
- if ('1.0' == $this->getProtocolVersion() && str_contains($headers->get('Cache-Control'), 'no-cache')) {
+ if ('1.0' == $this->getProtocolVersion() && str_contains($headers->get('Cache-Control', ''), 'no-cache')) {
$headers->set('pragma', 'no-cache');
$headers->set('expires', -1);
}
diff --git a/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php b/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php
index f26302eef1120..d4b8812d99c21 100644
--- a/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php
+++ b/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php
@@ -578,6 +578,12 @@ public function testPrepareSetsPragmaOnHttp10Only()
$this->assertEquals('no-cache', $response->headers->get('pragma'));
$this->assertEquals('-1', $response->headers->get('expires'));
+ $response = new Response('foo');
+ $response->headers->remove('cache-control');
+ $response->prepare($request);
+ $this->assertFalse($response->headers->has('pragma'));
+ $this->assertFalse($response->headers->has('expires'));
+
$request->server->set('SERVER_PROTOCOL', 'HTTP/1.1');
$response = new Response('foo');
$response->prepare($request);
diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php
index df0874eb9edc2..321cca741b69d 100644
--- a/src/Symfony/Component/HttpKernel/Kernel.php
+++ b/src/Symfony/Component/HttpKernel/Kernel.php
@@ -76,11 +76,11 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl
private static $freshCache = [];
- public const VERSION = '4.4.28';
- public const VERSION_ID = 40428;
+ public const VERSION = '4.4.29';
+ public const VERSION_ID = 40429;
public const MAJOR_VERSION = 4;
public const MINOR_VERSION = 4;
- public const RELEASE_VERSION = 28;
+ public const RELEASE_VERSION = 29;
public const EXTRA_VERSION = '';
public const END_OF_MAINTENANCE = '11/2022';
diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php
index 14d841ac18a25..0134a6ff5ef7f 100644
--- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php
+++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php
@@ -54,15 +54,18 @@ protected function doSendApi(SentMessage $sentMessage, Email $email, Envelope $e
try {
$statusCode = $response->getStatusCode();
- $result = $response->toArray(false);
- } catch (DecodingExceptionInterface $e) {
- throw new HttpTransportException('Unable to send an email: '.$response->getContent(false).sprintf(' (code %d).', $statusCode), $response);
} catch (TransportExceptionInterface $e) {
throw new HttpTransportException('Could not reach the remote Sendgrid server.', $response, 0, $e);
}
if (202 !== $statusCode) {
- throw new HttpTransportException('Unable to send an email: '.implode('; ', array_column($result['errors'], 'message')).sprintf(' (code %d).', $statusCode), $response);
+ try {
+ $result = $response->toArray(false);
+
+ throw new HttpTransportException('Unable to send an email: '.implode('; ', array_column($result['errors'], 'message')).sprintf(' (code %d).', $statusCode), $response);
+ } catch (DecodingExceptionInterface $e) {
+ throw new HttpTransportException('Unable to send an email: '.$response->getContent(false).sprintf(' (code %d).', $statusCode), $response);
+ }
}
$sentMessage->setMessageId($response->getHeaders(false)['x-message-id'][0]);
diff --git a/src/Symfony/Component/Security/Core/Resources/translations/security.eu.xlf b/src/Symfony/Component/Security/Core/Resources/translations/security.eu.xlf
index d957ceee29904..cfcdd1b02c44d 100644
--- a/src/Symfony/Component/Security/Core/Resources/translations/security.eu.xlf
+++ b/src/Symfony/Component/Security/Core/Resources/translations/security.eu.xlf
@@ -70,6 +70,14 @@
Invalid or expired login link.
Sartzeko esteka baliogabea edo iraungia.
+
+ Too many failed login attempts, please try again in %minutes% minute.
+ Saioa hasteko huts gehiegi egin dira, saiatu berriro minutu %minutes% geroago.
+
+
+ Too many failed login attempts, please try again in %minutes% minutes.
+ Saioa hasteko huts gehiegi egin dira, saiatu berriro %minutes% minututan.
+