@@ -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(); |
@@ -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(); |
@@ -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; |
@@ -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 | |||
*/ | |||
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; | |||
} | |||
} |