Skip to content

Commit

Permalink
Merge pull request #20224 from owncloud/fileinfo-owner
Browse files Browse the repository at this point in the history
Add getOwner to FileInfo
  • Loading branch information
icewind1991 committed Nov 10, 2015
2 parents f77c6db + 20cad09 commit bbe2f5c
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 17 deletions.
16 changes: 16 additions & 0 deletions apps/files_sharing/tests/share.php
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,22 @@ public function dataProviderTestFileSharePermissions() {
);
}

public function testFileOwner() {

$fileinfo = $this->view->getFileInfo($this->filename);

$result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
\Test_Files_Sharing::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL);

$this->assertTrue($result);

$this->loginHelper(\Test_Files_Sharing::TEST_FILES_SHARING_API_USER2);

$info = \OC\Files\Filesystem::getFileInfo($this->filename);

$this->assertSame(\Test_Files_Sharing::TEST_FILES_SHARING_API_USER1, $info->getOwner()->getUID());
}

/**
* @dataProvider dataProviderGetUsersSharingFile
*
Expand Down
20 changes: 19 additions & 1 deletion lib/private/files/fileinfo.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@

namespace OC\Files;

use OCP\IUser;

class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess {
/**
* @var array $data
Expand All @@ -54,19 +56,26 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess {
*/
private $mount;

/**
* @var IUser
*/
private $owner;

/**
* @param string|boolean $path
* @param Storage\Storage $storage
* @param string $internalPath
* @param array $data
* @param \OCP\Files\Mount\IMountPoint $mount
* @param \OCP\IUser|null $owner
*/
public function __construct($path, $storage, $internalPath, $data, $mount) {
public function __construct($path, $storage, $internalPath, $data, $mount, $owner= null) {
$this->path = $path;
$this->storage = $storage;
$this->internalPath = $internalPath;
$this->data = $data;
$this->mount = $mount;
$this->owner = $owner;
}

public function offsetSet($offset, $value) {
Expand Down Expand Up @@ -267,4 +276,13 @@ public function isMounted() {
public function getMountPoint() {
return $this->mount;
}

/**
* Get the owner of the file
*
* @return \OCP\IUser
*/
public function getOwner() {
return $this->owner;
}
}
4 changes: 4 additions & 0 deletions lib/private/files/node/node.php
Original file line number Diff line number Diff line change
Expand Up @@ -347,4 +347,8 @@ public function isEncrypted() {
public function getMountPoint() {
return $this->getFileInfo()->getMountPoint();
}

public function getOwner() {
return $this->getFileInfo()->getOwner();
}
}
19 changes: 13 additions & 6 deletions lib/private/files/view.php
Original file line number Diff line number Diff line change
Expand Up @@ -1250,7 +1250,8 @@ public function getFileInfo($path, $includeMountPoints = true) {
$data['permissions'] |= \OCP\Constants::PERMISSION_DELETE;
}

return new FileInfo($path, $storage, $internalPath, $data, $mount);
$owner = \OC::$server->getUserManager()->get($storage->getOwner($internalPath));
return new FileInfo($path, $storage, $internalPath, $data, $mount, $owner);
}

/**
Expand Down Expand Up @@ -1316,7 +1317,8 @@ public function getDirectoryContent($directory, $mimetype_filter = '') {
if (\OCP\Util::isSharingDisabledForUser()) {
$content['permissions'] = $content['permissions'] & ~\OCP\Constants::PERMISSION_SHARE;
}
$files[] = new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content, $mount);
$owner = \OC::$server->getUserManager()->get($storage->getOwner($content['path']));
$files[] = new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content, $mount, $owner);
}

//add a folder for any mountpoint in this directory and add the sizes of other mountpoints to the folders
Expand Down Expand Up @@ -1385,7 +1387,8 @@ public function getDirectoryContent($directory, $mimetype_filter = '') {
$rootEntry['permissions'] = $rootEntry['permissions'] & ~\OCP\Constants::PERMISSION_SHARE;
}

$files[] = new FileInfo($path . '/' . $rootEntry['name'], $subStorage, '', $rootEntry, $mount);
$owner = \OC::$server->getUserManager()->get($subStorage->getOwner(''));
$files[] = new FileInfo($path . '/' . $rootEntry['name'], $subStorage, '', $rootEntry, $mount, $owner);
}
}
}
Expand Down Expand Up @@ -1507,7 +1510,8 @@ private function searchCommon($method, $args) {
$internalPath = $result['path'];
$path = $mountPoint . $result['path'];
$result['path'] = substr($mountPoint . $result['path'], $rootLength);
$files[] = new FileInfo($path, $storage, $internalPath, $result, $mount);
$owner = \OC::$server->getUserManager()->get($storage->getOwner($internalPath));
$files[] = new FileInfo($path, $storage, $internalPath, $result, $mount, $owner);
}
}

Expand All @@ -1525,7 +1529,8 @@ private function searchCommon($method, $args) {
$internalPath = $result['path'];
$result['path'] = rtrim($relativeMountPoint . $result['path'], '/');
$path = rtrim($mountPoint . $internalPath, '/');
$files[] = new FileInfo($path, $storage, $internalPath, $result, $mount);
$owner = \OC::$server->getUserManager()->get($storage->getOwner($internalPath));
$files[] = new FileInfo($path, $storage, $internalPath, $result, $mount, $owner);
}
}
}
Expand Down Expand Up @@ -1666,6 +1671,7 @@ private function getPartFileInfo($path) {
$mount = $this->getMount($path);
$storage = $mount->getStorage();
$internalPath = $mount->getInternalPath($this->getAbsolutePath($path));
$owner = \OC::$server->getUserManager()->get($storage->getOwner($internalPath));
return new FileInfo(
$this->getAbsolutePath($path),
$storage,
Expand All @@ -1680,7 +1686,8 @@ private function getPartFileInfo($path) {
'encrypted' => false,
'permissions' => \OCP\Constants::PERMISSION_ALL
],
$mount
$mount,
$owner
);
}

Expand Down
8 changes: 8 additions & 0 deletions lib/public/files/fileinfo.php
Original file line number Diff line number Diff line change
Expand Up @@ -229,4 +229,12 @@ public function isMounted();
* @since 8.0.0
*/
public function getMountPoint();

/**
* Get the owner of the file
*
* @return \OCP\IUser
* @since 9.0.0
*/
public function getOwner();
}
54 changes: 44 additions & 10 deletions tests/lib/files/view.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use OC\Files\Storage\Common;
use OC\Files\Mount\MountPoint;
use OC\Files\Storage\Temporary;
use OCP\Files\FileInfo;
use OCP\Lock\ILockingProvider;

class TemporaryNoTouch extends \OC\Files\Storage\Temporary {
Expand Down Expand Up @@ -1560,6 +1561,7 @@ public function testMountPointMove() {
$this->assertTrue($view->rename('mount1', 'renamed_mount'), 'Can rename mount point');
$this->assertTrue($view->rename('mount2', 'sub/moved_mount'), 'Can move a mount point into a subdirectory');
}

/**
* Test that moving a mount point into another is forbidden
*/
Expand All @@ -1582,6 +1584,7 @@ public function testMoveMountPointIntoAnother() {
$this->assertFalse($view->rename('mount1', 'mount2'), 'Cannot overwrite another mount point');
$this->assertFalse($view->rename('mount1', 'mount2/sub'), 'Cannot move a mount point into another');
}

/**
* Test that moving a mount point into a shared folder is forbidden
*/
Expand Down Expand Up @@ -1765,7 +1768,7 @@ public function testLockBasicOperation(
$storage->expects($this->once())
->method($operation)
->will($this->returnCallback(
function() use ($view, $lockedPath, &$lockTypeDuring){
function () use ($view, $lockedPath, &$lockTypeDuring) {
$lockTypeDuring = $this->getFileLockType($view, $lockedPath);

return true;
Expand Down Expand Up @@ -1808,7 +1811,7 @@ public function testLockFilePutContentWithStream() {
$storage->expects($this->once())
->method('fopen')
->will($this->returnCallback(
function() use ($view, $path, &$lockTypeDuring){
function () use ($view, $path, &$lockTypeDuring) {
$lockTypeDuring = $this->getFileLockType($view, $path);

return fopen('php://temp', 'r+');
Expand Down Expand Up @@ -1846,7 +1849,7 @@ public function testLockFopen() {
$storage->expects($this->once())
->method('fopen')
->will($this->returnCallback(
function() use ($view, $path, &$lockTypeDuring){
function () use ($view, $path, &$lockTypeDuring) {
$lockTypeDuring = $this->getFileLockType($view, $path);

return fopen('php://temp', 'r+');
Expand Down Expand Up @@ -1903,7 +1906,7 @@ public function testLockBasicOperationUnlocksAfterException(
$storage->expects($this->once())
->method($operation)
->will($this->returnCallback(
function() {
function () {
throw new \Exception('Simulated exception');
}
));
Expand Down Expand Up @@ -1993,7 +1996,7 @@ public function testLockFileRename($operation, $expectedLockTypeSourceDuring) {
$storage->expects($this->once())
->method($operation)
->will($this->returnCallback(
function() use ($view, $sourcePath, $targetPath, &$lockTypeSourceDuring, &$lockTypeTargetDuring){
function () use ($view, $sourcePath, $targetPath, &$lockTypeSourceDuring, &$lockTypeTargetDuring) {
$lockTypeSourceDuring = $this->getFileLockType($view, $sourcePath);
$lockTypeTargetDuring = $this->getFileLockType($view, $targetPath);

Expand Down Expand Up @@ -2044,7 +2047,7 @@ public function testLockFileCopyException() {
$storage->expects($this->once())
->method('copy')
->will($this->returnCallback(
function() {
function () {
throw new \Exception();
}
));
Expand Down Expand Up @@ -2097,6 +2100,37 @@ public function testLockFileRenameUnlockOnException() {
$view->unlockFile($targetPath, ILockingProvider::LOCK_EXCLUSIVE);
}

/**
* Test rename operation: unlock first path when second path was locked
*/
public function testGetOwner() {
$this->loginAsUser('test');

$view = new \OC\Files\View('/test/files/');

$path = 'foo.txt';
$view->file_put_contents($path, 'meh');

$this->assertEquals('test', $view->getFileInfo($path)->getOwner()->getUID());

$folderInfo = $view->getDirectoryContent('');
$folderInfo = array_values(array_filter($folderInfo, function (FileInfo $info) {
return $info->getName() === 'foo.txt';
}));

$this->assertEquals('test', $folderInfo[0]->getOwner()->getUID());

$subStorage = new Temporary();
\OC\Files\Filesystem::mount($subStorage, [], '/test/files/asd');

$folderInfo = $view->getDirectoryContent('');
$folderInfo = array_values(array_filter($folderInfo, function (FileInfo $info) {
return $info->getName() === 'asd';
}));

$this->assertEquals('test', $folderInfo[0]->getOwner()->getUID());
}

public function lockFileRenameOrCopyCrossStorageDataProvider() {
return [
['rename', 'moveFromStorage', ILockingProvider::LOCK_EXCLUSIVE],
Expand Down Expand Up @@ -2141,7 +2175,7 @@ public function testLockFileRenameCrossStorage($viewOperation, $storageOperation
$storage2->expects($this->once())
->method($storageOperation)
->will($this->returnCallback(
function() use ($view, $sourcePath, $targetPath, &$lockTypeSourceDuring, &$lockTypeTargetDuring){
function () use ($view, $sourcePath, $targetPath, &$lockTypeSourceDuring, &$lockTypeTargetDuring) {
$lockTypeSourceDuring = $this->getFileLockType($view, $sourcePath);
$lockTypeTargetDuring = $this->getFileLockType($view, $targetPath);

Expand Down Expand Up @@ -2188,7 +2222,7 @@ public function testLockMoveMountPoint() {
$mount->expects($this->once())
->method('moveMount')
->will($this->returnCallback(
function($target) use ($mount, $view, $sourcePath, $targetPath, &$lockTypeSourceDuring, &$lockTypeTargetDuring, &$lockTypeSharedRootDuring){
function ($target) use ($mount, $view, $sourcePath, $targetPath, &$lockTypeSourceDuring, &$lockTypeTargetDuring, &$lockTypeSharedRootDuring) {
$lockTypeSourceDuring = $this->getFileLockType($view, $sourcePath, true);
$lockTypeTargetDuring = $this->getFileLockType($view, $targetPath, true);

Expand Down Expand Up @@ -2253,14 +2287,14 @@ private function connectMockHooks($hookType, $view, $path, &$lockTypePre, &$lock
$eventHandler->expects($this->any())
->method('preCallback')
->will($this->returnCallback(
function() use ($view, $path, $onMountPoint, &$lockTypePre){
function () use ($view, $path, $onMountPoint, &$lockTypePre) {
$lockTypePre = $this->getFileLockType($view, $path, $onMountPoint);
}
));
$eventHandler->expects($this->any())
->method('postCallback')
->will($this->returnCallback(
function() use ($view, $path, $onMountPoint, &$lockTypePost){
function () use ($view, $path, $onMountPoint, &$lockTypePost) {
$lockTypePost = $this->getFileLockType($view, $path, $onMountPoint);
}
));
Expand Down

0 comments on commit bbe2f5c

Please sign in to comment.