From ee49a78afa8f082269563d1c15c4dd04246583f9 Mon Sep 17 00:00:00 2001 From: 0x346e3730 Date: Wed, 17 Jan 2024 20:36:48 +0400 Subject: [PATCH] [Mime] Fix undefined array key 0 when empty sender --- src/Symfony/Component/Mime/Email.php | 4 ++++ src/Symfony/Component/Mime/Message.php | 5 ++++- src/Symfony/Component/Mime/Tests/EmailTest.php | 8 ++++++++ src/Symfony/Component/Mime/Tests/MessageTest.php | 9 +++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Mime/Email.php b/src/Symfony/Component/Mime/Email.php index bd0a476c4f778..43ac52b386ea9 100644 --- a/src/Symfony/Component/Mime/Email.php +++ b/src/Symfony/Component/Mime/Email.php @@ -121,6 +121,10 @@ public function addFrom(...$addresses) */ public function from(...$addresses) { + if (!$addresses) { + throw new LogicException('"from()" must be called with at least one address.'); + } + return $this->setListAddressHeaderBody('From', $addresses); } diff --git a/src/Symfony/Component/Mime/Message.php b/src/Symfony/Component/Mime/Message.php index 651ffd4529ba8..3af0186c7e314 100644 --- a/src/Symfony/Component/Mime/Message.php +++ b/src/Symfony/Component/Mime/Message.php @@ -140,7 +140,10 @@ public function generateMessageId(): string if ($this->headers->has('Sender')) { $sender = $this->headers->get('Sender')->getAddress(); } elseif ($this->headers->has('From')) { - $sender = $this->headers->get('From')->getAddresses()[0]; + if (!$froms = $this->headers->get('From')->getAddresses()) { + throw new LogicException('A "From" header must have at least one email address.'); + } + $sender = $froms[0]; } else { throw new LogicException('An email must have a "From" or a "Sender" header.'); } diff --git a/src/Symfony/Component/Mime/Tests/EmailTest.php b/src/Symfony/Component/Mime/Tests/EmailTest.php index 516a589180823..058849f2ac4ca 100644 --- a/src/Symfony/Component/Mime/Tests/EmailTest.php +++ b/src/Symfony/Component/Mime/Tests/EmailTest.php @@ -15,6 +15,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; +use Symfony\Component\Mime\Exception\LogicException; use Symfony\Component\Mime\Part\DataPart; use Symfony\Component\Mime\Part\Multipart\AlternativePart; use Symfony\Component\Mime\Part\Multipart\MixedPart; @@ -62,6 +63,13 @@ public function testSender() $this->assertSame($fabien, $e->getSender()); } + public function testFromWithNoAddress() + { + $e = new Email(); + $this->expectException(LogicException::class); + $e->from(); + } + public function testFrom() { $e = new Email(); diff --git a/src/Symfony/Component/Mime/Tests/MessageTest.php b/src/Symfony/Component/Mime/Tests/MessageTest.php index 86431903de1bd..c2c4c37bc3fb9 100644 --- a/src/Symfony/Component/Mime/Tests/MessageTest.php +++ b/src/Symfony/Component/Mime/Tests/MessageTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Mime\Address; +use Symfony\Component\Mime\Exception\LogicException; use Symfony\Component\Mime\Header\Headers; use Symfony\Component\Mime\Header\MailboxListHeader; use Symfony\Component\Mime\Header\UnstructuredHeader; @@ -125,6 +126,14 @@ public function testGetPreparedHeadersHasSenderWhenNeeded() $this->assertEquals('thomas@symfony.com', $message->getPreparedHeaders()->get('Sender')->getAddress()->getAddress()); } + public function testGenerateMessageIdThrowsWhenHasFromButNoAddresses() + { + $message = new Message(); + $message->getHeaders()->addMailboxListHeader('From', []); + $this->expectException(LogicException::class); + $message->generateMessageId(); + } + public function testToString() { $message = new Message();