[CalDAV] Validate notified emails

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2021-01-25 09:02:38 +01:00
parent 2fe66cb2e3
commit a720bdb83d
No known key found for this signature in database
GPG Key ID: A061B9DDE0CA0773
2 changed files with 131 additions and 76 deletions

View File

@ -114,6 +114,11 @@ class EmailProvider extends AbstractProvider {
$template->addFooter(); $template->addFooter();
foreach ($emailAddresses as $emailAddress) { foreach ($emailAddresses as $emailAddress) {
if (!$this->mailer->validateMailAddress($emailAddress)) {
$this->logger->error('Email address {address} for reminder notification is incorrect', ['app' => 'dav', 'address' => $emailAddress]);
continue;
}
$message = $this->mailer->createMessage(); $message = $this->mailer->createMessage();
$message->setFrom([$fromEMail]); $message->setFrom([$fromEMail]);
if ($organizer) { if ($organizer) {
@ -196,6 +201,10 @@ class EmailProvider extends AbstractProvider {
$organizerEMail = substr($organizer->getValue(), 7); $organizerEMail = substr($organizer->getValue(), 7);
if (!$this->mailer->validateMailAddress($organizerEMail)) {
return null;
}
$name = $organizer->offsetGet('CN'); $name = $organizer->offsetGet('CN');
if ($name instanceof Parameter) { if ($name instanceof Parameter) {
return [$organizerEMail => $name]; return [$organizerEMail => $name];

View File

@ -78,29 +78,6 @@ class EmailProviderTest extends AbstractNotificationProviderTest {
} }
public function testSendWithoutAttendees():void { public function testSendWithoutAttendees():void {
$user1 = $this->createMock(IUser::class);
$user1->method('getUID')
->willReturn('uid1');
$user1->method('getEMailAddress')
->willReturn('uid1@example.com');
$user2 = $this->createMock(IUser::class);
$user2->method('getUID')
->willReturn('uid2');
$user2->method('getEMailAddress')
->willReturn('uid2@example.com');
$user3 = $this->createMock(IUser::class);
$user3->method('getUID')
->willReturn('uid3');
$user3->method('getEMailAddress')
->willReturn('uid3@example.com');
$user4 = $this->createMock(IUser::class);
$user4->method('getUID')
->willReturn('uid4');
$user4->method('getEMailAddress')
->willReturn(null);
$users = [$user1, $user2, $user3, $user4];
$this->config->expects($this->at(0)) $this->config->expects($this->at(0))
->method('getUserValue') ->method('getUserValue')
->with('uid1', 'core', 'lang', null) ->with('uid1', 'core', 'lang', null)
@ -113,6 +90,10 @@ class EmailProviderTest extends AbstractNotificationProviderTest {
->method('getUserValue') ->method('getUserValue')
->with('uid3', 'core', 'lang', null) ->with('uid3', 'core', 'lang', null)
->willReturn('de'); ->willReturn('de');
$this->config->expects($this->at(3))
->method('getUserValue')
->with('uid5', 'core', 'lang', null)
->willReturn('de');
$enL10N = $this->createMock(IL10N::class); $enL10N = $this->createMock(IL10N::class);
$enL10N->method('t') $enL10N->method('t')
@ -163,66 +144,63 @@ class EmailProviderTest extends AbstractNotificationProviderTest {
->willReturn($template1); ->willReturn($template1);
$this->mailer->expects($this->at(1)) $this->mailer->expects($this->at(1))
->method('validateMailAddress')
->with('uid1@example.com')
->willReturn(true);
$this->mailer->expects($this->at(2))
->method('createMessage') ->method('createMessage')
->with() ->with()
->willReturn($message11); ->willReturn($message11);
$this->mailer->expects($this->at(2)) $this->mailer->expects($this->at(3))
->method('send') ->method('send')
->with($message11) ->with($message11)
->willReturn([]); ->willReturn([]);
$this->mailer->expects($this->at(3)) $this->mailer->expects($this->at(4))
->method('createEMailTemplate') ->method('createEMailTemplate')
->with('dav.calendarReminder') ->with('dav.calendarReminder')
->willReturn($template2); ->willReturn($template2);
$this->mailer->expects($this->at(4))
->method('createMessage')
->with()
->willReturn($message21);
$this->mailer->expects($this->at(5)) $this->mailer->expects($this->at(5))
->method('send') ->method('validateMailAddress')
->with($message21) ->with('uid2@example.com')
->willReturn([]); ->willReturn(true);
$this->mailer->expects($this->at(6)) $this->mailer->expects($this->at(6))
->method('createMessage') ->method('createMessage')
->with() ->with()
->willReturn($message22); ->willReturn($message21);
$this->mailer->expects($this->at(7)) $this->mailer->expects($this->at(7))
->method('send')
->with($message21)
->willReturn([]);
$this->mailer->expects($this->at(8))
->method('validateMailAddress')
->with('uid3@example.com')
->willReturn(true);
$this->mailer->expects($this->at(9))
->method('createMessage')
->with()
->willReturn($message22);
$this->mailer->expects($this->at(10))
->method('send') ->method('send')
->with($message22) ->with($message22)
->willReturn([]); ->willReturn([]);
$this->mailer->expects($this->at(11))
->method('validateMailAddress')
->with('invalid')
->willReturn(false);
$this->setupURLGeneratorMock(2); $this->setupURLGeneratorMock(2);
$vcalendar = $this->getNoAttendeeVCalendar(); $vcalendar = $this->getNoAttendeeVCalendar();
$this->provider->send($vcalendar->VEVENT, $this->calendarDisplayName, $users); $this->provider->send($vcalendar->VEVENT, $this->calendarDisplayName, $this->getUsers());
} }
public function testSendWithAttendees(): void { public function testSendWithAttendees(): void {
$user1 = $this->createMock(IUser::class);
$user1->method('getUID')
->willReturn('uid1');
$user1->method('getEMailAddress')
->willReturn('uid1@example.com');
$user2 = $this->createMock(IUser::class);
$user2->method('getUID')
->willReturn('uid2');
$user2->method('getEMailAddress')
->willReturn('uid2@example.com');
$user3 = $this->createMock(IUser::class);
$user3->method('getUID')
->willReturn('uid3');
$user3->method('getEMailAddress')
->willReturn('uid3@example.com');
$user4 = $this->createMock(IUser::class);
$user4->method('getUID')
->willReturn('uid4');
$user4->method('getEMailAddress')
->willReturn(null);
$users = [$user1, $user2, $user3, $user4];
$this->config->expects($this->at(0)) $this->config->expects($this->at(0))
->method('getUserValue') ->method('getUserValue')
->with('uid1', 'core', 'lang', null) ->with('uid1', 'core', 'lang', null)
@ -235,6 +213,10 @@ class EmailProviderTest extends AbstractNotificationProviderTest {
->method('getUserValue') ->method('getUserValue')
->with('uid3', 'core', 'lang', null) ->with('uid3', 'core', 'lang', null)
->willReturn('de'); ->willReturn('de');
$this->config->expects($this->at(3))
->method('getUserValue')
->with('uid5', 'core', 'lang', null)
->willReturn('de');
$enL10N = $this->createMock(IL10N::class); $enL10N = $this->createMock(IL10N::class);
$enL10N->method('t') $enL10N->method('t')
@ -273,10 +255,12 @@ class EmailProviderTest extends AbstractNotificationProviderTest {
->with('dav', 'en') ->with('dav', 'en')
->willReturn($deL10N); ->willReturn($deL10N);
// German
$template1 = $this->getTemplateMock(); $template1 = $this->getTemplateMock();
$message11 = $this->getMessageMock('foo1@example.org', $template1); $message11 = $this->getMessageMock('foo1@example.org', $template1);
$message12 = $this->getMessageMock('uid2@example.com', $template1); $message12 = $this->getMessageMock('uid2@example.com', $template1);
$message13 = $this->getMessageMock('uid3@example.com', $template1); $message13 = $this->getMessageMock('uid3@example.com', $template1);
// English
$template2 = $this->getTemplateMock(); $template2 = $this->getTemplateMock();
$message21 = $this->getMessageMock('foo3@example.org', $template2); $message21 = $this->getMessageMock('foo3@example.org', $template2);
$message22 = $this->getMessageMock('foo4@example.org', $template2); $message22 = $this->getMessageMock('foo4@example.org', $template2);
@ -288,56 +272,88 @@ class EmailProviderTest extends AbstractNotificationProviderTest {
->willReturn($template1); ->willReturn($template1);
$this->mailer->expects($this->at(1)) $this->mailer->expects($this->at(1))
->method('validateMailAddress')
->with('foo1@example.org')
->willReturn(true);
$this->mailer->expects($this->at(2))
->method('createMessage') ->method('createMessage')
->with() ->with()
->willReturn($message11); ->willReturn($message11);
$this->mailer->expects($this->at(2)) $this->mailer->expects($this->at(3))
->method('send') ->method('send')
->with($message11) ->with($message11)
->willReturn([]); ->willReturn([]);
$this->mailer->expects($this->at(3))
->method('createMessage')
->with()
->willReturn($message12);
$this->mailer->expects($this->at(4)) $this->mailer->expects($this->at(4))
->method('send') ->method('validateMailAddress')
->with($message12) ->with('uid2@example.com')
->willReturn([]); ->willReturn(true);
$this->mailer->expects($this->at(5)) $this->mailer->expects($this->at(5))
->method('createMessage') ->method('createMessage')
->with() ->with()
->willReturn($message13); ->willReturn($message12);
$this->mailer->expects($this->at(6)) $this->mailer->expects($this->at(6))
->method('send')
->with($message12)
->willReturn([]);
$this->mailer->expects($this->at(7))
->method('validateMailAddress')
->with('uid3@example.com')
->willReturn(true);
$this->mailer->expects($this->at(8))
->method('createMessage')
->with()
->willReturn($message13);
$this->mailer->expects($this->at(9))
->method('send') ->method('send')
->with($message13) ->with($message13)
->willReturn([]); ->willReturn([]);
$this->mailer->expects($this->at(10))
->method('validateMailAddress')
->with('invalid')
->willReturn(false);
$this->mailer->expects($this->at(7)) $this->mailer->expects($this->at(11))
->method('createEMailTemplate') ->method('createEMailTemplate')
->with('dav.calendarReminder') ->with('dav.calendarReminder')
->willReturn($template2); ->willReturn($template2);
$this->mailer->expects($this->at(8)) $this->mailer->expects($this->at(12))
->method('validateMailAddress')
->with('foo3@example.org')
->willReturn(true);
$this->mailer->expects($this->at(13))
->method('createMessage') ->method('createMessage')
->with() ->with()
->willReturn($message21); ->willReturn($message21);
$this->mailer->expects($this->at(9)) $this->mailer->expects($this->at(14))
->method('send') ->method('send')
->with($message21) ->with($message21)
->willReturn([]); ->willReturn([]);
$this->mailer->expects($this->at(10))
$this->mailer->expects($this->at(15))
->method('validateMailAddress')
->with('foo4@example.org')
->willReturn(true);
$this->mailer->expects($this->at(16))
->method('createMessage') ->method('createMessage')
->with() ->with()
->willReturn($message22); ->willReturn($message22);
$this->mailer->expects($this->at(11)) $this->mailer->expects($this->at(17))
->method('send') ->method('send')
->with($message22) ->with($message22)
->willReturn([]); ->willReturn([]);
$this->mailer->expects($this->at(12))
$this->mailer->expects($this->at(18))
->method('validateMailAddress')
->with('uid1@example.com')
->willReturn(true);
$this->mailer->expects($this->at(19))
->method('createMessage') ->method('createMessage')
->with() ->with()
->willReturn($message23); ->willReturn($message23);
$this->mailer->expects($this->at(13)) $this->mailer->expects($this->at(20))
->method('send') ->method('send')
->with($message23) ->with($message23)
->willReturn([]); ->willReturn([]);
@ -345,7 +361,7 @@ class EmailProviderTest extends AbstractNotificationProviderTest {
$this->setupURLGeneratorMock(2); $this->setupURLGeneratorMock(2);
$vcalendar = $this->getAttendeeVCalendar(); $vcalendar = $this->getAttendeeVCalendar();
$this->provider->send($vcalendar->VEVENT, $this->calendarDisplayName, $users); $this->provider->send($vcalendar->VEVENT, $this->calendarDisplayName, $this->getUsers());
} }
/** /**
@ -398,9 +414,9 @@ class EmailProviderTest extends AbstractNotificationProviderTest {
} }
/** /**
* @param array $toMail * @param string $toMail
* @param IEMailTemplate $templateMock * @param IEMailTemplate $templateMock
* @param array $replyTo * @param array|null $replyTo
* @return IMessage * @return IMessage
*/ */
private function getMessageMock(string $toMail, IEMailTemplate $templateMock, array $replyTo=null):IMessage { private function getMessageMock(string $toMail, IEMailTemplate $templateMock, array $replyTo=null):IMessage {
@ -546,4 +562,34 @@ class EmailProviderTest extends AbstractNotificationProviderTest {
->willReturn('AbsURL4'); ->willReturn('AbsURL4');
} }
} }
private function getUsers(): array {
$user1 = $this->createMock(IUser::class);
$user1->method('getUID')
->willReturn('uid1');
$user1->method('getEMailAddress')
->willReturn('uid1@example.com');
$user2 = $this->createMock(IUser::class);
$user2->method('getUID')
->willReturn('uid2');
$user2->method('getEMailAddress')
->willReturn('uid2@example.com');
$user3 = $this->createMock(IUser::class);
$user3->method('getUID')
->willReturn('uid3');
$user3->method('getEMailAddress')
->willReturn('uid3@example.com');
$user4 = $this->createMock(IUser::class);
$user4->method('getUID')
->willReturn('uid4');
$user4->method('getEMailAddress')
->willReturn(null);
$user5 = $this->createMock(IUser::class);
$user5->method('getUID')
->willReturn('uid5');
$user5->method('getEMailAddress')
->willReturn('invalid');
return [$user1, $user2, $user3, $user4, $user5];
}
} }