]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(caldav): when message is a reply compare the message sender not the recipient 46145/head
authorSebastianKrupinski <krupinskis05@gmail.com>
Wed, 17 Apr 2024 14:40:31 +0000 (10:40 -0400)
committerSebastianKrupinski <krupinskis05@gmail.com>
Wed, 26 Jun 2024 21:45:22 +0000 (17:45 -0400)
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
apps/dav/lib/CalDAV/Schedule/IMipService.php
apps/dav/tests/unit/CalDAV/Schedule/IMipServiceTest.php

index 95c6b5739af283deac9ff8ae6d7cf4d8d42de034..1a99a859279c9793d21b55dba16fa3a8ddbe0f89 100644 (file)
@@ -569,8 +569,11 @@ class IMipService {
                $vevent = $iTipMessage->message->VEVENT;
                $attendees = $vevent->select('ATTENDEE');
                foreach ($attendees as $attendee) {
-                       /** @var Property $attendee */
-                       if (strcasecmp($attendee->getValue(), $iTipMessage->recipient) === 0) {
+                       if ($iTipMessage->method === 'REPLY' && strcasecmp($attendee->getValue(), $iTipMessage->sender) === 0) {
+                               /** @var Property $attendee */
+                               return $attendee;
+                       } elseif (strcasecmp($attendee->getValue(), $iTipMessage->recipient) === 0) {
+                               /** @var Property $attendee */
                                return $attendee;
                        }
                }
index 142731098266a97bc70364ff4bb9e17ea0730082..fd48d04dc8e0888253ef9d10dbd39aebece6f44a 100644 (file)
@@ -41,6 +41,7 @@ use OCP\Security\ISecureRandom;
 use PHPUnit\Framework\MockObject\MockObject;
 use Sabre\VObject\Component\VCalendar;
 use Sabre\VObject\Component\VEvent;
+use Sabre\VObject\ITip\Message;
 use Sabre\VObject\Property\ICalendar\DateTime;
 use Test\TestCase;
 
@@ -271,4 +272,74 @@ class IMipServiceTest extends TestCase {
                $occurrence = $this->service->getLastOccurrence($vCalendar);
                $this->assertEquals(1451606400, $occurrence);
        }
+
+       public function testGetCurrentAttendeeRequest(): void {
+               // Construct ITip Message
+               $message = new Message();
+               $message->method = 'REQUEST';
+               $message->sequence = 1;
+               $message->sender = 'mailto:organizer@example.com';
+               $message->senderName = 'The Organizer';
+               $message->recipient = 'mailto:attendee@example.com';
+               $message->recipientName = 'The Attendee';
+               $message->significantChange = true;
+               $message->message = new VCalendar();
+               $message->message->add('VEVENT', ['UID' => '82496785-1915-4604-a5ce-4e2091639c9a', 'SEQUENCE' => 1]);
+               $message->message->VEVENT->add('SUMMARY', 'Fellowship meeting');
+               $message->message->VEVENT->add('DTSTART', (new \DateTime('NOW'))->modify('+1 hour'));
+               $message->message->VEVENT->add('DTEND', (new \DateTime('NOW'))->modify('+2 hour'));
+               $message->message->VEVENT->add('ORGANIZER', 'mailto:organizer@example.com', ['CN' => 'The Organizer']);
+               $message->message->VEVENT->add('ATTENDEE', 'mailto:attendee@example.com', ['CN' => 'The Attendee']);
+               // Test getCurrentAttendee
+               $result = $this->service->getCurrentAttendee($message);
+               // Evaluate Result
+               $this->assertEquals($message->message->VEVENT->ATTENDEE, $result);
+       }
+
+       public function testGetCurrentAttendeeReply(): void {
+               // Construct ITip Message
+               $message = new Message();
+               $message->method = 'REPLY';
+               $message->sequence = 2;
+               $message->sender = 'mailto:attendee@example.com';
+               $message->senderName = 'The Attendee';
+               $message->recipient = 'mailto:organizer@example.com';
+               $message->recipientName = 'The Organizer';
+               $message->significantChange = true;
+               $message->message = new VCalendar();
+               $message->message->add('METHOD', 'REPLY');
+               $message->message->add('VEVENT', ['UID' => '82496785-1915-4604-a5ce-4e2091639c9a', 'SEQUENCE' => 2]);
+               $message->message->VEVENT->add('SUMMARY', 'Fellowship meeting');
+               $message->message->VEVENT->add('DTSTART', (new \DateTime('NOW'))->modify('+1 hour'));
+               $message->message->VEVENT->add('DTEND', (new \DateTime('NOW'))->modify('+2 hour'));
+               $message->message->VEVENT->add('ORGANIZER', 'mailto:organizer@example.com', ['CN' => 'The Organizer']);
+               $message->message->VEVENT->add('ATTENDEE', 'mailto:attendee@example.com', ['CN' => 'The Attendee']);
+               // Test getCurrentAttendee
+               $result = $this->service->getCurrentAttendee($message);
+               // Evaluate Result
+               $this->assertEquals($message->message->VEVENT->ATTENDEE, $result);
+       }
+
+       public function testGetCurrentAttendeeMismatch(): void {
+               // Construct ITip Message
+               $message = new Message();
+               $message->method = 'REQUEST';
+               $message->sequence = 1;
+               $message->sender = 'mailto:organizer@example.com';
+               $message->senderName = 'The Organizer';
+               $message->recipient = 'mailto:mismatch@example.com';
+               $message->recipientName = 'The Mismatch';
+               $message->significantChange = true;
+               $message->message = new VCalendar();
+               $message->message->add('VEVENT', ['UID' => '82496785-1915-4604-a5ce-4e2091639c9a', 'SEQUENCE' => 1]);
+               $message->message->VEVENT->add('SUMMARY', 'Fellowship meeting');
+               $message->message->VEVENT->add('DTSTART', (new \DateTime('NOW'))->modify('+1 hour'));
+               $message->message->VEVENT->add('DTEND', (new \DateTime('NOW'))->modify('+2 hour'));
+               $message->message->VEVENT->add('ORGANIZER', 'mailto:organizer@example.com', ['CN' => 'The Organizer']);
+               $message->message->VEVENT->add('ATTENDEE', 'mailto:attendee@example.com', ['CN' => 'The Attendee']);
+               // Test getCurrentAttendee
+               $result = $this->service->getCurrentAttendee($message);
+               // Evaluate Result
+               $this->assertEquals(null, $result);
+       }
 }