Merge pull request #20188 from owncloud/webdav-exposeshareowner
Expose share owner id and display name via files webdav
This commit is contained in:
commit
20c251a575
|
@ -42,6 +42,8 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
|
||||||
const SIZE_PROPERTYNAME = '{http://owncloud.org/ns}size';
|
const SIZE_PROPERTYNAME = '{http://owncloud.org/ns}size';
|
||||||
const GETETAG_PROPERTYNAME = '{DAV:}getetag';
|
const GETETAG_PROPERTYNAME = '{DAV:}getetag';
|
||||||
const LASTMODIFIED_PROPERTYNAME = '{DAV:}lastmodified';
|
const LASTMODIFIED_PROPERTYNAME = '{DAV:}lastmodified';
|
||||||
|
const OWNER_ID_PROPERTYNAME = '{http://owncloud.org/ns}owner-id';
|
||||||
|
const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reference to main server object
|
* Reference to main server object
|
||||||
|
@ -99,6 +101,8 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
|
||||||
$server->protectedProperties[] = self::PERMISSIONS_PROPERTYNAME;
|
$server->protectedProperties[] = self::PERMISSIONS_PROPERTYNAME;
|
||||||
$server->protectedProperties[] = self::SIZE_PROPERTYNAME;
|
$server->protectedProperties[] = self::SIZE_PROPERTYNAME;
|
||||||
$server->protectedProperties[] = self::DOWNLOADURL_PROPERTYNAME;
|
$server->protectedProperties[] = self::DOWNLOADURL_PROPERTYNAME;
|
||||||
|
$server->protectedProperties[] = self::OWNER_ID_PROPERTYNAME;
|
||||||
|
$server->protectedProperties[] = self::OWNER_DISPLAY_NAME_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'];
|
||||||
|
@ -201,6 +205,16 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
|
||||||
return $node->getSize();
|
return $node->getSize();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$propFind->handle(self::OWNER_ID_PROPERTYNAME, function() use ($node) {
|
||||||
|
$owner = $node->getOwner();
|
||||||
|
return $owner->getUID();
|
||||||
|
});
|
||||||
|
$propFind->handle(self::OWNER_DISPLAY_NAME_PROPERTYNAME, function() use ($node) {
|
||||||
|
$owner = $node->getOwner();
|
||||||
|
$displayName = $owner->getDisplayName();
|
||||||
|
return $displayName;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -238,6 +238,10 @@ abstract class Node implements \Sabre\DAV\INode {
|
||||||
return $p;
|
return $p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getOwner() {
|
||||||
|
return $this->info->getOwner();
|
||||||
|
}
|
||||||
|
|
||||||
protected function verifyPath() {
|
protected function verifyPath() {
|
||||||
try {
|
try {
|
||||||
$fileName = basename($this->info->getPath());
|
$fileName = basename($this->info->getPath());
|
||||||
|
|
|
@ -15,6 +15,8 @@ class FilesPlugin extends \Test\TestCase {
|
||||||
const PERMISSIONS_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::PERMISSIONS_PROPERTYNAME;
|
const PERMISSIONS_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::PERMISSIONS_PROPERTYNAME;
|
||||||
const LASTMODIFIED_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::LASTMODIFIED_PROPERTYNAME;
|
const LASTMODIFIED_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::LASTMODIFIED_PROPERTYNAME;
|
||||||
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_DISPLAY_NAME_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \Sabre\DAV\Server
|
* @var \Sabre\DAV\Server
|
||||||
|
@ -91,13 +93,29 @@ class FilesPlugin extends \Test\TestCase {
|
||||||
self::SIZE_PROPERTYNAME,
|
self::SIZE_PROPERTYNAME,
|
||||||
self::PERMISSIONS_PROPERTYNAME,
|
self::PERMISSIONS_PROPERTYNAME,
|
||||||
self::DOWNLOADURL_PROPERTYNAME,
|
self::DOWNLOADURL_PROPERTYNAME,
|
||||||
|
self::OWNER_ID_PROPERTYNAME,
|
||||||
|
self::OWNER_DISPLAY_NAME_PROPERTYNAME
|
||||||
),
|
),
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$user = $this->getMockBuilder('\OC\User\User')
|
||||||
|
->disableOriginalConstructor()->getMock();
|
||||||
|
$user
|
||||||
|
->expects($this->once())
|
||||||
|
->method('getUID')
|
||||||
|
->will($this->returnValue('foo'));
|
||||||
|
$user
|
||||||
|
->expects($this->once())
|
||||||
|
->method('getDisplayName')
|
||||||
|
->will($this->returnValue('M. Foo'));
|
||||||
|
|
||||||
$node->expects($this->once())
|
$node->expects($this->once())
|
||||||
->method('getDirectDownload')
|
->method('getDirectDownload')
|
||||||
->will($this->returnValue(array('url' => 'http://example.com/')));
|
->will($this->returnValue(array('url' => 'http://example.com/')));
|
||||||
|
$node->expects($this->exactly(2))
|
||||||
|
->method('getOwner')
|
||||||
|
->will($this->returnValue($user));
|
||||||
$node->expects($this->never())
|
$node->expects($this->never())
|
||||||
->method('getSize');
|
->method('getSize');
|
||||||
|
|
||||||
|
@ -111,6 +129,8 @@ class FilesPlugin extends \Test\TestCase {
|
||||||
$this->assertEquals(null, $propFind->get(self::SIZE_PROPERTYNAME));
|
$this->assertEquals(null, $propFind->get(self::SIZE_PROPERTYNAME));
|
||||||
$this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME));
|
$this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME));
|
||||||
$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('M. Foo', $propFind->get(self::OWNER_DISPLAY_NAME_PROPERTYNAME));
|
||||||
$this->assertEquals(array(self::SIZE_PROPERTYNAME), $propFind->get404Properties());
|
$this->assertEquals(array(self::SIZE_PROPERTYNAME), $propFind->get404Properties());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,6 +227,36 @@ class FilesPlugin extends \Test\TestCase {
|
||||||
$this->assertEquals(200, $result[self::GETETAG_PROPERTYNAME]);
|
$this->assertEquals(200, $result[self::GETETAG_PROPERTYNAME]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testUpdatePropsForbidden() {
|
||||||
|
$node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File');
|
||||||
|
|
||||||
|
$propPatch = new \Sabre\DAV\PropPatch(array(
|
||||||
|
self::OWNER_ID_PROPERTYNAME => 'user2',
|
||||||
|
self::OWNER_DISPLAY_NAME_PROPERTYNAME => 'User Two',
|
||||||
|
self::FILEID_PROPERTYNAME => 12345,
|
||||||
|
self::PERMISSIONS_PROPERTYNAME => 'C',
|
||||||
|
self::SIZE_PROPERTYNAME => 123,
|
||||||
|
self::DOWNLOADURL_PROPERTYNAME => 'http://example.com/',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->plugin->handleUpdateProperties(
|
||||||
|
'/dummypath',
|
||||||
|
$propPatch
|
||||||
|
);
|
||||||
|
|
||||||
|
$propPatch->commit();
|
||||||
|
|
||||||
|
$this->assertEmpty($propPatch->getRemainingMutations());
|
||||||
|
|
||||||
|
$result = $propPatch->getResult();
|
||||||
|
$this->assertEquals(403, $result[self::OWNER_ID_PROPERTYNAME]);
|
||||||
|
$this->assertEquals(403, $result[self::OWNER_DISPLAY_NAME_PROPERTYNAME]);
|
||||||
|
$this->assertEquals(403, $result[self::FILEID_PROPERTYNAME]);
|
||||||
|
$this->assertEquals(403, $result[self::PERMISSIONS_PROPERTYNAME]);
|
||||||
|
$this->assertEquals(403, $result[self::SIZE_PROPERTYNAME]);
|
||||||
|
$this->assertEquals(403, $result[self::DOWNLOADURL_PROPERTYNAME]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Testcase from https://github.com/owncloud/core/issues/5251
|
* Testcase from https://github.com/owncloud/core/issues/5251
|
||||||
*
|
*
|
||||||
|
|
|
@ -225,4 +225,12 @@ interface Node extends FileInfo {
|
||||||
* @since 6.0.0
|
* @since 6.0.0
|
||||||
*/
|
*/
|
||||||
public function getName();
|
public function getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the file owner
|
||||||
|
*
|
||||||
|
* @since 9.0.0
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getOwner();
|
||||||
}
|
}
|
||||||
|
|
|
@ -462,4 +462,10 @@ interface Storage {
|
||||||
* @param bool $isAvailable
|
* @param bool $isAvailable
|
||||||
*/
|
*/
|
||||||
public function setAvailability($isAvailable);
|
public function setAvailability($isAvailable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $path path for which to retrieve the owner
|
||||||
|
* @since 9.0.0
|
||||||
|
*/
|
||||||
|
public function getOwner($path);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue