/** * This method is triggered *after* all properties have been retrieved. * This allows us to inject the correct resourcetype for calendars that * have been shared. * * @param DAV\PropFind $propFind * @param DAV\INode $node * @return void */ function propFindLate(DAV\PropFind $propFind, DAV\INode $node) { if ($node instanceof IShareableCalendar) { if ($rt = $propFind->get('{DAV:}resourcetype')) { if (count($node->getShares()) > 0) { $rt->add('{' . Plugin::NS_CALENDARSERVER . '}shared-owner'); } } $propFind->handle('{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes', function () { return new Xml\Property\AllowedSharingModes(true, false); }); } }
/** * This method is trigged when a user attempts to update a node's * properties. * * A previous draft of the sharing spec stated that it was possible to use * PROPPATCH to remove 'shared-owner' from the resourcetype, thus unsharing * the calendar. * * Even though this is no longer in the current spec, we keep this around * because OS X 10.7 may still make use of this feature. * * @param array $mutations * @param array $result * @param DAV\INode $node * @return void */ public function updateProperties(array &$mutations, array &$result, DAV\INode $node) { if (!$node instanceof IShareableCalendar) { return; } if (!isset($mutations['{DAV:}resourcetype'])) { return; } // Only doing something if shared-owner is indeed not in the list. if ($mutations['{DAV:}resourcetype']->is('{' . Plugin::NS_CALENDARSERVER . '}shared-owner')) { return; } $shares = $node->getShares(); $remove = array(); foreach ($shares as $share) { $remove[] = $share['href']; } $node->updateShares(array(), $remove); // We're marking this update as 200 OK $result[200]['{DAV:}resourcetype'] = null; // Removing it from the mutations list unset($mutations['{DAV:}resourcetype']); }
/** * This event is triggered when properties are requested for a certain * node. * * This allows us to inject any properties early. * * @param PropFind $propFind * @param INode $node * @return void */ function propFind(PropFind $propFind, INode $node) { if ($node instanceof IShareable) { $propFind->handle('{' . Plugin::NS_OWNCLOUD . '}invite', function () use($node) { return new Invite($node->getShares()); }); } }