]> source.dussan.org Git - nextcloud-server.git/commitdiff
Adding propfind property to retrieve sharee information from a dav resource
authorThomas Müller <thomas.mueller@tmit.eu>
Tue, 2 Feb 2016 14:13:28 +0000 (15:13 +0100)
committerThomas Müller <thomas.mueller@tmit.eu>
Wed, 3 Feb 2016 16:18:23 +0000 (17:18 +0100)
apps/dav/lib/dav/sharing/plugin.php
apps/dav/lib/dav/sharing/xml/invite.php [new file with mode: 0644]
apps/dav/tests/travis/caldav/script.sh
apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/sharing/calendars/read-write/5.xml
apps/dav/tests/travis/caldavtest/tests/CalDAV/sharing-calendars.xml

index cbb4408e29bcee294ec84b9b3e9d50168b238126..f6e2cceebd9c29d8258bd82319a3d823d0b28ad0 100644 (file)
 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)) {
diff --git a/apps/dav/lib/dav/sharing/xml/invite.php b/apps/dav/lib/dav/sharing/xml/invite.php
new file mode 100644 (file)
index 0000000..659f95d
--- /dev/null
@@ -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
+
+               }
+
+       }
+}
index 7259372567cd0c5e8df875ed57405c461fa7204b..aa5fc7329229d0ccc7e0c4d7780864405038f766 100644 (file)
@@ -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=$?
index e52a842ff662e52e48d9539960be6c5f86957f8d..4862ed195f81cba07b5da6f3c63402139b2140d4 100644 (file)
@@ -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>
index a5fabcf6e8257282c546f507362f0126abee1254..334fa561aecb4b7a3a5c76f1601d4cb9321b0ca4 100644 (file)
                                        <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>