diff --git a/lib/private/Mail/Mailer.php b/lib/private/Mail/Mailer.php index 61dc6f9214be6..750a5ee80e57f 100644 --- a/lib/private/Mail/Mailer.php +++ b/lib/private/Mail/Mailer.php @@ -36,6 +36,7 @@ namespace OC\Mail; use Egulias\EmailValidator\EmailValidator; +use Egulias\EmailValidator\Validation\NoRFCWarningsValidation; use Egulias\EmailValidator\Validation\RFCValidation; use OCP\Defaults; use OCP\EventDispatcher\IEventDispatcher; @@ -233,8 +234,10 @@ public function validateMailAddress(string $email): bool { // Shortcut: empty addresses are never valid return false; } + + $strictMailCheck = $this->config->getAppValue('core', 'enforce_strict_email_check', 'no') === 'yes'; $validator = new EmailValidator(); - $validation = new RFCValidation(); + $validation = $strictMailCheck ? new NoRFCWarningsValidation() : new RFCValidation(); return $validator->isValid($email, $validation); } diff --git a/tests/lib/Mail/MailerTest.php b/tests/lib/Mail/MailerTest.php index 0eee7db126a71..5626abb085af6 100644 --- a/tests/lib/Mail/MailerTest.php +++ b/tests/lib/Mail/MailerTest.php @@ -42,7 +42,7 @@ class MailerTest extends TestCase { private $l10n; /** @var Mailer */ private $mailer; - /** @var IEventDispatcher */ + /** @var IEventDispatcher&MockObject */ private $dispatcher; @@ -197,6 +197,7 @@ public function testSendInvalidMailException() { ]); $this->expectException(\Exception::class); + /** @var Message&MockObject */ $message = $this->getMockBuilder('\OC\Mail\Message') ->disableOriginalConstructor()->getMock(); $message->expects($this->once()) @@ -211,20 +212,27 @@ public function testSendInvalidMailException() { */ public function mailAddressProvider() { return [ - ['lukas@owncloud.com', true], - ['lukas@localhost', true], - ['lukas@192.168.1.1', true], - ['lukas@éxämplè.com', true], - ['asdf', false], - ['', false], - ['lukas@owncloud.org@owncloud.com', false], + ['lukas@owncloud.com', true, false], + ['lukas@localhost', true, false], + ['lukas@192.168.1.1', true, false], + ['lukas@éxämplè.com', true, false], + ['asdf', false, false], + ['', false, false], + ['lukas@owncloud.org@owncloud.com', false, false], + ['test@localhost', true, false], + ['test@localhost', false, true], ]; } /** * @dataProvider mailAddressProvider */ - public function testValidateMailAddress($email, $expected) { + public function testValidateMailAddress($email, $expected, $strict) { + $this->config + ->expects($this->atMost(1)) + ->method('getAppValue') + ->with('core', 'enforce_strict_email_check') + ->willReturn($strict ? 'yes' : 'no'); $this->assertSame($expected, $this->mailer->validateMailAddress($email)); } diff --git a/tests/lib/UtilTest.php b/tests/lib/UtilTest.php index 568f535e55752..1fdebfd5c4a21 100644 --- a/tests/lib/UtilTest.php +++ b/tests/lib/UtilTest.php @@ -91,11 +91,27 @@ public function testFileInfoLoaded() { $this->assertEquals($expected, \OC_Util::fileInfoLoaded()); } + /** + * Host is "localhost" this is a valid for emails, + * but not for default strict email verification that requires a top level domain. + * So we check that with strict email verification we fallback to the default + */ public function testGetDefaultEmailAddress() { $email = \OCP\Util::getDefaultEmailAddress("no-reply"); $this->assertEquals('no-reply@localhost', $email); } + /** + * If strict email check is enabled "localhost.localdomain" should validate as a valid email domain + */ + public function testGetDefaultEmailAddressStrict() { + $config = \OC::$server->getConfig(); + $config->setAppValue('core', 'enforce_strict_email_check', 'yes'); + $email = \OCP\Util::getDefaultEmailAddress("no-reply"); + $this->assertEquals('no-reply@localhost.localdomain', $email); + $config->deleteAppValue('core', 'enforce_strict_email_check'); + } + public function testGetDefaultEmailAddressFromConfig() { $config = \OC::$server->getConfig(); $config->setSystemValue('mail_domain', 'example.com');