From 474720ff1c7fb996b0537a6d786e0fb930c786b0 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 15 Nov 2016 17:01:40 +0100 Subject: [PATCH] Overwrite the schedule target calendar with the personal one and create it if missing Otherwise this leads to problems like events being added to the birthday calendar, if that one is the first calendar which was created for the user. See: https://github.com/nextcloud/server/pull/2274 Signed-off-by: Joas Schilling --- apps/dav/lib/CalDAV/CalendarHome.php | 7 +++ apps/dav/lib/CalDAV/Schedule/Plugin.php | 59 +++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/apps/dav/lib/CalDAV/CalendarHome.php b/apps/dav/lib/CalDAV/CalendarHome.php index f84b0c863c..7320754e6d 100644 --- a/apps/dav/lib/CalDAV/CalendarHome.php +++ b/apps/dav/lib/CalDAV/CalendarHome.php @@ -41,6 +41,13 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome { $this->l10n = \OC::$server->getL10N('dav'); } + /** + * @return BackendInterface + */ + public function getCalDAVBackend() { + return $this->caldavBackend; + } + /** * @inheritdoc */ diff --git a/apps/dav/lib/CalDAV/Schedule/Plugin.php b/apps/dav/lib/CalDAV/Schedule/Plugin.php index ad55a2756b..34df666637 100644 --- a/apps/dav/lib/CalDAV/Schedule/Plugin.php +++ b/apps/dav/lib/CalDAV/Schedule/Plugin.php @@ -1,7 +1,9 @@ + * @copyright Copyright (c) 2016, Joas Schilling * + * @author Joas Schilling * @author Roeland Jago Douma * * @license GNU AGPL version 3 or any later version @@ -22,8 +24,27 @@ */ namespace OCA\DAV\CalDAV\Schedule; +use OCA\DAV\CalDAV\CalDavBackend; +use OCA\DAV\CalDAV\CalendarHome; +use Sabre\DAV\INode; +use Sabre\DAV\PropFind; +use Sabre\DAV\Server; +use Sabre\DAV\Xml\Property\LocalHref; +use Sabre\DAVACL\IPrincipal; + class Plugin extends \Sabre\CalDAV\Schedule\Plugin { + /** + * Initializes the plugin + * + * @param Server $server + * @return void + */ + function initialize(Server $server) { + parent::initialize($server); + $server->on('propFind', [$this, 'propFindDefaultCalendarUrl'], 90); + } + /** * Returns a list of addresses that are associated with a principal. * @@ -39,4 +60,42 @@ class Plugin extends \Sabre\CalDAV\Schedule\Plugin { return $result; } + + /** + * Always use the personal calendar as target for scheduled events + * + * @param PropFind $propFind + * @param INode $node + * @return void + */ + function propFindDefaultCalendarUrl(PropFind $propFind, INode $node) { + if ($node instanceof IPrincipal) { + $propFind->handle('{' . self::NS_CALDAV . '}schedule-default-calendar-URL', function() use ($node) { + /** @var \OCA\DAV\CalDAV\Plugin $caldavPlugin */ + $caldavPlugin = $this->server->getPlugin('caldav'); + $principalUrl = $node->getPrincipalUrl(); + + $calendarHomePath = $caldavPlugin->getCalendarHomeForPrincipal($principalUrl); + + if (!$calendarHomePath) { + return null; + } + + /** @var CalendarHome $calendarHome */ + $calendarHome = $this->server->tree->getNodeForPath($calendarHomePath); + if (!$calendarHome->childExists(CalDavBackend::PERSONAL_CALENDAR_URI)) { + $calendarHome->getCalDAVBackend()->createCalendar($principalUrl, CalDavBackend::PERSONAL_CALENDAR_URI, [ + '{DAV:}displayname' => CalDavBackend::PERSONAL_CALENDAR_NAME, + ]); + } + + $result = $this->server->getPropertiesForPath($calendarHomePath . '/' . CalDavBackend::PERSONAL_CALENDAR_URI, [], 1); + if (empty($result)) { + return null; + } + + return new LocalHref($result[0]['href']); + }); + } + } }