1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\CalDAV; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehleruse Sabre\DAV; 6*a1a3b679SAndreas Boehleruse Sabre\DAV\Exception\NotFound; 7*a1a3b679SAndreas Boehleruse Sabre\DAV\MkCol; 8*a1a3b679SAndreas Boehleruse Sabre\DAVACL; 9*a1a3b679SAndreas Boehleruse Sabre\HTTP\URLUtil; 10*a1a3b679SAndreas Boehler 11*a1a3b679SAndreas Boehler/** 12*a1a3b679SAndreas Boehler * The CalendarHome represents a node that is usually in a users' 13*a1a3b679SAndreas Boehler * calendar-homeset. 14*a1a3b679SAndreas Boehler * 15*a1a3b679SAndreas Boehler * It contains all the users' calendars, and can optionally contain a 16*a1a3b679SAndreas Boehler * notifications collection, calendar subscriptions, a users' inbox, and a 17*a1a3b679SAndreas Boehler * users' outbox. 18*a1a3b679SAndreas Boehler * 19*a1a3b679SAndreas Boehler * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/). 20*a1a3b679SAndreas Boehler * @author Evert Pot (http://evertpot.com/) 21*a1a3b679SAndreas Boehler * @license http://sabre.io/license/ Modified BSD License 22*a1a3b679SAndreas Boehler */ 23*a1a3b679SAndreas Boehlerclass CalendarHome implements DAV\IExtendedCollection, DAVACL\IACL { 24*a1a3b679SAndreas Boehler 25*a1a3b679SAndreas Boehler /** 26*a1a3b679SAndreas Boehler * CalDAV backend 27*a1a3b679SAndreas Boehler * 28*a1a3b679SAndreas Boehler * @var Sabre\CalDAV\Backend\BackendInterface 29*a1a3b679SAndreas Boehler */ 30*a1a3b679SAndreas Boehler protected $caldavBackend; 31*a1a3b679SAndreas Boehler 32*a1a3b679SAndreas Boehler /** 33*a1a3b679SAndreas Boehler * Principal information 34*a1a3b679SAndreas Boehler * 35*a1a3b679SAndreas Boehler * @var array 36*a1a3b679SAndreas Boehler */ 37*a1a3b679SAndreas Boehler protected $principalInfo; 38*a1a3b679SAndreas Boehler 39*a1a3b679SAndreas Boehler /** 40*a1a3b679SAndreas Boehler * Constructor 41*a1a3b679SAndreas Boehler * 42*a1a3b679SAndreas Boehler * @param Backend\BackendInterface $caldavBackend 43*a1a3b679SAndreas Boehler * @param mixed $userUri 44*a1a3b679SAndreas Boehler */ 45*a1a3b679SAndreas Boehler function __construct(Backend\BackendInterface $caldavBackend, $principalInfo) { 46*a1a3b679SAndreas Boehler 47*a1a3b679SAndreas Boehler $this->caldavBackend = $caldavBackend; 48*a1a3b679SAndreas Boehler $this->principalInfo = $principalInfo; 49*a1a3b679SAndreas Boehler 50*a1a3b679SAndreas Boehler } 51*a1a3b679SAndreas Boehler 52*a1a3b679SAndreas Boehler /** 53*a1a3b679SAndreas Boehler * Returns the name of this object 54*a1a3b679SAndreas Boehler * 55*a1a3b679SAndreas Boehler * @return string 56*a1a3b679SAndreas Boehler */ 57*a1a3b679SAndreas Boehler function getName() { 58*a1a3b679SAndreas Boehler 59*a1a3b679SAndreas Boehler list(, $name) = URLUtil::splitPath($this->principalInfo['uri']); 60*a1a3b679SAndreas Boehler return $name; 61*a1a3b679SAndreas Boehler 62*a1a3b679SAndreas Boehler } 63*a1a3b679SAndreas Boehler 64*a1a3b679SAndreas Boehler /** 65*a1a3b679SAndreas Boehler * Updates the name of this object 66*a1a3b679SAndreas Boehler * 67*a1a3b679SAndreas Boehler * @param string $name 68*a1a3b679SAndreas Boehler * @return void 69*a1a3b679SAndreas Boehler */ 70*a1a3b679SAndreas Boehler function setName($name) { 71*a1a3b679SAndreas Boehler 72*a1a3b679SAndreas Boehler throw new DAV\Exception\Forbidden(); 73*a1a3b679SAndreas Boehler 74*a1a3b679SAndreas Boehler } 75*a1a3b679SAndreas Boehler 76*a1a3b679SAndreas Boehler /** 77*a1a3b679SAndreas Boehler * Deletes this object 78*a1a3b679SAndreas Boehler * 79*a1a3b679SAndreas Boehler * @return void 80*a1a3b679SAndreas Boehler */ 81*a1a3b679SAndreas Boehler function delete() { 82*a1a3b679SAndreas Boehler 83*a1a3b679SAndreas Boehler throw new DAV\Exception\Forbidden(); 84*a1a3b679SAndreas Boehler 85*a1a3b679SAndreas Boehler } 86*a1a3b679SAndreas Boehler 87*a1a3b679SAndreas Boehler /** 88*a1a3b679SAndreas Boehler * Returns the last modification date 89*a1a3b679SAndreas Boehler * 90*a1a3b679SAndreas Boehler * @return int 91*a1a3b679SAndreas Boehler */ 92*a1a3b679SAndreas Boehler function getLastModified() { 93*a1a3b679SAndreas Boehler 94*a1a3b679SAndreas Boehler return null; 95*a1a3b679SAndreas Boehler 96*a1a3b679SAndreas Boehler } 97*a1a3b679SAndreas Boehler 98*a1a3b679SAndreas Boehler /** 99*a1a3b679SAndreas Boehler * Creates a new file under this object. 100*a1a3b679SAndreas Boehler * 101*a1a3b679SAndreas Boehler * This is currently not allowed 102*a1a3b679SAndreas Boehler * 103*a1a3b679SAndreas Boehler * @param string $filename 104*a1a3b679SAndreas Boehler * @param resource $data 105*a1a3b679SAndreas Boehler * @return void 106*a1a3b679SAndreas Boehler */ 107*a1a3b679SAndreas Boehler function createFile($filename, $data = null) { 108*a1a3b679SAndreas Boehler 109*a1a3b679SAndreas Boehler throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported'); 110*a1a3b679SAndreas Boehler 111*a1a3b679SAndreas Boehler } 112*a1a3b679SAndreas Boehler 113*a1a3b679SAndreas Boehler /** 114*a1a3b679SAndreas Boehler * Creates a new directory under this object. 115*a1a3b679SAndreas Boehler * 116*a1a3b679SAndreas Boehler * This is currently not allowed. 117*a1a3b679SAndreas Boehler * 118*a1a3b679SAndreas Boehler * @param string $filename 119*a1a3b679SAndreas Boehler * @return void 120*a1a3b679SAndreas Boehler */ 121*a1a3b679SAndreas Boehler function createDirectory($filename) { 122*a1a3b679SAndreas Boehler 123*a1a3b679SAndreas Boehler throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported'); 124*a1a3b679SAndreas Boehler 125*a1a3b679SAndreas Boehler } 126*a1a3b679SAndreas Boehler 127*a1a3b679SAndreas Boehler /** 128*a1a3b679SAndreas Boehler * Returns a single calendar, by name 129*a1a3b679SAndreas Boehler * 130*a1a3b679SAndreas Boehler * @param string $name 131*a1a3b679SAndreas Boehler * @return Calendar 132*a1a3b679SAndreas Boehler */ 133*a1a3b679SAndreas Boehler function getChild($name) { 134*a1a3b679SAndreas Boehler 135*a1a3b679SAndreas Boehler // Special nodes 136*a1a3b679SAndreas Boehler if ($name === 'inbox' && $this->caldavBackend instanceof Backend\SchedulingSupport) { 137*a1a3b679SAndreas Boehler return new Schedule\Inbox($this->caldavBackend, $this->principalInfo['uri']); 138*a1a3b679SAndreas Boehler } 139*a1a3b679SAndreas Boehler if ($name === 'outbox' && $this->caldavBackend instanceof Backend\SchedulingSupport) { 140*a1a3b679SAndreas Boehler return new Schedule\Outbox($this->principalInfo['uri']); 141*a1a3b679SAndreas Boehler } 142*a1a3b679SAndreas Boehler if ($name === 'notifications' && $this->caldavBackend instanceof Backend\NotificationSupport) { 143*a1a3b679SAndreas Boehler return new Notifications\Collection($this->caldavBackend, $this->principalInfo['uri']); 144*a1a3b679SAndreas Boehler } 145*a1a3b679SAndreas Boehler 146*a1a3b679SAndreas Boehler // Calendars 147*a1a3b679SAndreas Boehler foreach ($this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']) as $calendar) { 148*a1a3b679SAndreas Boehler if ($calendar['uri'] === $name) { 149*a1a3b679SAndreas Boehler if ($this->caldavBackend instanceof Backend\SharingSupport) { 150*a1a3b679SAndreas Boehler if (isset($calendar['{http://calendarserver.org/ns/}shared-url'])) { 151*a1a3b679SAndreas Boehler return new SharedCalendar($this->caldavBackend, $calendar); 152*a1a3b679SAndreas Boehler } else { 153*a1a3b679SAndreas Boehler return new ShareableCalendar($this->caldavBackend, $calendar); 154*a1a3b679SAndreas Boehler } 155*a1a3b679SAndreas Boehler } else { 156*a1a3b679SAndreas Boehler return new Calendar($this->caldavBackend, $calendar); 157*a1a3b679SAndreas Boehler } 158*a1a3b679SAndreas Boehler } 159*a1a3b679SAndreas Boehler } 160*a1a3b679SAndreas Boehler 161*a1a3b679SAndreas Boehler if ($this->caldavBackend instanceof Backend\SubscriptionSupport) { 162*a1a3b679SAndreas Boehler foreach ($this->caldavBackend->getSubscriptionsForUser($this->principalInfo['uri']) as $subscription) { 163*a1a3b679SAndreas Boehler if ($subscription['uri'] === $name) { 164*a1a3b679SAndreas Boehler return new Subscriptions\Subscription($this->caldavBackend, $subscription); 165*a1a3b679SAndreas Boehler } 166*a1a3b679SAndreas Boehler } 167*a1a3b679SAndreas Boehler 168*a1a3b679SAndreas Boehler } 169*a1a3b679SAndreas Boehler 170*a1a3b679SAndreas Boehler throw new NotFound('Node with name \'' . $name . '\' could not be found'); 171*a1a3b679SAndreas Boehler 172*a1a3b679SAndreas Boehler } 173*a1a3b679SAndreas Boehler 174*a1a3b679SAndreas Boehler /** 175*a1a3b679SAndreas Boehler * Checks if a calendar exists. 176*a1a3b679SAndreas Boehler * 177*a1a3b679SAndreas Boehler * @param string $name 178*a1a3b679SAndreas Boehler * @return bool 179*a1a3b679SAndreas Boehler */ 180*a1a3b679SAndreas Boehler function childExists($name) { 181*a1a3b679SAndreas Boehler 182*a1a3b679SAndreas Boehler try { 183*a1a3b679SAndreas Boehler return !!$this->getChild($name); 184*a1a3b679SAndreas Boehler } catch (NotFound $e) { 185*a1a3b679SAndreas Boehler return false; 186*a1a3b679SAndreas Boehler } 187*a1a3b679SAndreas Boehler 188*a1a3b679SAndreas Boehler } 189*a1a3b679SAndreas Boehler 190*a1a3b679SAndreas Boehler /** 191*a1a3b679SAndreas Boehler * Returns a list of calendars 192*a1a3b679SAndreas Boehler * 193*a1a3b679SAndreas Boehler * @return array 194*a1a3b679SAndreas Boehler */ 195*a1a3b679SAndreas Boehler function getChildren() { 196*a1a3b679SAndreas Boehler 197*a1a3b679SAndreas Boehler $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']); 198*a1a3b679SAndreas Boehler $objs = []; 199*a1a3b679SAndreas Boehler foreach ($calendars as $calendar) { 200*a1a3b679SAndreas Boehler if ($this->caldavBackend instanceof Backend\SharingSupport) { 201*a1a3b679SAndreas Boehler if (isset($calendar['{http://calendarserver.org/ns/}shared-url'])) { 202*a1a3b679SAndreas Boehler $objs[] = new SharedCalendar($this->caldavBackend, $calendar); 203*a1a3b679SAndreas Boehler } else { 204*a1a3b679SAndreas Boehler $objs[] = new ShareableCalendar($this->caldavBackend, $calendar); 205*a1a3b679SAndreas Boehler } 206*a1a3b679SAndreas Boehler } else { 207*a1a3b679SAndreas Boehler $objs[] = new Calendar($this->caldavBackend, $calendar); 208*a1a3b679SAndreas Boehler } 209*a1a3b679SAndreas Boehler } 210*a1a3b679SAndreas Boehler 211*a1a3b679SAndreas Boehler if ($this->caldavBackend instanceof Backend\SchedulingSupport) { 212*a1a3b679SAndreas Boehler $objs[] = new Schedule\Inbox($this->caldavBackend, $this->principalInfo['uri']); 213*a1a3b679SAndreas Boehler $objs[] = new Schedule\Outbox($this->principalInfo['uri']); 214*a1a3b679SAndreas Boehler } 215*a1a3b679SAndreas Boehler 216*a1a3b679SAndreas Boehler // We're adding a notifications node, if it's supported by the backend. 217*a1a3b679SAndreas Boehler if ($this->caldavBackend instanceof Backend\NotificationSupport) { 218*a1a3b679SAndreas Boehler $objs[] = new Notifications\Collection($this->caldavBackend, $this->principalInfo['uri']); 219*a1a3b679SAndreas Boehler } 220*a1a3b679SAndreas Boehler 221*a1a3b679SAndreas Boehler // If the backend supports subscriptions, we'll add those as well, 222*a1a3b679SAndreas Boehler if ($this->caldavBackend instanceof Backend\SubscriptionSupport) { 223*a1a3b679SAndreas Boehler foreach ($this->caldavBackend->getSubscriptionsForUser($this->principalInfo['uri']) as $subscription) { 224*a1a3b679SAndreas Boehler $objs[] = new Subscriptions\Subscription($this->caldavBackend, $subscription); 225*a1a3b679SAndreas Boehler } 226*a1a3b679SAndreas Boehler } 227*a1a3b679SAndreas Boehler 228*a1a3b679SAndreas Boehler return $objs; 229*a1a3b679SAndreas Boehler 230*a1a3b679SAndreas Boehler } 231*a1a3b679SAndreas Boehler 232*a1a3b679SAndreas Boehler /** 233*a1a3b679SAndreas Boehler * Creates a new calendar or subscription. 234*a1a3b679SAndreas Boehler * 235*a1a3b679SAndreas Boehler * @param string $name 236*a1a3b679SAndreas Boehler * @param MkCol $mkCol 237*a1a3b679SAndreas Boehler * @throws DAV\Exception\InvalidResourceType 238*a1a3b679SAndreas Boehler * @return void 239*a1a3b679SAndreas Boehler */ 240*a1a3b679SAndreas Boehler function createExtendedCollection($name, MkCol $mkCol) { 241*a1a3b679SAndreas Boehler 242*a1a3b679SAndreas Boehler $isCalendar = false; 243*a1a3b679SAndreas Boehler $isSubscription = false; 244*a1a3b679SAndreas Boehler foreach ($mkCol->getResourceType() as $rt) { 245*a1a3b679SAndreas Boehler switch ($rt) { 246*a1a3b679SAndreas Boehler case '{DAV:}collection' : 247*a1a3b679SAndreas Boehler case '{http://calendarserver.org/ns/}shared-owner' : 248*a1a3b679SAndreas Boehler // ignore 249*a1a3b679SAndreas Boehler break; 250*a1a3b679SAndreas Boehler case '{urn:ietf:params:xml:ns:caldav}calendar' : 251*a1a3b679SAndreas Boehler $isCalendar = true; 252*a1a3b679SAndreas Boehler break; 253*a1a3b679SAndreas Boehler case '{http://calendarserver.org/ns/}subscribed' : 254*a1a3b679SAndreas Boehler $isSubscription = true; 255*a1a3b679SAndreas Boehler break; 256*a1a3b679SAndreas Boehler default : 257*a1a3b679SAndreas Boehler throw new DAV\Exception\InvalidResourceType('Unknown resourceType: ' . $rt); 258*a1a3b679SAndreas Boehler } 259*a1a3b679SAndreas Boehler } 260*a1a3b679SAndreas Boehler 261*a1a3b679SAndreas Boehler $properties = $mkCol->getRemainingValues(); 262*a1a3b679SAndreas Boehler $mkCol->setRemainingResultCode(201); 263*a1a3b679SAndreas Boehler 264*a1a3b679SAndreas Boehler if ($isSubscription) { 265*a1a3b679SAndreas Boehler if (!$this->caldavBackend instanceof Backend\SubscriptionSupport) { 266*a1a3b679SAndreas Boehler throw new DAV\Exception\InvalidResourceType('This backend does not support subscriptions'); 267*a1a3b679SAndreas Boehler } 268*a1a3b679SAndreas Boehler $this->caldavBackend->createSubscription($this->principalInfo['uri'], $name, $properties); 269*a1a3b679SAndreas Boehler 270*a1a3b679SAndreas Boehler } elseif ($isCalendar) { 271*a1a3b679SAndreas Boehler $this->caldavBackend->createCalendar($this->principalInfo['uri'], $name, $properties); 272*a1a3b679SAndreas Boehler 273*a1a3b679SAndreas Boehler } else { 274*a1a3b679SAndreas Boehler throw new DAV\Exception\InvalidResourceType('You can only create calendars and subscriptions in this collection'); 275*a1a3b679SAndreas Boehler 276*a1a3b679SAndreas Boehler } 277*a1a3b679SAndreas Boehler 278*a1a3b679SAndreas Boehler } 279*a1a3b679SAndreas Boehler 280*a1a3b679SAndreas Boehler /** 281*a1a3b679SAndreas Boehler * Returns the owner principal 282*a1a3b679SAndreas Boehler * 283*a1a3b679SAndreas Boehler * This must be a url to a principal, or null if there's no owner 284*a1a3b679SAndreas Boehler * 285*a1a3b679SAndreas Boehler * @return string|null 286*a1a3b679SAndreas Boehler */ 287*a1a3b679SAndreas Boehler function getOwner() { 288*a1a3b679SAndreas Boehler 289*a1a3b679SAndreas Boehler return $this->principalInfo['uri']; 290*a1a3b679SAndreas Boehler 291*a1a3b679SAndreas Boehler } 292*a1a3b679SAndreas Boehler 293*a1a3b679SAndreas Boehler /** 294*a1a3b679SAndreas Boehler * Returns a group principal 295*a1a3b679SAndreas Boehler * 296*a1a3b679SAndreas Boehler * This must be a url to a principal, or null if there's no owner 297*a1a3b679SAndreas Boehler * 298*a1a3b679SAndreas Boehler * @return string|null 299*a1a3b679SAndreas Boehler */ 300*a1a3b679SAndreas Boehler function getGroup() { 301*a1a3b679SAndreas Boehler 302*a1a3b679SAndreas Boehler return null; 303*a1a3b679SAndreas Boehler 304*a1a3b679SAndreas Boehler } 305*a1a3b679SAndreas Boehler 306*a1a3b679SAndreas Boehler /** 307*a1a3b679SAndreas Boehler * Returns a list of ACE's for this node. 308*a1a3b679SAndreas Boehler * 309*a1a3b679SAndreas Boehler * Each ACE has the following properties: 310*a1a3b679SAndreas Boehler * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are 311*a1a3b679SAndreas Boehler * currently the only supported privileges 312*a1a3b679SAndreas Boehler * * 'principal', a url to the principal who owns the node 313*a1a3b679SAndreas Boehler * * 'protected' (optional), indicating that this ACE is not allowed to 314*a1a3b679SAndreas Boehler * be updated. 315*a1a3b679SAndreas Boehler * 316*a1a3b679SAndreas Boehler * @return array 317*a1a3b679SAndreas Boehler */ 318*a1a3b679SAndreas Boehler function getACL() { 319*a1a3b679SAndreas Boehler 320*a1a3b679SAndreas Boehler return [ 321*a1a3b679SAndreas Boehler [ 322*a1a3b679SAndreas Boehler 'privilege' => '{DAV:}read', 323*a1a3b679SAndreas Boehler 'principal' => $this->principalInfo['uri'], 324*a1a3b679SAndreas Boehler 'protected' => true, 325*a1a3b679SAndreas Boehler ], 326*a1a3b679SAndreas Boehler [ 327*a1a3b679SAndreas Boehler 'privilege' => '{DAV:}write', 328*a1a3b679SAndreas Boehler 'principal' => $this->principalInfo['uri'], 329*a1a3b679SAndreas Boehler 'protected' => true, 330*a1a3b679SAndreas Boehler ], 331*a1a3b679SAndreas Boehler [ 332*a1a3b679SAndreas Boehler 'privilege' => '{DAV:}read', 333*a1a3b679SAndreas Boehler 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', 334*a1a3b679SAndreas Boehler 'protected' => true, 335*a1a3b679SAndreas Boehler ], 336*a1a3b679SAndreas Boehler [ 337*a1a3b679SAndreas Boehler 'privilege' => '{DAV:}write', 338*a1a3b679SAndreas Boehler 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', 339*a1a3b679SAndreas Boehler 'protected' => true, 340*a1a3b679SAndreas Boehler ], 341*a1a3b679SAndreas Boehler [ 342*a1a3b679SAndreas Boehler 'privilege' => '{DAV:}read', 343*a1a3b679SAndreas Boehler 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-read', 344*a1a3b679SAndreas Boehler 'protected' => true, 345*a1a3b679SAndreas Boehler ], 346*a1a3b679SAndreas Boehler 347*a1a3b679SAndreas Boehler ]; 348*a1a3b679SAndreas Boehler 349*a1a3b679SAndreas Boehler } 350*a1a3b679SAndreas Boehler 351*a1a3b679SAndreas Boehler /** 352*a1a3b679SAndreas Boehler * Updates the ACL 353*a1a3b679SAndreas Boehler * 354*a1a3b679SAndreas Boehler * This method will receive a list of new ACE's. 355*a1a3b679SAndreas Boehler * 356*a1a3b679SAndreas Boehler * @param array $acl 357*a1a3b679SAndreas Boehler * @return void 358*a1a3b679SAndreas Boehler */ 359*a1a3b679SAndreas Boehler function setACL(array $acl) { 360*a1a3b679SAndreas Boehler 361*a1a3b679SAndreas Boehler throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); 362*a1a3b679SAndreas Boehler 363*a1a3b679SAndreas Boehler } 364*a1a3b679SAndreas Boehler 365*a1a3b679SAndreas Boehler /** 366*a1a3b679SAndreas Boehler * Returns the list of supported privileges for this node. 367*a1a3b679SAndreas Boehler * 368*a1a3b679SAndreas Boehler * The returned data structure is a list of nested privileges. 369*a1a3b679SAndreas Boehler * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple 370*a1a3b679SAndreas Boehler * standard structure. 371*a1a3b679SAndreas Boehler * 372*a1a3b679SAndreas Boehler * If null is returned from this method, the default privilege set is used, 373*a1a3b679SAndreas Boehler * which is fine for most common usecases. 374*a1a3b679SAndreas Boehler * 375*a1a3b679SAndreas Boehler * @return array|null 376*a1a3b679SAndreas Boehler */ 377*a1a3b679SAndreas Boehler function getSupportedPrivilegeSet() { 378*a1a3b679SAndreas Boehler 379*a1a3b679SAndreas Boehler return null; 380*a1a3b679SAndreas Boehler 381*a1a3b679SAndreas Boehler } 382*a1a3b679SAndreas Boehler 383*a1a3b679SAndreas Boehler /** 384*a1a3b679SAndreas Boehler * This method is called when a user replied to a request to share. 385*a1a3b679SAndreas Boehler * 386*a1a3b679SAndreas Boehler * This method should return the url of the newly created calendar if the 387*a1a3b679SAndreas Boehler * share was accepted. 388*a1a3b679SAndreas Boehler * 389*a1a3b679SAndreas Boehler * @param string href The sharee who is replying (often a mailto: address) 390*a1a3b679SAndreas Boehler * @param int status One of the SharingPlugin::STATUS_* constants 391*a1a3b679SAndreas Boehler * @param string $calendarUri The url to the calendar thats being shared 392*a1a3b679SAndreas Boehler * @param string $inReplyTo The unique id this message is a response to 393*a1a3b679SAndreas Boehler * @param string $summary A description of the reply 394*a1a3b679SAndreas Boehler * @return null|string 395*a1a3b679SAndreas Boehler */ 396*a1a3b679SAndreas Boehler function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null) { 397*a1a3b679SAndreas Boehler 398*a1a3b679SAndreas Boehler if (!$this->caldavBackend instanceof Backend\SharingSupport) { 399*a1a3b679SAndreas Boehler throw new DAV\Exception\NotImplemented('Sharing support is not implemented by this backend.'); 400*a1a3b679SAndreas Boehler } 401*a1a3b679SAndreas Boehler 402*a1a3b679SAndreas Boehler return $this->caldavBackend->shareReply($href, $status, $calendarUri, $inReplyTo, $summary); 403*a1a3b679SAndreas Boehler 404*a1a3b679SAndreas Boehler } 405*a1a3b679SAndreas Boehler 406*a1a3b679SAndreas Boehler /** 407*a1a3b679SAndreas Boehler * Searches through all of a users calendars and calendar objects to find 408*a1a3b679SAndreas Boehler * an object with a specific UID. 409*a1a3b679SAndreas Boehler * 410*a1a3b679SAndreas Boehler * This method should return the path to this object, relative to the 411*a1a3b679SAndreas Boehler * calendar home, so this path usually only contains two parts: 412*a1a3b679SAndreas Boehler * 413*a1a3b679SAndreas Boehler * calendarpath/objectpath.ics 414*a1a3b679SAndreas Boehler * 415*a1a3b679SAndreas Boehler * If the uid is not found, return null. 416*a1a3b679SAndreas Boehler * 417*a1a3b679SAndreas Boehler * This method should only consider * objects that the principal owns, so 418*a1a3b679SAndreas Boehler * any calendars owned by other principals that also appear in this 419*a1a3b679SAndreas Boehler * collection should be ignored. 420*a1a3b679SAndreas Boehler * 421*a1a3b679SAndreas Boehler * @param string $uid 422*a1a3b679SAndreas Boehler * @return string|null 423*a1a3b679SAndreas Boehler */ 424*a1a3b679SAndreas Boehler function getCalendarObjectByUID($uid) { 425*a1a3b679SAndreas Boehler 426*a1a3b679SAndreas Boehler return $this->caldavBackend->getCalendarObjectByUID($this->principalInfo['uri'], $uid); 427*a1a3b679SAndreas Boehler 428*a1a3b679SAndreas Boehler } 429*a1a3b679SAndreas Boehler 430*a1a3b679SAndreas Boehler} 431