Test ownCloud CardDAV sharing using CalDAVTester

This commit is contained in:
Thomas Müller 2016-01-12 13:23:50 +01:00
parent 1448215055
commit 45baf03a2a
21 changed files with 464 additions and 32 deletions

View File

@ -68,7 +68,7 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareableAddres
function getShares() {
/** @var CardDavBackend $carddavBackend */
$carddavBackend = $this->carddavBackend;
$carddavBackend->getShares($this->getName());
return $carddavBackend->getShares($this->getBookId());
}
function getACL() {
@ -81,7 +81,26 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareableAddres
];
}
return $acl;
// add the current user
if (isset($this->addressBookInfo['{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal'])) {
$owner = $this->addressBookInfo['{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal'];
$acl[] = [
'privilege' => '{DAV:}read',
'principal' => $owner,
'protected' => true,
];
if ($this->addressBookInfo['{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only']) {
$acl[] = [
'privilege' => '{DAV:}write',
'principal' => $owner,
'protected' => true,
];
}
}
/** @var CardDavBackend $carddavBackend */
$carddavBackend = $this->carddavBackend;
return $carddavBackend->applyShareAcl($this->getBookId(), $acl);
}
function getChildACL() {
@ -94,7 +113,9 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareableAddres
];
}
return $acl;
/** @var CardDavBackend $carddavBackend */
$carddavBackend = $this->carddavBackend;
return $carddavBackend->applyShareAcl($this->getBookId(), $acl);
}
function getChild($name) {
@ -105,4 +126,8 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareableAddres
return new Card($this->carddavBackend, $this->addressBookInfo, $obj);
}
private function getBookId() {
return $this->addressBookInfo['id'];
}
}

View File

@ -33,7 +33,13 @@ class Card extends \Sabre\CardDAV\Card {
];
}
return $acl;
/** @var CardDavBackend $carddavBackend */
$carddavBackend = $this->carddavBackend;
return $carddavBackend->applyShareAcl($this->getBookId(), $acl);
}
private function getBookId() {
return $this->addressBookInfo['id'];
}
}

View File

@ -53,6 +53,10 @@ class CardDavBackend implements BackendInterface, SyncSupport {
'BDAY', 'UID', 'N', 'FN', 'TITLE', 'ROLE', 'NOTE', 'NICKNAME',
'ORG', 'CATEGORIES', 'EMAIL', 'TEL', 'IMPP', 'ADR', 'URL', 'GEO', 'CLOUD');
const ACCESS_OWNER = 1;
const ACCESS_READ_WRITE = 2;
const ACCESS_READ = 3;
/**
* CardDavBackend constructor.
*
@ -109,14 +113,11 @@ class CardDavBackend implements BackendInterface, SyncSupport {
$principals[]= $principalUri;
$query = $this->db->getQueryBuilder();
$query2 = $this->db->getQueryBuilder();
$query2->select(['resourceid'])
->from('dav_shares')
->where($query2->expr()->in('principaluri', $query2->createParameter('principaluri')))
->andWhere($query2->expr()->eq('type', $query2->createParameter('type')));
$result = $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken'])
->from('addressbooks')
->where($query->expr()->in('id', $query->createFunction($query2->getSQL())))
$result = $query->select(['a.id', 'a.uri', 'a.displayname', 'a.principaluri', 'a.description', 'a.synctoken', 's.uri', 's.access'])
->from('dav_shares', 's')
->join('s', 'addressbooks', 'a', 's.resourceid = a.id')
->where($query->expr()->in('s.principaluri', $query->createParameter('principaluri')))
->andWhere($query->expr()->eq('s.type', $query->createParameter('type')))
->setParameter('type', 'addressbook')
->setParameter('principaluri', $principals, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
->execute();
@ -125,11 +126,13 @@ class CardDavBackend implements BackendInterface, SyncSupport {
$addressBooks[] = [
'id' => $row['id'],
'uri' => $row['uri'],
'principaluri' => $row['principaluri'],
'principaluri' => $principalUri,
'{DAV:}displayname' => $row['displayname'],
'{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
'{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
'{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
'{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'],
'{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => $row['access'] === self::ACCESS_READ,
];
}
$result->closeCursor();
@ -782,12 +785,14 @@ class CardDavBackend implements BackendInterface, SyncSupport {
// remove the share if it already exists
$this->unshare($addressBookUri, $element['href']);
$access = $element['readOnly'] ? self::ACCESS_READ : self::ACCESS_READ_WRITE;
$newUri = sha1($addressBookUri . $addressBook['principaluri']);
$query = $this->db->getQueryBuilder();
$query->insert('dav_shares')
->values([
'principaluri' => $query->createNamedParameter($parts[1]),
'uri' => $query->createNamedParameter($addressBookUri),
'uri' => $query->createNamedParameter($newUri),
'type' => $query->createNamedParameter('addressbook'),
'access' => $query->createNamedParameter(0),
'resourceid' => $query->createNamedParameter($addressBook['id'])
@ -835,11 +840,11 @@ class CardDavBackend implements BackendInterface, SyncSupport {
*
* @return array
*/
public function getShares($addressBookUri) {
public function getShares($addressBookId) {
$query = $this->db->getQueryBuilder();
$result = $query->select(['principaluri', 'access'])
->from('dav_shares')
->where($query->expr()->eq('uri', $query->createNamedParameter($addressBookUri)))
->where($query->expr()->eq('resourceid', $query->createNamedParameter($addressBookId)))
->andWhere($query->expr()->eq('type', $query->createNamedParameter('addressbook')))
->execute();
@ -850,7 +855,8 @@ class CardDavBackend implements BackendInterface, SyncSupport {
'href' => "principal:${p['uri']}",
'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '',
'status' => 1,
'readOnly' => ($row['access'] === 1)
'readOnly' => ($row['access'] === self::ACCESS_READ),
'{'.\OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD.'}principal' => $p['uri']
];
}
@ -945,4 +951,29 @@ class CardDavBackend implements BackendInterface, SyncSupport {
return (int)$cardIds['id'];
}
/**
* @param $addressBookId
* @param $acl
* @return array
*/
public function applyShareAcl($addressBookId, $acl) {
$shares = $this->getShares($addressBookId);
foreach ($shares as $share) {
$acl[] = [
'privilege' => '{DAV:}read',
'principal' => $share['{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}principal'],
'protected' => true,
];
if (!$share['readOnly']) {
$acl[] = [
'privilege' => '{DAV:}write',
'principal' => $share['{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}principal'],
'protected' => true,
];
}
}
return $acl;
}
}

View File

@ -34,6 +34,8 @@ use Sabre\HTTP\ResponseInterface;
class Plugin extends ServerPlugin {
const NS_OWNCLOUD = 'http://owncloud.org/ns';
/** @var Auth */
private $auth;
@ -100,7 +102,7 @@ class Plugin extends ServerPlugin {
function initialize(Server $server) {
$this->server = $server;
$server->resourceTypeMapping['OCA\\DAV\CardDAV\\ISharedAddressbook'] = '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}shared';
$this->server->xml->elementMap['{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}share'] = 'OCA\\DAV\\CardDAV\\Sharing\\Xml\\ShareRequest';
$this->server->xml->elementMap['{' . Plugin::NS_OWNCLOUD . '}share'] = 'OCA\\DAV\\CardDAV\\Sharing\\Xml\\ShareRequest';
$this->server->on('method:POST', [$this, 'httpPost']);
}
@ -148,7 +150,7 @@ class Plugin extends ServerPlugin {
// Dealing with the 'share' document, which modified invitees on a
// calendar.
case '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}share' :
case '{' . self::NS_OWNCLOUD . '}share' :
// We can only deal with IShareableCalendar objects
if (!$node instanceof IShareableAddressBook) {

View File

@ -20,6 +20,7 @@
*/
namespace OCA\DAV\CardDAV\Sharing\Xml;
use OCA\DAV\CardDAV\Sharing\Plugin;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
@ -44,32 +45,32 @@ class ShareRequest implements XmlDeserializable {
static function xmlDeserialize(Reader $reader) {
$elems = $reader->parseInnerTree([
'{' . \Sabre\CardDAV\Plugin::NS_CARDDAV. '}set' => 'Sabre\\Xml\\Element\\KeyValue',
'{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}remove' => 'Sabre\\Xml\\Element\\KeyValue',
$elements = $reader->parseInnerTree([
'{' . Plugin::NS_OWNCLOUD. '}set' => 'Sabre\\Xml\\Element\\KeyValue',
'{' . Plugin::NS_OWNCLOUD . '}remove' => 'Sabre\\Xml\\Element\\KeyValue',
]);
$set = [];
$remove = [];
foreach ($elems as $elem) {
foreach ($elements as $elem) {
switch ($elem['name']) {
case '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}set' :
case '{' . Plugin::NS_OWNCLOUD . '}set' :
$sharee = $elem['value'];
$sumElem = '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}summary';
$commonName = '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}common-name';
$sumElem = '{' . Plugin::NS_OWNCLOUD . '}summary';
$commonName = '{' . Plugin::NS_OWNCLOUD . '}common-name';
$set[] = [
'href' => $sharee['{DAV:}href'],
'commonName' => isset($sharee[$commonName]) ? $sharee[$commonName] : null,
'summary' => isset($sharee[$sumElem]) ? $sharee[$sumElem] : null,
'readOnly' => !array_key_exists('{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}read-write', $sharee),
'readOnly' => !array_key_exists('{' . Plugin::NS_OWNCLOUD . '}read-write', $sharee),
];
break;
case '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}remove' :
case '{' . Plugin::NS_OWNCLOUD . '}remove' :
$remove[] = $elem['value']['{DAV:}href'];
break;

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<CS:share xmlns:D="DAV:" xmlns:CS="http://owncloud.org/ns">
<CS:set>
<D:href>principal:principals/users/user02</D:href>
<CS:summary>My Shared Calendar</CS:summary>
<CS:read-write/>
</CS:set>
</CS:share>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:resourcetype/>
<D:owner/>
<D:current-user-privilege-set/>
</D:prop>
</D:propfind>

View File

@ -0,0 +1,11 @@
BEGIN:VCARD
VERSION:3.0
N:Thompson;Default;;;
FN:Default Thompson
EMAIL;TYPE=INTERNET,WORK,pref:lthompson@example.com
TEL;TYPE=WORK,pref:1-555-555-5555
TEL;TYPE=CELL:1-555-555-5555
ITEM1.ADR;TYPE=WORK,pref:;;2 Lag;Elk Forest;California;99999;USA
ITEM1.X-ABADR:us
UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1:ABPerson
END:VCARD

View File

@ -0,0 +1,11 @@
BEGIN:VCARD
VERSION:3.0
N:Thompson;Default;;;
FN:Default Thompson
EMAIL;TYPE=INTERNET,WORK,pref:lthompson@example.net
TEL;TYPE=WORK,pref:1-555-555-5555
TEL;TYPE=CELL:1-555-555-6666
ITEM1.ADR;TYPE=WORK,pref:;;2 Lag;Elk Forest;California;99999;USA
ITEM1.X-ABADR:us
UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1:ABPerson
END:VCARD

View File

@ -0,0 +1,11 @@
BEGIN:VCARD
VERSION:3.0
N:Miller;Default;;;
FN:Default Miller
EMAIL;TYPE=INTERNET,WORK,pref:lthompson@example.com
TEL;TYPE=WORK,pref:1-555-555-5555
TEL;TYPE=CELL:1-555-555-5555
ITEM1.ADR;TYPE=WORK,pref:;;2 Lag;Elk Forest;California;99999;USA
ITEM1.X-ABADR:us
UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1:ABPerson
END:VCARD

View File

@ -0,0 +1,11 @@
BEGIN:VCARD
VERSION:3.0
N:Smith;Default;;;
FN:Default Smith
EMAIL;TYPE=INTERNET,WORK,pref:lthompson@example.com
TEL;TYPE=WORK,pref:1-555-555-5555
TEL;TYPE=CELL:1-555-555-5555
ITEM1.ADR;TYPE=WORK,pref:;;2 Lag;Elk Forest;California;99999;USA
ITEM1.X-ABADR:us
UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1:ABPerson
END:VCARD

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:current-user-principal/>
</D:prop>
</D:propfind>

View File

@ -0,0 +1,11 @@
BEGIN:VCARD
VERSION:3.0
N:Thompson;Default;;;
FN:Default Thompson
EMAIL;type=INTERNET;type=WORK;type=pref:lthompson@example.com
TEL;type=WORK;type=pref:1-555-555-5555
TEL;type=CELL:1-555-555-5555
item1.ADR;type=WORK;type=pref:;;2 Lag;Elk Forest;California;99999;USA
item1.X-ABADR:us
UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1:ABPerson
END:VCARD

View File

@ -0,0 +1,17 @@
BEGIN:VCARD
VERSION:3.0
N:Contact;Mulberry;;;
FN:Mulberry Contact
NICKNAME:mulberry
ORG:Apple Inc.;
EMAIL;type=INTERNET;type=WORK;type=pref:mulberry_contact@example.com
TEL;type=HOME;type=pref:555-555-5555
TEL;type=WORK:555-555-5555
TEL;type=WORK;type=FAX:555-555-5555
item1.ADR;type=WORK;type=pref:;;1 Infinite Circle;Exampletino\, CA 99999;USA;;
item1.X-ABADR:us
NOTE:This is a contact created in Mulberry.
item2.URL;type=pref:http://www.example.com/~magic
item2.X-ABLabel:_$!<HomePage>!$_
UID:782DAAF92CB1ED1BC155CDB3@D76FAF7B10D9E8D2D41F779D
END:VCARD

View File

@ -0,0 +1,12 @@
BEGIN:VCARD
VERSION:3.0
N:Kawado;Saeko;;;
FN:Snow Leopard
ORG:Snow Leopard;
EMAIL;type=INTERNET;type=WORK;type=pref:snowleopard_apple@example.com
TEL;type=WORK;type=pref:555-555-5555
item1.ADR;type=WORK;type=pref:;;2 Fidel Ave. Suite 1;Mountain Top;CA;99999;USA
item1.X-ABADR:us
X-ABShowAs:COMPANY
UID:FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1:ABPerson
END:VCARD

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:supported-report-set/>
<D:sync-token/>
</D:prop>
</D:propfind>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<D:sync-collection xmlns:D="DAV:">
<D:sync-token/>
<D:prop/>
</D:sync-collection>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE serverinfo SYSTEM
"/home/deepdiver/Development/ownCloud/master/apps/dav/tests/travis/caldavtest/config/serverinfo.dtd">
"/home/deepdiver/Development/ownCloud/master/apps/dav/tests/travis/caldavtest/serverinfo.dtd">
<!--
Copyright (c) 2006-2015 Apple Inc. All rights reserved.

View File

@ -0,0 +1,246 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
<caldavtest>
<description>Test addressbook sharing</description>
<require-feature>
<feature>carddav</feature>
</require-feature>
<start>
</start>
<test-suite name='Read-write addressbook'>
<test name='1'>
<description>POST invitation</description>
<request>
<method>POST</method>
<ruri>$addressbookpath1:</ruri>
<data>
<content-type>text/xml; charset=utf-8</content-type>
<filepath>Resource/CardDAV/sharing/read-write/1.xml</filepath>
</data>
<verify>
<callback>statusCode</callback>
</verify>
</request>
</test>
<test name='4'>
<description>Shared addressbook exists</description>
<request user="$userid2:" pswd="$pswd2:">
<method>PROPFIND</method>
<ruri>$addressbookpath1:/</ruri>
<header>
<name>Depth</name>
<value>0</value>
</header>
<data>
<content-type>text/xml; charset=utf-8</content-type>
<filepath>Resource/CardDAV/sharing/read-write/4.xml</filepath>
</data>
<verify>
<callback>xmlElementMatch</callback>
<arg>
<name>exists</name>
<value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
<value>$verify-property-prefix:/{DAV:}resourcetype/{DAV:}collection</value>
<value>$verify-property-prefix:/{DAV:}resourcetype/{urn:ietf:params:xml:ns:carddav}addressbook</value>
<value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value>
<value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value>
<value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value>
<value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value>
</arg>
<arg>
<name>notexists</name>
<value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value>
<value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value>
</arg>
</verify>
</request>
</test>
<test name='4a'>
<description>Shared calendar exists Depth:1</description>
<request user="$userid2:" pswd="$pswd2:">
<method>PROPFIND</method>
<ruri>$addressbookhome2:/</ruri>
<header>
<name>Depth</name>
<value>1</value>
</header>
<data>
<content-type>text/xml; charset=utf-8</content-type>
<filepath>Resource/CardDAV/sharing/read-write/4.xml</filepath>
</data>
<verify>
<callback>xmlElementMatch</callback>
<arg>
<name>parent</name>
<value>$multistatus-response-prefix:[^{DAV:}href=$addressbookhome2:/ade1a55d408167e8ff77611c0eebe8f80579b549/]</value>
</arg>
<arg>
<name>exists</name>
<!--<value>$verify-response-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>-->
<value>$verify-response-prefix:/{DAV:}resourcetype/{DAV:}collection</value>
<value>$verify-response-prefix:/{DAV:}resourcetype/{urn:ietf:params:xml:ns:carddav}addressbook</value>
<value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value>
<value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value>
<value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value>
<value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value>
</arg>
<arg>
<name>notexists</name>
<value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value>
<value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value>
</arg>
</verify>
</request>
</test>
<test name='5'>
<description>Original calendar unchanged</description>
<request>
<method>PROPFIND</method>
<ruri>$addressbookpath1:</ruri>
<header>
<name>Depth</name>
<value>0</value>
</header>
<data>
<content-type>text/xml; charset=utf-8</content-type>
<filepath>Resource/CardDAV/sharing/read-write/4.xml</filepath>
</data>
<verify>
<callback>xmlElementMatch</callback>
<arg>
<name>exists</name>
<value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
</arg>
</verify>
</request>
</test>
<test name='6'>
<description>Sharee creates contact</description>
<request user="$userid2:" pswd="$pswd2:">
<method>PUT</method>
<ruri>$addressbookpath1:/1.vcf</ruri>
<data>
<content-type>text/vcard; charset=utf-8</content-type>
<filepath>Resource/CardDAV/sharing/read-write/6.vcf</filepath>
</data>
<verify>
<callback>statusCode</callback>
</verify>
</request>
</test>
<test name='7'>
<description>Sharer sees contact</description>
<request>
<method>GET</method>
<ruri>$addressbookpath1:/1.vcf</ruri>
<verify>
<callback>addressDataMatch</callback>
<arg>
<name>filepath</name>
<value>Resource/CardDAV/sharing/read-write/6.vcf</value>
</arg>
</verify>
</request>
</test>
<test name='8'>
<description>Sharer changes contact</description>
<request>
<method>PUT</method>
<ruri>$addressbookpath1:/1.vcf</ruri>
<data>
<content-type>text/vcard; charset=utf-8</content-type>
<filepath>Resource/CardDAV/sharing/read-write/7.vcf</filepath>
</data>
<verify>
<callback>statusCode</callback>
</verify>
</request>
</test>
<test name='9'>
<description>Sharee sees changed contact</description>
<request user="$userid2:" pswd="$pswd2:">
<method>GET</method>
<ruri>$addressbookpath1:/1.vcf</ruri>
<verify>
<callback>addressDataMatch</callback>
<arg>
<name>filepath</name>
<value>Resource/CardDAV/sharing/read-write/7.vcf</value>
</arg>
</verify>
</request>
</test>
<test name='10'>
<description>Sharer creates event</description>
<request>
<method>PUT</method>
<ruri>$addressbookpath1:/2.vcf</ruri>
<data>
<content-type>text/vcard; charset=utf-8</content-type>
<filepath>Resource/CardDAV/sharing/read-write/8.vcf</filepath>
</data>
<verify>
<callback>statusCode</callback>
</verify>
</request>
</test>
<test name='11'>
<description>Sharee sees new event</description>
<request user="$userid2:" pswd="$pswd2:">
<method>GET</method>
<ruri>$addressbookpath1:/2.vcf</ruri>
<verify>
<callback>addressDataMatch</callback>
<arg>
<name>filepath</name>
<value>Resource/CardDAV/sharing/read-write/8.vcf</value>
</arg>
</verify>
</request>
</test>
<test name='12'>
<description>Sharee changes event</description>
<request user="$userid2:" pswd="$pswd2:">
<method>PUT</method>
<ruri>$addressbookpath1:/2.vcf</ruri>
<data>
<content-type>text/vcard; charset=utf-8</content-type>
<filepath>Resource/CardDAV/sharing/read-write/9.vcf</filepath>
</data>
<verify>
<callback>statusCode</callback>
</verify>
</request>
</test>
<test name='13'>
<description>Sharer sees changed event</description>
<request>
<method>GET</method>
<ruri>$addressbookpath1:/2.vcf</ruri>
<verify>
<callback>addressDataMatch</callback>
<arg>
<name>filepath</name>
<value>Resource/CardDAV/sharing/read-write/9.vcf</value>
</arg>
</verify>
</request>
</test>
</test-suite>
<end>
</end>
</caldavtest>

View File

@ -9,9 +9,12 @@ sleep 30
# run the tests
cd "$SCRIPTPATH/CalDAVTester"
PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail -s "$SCRIPTPATH/../caldavtest/config/serverinfo.xml" -o cdt.txt \
"$SCRIPTPATH/../caldavtest/tests/CardDAV/current-user-principal.xml" \
"$SCRIPTPATH/../caldavtest/tests/CardDAV/sync-report.xml"
PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail --basedir "$SCRIPTPATH/../caldavtest/" -o cdt.txt \
"CardDAV/current-user-principal.xml" \
"CardDAV/sync-report.xml" \
"CardDAV/sharing-addressbooks.xml"
RESULT=$?
tail "$/../../../../../data-autotest/owncloud.log"