Adding propfind property to retrieve sharee information from a dav resource
This commit is contained in:
parent
8c14ce01ba
commit
a3cc448c9d
|
@ -23,9 +23,12 @@
|
|||
namespace OCA\DAV\DAV\Sharing;
|
||||
|
||||
use OCA\DAV\Connector\Sabre\Auth;
|
||||
use OCA\DAV\DAV\Sharing\Xml\Invite;
|
||||
use OCP\IRequest;
|
||||
use Sabre\DAV\Exception\BadRequest;
|
||||
use Sabre\DAV\Exception\NotFound;
|
||||
use Sabre\DAV\INode;
|
||||
use Sabre\DAV\PropFind;
|
||||
use Sabre\DAV\Server;
|
||||
use Sabre\DAV\ServerPlugin;
|
||||
use Sabre\HTTP\RequestInterface;
|
||||
|
@ -97,8 +100,10 @@ class Plugin extends ServerPlugin {
|
|||
function initialize(Server $server) {
|
||||
$this->server = $server;
|
||||
$this->server->xml->elementMap['{' . Plugin::NS_OWNCLOUD . '}share'] = 'OCA\\DAV\\DAV\\Sharing\\Xml\\ShareRequest';
|
||||
$this->server->xml->elementMap['{' . Plugin::NS_OWNCLOUD . '}invite'] = 'OCA\\DAV\\DAV\\Sharing\\Xml\\Invite';
|
||||
|
||||
$this->server->on('method:POST', [$this, 'httpPost']);
|
||||
$this->server->on('propFind', [$this, 'propFind']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -174,6 +179,28 @@ class Plugin extends ServerPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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()
|
||||
);
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private function protectAgainstCSRF() {
|
||||
$user = $this->auth->getCurrentUser();
|
||||
if ($this->auth->isDavAuthenticated($user)) {
|
||||
|
|
|
@ -0,0 +1,149 @@
|
|||
<?php
|
||||
|
||||
namespace OCA\DAV\DAV\Sharing\Xml;
|
||||
|
||||
use OCA\DAV\DAV\Sharing\Plugin;
|
||||
use Sabre\Xml\Writer;
|
||||
use Sabre\Xml\XmlSerializable;
|
||||
|
||||
/**
|
||||
* Invite property
|
||||
*
|
||||
* This property encodes the 'invite' property, as defined by
|
||||
* the 'caldav-sharing-02' spec, in the http://calendarserver.org/ns/
|
||||
* namespace.
|
||||
*
|
||||
* @see https://trac.calendarserver.org/browser/CalendarServer/trunk/doc/Extensions/caldav-sharing-02.txt
|
||||
* @copyright Copyright (C) fruux GmbH (https://fruux.com/)
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Invite implements XmlSerializable {
|
||||
|
||||
/**
|
||||
* The list of users a calendar has been shared to.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $users;
|
||||
|
||||
/**
|
||||
* The organizer contains information about the person who shared the
|
||||
* object.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $organizer;
|
||||
|
||||
/**
|
||||
* Creates the property.
|
||||
*
|
||||
* Users is an array. Each element of the array has the following
|
||||
* properties:
|
||||
*
|
||||
* * href - Often a mailto: address
|
||||
* * commonName - Optional, for example a first and lastname for a user.
|
||||
* * status - One of the SharingPlugin::STATUS_* constants.
|
||||
* * readOnly - true or false
|
||||
* * summary - Optional, description of the share
|
||||
*
|
||||
* The organizer key is optional to specify. It's only useful when a
|
||||
* 'sharee' requests the sharing information.
|
||||
*
|
||||
* The organizer may have the following properties:
|
||||
* * href - Often a mailto: address.
|
||||
* * commonName - Optional human-readable name.
|
||||
* * firstName - Optional first name.
|
||||
* * lastName - Optional last name.
|
||||
*
|
||||
* If you wonder why these two structures are so different, I guess a
|
||||
* valid answer is that the current spec is still a draft.
|
||||
*
|
||||
* @param array $users
|
||||
*/
|
||||
function __construct(array $users, array $organizer = null) {
|
||||
|
||||
$this->users = $users;
|
||||
$this->organizer = $organizer;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of users, as it was passed to the constructor.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getValue() {
|
||||
|
||||
return $this->users;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* The xmlSerialize metod is called during xml writing.
|
||||
*
|
||||
* Use the $writer argument to write its own xml serialization.
|
||||
*
|
||||
* An important note: do _not_ create a parent element. Any element
|
||||
* implementing XmlSerializble should only ever write what's considered
|
||||
* its 'inner xml'.
|
||||
*
|
||||
* The parent of the current element is responsible for writing a
|
||||
* containing element.
|
||||
*
|
||||
* This allows serializers to be re-used for different element names.
|
||||
*
|
||||
* If you are opening new elements, you must also close them again.
|
||||
*
|
||||
* @param Writer $writer
|
||||
* @return void
|
||||
*/
|
||||
function xmlSerialize(Writer $writer) {
|
||||
|
||||
$cs = '{' . Plugin::NS_OWNCLOUD . '}';
|
||||
|
||||
if (!is_null($this->organizer)) {
|
||||
|
||||
$writer->startElement($cs . 'organizer');
|
||||
$writer->writeElement('{DAV:}href', $this->organizer['href']);
|
||||
|
||||
if (isset($this->organizer['commonName']) && $this->organizer['commonName']) {
|
||||
$writer->writeElement($cs . 'common-name', $this->organizer['commonName']);
|
||||
}
|
||||
if (isset($this->organizer['firstName']) && $this->organizer['firstName']) {
|
||||
$writer->writeElement($cs . 'first-name', $this->organizer['firstName']);
|
||||
}
|
||||
if (isset($this->organizer['lastName']) && $this->organizer['lastName']) {
|
||||
$writer->writeElement($cs . 'last-name', $this->organizer['lastName']);
|
||||
}
|
||||
$writer->endElement(); // organizer
|
||||
|
||||
}
|
||||
|
||||
foreach ($this->users as $user) {
|
||||
|
||||
$writer->startElement($cs . 'user');
|
||||
$writer->writeElement('{DAV:}href', $user['href']);
|
||||
if (isset($user['commonName']) && $user['commonName']) {
|
||||
$writer->writeElement($cs . 'common-name', $user['commonName']);
|
||||
}
|
||||
$writer->writeElement($cs . 'invite-accepted');
|
||||
|
||||
$writer->startElement($cs . 'access');
|
||||
if ($user['readOnly']) {
|
||||
$writer->writeElement($cs . 'read');
|
||||
} else {
|
||||
$writer->writeElement($cs . 'read-write');
|
||||
}
|
||||
$writer->endElement(); // access
|
||||
|
||||
if (isset($user['summary']) && $user['summary']) {
|
||||
$writer->writeElement($cs . 'summary', $user['summary']);
|
||||
}
|
||||
|
||||
$writer->endElement(); //user
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -10,8 +10,6 @@ sleep 30
|
|||
# run the tests
|
||||
cd "$SCRIPTPATH/CalDAVTester"
|
||||
PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail --basedir "$SCRIPTPATH/../caldavtest/" -o cdt.txt \
|
||||
"CalDAV/current-user-principal.xml" \
|
||||
"CalDAV/sync-report.xml" \
|
||||
"CalDAV/sharing-calendars.xml"
|
||||
|
||||
RESULT=$?
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<D:propfind xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">
|
||||
<D:propfind xmlns:D="DAV:" xmlns:CS="http://owncloud.org/ns">
|
||||
<D:prop>
|
||||
<CS:invite/>
|
||||
</D:prop>
|
||||
|
|
|
@ -161,7 +161,30 @@
|
|||
<arg>
|
||||
<name>exists</name>
|
||||
<value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
|
||||
<!-- value>$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}opaque</value -->
|
||||
<!--<value>$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}opaque</value>-->
|
||||
</arg>
|
||||
</verify>
|
||||
</request>
|
||||
</test>
|
||||
<test name='5a'>
|
||||
<description>Invite propfind returns sharees</description>
|
||||
<request>
|
||||
<method>PROPFIND</method>
|
||||
<ruri>$calendarhome1:/shared/</ruri>
|
||||
<header>
|
||||
<name>Depth</name>
|
||||
<value>0</value>
|
||||
</header>
|
||||
<data>
|
||||
<content-type>text/xml; charset=utf-8</content-type>
|
||||
<filepath>Resource/CalDAV/sharing/calendars/read-write/5.xml</filepath>
|
||||
</data>
|
||||
<verify>
|
||||
<callback>xmlElementMatch</callback>
|
||||
<arg>
|
||||
<name>exists</name>
|
||||
<value>$verify-property-prefix:/{http://owncloud.org/ns}invite/{http://owncloud.org/ns}user/{DAV:}href</value>
|
||||
<value>$verify-property-prefix:/{http://owncloud.org/ns}invite/{http://owncloud.org/ns}user/{http://owncloud.org/ns}invite-accepted</value>
|
||||
</arg>
|
||||
</verify>
|
||||
</request>
|
||||
|
|
Loading…
Reference in New Issue