Skip to content

Commit

Permalink
fix(caldav): Only track interactions of event organizers
Browse files Browse the repository at this point in the history
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
  • Loading branch information
ChristophWurst committed Jun 15, 2023
1 parent 6cb75e8 commit 34d12a7
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 3 deletions.
22 changes: 21 additions & 1 deletion apps/dav/lib/Listener/CalendarContactInteractionListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -142,10 +142,30 @@ private function emitFromUri(string $uri, IUser $user): void {
}

private function emitFromObject(VEvent $vevent, IUser $user): void {
if (!$vevent->ATTENDEE) {
$userEmail = $user->getPrimaryEMailAddress();
if ($userEmail === null) {
// This user can't be organizer
return;
}

if (!$vevent->ORGANIZER || !$vevent->ATTENDEE) {
// Nothing left to do
return;
}
$organizer = $vevent->ORGANIZER;
if (!($organizer instanceof Property)) {
return;
}
$organizerMailTo = $organizer->getValue();
if (strpos($organizerMailTo, 'mailto:') !== 0) {
// Doesn't look like an email
return;
}
$organizerEmail = substr($organizerMailTo, strlen('mailto:'));
$userEmail = $user->getPrimaryEMailAddress();
if ($organizerEmail !== $userEmail) {
return;
}

foreach ($vevent->ATTENDEE as $attendee) {
if (!($attendee instanceof Property)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,14 +135,63 @@ public function testParseCalendarEventWithInvalidEmail(): void {
DTSTART;TZID=Europe/Vienna:20210202T103000
DTEND;TZID=Europe/Vienna:20210202T133000
SUMMARY:tes
ORGANIZER;CN=admin:mailto:christoph.wurst@nextcloud.com
ORGANIZER;CN=admin:mailto:user@domain.tld
ATTENDEE;CN=somethingbutnotanemail;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;
ROLE=REQ-PARTICIPANT;RSVP=FALSE:mailto:somethingbutnotanemail
DESCRIPTION:test
END:VEVENT
END:VCALENDAR
EVENT]);
$user = $this->createMock(IUser::class);
$user->method('getPrimaryEMailAddress')->willReturn('user@domain.tld');
$this->userSession->expects(self::once())->method('getUser')->willReturn($user);
$this->eventDispatcher->expects(self::never())->method('dispatchTyped');
$this->logger->expects(self::never())->method('warning');

$this->listener->handle($event);
}

public function testParseImportedEventWithUnknownOrganizer(): void {
$event = new CalendarObjectCreatedEvent(123, [], [], ['calendardata' => <<<EVENT
BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
PRODID:-//IDN nextcloud.com//Calendar app 2.1.3//EN
BEGIN:VTIMEZONE
TZID:Europe/Vienna
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
CREATED:20210202T091151Z
DTSTAMP:20210203T130231Z
LAST-MODIFIED:20210203T130231Z
SEQUENCE:9
UID:b74a0c8e-93b0-447f-aed5-b679b19e874a
DTSTART;TZID=Europe/Vienna:20210202T103000
DTEND;TZID=Europe/Vienna:20210202T133000
SUMMARY:tes
ORGANIZER;CN=admin:mailto:someoneelse@email.tld
ATTENDEE;CN=somethingbutnotanemail;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;
ROLE=REQ-PARTICIPANT;RSVP=FALSE:mailto:somethingbutnotanemail
DESCRIPTION:test
END:VEVENT
END:VCALENDAR
EVENT]);
$user = $this->createMock(IUser::class);
$user->method('getPrimaryEMailAddress')->willReturn('user@domain.tld');
$this->userSession->expects(self::once())->method('getUser')->willReturn($user);
$this->eventDispatcher->expects(self::never())->method('dispatchTyped');
$this->logger->expects(self::never())->method('warning');
Expand Down Expand Up @@ -182,14 +231,15 @@ public function testParseCalendarEvent(): void {
DTSTART;TZID=Europe/Vienna:20210202T103000
DTEND;TZID=Europe/Vienna:20210202T133000
SUMMARY:tes
ORGANIZER;CN=admin:mailto:christoph.wurst@nextcloud.com
ORGANIZER;CN=admin:mailto:user@domain.tld
ATTENDEE;CN=user@domain.tld;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;
ROLE=REQ-PARTICIPANT;RSVP=FALSE:mailto:user@domain.tld
DESCRIPTION:test
END:VEVENT
END:VCALENDAR
EVENT]);
$user = $this->createMock(IUser::class);
$user->method('getPrimaryEMailAddress')->willReturn('user@domain.tld');
$this->userSession->expects(self::once())->method('getUser')->willReturn($user);
$this->mailer->expects(self::once())->method('validateMailAddress')->willReturn(true);
$this->eventDispatcher->expects(self::once())
Expand Down

0 comments on commit 34d12a7

Please sign in to comment.