From fd036f774f92c3f3f8abacd11e8b6d9fc3e75ee5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Julius=20H=C3=A4rtl?= Date: Mon, 24 Oct 2022 16:45:24 +0200 Subject: [PATCH] Do not throw errors when invalid setTo email is provided MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- lib/private/Mail/Message.php | 18 +++++++++++------- tests/lib/Mail/MessageTest.php | 17 ++++++++++++++--- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/private/Mail/Message.php b/lib/private/Mail/Message.php index c1b08b4e231..8b94f44ddba 100644 --- a/lib/private/Mail/Message.php +++ b/lib/private/Mail/Message.php @@ -78,14 +78,18 @@ class Message implements IMessage { $convertedAddresses = []; foreach ($addresses as $email => $readableName) { - if (!is_numeric($email)) { - [$name, $domain] = explode('@', $email, 2); - $domain = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46); - $convertedAddresses[$name.'@'.$domain] = $readableName; + $parsableEmail = is_numeric($email) ? $readableName : $email; + if (strpos($parsableEmail, '@') === false) { + $convertedAddresses[$parsableEmail] = $readableName; + continue; + } + + [$name, $domain] = explode('@', $parsableEmail, 2); + $domain = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46); + if (is_numeric($email)) { + $convertedAddresses[] = $name . '@' . $domain; } else { - [$name, $domain] = explode('@', $readableName, 2); - $domain = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46); - $convertedAddresses[$email] = $name.'@'.$domain; + $convertedAddresses[$name . '@' . $domain] = $readableName; } } diff --git a/tests/lib/Mail/MessageTest.php b/tests/lib/Mail/MessageTest.php index f30630824fc..bec70d1c78a 100644 --- a/tests/lib/Mail/MessageTest.php +++ b/tests/lib/Mail/MessageTest.php @@ -102,12 +102,23 @@ class MessageTest extends TestCase { $this->assertSame('lukas@owncloud.com', $this->message->getReplyTo()); } - public function testSetTo() { + /** @dataProvider dataSetTo */ + public function testSetTo(array $to, array $expected) { $this->swiftMessage ->expects($this->once()) ->method('setTo') - ->with(['lukas@owncloud.com']); - $this->message->setTo(['lukas@owncloud.com']); + ->with($expected); + $this->message->setTo($to); + } + + public function dataSetTo(): array { + return [ + [['robot@example.com'], ['robot@example.com']], + [['robot'], ['robot' => 'robot']], + [['robot' => 'robot display name'], ['robot' => 'robot display name']], + [['example@🤖.com'], ['example@xn--yp9h.com']], + [['example@🤖.com' => 'A robot'], ['example@xn--yp9h.com' => 'A robot']], + ]; } /** -- 2.39.5