summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2015-08-07 17:36:14 +0200
committerRobin Appelman <icewind@owncloud.com>2015-08-11 14:43:46 +0200
commitb0c8654f9eb8cd71aa575d3eb760fceb2a3942b1 (patch)
tree946ac403dff65d86bda6ce5b6ac1681438abc848
parent8c5302847b9ac3d491c1b62411e62f509573fe7a (diff)
downloadnextcloud-server-b0c8654f9eb8cd71aa575d3eb760fceb2a3942b1.tar.gz
nextcloud-server-b0c8654f9eb8cd71aa575d3eb760fceb2a3942b1.zip
split out creating the sabre dav server to it's own factory
-rw-r--r--apps/files/appinfo/remote.php56
-rw-r--r--apps/files_sharing/publicwebdav.php42
-rw-r--r--lib/private/connector/sabre/objecttree.php6
-rw-r--r--lib/private/connector/sabre/serverfactory.php103
-rw-r--r--tests/lib/connector/sabre/requesttest/requesttest.php44
5 files changed, 145 insertions, 106 deletions
diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php
index fff3332ef49..36479ae13d0 100644
--- a/apps/files/appinfo/remote.php
+++ b/apps/files/appinfo/remote.php
@@ -33,51 +33,23 @@ set_time_limit(0);
// Turn off output buffering to prevent memory problems
\OC_Util::obEnd();
+$serverFactory = new \OC\Connector\Sabre\ServerFactory(
+ \OC::$server->getConfig(),
+ \OC::$server->getLogger(),
+ \OC::$server->getDatabaseConnection(),
+ \OC::$server->getUserSession(),
+ \OC::$server->getMountManager(),
+ \OC::$server->getTagManager()
+);
+
// Backends
$authBackend = new \OC\Connector\Sabre\Auth();
+$requestUri = \OC::$server->getRequest()->getRequestUri();
-// Fire up server
-$objectTree = new \OC\Connector\Sabre\ObjectTree();
-$server = new \OC\Connector\Sabre\Server($objectTree);
-// Set URL explicitly due to reverse-proxy situations
-$server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri());
-$server->setBaseUri($baseuri);
-
-// Load plugins
-$defaults = new OC_Defaults();
-$server->addPlugin(new \OC\Connector\Sabre\BlockLegacyClientPlugin(\OC::$server->getConfig()));
-$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, $defaults->getName()));
-// FIXME: The following line is a workaround for legacy components relying on being able to send a GET to /
-$server->addPlugin(new \OC\Connector\Sabre\DummyGetResponsePlugin());
-$server->addPlugin(new \OC\Connector\Sabre\FilesPlugin($objectTree));
-$server->addPlugin(new \OC\Connector\Sabre\MaintenancePlugin(\OC::$server->getConfig()));
-$server->addPlugin(new \OC\Connector\Sabre\ExceptionLoggerPlugin('webdav', \OC::$server->getLogger()));
-
-// wait with registering these until auth is handled and the filesystem is setup
-$server->on('beforeMethod', function () use ($server, $objectTree) {
- $view = \OC\Files\Filesystem::getView();
- $rootInfo = $view->getFileInfo('');
-
- // Create ownCloud Dir
- $mountManager = \OC\Files\Filesystem::getMountManager();
- $rootDir = new \OC\Connector\Sabre\Directory($view, $rootInfo);
- $objectTree->init($rootDir, $view, $mountManager);
-
- $server->addPlugin(new \OC\Connector\Sabre\TagsPlugin($objectTree, \OC::$server->getTagManager()));
- $server->addPlugin(new \OC\Connector\Sabre\QuotaPlugin($view));
-
- // custom properties plugin must be the last one
- $server->addPlugin(
- new \Sabre\DAV\PropertyStorage\Plugin(
- new \OC\Connector\Sabre\CustomPropertiesBackend(
- $objectTree,
- \OC::$server->getDatabaseConnection(),
- \OC::$server->getUserSession()->getUser()
- )
- )
- );
- $server->addPlugin(new \OC\Connector\Sabre\CopyEtagHeaderPlugin());
-}, 30); // priority 30: after auth (10) and acl(20), before lock(50) and handling the request
+$server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, function() {
+ // use the view for the logged in user
+ return \OC\Files\Filesystem::getView();
+});
// And off we go!
$server->exec();
diff --git a/apps/files_sharing/publicwebdav.php b/apps/files_sharing/publicwebdav.php
index 5bde908109d..eec158dd4b6 100644
--- a/apps/files_sharing/publicwebdav.php
+++ b/apps/files_sharing/publicwebdav.php
@@ -33,24 +33,18 @@ OC_Util::obEnd();
// Backends
$authBackend = new OCA\Files_Sharing\Connector\PublicAuth(\OC::$server->getConfig());
-// Fire up server
-$objectTree = new \OC\Connector\Sabre\ObjectTree();
-$server = new \OC\Connector\Sabre\Server($objectTree);
-// Set URL explicitly due to reverse-proxy situations
-$server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri());
-$server->setBaseUri($baseuri);
+$serverFactory = new \OC\Connector\Sabre\ServerFactory(
+ \OC::$server->getConfig(),
+ \OC::$server->getLogger(),
+ \OC::$server->getDatabaseConnection(),
+ \OC::$server->getUserSession(),
+ \OC::$server->getMountManager(),
+ \OC::$server->getTagManager()
+);
-// Load plugins
-$defaults = new OC_Defaults();
-$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, $defaults->getName()));
-// FIXME: The following line is a workaround for legacy components relying on being able to send a GET to /
-$server->addPlugin(new \OC\Connector\Sabre\DummyGetResponsePlugin());
-$server->addPlugin(new \OC\Connector\Sabre\FilesPlugin($objectTree, true));
-$server->addPlugin(new \OC\Connector\Sabre\MaintenancePlugin(\OC::$server->getConfig()));
-$server->addPlugin(new \OC\Connector\Sabre\ExceptionLoggerPlugin('webdav', \OC::$server->getLogger()));
+$requestUri = \OC::$server->getRequest()->getRequestUri();
-// wait with registering these until auth is handled and the filesystem is setup
-$server->on('beforeMethod', function () use ($server, $objectTree, $authBackend) {
+$server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, function () use ($authBackend) {
if (OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled() === false) {
// this is what is thrown when trying to access a non-existing share
throw new \Sabre\DAV\Exception\NotAuthenticated();
@@ -72,20 +66,8 @@ $server->on('beforeMethod', function () use ($server, $objectTree, $authBackend)
$ownerView = \OC\Files\Filesystem::getView();
$path = $ownerView->getPath($fileId);
- $view = new \OC\Files\View($ownerView->getAbsolutePath($path));
- $rootInfo = $view->getFileInfo('');
-
- // Create ownCloud Dir
- if ($rootInfo->getType() === 'dir') {
- $root = new \OC\Connector\Sabre\Directory($view, $rootInfo);
- } else {
- $root = new \OC\Connector\Sabre\File($view, $rootInfo);
- }
- $mountManager = \OC\Files\Filesystem::getMountManager();
- $objectTree->init($root, $view, $mountManager);
-
- $server->addPlugin(new \OC\Connector\Sabre\QuotaPlugin($view));
-}, 30); // priority 30: after auth (10) and acl(20), before lock(50) and handling the request
+ return new \OC\Files\View($ownerView->getAbsolutePath($path));
+});
// And off we go!
$server->exec();
diff --git a/lib/private/connector/sabre/objecttree.php b/lib/private/connector/sabre/objecttree.php
index 1e9b9ba59e2..18d3c1dcf23 100644
--- a/lib/private/connector/sabre/objecttree.php
+++ b/lib/private/connector/sabre/objecttree.php
@@ -41,7 +41,7 @@ class ObjectTree extends \Sabre\DAV\Tree {
protected $fileView;
/**
- * @var \OC\Files\Mount\Manager
+ * @var \OCP\Files\Mount\IMountManager
*/
protected $mountManager;
@@ -54,9 +54,9 @@ class ObjectTree extends \Sabre\DAV\Tree {
/**
* @param \Sabre\DAV\INode $rootNode
* @param \OC\Files\View $view
- * @param \OC\Files\Mount\Manager $mountManager
+ * @param \OCP\Files\Mount\IMountManager $mountManager
*/
- public function init(\Sabre\DAV\INode $rootNode, \OC\Files\View $view, \OC\Files\Mount\Manager $mountManager) {
+ public function init(\Sabre\DAV\INode $rootNode, \OC\Files\View $view, \OCP\Files\Mount\IMountManager $mountManager) {
$this->rootNode = $rootNode;
$this->fileView = $view;
$this->mountManager = $mountManager;
diff --git a/lib/private/connector/sabre/serverfactory.php b/lib/private/connector/sabre/serverfactory.php
new file mode 100644
index 00000000000..7d3ed338adf
--- /dev/null
+++ b/lib/private/connector/sabre/serverfactory.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, 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/>
+ *
+ */
+
+namespace OC\Connector\Sabre;
+
+use OCP\Files\Mount\IMountManager;
+use OCP\IConfig;
+use OCP\IDBConnection;
+use OCP\ILogger;
+use OCP\ITagManager;
+use OCP\IUserSession;
+use Sabre\DAV\Auth\Backend\BackendInterface;
+
+class ServerFactory {
+ public function __construct(
+ IConfig $config,
+ ILogger $logger,
+ IDBConnection $databaseConnection,
+ IUserSession $userSession,
+ IMountManager $mountManager,
+ ITagManager $tagManager
+ ) {
+ $this->config = $config;
+ $this->logger = $logger;
+ $this->databaseConnection = $databaseConnection;
+ $this->userSession = $userSession;
+ $this->mountManager = $mountManager;
+ $this->tagManager = $tagManager;
+ }
+
+ /**
+ * @param string $baseUri
+ * @param string $requestUri
+ * @param BackendInterface $authBackend
+ * @param callable $viewCallBack callback that should return the view for the dav endpoint
+ * @return Server
+ */
+ public function createServer($baseUri, $requestUri, BackendInterface $authBackend, callable $viewCallBack) {
+ // Fire up server
+ $objectTree = new \OC\Connector\Sabre\ObjectTree();
+ $server = new \OC\Connector\Sabre\Server($objectTree);
+ // Set URL explicitly due to reverse-proxy situations
+ $server->httpRequest->setUrl($requestUri);
+ $server->setBaseUri($baseUri);
+
+ // Load plugins
+ $defaults = new \OC_Defaults();
+ $server->addPlugin(new \OC\Connector\Sabre\BlockLegacyClientPlugin($this->config));
+ $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, $defaults->getName()));
+ // FIXME: The following line is a workaround for legacy components relying on being able to send a GET to /
+ $server->addPlugin(new \OC\Connector\Sabre\DummyGetResponsePlugin());
+ $server->addPlugin(new \OC\Connector\Sabre\FilesPlugin($objectTree));
+ $server->addPlugin(new \OC\Connector\Sabre\MaintenancePlugin($this->config));
+ $server->addPlugin(new \OC\Connector\Sabre\ExceptionLoggerPlugin('webdav', $this->logger));
+
+ // wait with registering these until auth is handled and the filesystem is setup
+ $server->on('beforeMethod', function () use ($server, $objectTree, $viewCallBack) {
+ /** @var \OC\Files\View $view */
+ $view = $viewCallBack();
+ $rootInfo = $view->getFileInfo('');
+
+ // Create ownCloud Dir
+ $rootDir = new \OC\Connector\Sabre\Directory($view, $rootInfo);
+ $objectTree->init($rootDir, $view, $this->mountManager);
+
+ $server->addPlugin(new \OC\Connector\Sabre\TagsPlugin($objectTree, $this->tagManager));
+ $server->addPlugin(new \OC\Connector\Sabre\QuotaPlugin($view));
+
+ // custom properties plugin must be the last one
+ if($this->userSession->isLoggedIn()) {
+ $server->addPlugin(
+ new \Sabre\DAV\PropertyStorage\Plugin(
+ new \OC\Connector\Sabre\CustomPropertiesBackend(
+ $objectTree,
+ $this->databaseConnection,
+ $this->userSession->getUser()
+ )
+ )
+ );
+ }
+ $server->addPlugin(new \OC\Connector\Sabre\CopyEtagHeaderPlugin());
+ }, 30); // priority 30: after auth (10) and acl(20), before lock(50) and handling the request
+ return $server;
+ }
+}
diff --git a/tests/lib/connector/sabre/requesttest/requesttest.php b/tests/lib/connector/sabre/requesttest/requesttest.php
index 7a4f44ee71a..91dd92c4603 100644
--- a/tests/lib/connector/sabre/requesttest/requesttest.php
+++ b/tests/lib/connector/sabre/requesttest/requesttest.php
@@ -134,41 +134,23 @@ abstract class RequestTest extends TestCase {
* @return Server
*/
protected function getSabreServer(View $view, $user, $password, ExceptionPlugin $exceptionPlugin) {
- $authBackend = new Auth($user, $password);
- $objectTree = new \OC\Connector\Sabre\ObjectTree();
- $server = new \OC\Connector\Sabre\Server($objectTree);
+ $serverFactory = new \OC\Connector\Sabre\ServerFactory(
+ \OC::$server->getConfig(),
+ \OC::$server->getLogger(),
+ \OC::$server->getDatabaseConnection(),
+ \OC::$server->getUserSession(),
+ \OC::$server->getMountManager(),
+ \OC::$server->getTagManager()
+ );
+
- $server->setBaseUri('/');
+ $authBackend = new Auth($user, $password);
- // Load plugins
- $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'oc-test'));
- $server->addPlugin(new \OC\Connector\Sabre\DummyGetResponsePlugin());
- $server->addPlugin(new \OC\Connector\Sabre\FilesPlugin($objectTree));
+ $server = $serverFactory->createServer('/', 'dummy', $authBackend, function () use ($view) {
+ return $view;
+ });
$server->addPlugin($exceptionPlugin);
- // wait with registering these until auth is handled and the filesystem is setup
- $server->on('beforeMethod', function () use ($server, $objectTree, $view) {
- $rootInfo = $view->getFileInfo('');
-
- // Create ownCloud Dir
- $mountManager = \OC\Files\Filesystem::getMountManager();
- $rootDir = new \OC\Connector\Sabre\Directory($view, $rootInfo);
- $objectTree->init($rootDir, $view, $mountManager);
-
- $server->addPlugin(new \OC\Connector\Sabre\QuotaPlugin($view));
-
- // custom properties plugin must be the last one
- $server->addPlugin(
- new \Sabre\DAV\PropertyStorage\Plugin(
- new \OC\Connector\Sabre\CustomPropertiesBackend(
- $objectTree,
- \OC::$server->getDatabaseConnection(),
- \OC::$server->getUserSession()->getUser()
- )
- )
- );
- $server->addPlugin(new \OC\Connector\Sabre\CopyEtagHeaderPlugin());
- }, 30); // priority 30: after auth (10) and acl(20), before lock(50) and handling the request
return $server;
}
}