From 2cd1b8e173837e8308049d77ff41f2726822e307 Mon Sep 17 00:00:00 2001 From: Nico Donath Date: Thu, 11 Jun 2026 14:01:13 +0000 Subject: [PATCH] fix(dav): send reply email to organizer when attendee responds via invitation link Signed-off-by: Nico Donath Assisted-by: ClaudeCode:claude-opus-4-8 Assisted-by: ClaudeCode:claude-fable-5 --- .../InvitationResponseServer.php | 6 +++ .../InvitationResponseServerTest.php | 51 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 apps/dav/tests/unit/CalDAV/InvitationResponse/InvitationResponseServerTest.php diff --git a/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php b/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php index de7815c68f2d7..21509585a72be 100644 --- a/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php +++ b/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php @@ -12,6 +12,7 @@ use OCA\DAV\CalDAV\Auth\PublicPrincipalPlugin; use OCA\DAV\CalDAV\DefaultCalendarValidator; use OCA\DAV\CalDAV\Publishing\PublishPlugin; +use OCA\DAV\CalDAV\Schedule\IMipPlugin; use OCA\DAV\Connector\Sabre\AnonymousOptionsPlugin; use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin; use OCA\DAV\Connector\Sabre\CachingTree; @@ -113,6 +114,11 @@ public function __construct(bool $public = true) { * @return void */ public function handleITipMessage(Message $iTipMessage) { + // Register the iMIP plugin only for the invitation-link flow, it must stay absent for createFromStringMinimal() and CalendarImpl + if ($this->server->getPlugin('imip') === null) { + $this->server->addPlugin(Server::get(IMipPlugin::class)); + } + /** @var \OCA\DAV\CalDAV\Schedule\Plugin $schedulingPlugin */ $schedulingPlugin = $this->server->getPlugin('caldav-schedule'); $schedulingPlugin->scheduleLocalDelivery($iTipMessage); diff --git a/apps/dav/tests/unit/CalDAV/InvitationResponse/InvitationResponseServerTest.php b/apps/dav/tests/unit/CalDAV/InvitationResponse/InvitationResponseServerTest.php new file mode 100644 index 0000000000000..78537ffa06a5a --- /dev/null +++ b/apps/dav/tests/unit/CalDAV/InvitationResponse/InvitationResponseServerTest.php @@ -0,0 +1,51 @@ +assertNull($server->getServer()->getPlugin('imip')); + + $message = new Message(); + $message->uid = 'fb1bc04c-ac3e-4f5d-8329-7a1e0b07a1e0'; + $message->component = 'VEVENT'; + $message->method = 'REPLY'; + $message->sequence = 0; + $message->sender = 'mailto:attendee@example.com'; + $message->recipient = 'mailto:unknown-organizer@example.com'; + $message->message = Reader::read(<<handleITipMessage($message); + + $this->assertInstanceOf(IMipPlugin::class, $server->getServer()->getPlugin('imip')); + } +}