xref: /plugin/davcal/vendor/sabre/dav/lib/CalDAV/CalendarHome.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
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