Merge pull request #21626 from owncloud/share-addressbooks-with-groups-2
Show group shared addressbooks
This commit is contained in:
commit
bf9f4f20e1
|
@ -67,7 +67,8 @@ class Application extends App {
|
|||
$db = $c->getServer()->getDatabaseConnection();
|
||||
$logger = $c->getServer()->getLogger();
|
||||
$principal = new \OCA\DAV\Connector\Sabre\Principal(
|
||||
$c->getServer()->getUserManager()
|
||||
$c->getServer()->getUserManager(),
|
||||
$c->getServer()->getGroupManager()
|
||||
);
|
||||
return new \OCA\DAV\CardDAV\CardDavBackend($db, $principal, $logger);
|
||||
});
|
||||
|
|
|
@ -27,12 +27,13 @@ use OCA\DAV\Command\SyncSystemAddressBook;
|
|||
$config = \OC::$server->getConfig();
|
||||
$dbConnection = \OC::$server->getDatabaseConnection();
|
||||
$userManager = OC::$server->getUserManager();
|
||||
$groupManager = OC::$server->getGroupManager();
|
||||
$config = \OC::$server->getConfig();
|
||||
$logger = \OC::$server->getLogger();
|
||||
|
||||
$app = new Application();
|
||||
|
||||
/** @var Symfony\Component\Console\Application $application */
|
||||
$application->add(new CreateAddressBook($userManager, $dbConnection, $config, $logger));
|
||||
$application->add(new CreateAddressBook($userManager, $groupManager, $dbConnection, $logger));
|
||||
$application->add(new CreateCalendar($userManager, $dbConnection));
|
||||
$application->add(new SyncSystemAddressBook($app->getSyncService()));
|
||||
|
|
|
@ -25,6 +25,7 @@ use OCA\DAV\CardDAV\CardDavBackend;
|
|||
use OCA\DAV\Connector\Sabre\Principal;
|
||||
use OCP\IConfig;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\ILogger;
|
||||
use OCP\IUserManager;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
|
@ -40,12 +41,12 @@ class CreateAddressBook extends Command {
|
|||
/** @var \OCP\IDBConnection */
|
||||
protected $dbConnection;
|
||||
|
||||
/** @var IConfig */
|
||||
private $config;
|
||||
|
||||
/** @var ILogger */
|
||||
private $logger;
|
||||
|
||||
/** @var IGroupManager $groupManager */
|
||||
private $groupManager;
|
||||
|
||||
/**
|
||||
* @param IUserManager $userManager
|
||||
* @param IDBConnection $dbConnection
|
||||
|
@ -53,14 +54,14 @@ class CreateAddressBook extends Command {
|
|||
* @param ILogger $logger
|
||||
*/
|
||||
function __construct(IUserManager $userManager,
|
||||
IGroupManager $groupManager,
|
||||
IDBConnection $dbConnection,
|
||||
IConfig $config,
|
||||
ILogger $logger
|
||||
) {
|
||||
parent::__construct();
|
||||
$this->userManager = $userManager;
|
||||
$this->groupManager = $groupManager;
|
||||
$this->dbConnection = $dbConnection;
|
||||
$this->config = $config;
|
||||
$this->logger = $logger;
|
||||
}
|
||||
|
||||
|
@ -82,7 +83,8 @@ class CreateAddressBook extends Command {
|
|||
throw new \InvalidArgumentException("User <$user> in unknown.");
|
||||
}
|
||||
$principalBackend = new Principal(
|
||||
$this->userManager
|
||||
$this->userManager,
|
||||
$this->groupManager
|
||||
);
|
||||
|
||||
$name = $input->getArgument('name');
|
||||
|
|
|
@ -20,18 +20,8 @@
|
|||
*/
|
||||
namespace OCA\DAV\Command;
|
||||
|
||||
use OCA\DAV\CardDAV\CardDavBackend;
|
||||
use OCA\DAV\CardDAV\Converter;
|
||||
use OCA\DAV\CardDAV\SyncService;
|
||||
use OCA\DAV\Connector\Sabre\Principal;
|
||||
use OCP\IConfig;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
use Sabre\CardDAV\Plugin;
|
||||
use Sabre\VObject\Component\VCard;
|
||||
use Sabre\VObject\Property\Text;
|
||||
use Sabre\VObject\Reader;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Helper\ProgressBar;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
|
|
@ -50,7 +50,7 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareableAddres
|
|||
function updateShares(array $add, array $remove) {
|
||||
/** @var CardDavBackend $carddavBackend */
|
||||
$carddavBackend = $this->carddavBackend;
|
||||
$carddavBackend->updateShares($this->getName(), $add, $remove);
|
||||
$carddavBackend->updateShares($this, $add, $remove);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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,15 +113,24 @@ 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) {
|
||||
$obj = $this->carddavBackend->getCard($this->addressBookInfo['id'], $name);
|
||||
$obj = $this->carddavBackend->getCard($this->getBookId(), $name);
|
||||
if (!$obj) {
|
||||
throw new NotFound('Card not found');
|
||||
}
|
||||
return new Card($this->carddavBackend, $this->addressBookInfo, $obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getBookId() {
|
||||
return $this->addressBookInfo['id'];
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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'];
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ namespace OCA\DAV\CardDAV;
|
|||
|
||||
use OCA\DAV\Connector\Sabre\Principal;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\ILogger;
|
||||
use Sabre\CardDAV\Backend\BackendInterface;
|
||||
use Sabre\CardDAV\Backend\SyncSupport;
|
||||
use Sabre\CardDAV\Plugin;
|
||||
|
@ -53,6 +52,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.
|
||||
*
|
||||
|
@ -65,7 +68,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns the list of addressbooks for a specific user.
|
||||
* Returns the list of address books for a specific user.
|
||||
*
|
||||
* Every addressbook should have the following properties:
|
||||
* id - an arbitrary unique id
|
||||
|
@ -105,28 +108,30 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
|||
$result->closeCursor();
|
||||
|
||||
// query for shared calendars
|
||||
$principals = $this->principalBackend->getGroupMembership($principalUri);
|
||||
$principals[]= $principalUri;
|
||||
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query2 = $this->db->getQueryBuilder();
|
||||
$query2->select(['resourceid'])
|
||||
->from('dav_shares')
|
||||
->where($query2->expr()->eq('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', $query->expr()->eq('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', $principalUri)
|
||||
->setParameter('principaluri', $principals, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
|
||||
->execute();
|
||||
|
||||
while($row = $result->fetch()) {
|
||||
$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();
|
||||
|
@ -134,11 +139,43 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
|||
return $addressBooks;
|
||||
}
|
||||
|
||||
public function getAddressBooksByUri($addressBookUri) {
|
||||
/**
|
||||
* @param int $addressBookId
|
||||
*/
|
||||
public function getAddressBookById($addressBookId) {
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$result = $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken'])
|
||||
->from('addressbooks')
|
||||
->where($query->expr()->eq('id', $query->createNamedParameter($addressBookId)))
|
||||
->execute();
|
||||
|
||||
$row = $result->fetch();
|
||||
$result->closeCursor();
|
||||
if ($row === false) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $row['id'],
|
||||
'uri' => $row['uri'],
|
||||
'principaluri' => $row['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',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $addressBookUri
|
||||
* @return array|null
|
||||
*/
|
||||
public function getAddressBooksByUri($principal, $addressBookUri) {
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$result = $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken'])
|
||||
->from('addressbooks')
|
||||
->where($query->expr()->eq('uri', $query->createNamedParameter($addressBookUri)))
|
||||
->andWhere($query->expr()->eq('principaluri', $query->createNamedParameter($principal)))
|
||||
->setMaxResults(1)
|
||||
->execute();
|
||||
|
||||
|
@ -217,6 +254,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
|||
* @param string $principalUri
|
||||
* @param string $url Just the 'basename' of the url.
|
||||
* @param array $properties
|
||||
* @return int
|
||||
* @throws BadRequest
|
||||
*/
|
||||
function createAddressBook($principalUri, $url, array $properties) {
|
||||
|
@ -260,6 +298,8 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
|||
])
|
||||
->setParameters($values)
|
||||
->execute();
|
||||
|
||||
return $query->getLastInsertId();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -663,16 +703,16 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
|||
}
|
||||
|
||||
/**
|
||||
* @param string $path
|
||||
* @param AddressBook $book
|
||||
* @param string[] $add
|
||||
* @param string[] $remove
|
||||
*/
|
||||
public function updateShares($path, $add, $remove) {
|
||||
public function updateShares($book, $add, $remove) {
|
||||
foreach($add as $element) {
|
||||
$this->shareWith($path, $element);
|
||||
$this->shareWith($book, $element);
|
||||
}
|
||||
foreach($remove as $element) {
|
||||
$this->unshare($path, $element);
|
||||
$this->unshare($book->getBookId(), $element);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -758,10 +798,10 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
|||
|
||||
|
||||
/**
|
||||
* @param string $addressBookUri
|
||||
* @param AddressBook $addressBook
|
||||
* @param string $element
|
||||
*/
|
||||
private function shareWith($addressBookUri, $element) {
|
||||
private function shareWith($addressBook, $element) {
|
||||
$user = $element['href'];
|
||||
$parts = explode(':', $user, 2);
|
||||
if ($parts[0] !== 'principal') {
|
||||
|
@ -772,31 +812,31 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
|||
return;
|
||||
}
|
||||
|
||||
$addressBook = $this->getAddressBooksByUri($addressBookUri);
|
||||
if (is_null($addressBook)) {
|
||||
return;
|
||||
// remove the share if it already exists
|
||||
$this->unshare($addressBook->getBookId(), $element['href']);
|
||||
$access = self::ACCESS_READ;
|
||||
if (isset($element['readOnly'])) {
|
||||
$access = $element['readOnly'] ? self::ACCESS_READ : self::ACCESS_READ_WRITE;
|
||||
}
|
||||
|
||||
// remove the share if it already exists
|
||||
$this->unshare($addressBookUri, $element['href']);
|
||||
|
||||
$newUri = sha1($addressBook->getName() . $addressBook->getOwner());
|
||||
$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'])
|
||||
'access' => $query->createNamedParameter($access),
|
||||
'resourceid' => $query->createNamedParameter($addressBook->getBookId())
|
||||
]);
|
||||
$query->execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $addressBookUri
|
||||
* @param int $addressBookId
|
||||
* @param string $element
|
||||
*/
|
||||
private function unshare($addressBookUri, $element) {
|
||||
private function unshare($addressBookId, $element) {
|
||||
$parts = explode(':', $element, 2);
|
||||
if ($parts[0] !== 'principal') {
|
||||
return;
|
||||
|
@ -806,14 +846,9 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
|||
return;
|
||||
}
|
||||
|
||||
$addressBook = $this->getAddressBooksByUri($addressBookUri);
|
||||
if (is_null($addressBook)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query->delete('dav_shares')
|
||||
->where($query->expr()->eq('resourceid', $query->createNamedParameter($addressBook['id'])))
|
||||
->where($query->expr()->eq('resourceid', $query->createNamedParameter($addressBookId)))
|
||||
->andWhere($query->expr()->eq('type', $query->createNamedParameter('addressbook')))
|
||||
->andWhere($query->expr()->eq('principaluri', $query->createNamedParameter($parts[1])))
|
||||
;
|
||||
|
@ -832,11 +867,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();
|
||||
|
||||
|
@ -847,7 +882,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']
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -942,4 +978,30 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
|||
|
||||
return (int)$cardIds['id'];
|
||||
}
|
||||
|
||||
/**
|
||||
* For shared address books the sharee is set in the ACL of the address book
|
||||
* @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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -90,13 +90,13 @@ class SyncService {
|
|||
* @throws \Sabre\DAV\Exception\BadRequest
|
||||
*/
|
||||
public function ensureSystemAddressBookExists($principal, $id, $properties) {
|
||||
$book = $this->backend->getAddressBooksByUri($id);
|
||||
$book = $this->backend->getAddressBooksByUri($principal, $id);
|
||||
if (!is_null($book)) {
|
||||
return $book;
|
||||
}
|
||||
$this->backend->createAddressBook($principal, $id, $properties);
|
||||
|
||||
return $this->backend->getAddressBooksByUri($id);
|
||||
return $this->backend->getAddressBooksByUri($principal, $id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -29,9 +29,10 @@
|
|||
|
||||
namespace OCA\DAV\Connector\Sabre;
|
||||
|
||||
use OCP\IGroup;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
use OCP\IConfig;
|
||||
use Sabre\DAV\Exception;
|
||||
use \Sabre\DAV\PropPatch;
|
||||
use Sabre\DAVACL\PrincipalBackend\BackendInterface;
|
||||
|
@ -42,11 +43,15 @@ class Principal implements BackendInterface {
|
|||
/** @var IUserManager */
|
||||
private $userManager;
|
||||
|
||||
/** @var IGroupManager */
|
||||
private $groupManager;
|
||||
|
||||
/**
|
||||
* @param IUserManager $userManager
|
||||
*/
|
||||
public function __construct(IUserManager $userManager) {
|
||||
public function __construct(IUserManager $userManager, IGroupManager $groupManager) {
|
||||
$this->userManager = $userManager;
|
||||
$this->groupManager = $groupManager;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -127,24 +132,23 @@ class Principal implements BackendInterface {
|
|||
public function getGroupMembership($principal) {
|
||||
list($prefix, $name) = URLUtil::splitPath($principal);
|
||||
|
||||
$group_membership = array();
|
||||
if ($prefix === 'principals/users') {
|
||||
$principal = $this->getPrincipalByPath($principal);
|
||||
if (!$principal) {
|
||||
$user = $this->userManager->get($name);
|
||||
if (!$user) {
|
||||
throw new Exception('Principal not found');
|
||||
}
|
||||
|
||||
// TODO: for now the user principal has only its own groups
|
||||
return array(
|
||||
'principals/users/'.$name.'/calendar-proxy-read',
|
||||
'principals/users/'.$name.'/calendar-proxy-write',
|
||||
// The addressbook groups are not supported in Sabre,
|
||||
// see http://groups.google.com/group/sabredav-discuss/browse_thread/thread/ef2fa9759d55f8c#msg_5720afc11602e753
|
||||
//'principals/'.$name.'/addressbook-proxy-read',
|
||||
//'principals/'.$name.'/addressbook-proxy-write',
|
||||
);
|
||||
$groups = $this->groupManager->getUserGroups($user);
|
||||
$groups = array_map(function($group) {
|
||||
/** @var IGroup $group */
|
||||
return 'principals/groups/' . $group->getGID();
|
||||
}, $groups);
|
||||
|
||||
$groups[]= 'principals/users/'.$name.'/calendar-proxy-read';
|
||||
$groups[]= 'principals/users/'.$name.'/calendar-proxy-write';
|
||||
return $groups;
|
||||
}
|
||||
return $group_membership;
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -207,4 +211,5 @@ class Principal implements BackendInterface {
|
|||
}
|
||||
return $principal;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -37,7 +37,8 @@ class RootCollection extends SimpleCollection {
|
|||
$config = \OC::$server->getConfig();
|
||||
$db = \OC::$server->getDatabaseConnection();
|
||||
$userPrincipalBackend = new Principal(
|
||||
\OC::$server->getUserManager()
|
||||
\OC::$server->getUserManager(),
|
||||
\OC::$server->getGroupManager()
|
||||
);
|
||||
$groupPrincipalBackend = new GroupPrincipalBackend(
|
||||
\OC::$server->getGroupManager()
|
||||
|
|
|
@ -9,7 +9,7 @@ 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 \
|
||||
PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail -s "$SCRIPTPATH/../caldavtest/serverinfo.xml" -o cdt.txt \
|
||||
"$SCRIPTPATH/../caldavtest/tests/CalDAV/current-user-principal.xml"
|
||||
RESULT=$?
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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>
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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>
|
|
@ -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>
|
|
@ -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.
|
|
@ -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>
|
|
@ -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"
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
namespace OCA\DAV\Tests\Unit\CardDAV;
|
||||
|
||||
use InvalidArgumentException;
|
||||
use OCA\DAV\CardDAV\AddressBook;
|
||||
use OCA\DAV\CardDAV\CardDavBackend;
|
||||
use OCA\DAV\Connector\Sabre\Principal;
|
||||
use OCP\IDBConnection;
|
||||
|
@ -247,23 +248,24 @@ class CardDavBackendTest extends TestCase {
|
|||
$books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER);
|
||||
$this->assertEquals(1, count($books));
|
||||
|
||||
$this->backend->updateShares('Example', [['href' => 'principal:principals/best-friend']], []);
|
||||
$exampleBook = new AddressBook($this->backend, $books[0]);
|
||||
$this->backend->updateShares($exampleBook, [['href' => 'principal:principals/best-friend']], []);
|
||||
|
||||
$shares = $this->backend->getShares('Example');
|
||||
$shares = $this->backend->getShares($exampleBook->getBookId());
|
||||
$this->assertEquals(1, count($shares));
|
||||
|
||||
// adding the same sharee again has no effect
|
||||
$this->backend->updateShares('Example', [['href' => 'principal:principals/best-friend']], []);
|
||||
$this->backend->updateShares($exampleBook, [['href' => 'principal:principals/best-friend']], []);
|
||||
|
||||
$shares = $this->backend->getShares('Example');
|
||||
$shares = $this->backend->getShares($exampleBook->getBookId());
|
||||
$this->assertEquals(1, count($shares));
|
||||
|
||||
$books = $this->backend->getAddressBooksForUser('principals/best-friend');
|
||||
$this->assertEquals(1, count($books));
|
||||
|
||||
$this->backend->updateShares('Example', [], ['principal:principals/best-friend']);
|
||||
$this->backend->updateShares($exampleBook, [], ['principal:principals/best-friend']);
|
||||
|
||||
$shares = $this->backend->getShares('Example');
|
||||
$shares = $this->backend->getShares($exampleBook->getBookId());
|
||||
$this->assertEquals(0, count($shares));
|
||||
|
||||
$books = $this->backend->getAddressBooksForUser('principals/best-friend');
|
||||
|
|
|
@ -74,7 +74,7 @@ class PluginTest extends TestCase {
|
|||
$request = new Request();
|
||||
$request->addHeader('Content-Type', 'application/xml');
|
||||
$request->setUrl('addressbook1.vcf');
|
||||
$request->setBody('<?xml version="1.0" encoding="utf-8" ?><CS:share xmlns:D="DAV:" xmlns:CS="urn:ietf:params:xml:ns:carddav"><CS:set><D:href>principal:principals/admin</D:href><CS:read-write/></CS:set> <CS:remove><D:href>mailto:wilfredo@example.com</D:href></CS:remove></CS:share>');
|
||||
$request->setBody('<?xml version="1.0" encoding="utf-8" ?><CS:share xmlns:D="DAV:" xmlns:CS="http://owncloud.org/ns"><CS:set><D:href>principal:principals/admin</D:href><CS:read-write/></CS:set> <CS:remove><D:href>mailto:wilfredo@example.com</D:href></CS:remove></CS:share>');
|
||||
$response = new Response();
|
||||
$this->plugin->httpPost($request, $response);
|
||||
}
|
||||
|
|
|
@ -23,21 +23,28 @@
|
|||
|
||||
namespace OCA\DAV\Tests\Unit\Connector\Sabre;
|
||||
|
||||
use OCP\IGroupManager;
|
||||
use \Sabre\DAV\PropPatch;
|
||||
use OCP\IUserManager;
|
||||
use OCP\IConfig;
|
||||
use Test\TestCase;
|
||||
|
||||
class Principal extends \Test\TestCase {
|
||||
/** @var IUserManager */
|
||||
class Principal extends TestCase {
|
||||
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject */
|
||||
private $userManager;
|
||||
/** @var \OCA\DAV\Connector\Sabre\Principal */
|
||||
private $connector;
|
||||
/** @var IGroupManager | \PHPUnit_Framework_MockObject_MockObject */
|
||||
private $groupManager;
|
||||
|
||||
public function setUp() {
|
||||
$this->userManager = $this->getMockBuilder('\OCP\IUserManager')
|
||||
->disableOriginalConstructor()->getMock();
|
||||
$this->groupManager = $this->getMockBuilder('\OCP\IGroupManager')
|
||||
->disableOriginalConstructor()->getMock();
|
||||
|
||||
$this->connector = new \OCA\DAV\Connector\Sabre\Principal($this->userManager);
|
||||
$this->connector = new \OCA\DAV\Connector\Sabre\Principal(
|
||||
$this->userManager,
|
||||
$this->groupManager);
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
|
@ -195,15 +202,14 @@ class Principal extends \Test\TestCase {
|
|||
public function testGetGroupMembership() {
|
||||
$fooUser = $this->getMockBuilder('\OC\User\User')
|
||||
->disableOriginalConstructor()->getMock();
|
||||
$fooUser
|
||||
->expects($this->exactly(1))
|
||||
->method('getUID')
|
||||
->will($this->returnValue('foo'));
|
||||
$this->userManager
|
||||
->expects($this->once())
|
||||
->method('get')
|
||||
->with('foo')
|
||||
->will($this->returnValue($fooUser));
|
||||
->willReturn($fooUser);
|
||||
$this->groupManager
|
||||
->method('getUserGroups')
|
||||
->willReturn([]);
|
||||
|
||||
$expectedResponse = [
|
||||
'principals/users/foo/calendar-proxy-read',
|
||||
|
|
Loading…
Reference in New Issue