Skip to content

Commit

Permalink
fix: disable both iTip and iMip messages
Browse files Browse the repository at this point in the history
Signed-off-by: SebastianKrupinski <[email protected]>
  • Loading branch information
SebastianKrupinski committed Nov 29, 2024
1 parent 863c880 commit d23f95e
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 28 deletions.
8 changes: 0 additions & 8 deletions apps/dav/lib/CalDAV/Schedule/IMipPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -97,14 +97,6 @@ public function beforeWriteContent($uri, INode $node, $data, $modified): void {
*/
public function schedule(Message $iTipMessage) {

// do not send imip messages if external system already did
/** @psalm-suppress UndefinedPropertyFetch */
if ($iTipMessage->message?->VEVENT?->{'X-NC-DISABLE-SCHEDULING'}?->getValue() === 'true') {
if (!$iTipMessage->scheduleStatus) {
$iTipMessage->scheduleStatus = '1.0;We got the message, but iMip messages are disabled for this event';
}
return;
}
// Not sending any emails if the system considers the update insignificant
if (!$iTipMessage->significantChange) {
if (!$iTipMessage->scheduleStatus) {
Expand Down
13 changes: 12 additions & 1 deletion apps/dav/lib/CalDAV/Schedule/Plugin.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

/**
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
Expand Down Expand Up @@ -165,7 +166,17 @@ public function calendarObjectChange(RequestInterface $request, ResponseInterfac
if (!$this->scheduleReply($this->server->httpRequest)) {
return;
}


// Do not generate iTip and iMip messages if scheduling is disabled for this message
// this property is for one time use, and needs to be removed so that if this event
// is altered in the future it will correctly generate messages again
/** @psalm-suppress UndefinedPropertyFetch */
if ($vCal->VEVENT?->{'X-NC-DISABLE-SCHEDULING'}?->getValue() === 'true') {
$vCal->VEVENT->remove('X-NC-DISABLE-SCHEDULING');

Check failure on line 175 in apps/dav/lib/CalDAV/Schedule/Plugin.php

View workflow job for this annotation

GitHub Actions / static-code-analysis

UndefinedMethod

apps/dav/lib/CalDAV/Schedule/Plugin.php:175:20: UndefinedMethod: Method Sabre\VObject\Property::remove does not exist (see https://psalm.dev/022)
$modified = true;
return;
}

/** @var Calendar $calendarNode */
$calendarNode = $this->server->tree->getNodeForPath($calendarPath);
// extract addresses for owner
Expand Down
19 changes: 0 additions & 19 deletions apps/dav/tests/unit/CalDAV/Schedule/IMipPluginTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -997,23 +997,4 @@ public function testNoButtons(): void {
$this->plugin->schedule($message);
$this->assertEquals('1.1', $message->getScheduleStatus());
}

public function testImipDisabledForEvent(): void {
// construct iTip message with event and attendees
$calendar = new VCalendar();
$calendar->add('VEVENT', ['UID' => 'uid-1234']);
$event = $calendar->VEVENT;
$event->add('ORGANIZER', 'mailto:[email protected]');
$event->add('ATTENDEE', 'mailto:' . '[email protected]', ['RSVP' => 'TRUE', 'CN' => 'Frodo']);
$event->add('X-NC-DISABLE-SCHEDULING', 'true');
$message = new Message();
$message->method = 'REQUEST';
$message->message = $calendar;
$message->sender = 'mailto:[email protected]';
$message->senderName = 'Mr. Wizard';
$message->recipient = 'mailto:' . '[email protected]';

$this->plugin->schedule($message);
$this->assertEquals('1.0;We got the message, but iMip messages are disabled for this event', $message->scheduleStatus);
}
}
61 changes: 61 additions & 0 deletions apps/dav/tests/unit/CalDAV/Schedule/PluginTest.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

/**
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
Expand Down Expand Up @@ -738,4 +739,64 @@ function (string $eventName, array $arguments = [], ?callable $continueCallBack

}

/**
* Test Calendar Event Creation with iTip and iMip disabled
*
* Should generate 2 messages for attendees User 2 and User External
*/
public function testCalendarObjectChangeWithSchedulingDisabled(): void {
// construct server request
$request = new Request(
'PUT',
'/remote.php/dav/calendars/user1/personal/B0DC78AE-6DD7-47E3-80BE-89F23E6D5383.ics'
);
$request->setBaseUrl('/remote.php/dav/');
// construct server response
$response = new Response();
// construct server tree
$tree = $this->createMock(Tree::class);
$tree->expects($this->never())
->method('getNodeForPath');
// construct server properties and returns
$this->server->httpRequest = $request;
$this->server->tree = $tree;
// construct calendar with a 1 hour event and same start/end time zones
$vCalendar = new VCalendar();
$vEvent = $vCalendar->add('VEVENT', []);
$vEvent->UID->setValue('96a0e6b1-d886-4a55-a60d-152b31401dcc');
$vEvent->add('DTSTART', '20240701T080000', ['TZID' => 'America/Toronto']);
$vEvent->add('DTEND', '20240701T090000', ['TZID' => 'America/Toronto']);
$vEvent->add('SUMMARY', 'Test Recurring Event');
$vEvent->add('ORGANIZER', 'mailto:[email protected]', ['CN' => 'User One']);
$vEvent->add('ATTENDEE', 'mailto:[email protected]', [
'CN' => 'User Two',
'CUTYPE' => 'INDIVIDUAL',
'PARTSTAT' => 'NEEDS-ACTION',
'ROLE' => 'REQ-PARTICIPANT',
'RSVP' => 'TRUE'
]);
$vEvent->add('ATTENDEE', 'mailto:[email protected]', [
'CN' => 'User External',
'CUTYPE' => 'INDIVIDUAL',
'PARTSTAT' => 'NEEDS-ACTION',
'ROLE' => 'REQ-PARTICIPANT',
'RSVP' => 'TRUE'
]);
$vEvent->add('X-NC-DISABLE-SCHEDULING', 'true');
// define flags
$newFlag = true;
$modifiedFlag = false;
// execute method
$this->plugin->calendarObjectChange(
$request,
$response,
$vCalendar,
'calendars/user1/personal',
$modifiedFlag,
$newFlag
);
// test if event was modified and property was removed
$this->assertTrue($modifiedFlag);
$this->assertFalse(isset($vCalendar->VEVENT->{'X-NC-DISABLE-SCHEDULING'}));
}
}

0 comments on commit d23f95e

Please sign in to comment.