summaryrefslogtreecommitdiffstats
path: root/apps/dav
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2016-01-20 21:08:23 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2016-02-08 10:52:30 +0100
commitcca2ade199f09c2e4c2c00c86e776dcc3b51d60f (patch)
tree048d4f64d0de92a12565d1a8111fc1817f7db8cc /apps/dav
parent9eef38c5937cf8c8a848a0b78afe8123fb922712 (diff)
downloadnextcloud-server-cca2ade199f09c2e4c2c00c86e776dcc3b51d60f.tar.gz
nextcloud-server-cca2ade199f09c2e4c2c00c86e776dcc3b51d60f.zip
Adding pre oc 9.0 CardDAV endpoint for migration of old clients
Diffstat (limited to 'apps/dav')
-rw-r--r--apps/dav/appinfo/info.xml4
-rw-r--r--apps/dav/appinfo/v1/carddav.php70
-rw-r--r--apps/dav/appinfo/v1/webdav.php3
-rw-r--r--apps/dav/lib/carddav/addressbookroot.php3
-rw-r--r--apps/dav/lib/carddav/carddavbackend.php17
-rw-r--r--apps/dav/lib/connector/sabre/auth.php6
-rw-r--r--apps/dav/lib/connector/sabre/principal.php45
7 files changed, 122 insertions, 26 deletions
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml
index f035d19d862..647ad279ba7 100644
--- a/apps/dav/appinfo/info.xml
+++ b/apps/dav/appinfo/info.xml
@@ -14,7 +14,9 @@
<files>appinfo/v1/webdav.php</files>
<webdav>appinfo/v1/webdav.php</webdav>
<dav>appinfo/v2/remote.php</dav>
- </remote>
+ <!-- carddav endpoints as used before ownCloud 9.0-->
+ <contacts>appinfo/v1/carddav.php</contacts>
+ <carddav>appinfo/v1/carddav.php</carddav> </remote>
<public>
<webdav>appinfo/v1/publicwebdav.php</webdav>
</public>
diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php
new file mode 100644
index 00000000000..e0c79c75b72
--- /dev/null
+++ b/apps/dav/appinfo/v1/carddav.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+// Backends
+use OCA\DAV\CardDAV\AddressBookRoot;
+use OCA\DAV\CardDAV\CardDavBackend;
+use OCA\DAV\Connector\Sabre\AppEnabledPlugin;
+use OCA\DAV\Connector\Sabre\Auth;
+use OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin;
+use OCA\DAV\Connector\Sabre\MaintenancePlugin;
+use OCA\DAV\Connector\Sabre\Principal;
+use Sabre\CardDAV\Plugin;
+
+$authBackend = new Auth(
+ \OC::$server->getSession(),
+ \OC::$server->getUserSession(),
+ 'principals/'
+);
+$principalBackend = new Principal(
+ \OC::$server->getUserManager(),
+ \OC::$server->getGroupManager(),
+ 'principals/'
+);
+$db = \OC::$server->getDatabaseConnection();
+$cardDavBackend = new CardDavBackend($db, $principalBackend);
+
+// Root nodes
+$principalCollection = new \Sabre\CalDAV\Principal\Collection($principalBackend);
+$principalCollection->disableListing = true; // Disable listing
+
+$addressBookRoot = new AddressBookRoot($principalBackend, $cardDavBackend);
+$addressBookRoot->disableListing = true; // Disable listing
+
+$nodes = array(
+ $principalCollection,
+ $addressBookRoot,
+);
+
+// Fire up server
+$server = new \Sabre\DAV\Server($nodes);
+$server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri());
+$server->setBaseUri($baseuri);
+// Add plugins
+$server->addPlugin(new MaintenancePlugin());
+$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'ownCloud'));
+$server->addPlugin(new Plugin());
+$server->addPlugin(new \Sabre\DAVACL\Plugin());
+$server->addPlugin(new \Sabre\CardDAV\VCFExportPlugin());
+$server->addPlugin(new ExceptionLoggerPlugin('carddav', \OC::$server->getLogger()));
+
+// And off we go!
+$server->exec();
diff --git a/apps/dav/appinfo/v1/webdav.php b/apps/dav/appinfo/v1/webdav.php
index d75c3526bdd..3d3e51e84bc 100644
--- a/apps/dav/appinfo/v1/webdav.php
+++ b/apps/dav/appinfo/v1/webdav.php
@@ -40,7 +40,8 @@ $serverFactory = new \OCA\DAV\Connector\Sabre\ServerFactory(
// Backends
$authBackend = new \OCA\DAV\Connector\Sabre\Auth(
\OC::$server->getSession(),
- \OC::$server->getUserSession()
+ \OC::$server->getUserSession(),
+ 'principals/'
);
$requestUri = \OC::$server->getRequest()->getRequestUri();
diff --git a/apps/dav/lib/carddav/addressbookroot.php b/apps/dav/lib/carddav/addressbookroot.php
index 2680135dec2..99c36c2e767 100644
--- a/apps/dav/lib/carddav/addressbookroot.php
+++ b/apps/dav/lib/carddav/addressbookroot.php
@@ -40,6 +40,9 @@ class AddressBookRoot extends \Sabre\CardDAV\AddressBookRoot {
function getName() {
+ if ($this->principalPrefix === 'principals') {
+ return parent::getName();
+ }
// Grabbing all the components of the principal path.
$parts = explode('/', $this->principalPrefix);
diff --git a/apps/dav/lib/carddav/carddavbackend.php b/apps/dav/lib/carddav/carddavbackend.php
index 9ca166c22a2..b2a54adc49d 100644
--- a/apps/dav/lib/carddav/carddavbackend.php
+++ b/apps/dav/lib/carddav/carddavbackend.php
@@ -93,11 +93,11 @@ class CardDavBackend implements BackendInterface, SyncSupport {
* @return array
*/
function getAddressBooksForUser($principalUri) {
+ $principalUri = $this->convertPrincipal($principalUri, true);
$query = $this->db->getQueryBuilder();
$query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken'])
->from('addressbooks')
- ->where($query->expr()->eq('principaluri', $query->createParameter('principaluri')))
- ->setParameter('principaluri', $principalUri);
+ ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri)));
$addressBooks = [];
@@ -106,7 +106,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
$addressBooks[$row['id']] = [
'id' => $row['id'],
'uri' => $row['uri'],
- 'principaluri' => $row['principaluri'],
+ 'principaluri' => $this->convertPrincipal($row['principaluri'], false),
'{DAV:}displayname' => $row['displayname'],
'{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
'{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
@@ -919,4 +919,15 @@ class CardDavBackend implements BackendInterface, SyncSupport {
public function applyShareAcl($addressBookId, $acl) {
return $this->sharingBackend->applyShareAcl($addressBookId, $acl);
}
+
+ private function convertPrincipal($principalUri, $toV2) {
+ if ($this->principalBackend->getPrincipalPrefix() === 'principals') {
+ list(, $name) = URLUtil::splitPath($principalUri);
+ if ($toV2 === true) {
+ return "principals/users/$name";
+ }
+ return "principals/$name";
+ }
+ return $principalUri;
+ }
}
diff --git a/apps/dav/lib/connector/sabre/auth.php b/apps/dav/lib/connector/sabre/auth.php
index cc679e44dbe..a046e078482 100644
--- a/apps/dav/lib/connector/sabre/auth.php
+++ b/apps/dav/lib/connector/sabre/auth.php
@@ -49,12 +49,14 @@ class Auth extends AbstractBasic {
/**
* @param ISession $session
* @param IUserSession $userSession
+ * @param string $principalPrefix
*/
public function __construct(ISession $session,
- IUserSession $userSession) {
+ IUserSession $userSession,
+ $principalPrefix = 'principals/users/') {
$this->session = $session;
$this->userSession = $userSession;
- $this->principalPrefix = 'principals/users/';
+ $this->principalPrefix = $principalPrefix;
}
/**
diff --git a/apps/dav/lib/connector/sabre/principal.php b/apps/dav/lib/connector/sabre/principal.php
index 5f02d1271df..0f60ec33744 100644
--- a/apps/dav/lib/connector/sabre/principal.php
+++ b/apps/dav/lib/connector/sabre/principal.php
@@ -46,12 +46,20 @@ class Principal implements BackendInterface {
/** @var IGroupManager */
private $groupManager;
+ /** @var string */
+ private $principalPrefix;
+
/**
* @param IUserManager $userManager
+ * @param IGroupManager $groupManager
+ * @param string $principalPrefix
*/
- public function __construct(IUserManager $userManager, IGroupManager $groupManager) {
+ public function __construct(IUserManager $userManager,
+ IGroupManager $groupManager,
+ $principalPrefix = 'principals/users/') {
$this->userManager = $userManager;
$this->groupManager = $groupManager;
+ $this->principalPrefix = trim($principalPrefix, '/');
}
/**
@@ -70,7 +78,7 @@ class Principal implements BackendInterface {
public function getPrincipalsByPrefix($prefixPath) {
$principals = [];
- if ($prefixPath === 'principals/users') {
+ if ($prefixPath === $this->principalPrefix) {
foreach($this->userManager->search('') as $user) {
$principals[] = $this->userToPrincipal($user);
}
@@ -88,20 +96,15 @@ class Principal implements BackendInterface {
* @return array
*/
public function getPrincipalByPath($path) {
- $elements = explode('/', $path);
- if ($elements[0] !== 'principals') {
- return null;
- }
- if ($elements[1] !== 'users') {
- return null;
- }
- $name = $elements[2];
- $user = $this->userManager->get($name);
+ list($prefix, $name) = URLUtil::splitPath($path);
- if (!is_null($user)) {
- return $this->userToPrincipal($user);
- }
+ if ($prefix === $this->principalPrefix) {
+ $user = $this->userManager->get($name);
+ if (!is_null($user)) {
+ return $this->userToPrincipal($user);
+ }
+ }
return null;
}
@@ -132,7 +135,7 @@ class Principal implements BackendInterface {
public function getGroupMembership($principal) {
list($prefix, $name) = URLUtil::splitPath($principal);
- if ($prefix === 'principals/users') {
+ if ($prefix === $this->principalPrefix) {
$user = $this->userManager->get($name);
if (!$user) {
throw new Exception('Principal not found');
@@ -141,11 +144,11 @@ class Principal implements BackendInterface {
$groups = $this->groupManager->getUserGroups($user);
$groups = array_map(function($group) {
/** @var IGroup $group */
- return 'principals/groups/' . $group->getGID();
+ return $this->principalPrefix . '/' . $group->getGID();
}, $groups);
- $groups[]= 'principals/users/'.$name.'/calendar-proxy-read';
- $groups[]= 'principals/users/'.$name.'/calendar-proxy-write';
+// $groups[]= $this->principalPrefix . '/' . $name . '/calendar-proxy-read';
+// $groups[]= $this->principalPrefix . '/' . $name . '/calendar-proxy-write';
return $groups;
}
return [];
@@ -200,7 +203,7 @@ class Principal implements BackendInterface {
$userId = $user->getUID();
$displayName = $user->getDisplayName();
$principal = [
- 'uri' => "principals/users/$userId",
+ 'uri' => $this->principalPrefix . '/' . $userId,
'{DAV:}displayname' => is_null($displayName) ? $userId : $displayName,
];
@@ -212,4 +215,8 @@ class Principal implements BackendInterface {
return $principal;
}
+ public function getPrincipalPrefix() {
+ return $this->principalPrefix;
+ }
+
}