split out creating the sabre dav server to it's own factory
This commit is contained in:
parent
8c5302847b
commit
b0c8654f9e
|
@ -33,51 +33,23 @@ set_time_limit(0);
|
||||||
// Turn off output buffering to prevent memory problems
|
// Turn off output buffering to prevent memory problems
|
||||||
\OC_Util::obEnd();
|
\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
|
// Backends
|
||||||
$authBackend = new \OC\Connector\Sabre\Auth();
|
$authBackend = new \OC\Connector\Sabre\Auth();
|
||||||
|
$requestUri = \OC::$server->getRequest()->getRequestUri();
|
||||||
|
|
||||||
// Fire up server
|
$server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, function() {
|
||||||
$objectTree = new \OC\Connector\Sabre\ObjectTree();
|
// use the view for the logged in user
|
||||||
$server = new \OC\Connector\Sabre\Server($objectTree);
|
return \OC\Files\Filesystem::getView();
|
||||||
// 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
|
|
||||||
|
|
||||||
// And off we go!
|
// And off we go!
|
||||||
$server->exec();
|
$server->exec();
|
||||||
|
|
|
@ -33,24 +33,18 @@ OC_Util::obEnd();
|
||||||
// Backends
|
// Backends
|
||||||
$authBackend = new OCA\Files_Sharing\Connector\PublicAuth(\OC::$server->getConfig());
|
$authBackend = new OCA\Files_Sharing\Connector\PublicAuth(\OC::$server->getConfig());
|
||||||
|
|
||||||
// Fire up server
|
$serverFactory = new \OC\Connector\Sabre\ServerFactory(
|
||||||
$objectTree = new \OC\Connector\Sabre\ObjectTree();
|
\OC::$server->getConfig(),
|
||||||
$server = new \OC\Connector\Sabre\Server($objectTree);
|
\OC::$server->getLogger(),
|
||||||
// Set URL explicitly due to reverse-proxy situations
|
\OC::$server->getDatabaseConnection(),
|
||||||
$server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri());
|
\OC::$server->getUserSession(),
|
||||||
$server->setBaseUri($baseuri);
|
\OC::$server->getMountManager(),
|
||||||
|
\OC::$server->getTagManager()
|
||||||
|
);
|
||||||
|
|
||||||
// Load plugins
|
$requestUri = \OC::$server->getRequest()->getRequestUri();
|
||||||
$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()));
|
|
||||||
|
|
||||||
// wait with registering these until auth is handled and the filesystem is setup
|
$server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, function () use ($authBackend) {
|
||||||
$server->on('beforeMethod', function () use ($server, $objectTree, $authBackend) {
|
|
||||||
if (OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled() === false) {
|
if (OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled() === false) {
|
||||||
// this is what is thrown when trying to access a non-existing share
|
// this is what is thrown when trying to access a non-existing share
|
||||||
throw new \Sabre\DAV\Exception\NotAuthenticated();
|
throw new \Sabre\DAV\Exception\NotAuthenticated();
|
||||||
|
@ -72,20 +66,8 @@ $server->on('beforeMethod', function () use ($server, $objectTree, $authBackend)
|
||||||
$ownerView = \OC\Files\Filesystem::getView();
|
$ownerView = \OC\Files\Filesystem::getView();
|
||||||
$path = $ownerView->getPath($fileId);
|
$path = $ownerView->getPath($fileId);
|
||||||
|
|
||||||
$view = new \OC\Files\View($ownerView->getAbsolutePath($path));
|
return 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
|
|
||||||
|
|
||||||
// And off we go!
|
// And off we go!
|
||||||
$server->exec();
|
$server->exec();
|
||||||
|
|
|
@ -41,7 +41,7 @@ class ObjectTree extends \Sabre\DAV\Tree {
|
||||||
protected $fileView;
|
protected $fileView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \OC\Files\Mount\Manager
|
* @var \OCP\Files\Mount\IMountManager
|
||||||
*/
|
*/
|
||||||
protected $mountManager;
|
protected $mountManager;
|
||||||
|
|
||||||
|
@ -54,9 +54,9 @@ class ObjectTree extends \Sabre\DAV\Tree {
|
||||||
/**
|
/**
|
||||||
* @param \Sabre\DAV\INode $rootNode
|
* @param \Sabre\DAV\INode $rootNode
|
||||||
* @param \OC\Files\View $view
|
* @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->rootNode = $rootNode;
|
||||||
$this->fileView = $view;
|
$this->fileView = $view;
|
||||||
$this->mountManager = $mountManager;
|
$this->mountManager = $mountManager;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -134,41 +134,23 @@ abstract class RequestTest extends TestCase {
|
||||||
* @return Server
|
* @return Server
|
||||||
*/
|
*/
|
||||||
protected function getSabreServer(View $view, $user, $password, ExceptionPlugin $exceptionPlugin) {
|
protected function getSabreServer(View $view, $user, $password, ExceptionPlugin $exceptionPlugin) {
|
||||||
|
$serverFactory = new \OC\Connector\Sabre\ServerFactory(
|
||||||
|
\OC::$server->getConfig(),
|
||||||
|
\OC::$server->getLogger(),
|
||||||
|
\OC::$server->getDatabaseConnection(),
|
||||||
|
\OC::$server->getUserSession(),
|
||||||
|
\OC::$server->getMountManager(),
|
||||||
|
\OC::$server->getTagManager()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
$authBackend = new Auth($user, $password);
|
$authBackend = new Auth($user, $password);
|
||||||
$objectTree = new \OC\Connector\Sabre\ObjectTree();
|
|
||||||
$server = new \OC\Connector\Sabre\Server($objectTree);
|
|
||||||
|
|
||||||
$server->setBaseUri('/');
|
$server = $serverFactory->createServer('/', 'dummy', $authBackend, function () use ($view) {
|
||||||
|
return $view;
|
||||||
// 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->addPlugin($exceptionPlugin);
|
$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;
|
return $server;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue