Add data-fingerprint property to webdav

This commit is contained in:
Roeland Jago Douma 2016-04-18 11:18:50 +02:00
parent fd1740deb6
commit dcb2b37e24
No known key found for this signature in database
GPG Key ID: 1E152838F164D13B
5 changed files with 100 additions and 11 deletions

View File

@ -39,6 +39,7 @@ use Sabre\DAV\Tree;
use \Sabre\HTTP\RequestInterface; use \Sabre\HTTP\RequestInterface;
use \Sabre\HTTP\ResponseInterface; use \Sabre\HTTP\ResponseInterface;
use OCP\Files\StorageNotAvailableException; use OCP\Files\StorageNotAvailableException;
use OCP\IConfig;
class FilesPlugin extends ServerPlugin { class FilesPlugin extends ServerPlugin {
@ -55,6 +56,7 @@ class FilesPlugin extends ServerPlugin {
const OWNER_ID_PROPERTYNAME = '{http://owncloud.org/ns}owner-id'; const OWNER_ID_PROPERTYNAME = '{http://owncloud.org/ns}owner-id';
const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name'; const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name';
const CHECKSUMS_PROPERTYNAME = '{http://owncloud.org/ns}checksums'; const CHECKSUMS_PROPERTYNAME = '{http://owncloud.org/ns}checksums';
const DATA_FINGERPRINT_PROPERTYNAME = '{http://owncloud.org/ns}data-fingerprint';
/** /**
* Reference to main server object * Reference to main server object
@ -86,6 +88,11 @@ class FilesPlugin extends ServerPlugin {
*/ */
private $downloadAttachment; private $downloadAttachment;
/**
* @var IConfig
*/
private $config;
/** /**
* @param Tree $tree * @param Tree $tree
* @param View $view * @param View $view
@ -94,10 +101,12 @@ class FilesPlugin extends ServerPlugin {
*/ */
public function __construct(Tree $tree, public function __construct(Tree $tree,
View $view, View $view,
IConfig $config,
$isPublic = false, $isPublic = false,
$downloadAttachment = true) { $downloadAttachment = true) {
$this->tree = $tree; $this->tree = $tree;
$this->fileView = $view; $this->fileView = $view;
$this->config = $config;
$this->isPublic = $isPublic; $this->isPublic = $isPublic;
$this->downloadAttachment = $downloadAttachment; $this->downloadAttachment = $downloadAttachment;
} }
@ -125,6 +134,7 @@ class FilesPlugin extends ServerPlugin {
$server->protectedProperties[] = self::OWNER_ID_PROPERTYNAME; $server->protectedProperties[] = self::OWNER_ID_PROPERTYNAME;
$server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME; $server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME;
$server->protectedProperties[] = self::CHECKSUMS_PROPERTYNAME; $server->protectedProperties[] = self::CHECKSUMS_PROPERTYNAME;
$server->protectedProperties[] = self::DATA_FINGERPRINT_PROPERTYNAME;
// normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH // normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH
$allowedProperties = ['{DAV:}getetag']; $allowedProperties = ['{DAV:}getetag'];
@ -272,6 +282,18 @@ class FilesPlugin extends ServerPlugin {
$displayName = $owner->getDisplayName(); $displayName = $owner->getDisplayName();
return $displayName; return $displayName;
}); });
$propFind->handle(self::DATA_FINGERPRINT_PROPERTYNAME, function() use ($node) {
if ($node->getPath() === '/') {
return $this->config->getSystemValue('data-fingerprint', '');
}
});
}
if ($node instanceof \OCA\DAV\Files\FilesHome) {
$propFind->handle(self::DATA_FINGERPRINT_PROPERTYNAME, function() use ($node) {
return $this->config->getSystemValue('data-fingerprint', '');
});
} }
if ($node instanceof \OCA\DAV\Connector\Sabre\File) { if ($node instanceof \OCA\DAV\Connector\Sabre\File) {

View File

@ -137,8 +137,15 @@ class ServerFactory {
} }
$objectTree->init($root, $view, $this->mountManager); $objectTree->init($root, $view, $this->mountManager);
$server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesPlugin($objectTree, $view, false, $server->addPlugin(
!$this->config->getSystemValue('debug', false))); new \OCA\DAV\Connector\Sabre\FilesPlugin(
$objectTree,
$view,
$this->config,
false,
!$this->config->getSystemValue('debug', false)
)
);
$server->addPlugin(new \OCA\DAV\Connector\Sabre\QuotaPlugin($view)); $server->addPlugin(new \OCA\DAV\Connector\Sabre\QuotaPlugin($view));
if($this->userSession->isLoggedIn()) { if($this->userSession->isLoggedIn()) {

View File

@ -132,8 +132,15 @@ class Server {
$user = \OC::$server->getUserSession()->getUser(); $user = \OC::$server->getUserSession()->getUser();
if (!is_null($user)) { if (!is_null($user)) {
$view = \OC\Files\Filesystem::getView(); $view = \OC\Files\Filesystem::getView();
$this->server->addPlugin(new FilesPlugin($this->server->tree, $view, false, $this->server->addPlugin(
!\OC::$server->getConfig()->getSystemValue('debug', false))); new FilesPlugin(
$this->server->tree,
$view,
\OC::$server->getConfig(),
false,
!\OC::$server->getConfig()->getSystemValue('debug', false)
)
);
$this->server->addPlugin( $this->server->addPlugin(
new \Sabre\DAV\PropertyStorage\Plugin( new \Sabre\DAV\PropertyStorage\Plugin(

View File

@ -43,6 +43,7 @@ class FilesPlugin extends TestCase {
const DOWNLOADURL_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DOWNLOADURL_PROPERTYNAME; const DOWNLOADURL_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DOWNLOADURL_PROPERTYNAME;
const OWNER_ID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_ID_PROPERTYNAME; const OWNER_ID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_ID_PROPERTYNAME;
const OWNER_DISPLAY_NAME_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME; const OWNER_DISPLAY_NAME_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME;
const DATA_FINGERPRINT_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME;
/** /**
* @var \Sabre\DAV\Server | \PHPUnit_Framework_MockObject_MockObject * @var \Sabre\DAV\Server | \PHPUnit_Framework_MockObject_MockObject
@ -64,6 +65,11 @@ class FilesPlugin extends TestCase {
*/ */
private $view; private $view;
/**
* @var \OCP\IConfig | \PHPUnit_Framework_MockObject_MockObject
*/
private $config;
public function setUp() { public function setUp() {
parent::setUp(); parent::setUp();
$this->server = $this->getMockBuilder('\Sabre\DAV\Server') $this->server = $this->getMockBuilder('\Sabre\DAV\Server')
@ -75,8 +81,16 @@ class FilesPlugin extends TestCase {
$this->view = $this->getMockBuilder('\OC\Files\View') $this->view = $this->getMockBuilder('\OC\Files\View')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$this->config = $this->getMock('\OCP\IConfig');
$this->config->method('getSystemValue')
->with($this->equalTo('data-fingerprint'), $this->equalTo(''))
->willReturn('my_fingerprint');
$this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view); $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin(
$this->tree,
$this->view,
$this->config
);
$this->plugin->initialize($this->server); $this->plugin->initialize($this->server);
} }
@ -128,7 +142,8 @@ class FilesPlugin extends TestCase {
self::PERMISSIONS_PROPERTYNAME, self::PERMISSIONS_PROPERTYNAME,
self::DOWNLOADURL_PROPERTYNAME, self::DOWNLOADURL_PROPERTYNAME,
self::OWNER_ID_PROPERTYNAME, self::OWNER_ID_PROPERTYNAME,
self::OWNER_DISPLAY_NAME_PROPERTYNAME self::OWNER_DISPLAY_NAME_PROPERTYNAME,
self::DATA_FINGERPRINT_PROPERTYNAME,
), ),
0 0
); );
@ -166,7 +181,7 @@ class FilesPlugin extends TestCase {
$this->assertEquals('http://example.com/', $propFind->get(self::DOWNLOADURL_PROPERTYNAME)); $this->assertEquals('http://example.com/', $propFind->get(self::DOWNLOADURL_PROPERTYNAME));
$this->assertEquals('foo', $propFind->get(self::OWNER_ID_PROPERTYNAME)); $this->assertEquals('foo', $propFind->get(self::OWNER_ID_PROPERTYNAME));
$this->assertEquals('M. Foo', $propFind->get(self::OWNER_DISPLAY_NAME_PROPERTYNAME)); $this->assertEquals('M. Foo', $propFind->get(self::OWNER_DISPLAY_NAME_PROPERTYNAME));
$this->assertEquals(array(self::SIZE_PROPERTYNAME), $propFind->get404Properties()); $this->assertEquals([self::SIZE_PROPERTYNAME, self::DATA_FINGERPRINT_PROPERTYNAME], $propFind->get404Properties());
} }
public function testGetPropertiesForFileHome() { public function testGetPropertiesForFileHome() {
@ -185,7 +200,8 @@ class FilesPlugin extends TestCase {
self::PERMISSIONS_PROPERTYNAME, self::PERMISSIONS_PROPERTYNAME,
self::DOWNLOADURL_PROPERTYNAME, self::DOWNLOADURL_PROPERTYNAME,
self::OWNER_ID_PROPERTYNAME, self::OWNER_ID_PROPERTYNAME,
self::OWNER_DISPLAY_NAME_PROPERTYNAME self::OWNER_DISPLAY_NAME_PROPERTYNAME,
self::DATA_FINGERPRINT_PROPERTYNAME,
), ),
0 0
); );
@ -217,6 +233,7 @@ class FilesPlugin extends TestCase {
'{http://owncloud.org/ns}owner-id', '{http://owncloud.org/ns}owner-id',
'{http://owncloud.org/ns}owner-display-name' '{http://owncloud.org/ns}owner-display-name'
], $propFind->get404Properties()); ], $propFind->get404Properties());
$this->assertEquals('my_fingerprint', $propFind->get(self::DATA_FINGERPRINT_PROPERTYNAME));
} }
public function testGetPropertiesStorageNotAvailable() { public function testGetPropertiesStorageNotAvailable() {
@ -244,7 +261,11 @@ class FilesPlugin extends TestCase {
} }
public function testGetPublicPermissions() { public function testGetPublicPermissions() {
$this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view, true); $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin(
$this->tree,
$this->view,
$this->config,
true);
$this->plugin->initialize($this->server); $this->plugin->initialize($this->server);
$propFind = new PropFind( $propFind = new PropFind(
@ -281,6 +302,7 @@ class FilesPlugin extends TestCase {
self::SIZE_PROPERTYNAME, self::SIZE_PROPERTYNAME,
self::PERMISSIONS_PROPERTYNAME, self::PERMISSIONS_PROPERTYNAME,
self::DOWNLOADURL_PROPERTYNAME, self::DOWNLOADURL_PROPERTYNAME,
self::DATA_FINGERPRINT_PROPERTYNAME,
), ),
0 0
); );
@ -299,7 +321,30 @@ class FilesPlugin extends TestCase {
$this->assertEquals(1025, $propFind->get(self::SIZE_PROPERTYNAME)); $this->assertEquals(1025, $propFind->get(self::SIZE_PROPERTYNAME));
$this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME)); $this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME));
$this->assertEquals(null, $propFind->get(self::DOWNLOADURL_PROPERTYNAME)); $this->assertEquals(null, $propFind->get(self::DOWNLOADURL_PROPERTYNAME));
$this->assertEquals(array(self::DOWNLOADURL_PROPERTYNAME), $propFind->get404Properties()); $this->assertEquals([self::DOWNLOADURL_PROPERTYNAME, self::DATA_FINGERPRINT_PROPERTYNAME], $propFind->get404Properties());
}
public function testGetPropertiesForRootDirectory() {
/** @var \OCA\DAV\Connector\Sabre\Directory | \PHPUnit_Framework_MockObject_MockObject $node */
$node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
->disableOriginalConstructor()
->getMock();
$node->method('getPath')->willReturn('/');
$propFind = new PropFind(
'/',
[
self::DATA_FINGERPRINT_PROPERTYNAME,
],
0
);
$this->plugin->handleGetProperties(
$propFind,
$node
);
$this->assertEquals('my_fingerprint', $propFind->get(self::DATA_FINGERPRINT_PROPERTYNAME));
} }
public function testUpdateProps() { public function testUpdateProps() {

View File

@ -336,7 +336,15 @@ class FilesReportPlugin extends \Test\TestCase {
->method('getSize') ->method('getSize')
->will($this->returnValue(1024)); ->will($this->returnValue(1024));
$this->server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view)); $config = $this->getMock('\OCP\IConfig');
$this->server->addPlugin(
new \OCA\DAV\Connector\Sabre\FilesPlugin(
$this->tree,
$this->view,
$config
)
);
$this->plugin->initialize($this->server); $this->plugin->initialize($this->server);
$responses = $this->plugin->prepareResponses($requestedProps, [$node1, $node2]); $responses = $this->plugin->prepareResponses($requestedProps, [$node1, $node2]);