Skip to content

Commit 7c60d70

Browse files
authored
Merge pull request #46145 from nextcloud/backport/44893/stable28
[stable28] fix(caldav): When message is a reply compare the message sender not the recipient
2 parents 427f3c9 + 77291ce commit 7c60d70

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

apps/dav/lib/CalDAV/Schedule/IMipService.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -569,8 +569,11 @@ public function getCurrentAttendee(Message $iTipMessage): ?Property {
569569
$vevent = $iTipMessage->message->VEVENT;
570570
$attendees = $vevent->select('ATTENDEE');
571571
foreach ($attendees as $attendee) {
572-
/** @var Property $attendee */
573-
if (strcasecmp($attendee->getValue(), $iTipMessage->recipient) === 0) {
572+
if ($iTipMessage->method === 'REPLY' && strcasecmp($attendee->getValue(), $iTipMessage->sender) === 0) {
573+
/** @var Property $attendee */
574+
return $attendee;
575+
} elseif (strcasecmp($attendee->getValue(), $iTipMessage->recipient) === 0) {
576+
/** @var Property $attendee */
574577
return $attendee;
575578
}
576579
}

apps/dav/tests/unit/CalDAV/Schedule/IMipServiceTest.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
use PHPUnit\Framework\MockObject\MockObject;
4242
use Sabre\VObject\Component\VCalendar;
4343
use Sabre\VObject\Component\VEvent;
44+
use Sabre\VObject\ITip\Message;
4445
use Sabre\VObject\Property\ICalendar\DateTime;
4546
use Test\TestCase;
4647

@@ -271,4 +272,74 @@ public function testGetLastOccurrenceFallback(): void {
271272
$occurrence = $this->service->getLastOccurrence($vCalendar);
272273
$this->assertEquals(1451606400, $occurrence);
273274
}
275+
276+
public function testGetCurrentAttendeeRequest(): void {
277+
// Construct ITip Message
278+
$message = new Message();
279+
$message->method = 'REQUEST';
280+
$message->sequence = 1;
281+
$message->sender = 'mailto:organizer@example.com';
282+
$message->senderName = 'The Organizer';
283+
$message->recipient = 'mailto:attendee@example.com';
284+
$message->recipientName = 'The Attendee';
285+
$message->significantChange = true;
286+
$message->message = new VCalendar();
287+
$message->message->add('VEVENT', ['UID' => '82496785-1915-4604-a5ce-4e2091639c9a', 'SEQUENCE' => 1]);
288+
$message->message->VEVENT->add('SUMMARY', 'Fellowship meeting');
289+
$message->message->VEVENT->add('DTSTART', (new \DateTime('NOW'))->modify('+1 hour'));
290+
$message->message->VEVENT->add('DTEND', (new \DateTime('NOW'))->modify('+2 hour'));
291+
$message->message->VEVENT->add('ORGANIZER', 'mailto:organizer@example.com', ['CN' => 'The Organizer']);
292+
$message->message->VEVENT->add('ATTENDEE', 'mailto:attendee@example.com', ['CN' => 'The Attendee']);
293+
// Test getCurrentAttendee
294+
$result = $this->service->getCurrentAttendee($message);
295+
// Evaluate Result
296+
$this->assertEquals($message->message->VEVENT->ATTENDEE, $result);
297+
}
298+
299+
public function testGetCurrentAttendeeReply(): void {
300+
// Construct ITip Message
301+
$message = new Message();
302+
$message->method = 'REPLY';
303+
$message->sequence = 2;
304+
$message->sender = 'mailto:attendee@example.com';
305+
$message->senderName = 'The Attendee';
306+
$message->recipient = 'mailto:organizer@example.com';
307+
$message->recipientName = 'The Organizer';
308+
$message->significantChange = true;
309+
$message->message = new VCalendar();
310+
$message->message->add('METHOD', 'REPLY');
311+
$message->message->add('VEVENT', ['UID' => '82496785-1915-4604-a5ce-4e2091639c9a', 'SEQUENCE' => 2]);
312+
$message->message->VEVENT->add('SUMMARY', 'Fellowship meeting');
313+
$message->message->VEVENT->add('DTSTART', (new \DateTime('NOW'))->modify('+1 hour'));
314+
$message->message->VEVENT->add('DTEND', (new \DateTime('NOW'))->modify('+2 hour'));
315+
$message->message->VEVENT->add('ORGANIZER', 'mailto:organizer@example.com', ['CN' => 'The Organizer']);
316+
$message->message->VEVENT->add('ATTENDEE', 'mailto:attendee@example.com', ['CN' => 'The Attendee']);
317+
// Test getCurrentAttendee
318+
$result = $this->service->getCurrentAttendee($message);
319+
// Evaluate Result
320+
$this->assertEquals($message->message->VEVENT->ATTENDEE, $result);
321+
}
322+
323+
public function testGetCurrentAttendeeMismatch(): void {
324+
// Construct ITip Message
325+
$message = new Message();
326+
$message->method = 'REQUEST';
327+
$message->sequence = 1;
328+
$message->sender = 'mailto:organizer@example.com';
329+
$message->senderName = 'The Organizer';
330+
$message->recipient = 'mailto:mismatch@example.com';
331+
$message->recipientName = 'The Mismatch';
332+
$message->significantChange = true;
333+
$message->message = new VCalendar();
334+
$message->message->add('VEVENT', ['UID' => '82496785-1915-4604-a5ce-4e2091639c9a', 'SEQUENCE' => 1]);
335+
$message->message->VEVENT->add('SUMMARY', 'Fellowship meeting');
336+
$message->message->VEVENT->add('DTSTART', (new \DateTime('NOW'))->modify('+1 hour'));
337+
$message->message->VEVENT->add('DTEND', (new \DateTime('NOW'))->modify('+2 hour'));
338+
$message->message->VEVENT->add('ORGANIZER', 'mailto:organizer@example.com', ['CN' => 'The Organizer']);
339+
$message->message->VEVENT->add('ATTENDEE', 'mailto:attendee@example.com', ['CN' => 'The Attendee']);
340+
// Test getCurrentAttendee
341+
$result = $this->service->getCurrentAttendee($message);
342+
// Evaluate Result
343+
$this->assertEquals(null, $result);
344+
}
274345
}

0 commit comments

Comments
 (0)