Skip to content

Commit

Permalink
Provide dav setting for user's default calendar
Browse files Browse the repository at this point in the history
And add tests to handle schedule-default-calendar-URL

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
  • Loading branch information
tcitworld committed Apr 5, 2020
1 parent f14f75a commit 925efdd
Show file tree
Hide file tree
Showing 6 changed files with 265 additions and 15 deletions.
2 changes: 1 addition & 1 deletion apps/dav/appinfo/v1/caldav.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@

$server->addPlugin(new \Sabre\DAV\Sync\Plugin());
$server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin());
$server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin());
$server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin(\OC::$server->getConfig()));

if ($sendInvitations) {
$server->addPlugin(\OC::$server->query(\OCA\DAV\CalDAV\Schedule\IMipPlugin::class));
Expand Down
14 changes: 14 additions & 0 deletions apps/dav/lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
use OCP\AppFramework\App;
use OCP\Calendar\IManager as ICalendarManager;
use OCP\Contacts\IManager as IContactsManager;
use OCP\IConfig;
use OCP\IUser;
use Symfony\Component\EventDispatcher\GenericEvent;

Expand Down Expand Up @@ -245,6 +246,19 @@ public function registerHooks() {
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject', $listener);
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::updateCalendarObject', $listener);
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject', $listener);

/**
* In case the user has set their default calendar to this one
*/
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendar', function(GenericEvent $event) {
/** @var IConfig $config */
$config = $this->getContainer()->getServer()->getConfig();
$principalUri = $event->getArgument('calendarData')['principaluri'];
if (strpos($principalUri, 'principals/users') === 0) {
list(, $UID) = \Sabre\Uri\split($principalUri);
$config->deleteUserValue($UID, 'dav', 'defaultCalendar');
}
});
}

public function getSyncService() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ public function getCurrentPrincipal() {
// calendar plugins
$this->server->addPlugin(new \OCA\DAV\CalDAV\Plugin());
$this->server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin());
$this->server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin());
$this->server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin(\OC::$server->getConfig()));
$this->server->addPlugin(new \Sabre\CalDAV\Subscriptions\Plugin());
$this->server->addPlugin(new \Sabre\CalDAV\Notifications\Plugin());
//$this->server->addPlugin(new \OCA\DAV\DAV\Sharing\Plugin($authBackend, \OC::$server->getRequest()));
Expand Down
37 changes: 27 additions & 10 deletions apps/dav/lib/CalDAV/Schedule/Plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
use DateTimeZone;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\CalendarHome;
use OCP\IConfig;
use Sabre\CalDAV\ICalendar;
use Sabre\DAV\INode;
use Sabre\DAV\IProperties;
Expand All @@ -47,15 +48,31 @@
use Sabre\VObject\Parameter;
use Sabre\VObject\Property;
use Sabre\VObject\Reader;
use function \Sabre\Uri\split;

class Plugin extends \Sabre\CalDAV\Schedule\Plugin {

/**
* @var IConfig
*/
private $config;

/** @var ITip\Message[] */
private $schedulingResponses = [];

/** @var string|null */
private $pathOfCalendarObjectChange = null;

const CALENDAR_USER_TYPE = '{' . self::NS_CALDAV . '}calendar-user-type';
const SCHEDULE_DEFAULT_CALENDAR_URL = '{' . Plugin::NS_CALDAV . '}schedule-default-calendar-URL';

/**
* @param IConfig $config
*/
public function __construct(IConfig $config) {
$this->config = $config;
}

/**
* Initializes the plugin
*
Expand All @@ -81,13 +98,12 @@ function initialize(Server $server) {
function propFind(PropFind $propFind, INode $node) {
if ($node instanceof IPrincipal) {
// overwrite Sabre/Dav's implementation
$propFind->handle('{' . self::NS_CALDAV . '}calendar-user-type', function () use ($node) {
$propFind->handle(self::CALENDAR_USER_TYPE, function () use ($node) {
if ($node instanceof IProperties) {
$calendarUserType = '{' . self::NS_CALDAV . '}calendar-user-type';
$props = $node->getProperties([$calendarUserType]);
$props = $node->getProperties([self::CALENDAR_USER_TYPE]);

if (isset($props[$calendarUserType])) {
return $props[$calendarUserType];
if (isset($props[self::CALENDAR_USER_TYPE])) {
return $props[self::CALENDAR_USER_TYPE];
}
}

Expand Down Expand Up @@ -261,7 +277,7 @@ public function dispatchSchedulingResponses(string $uri):void {
*/
function propFindDefaultCalendarUrl(PropFind $propFind, INode $node) {
if ($node instanceof IPrincipal) {
$propFind->handle('{' . self::NS_CALDAV . '}schedule-default-calendar-URL', function() use ($node) {
$propFind->handle(self::SCHEDULE_DEFAULT_CALENDAR_URL, function() use ($node) {
/** @var \OCA\DAV\CalDAV\Plugin $caldavPlugin */
$caldavPlugin = $this->server->getPlugin('caldav');
$principalUrl = $node->getPrincipalUrl();
Expand All @@ -272,12 +288,13 @@ function propFindDefaultCalendarUrl(PropFind $propFind, INode $node) {
}

if (strpos($principalUrl, 'principals/users') === 0) {
$uri = CalDavBackend::PERSONAL_CALENDAR_URI;
$displayname = CalDavBackend::PERSONAL_CALENDAR_NAME;
list(, $userId) = split($principalUrl);
$uri = $this->config->getUserValue($userId, 'dav', 'defaultCalendar', CalDavBackend::PERSONAL_CALENDAR_URI);
$displayName = CalDavBackend::PERSONAL_CALENDAR_NAME;
} elseif (strpos($principalUrl, 'principals/calendar-resources') === 0 ||
strpos($principalUrl, 'principals/calendar-rooms') === 0) {
$uri = CalDavBackend::RESOURCE_BOOKING_CALENDAR_URI;
$displayname = CalDavBackend::RESOURCE_BOOKING_CALENDAR_NAME;
$displayName = CalDavBackend::RESOURCE_BOOKING_CALENDAR_NAME;
} else {
// How did we end up here?
// TODO - throw exception or just ignore?
Expand All @@ -288,7 +305,7 @@ function propFindDefaultCalendarUrl(PropFind $propFind, INode $node) {
$calendarHome = $this->server->tree->getNodeForPath($calendarHomePath);
if (!$calendarHome->childExists($uri)) {
$calendarHome->getCalDAVBackend()->createCalendar($principalUrl, $uri, [
'{DAV:}displayname' => $displayname,
'{DAV:}displayname' => $displayName,
]);
}

Expand Down
2 changes: 1 addition & 1 deletion apps/dav/lib/Server.php
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ public function __construct(IRequest $request, $baseUri) {
if ($this->requestIsForSubtree(['calendars', 'public-calendars', 'system-calendars', 'principals'])) {
$this->server->addPlugin(new \OCA\DAV\CalDAV\Plugin());
$this->server->addPlugin(new \OCA\DAV\CalDAV\ICSExportPlugin\ICSExportPlugin(\OC::$server->getConfig(), \OC::$server->getLogger()));
$this->server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin());
$this->server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin(\OC::$server->getConfig()));
if (\OC::$server->getConfig()->getAppValue('dav', 'sendInvitations', 'yes') === 'yes') {
$this->server->addPlugin(\OC::$server->query(\OCA\DAV\CalDAV\Schedule\IMipPlugin::class));
}
Expand Down
Loading

0 comments on commit 925efdd

Please sign in to comment.