Merge pull request #17330 from owncloud/fix-share-path-for-group-exceptions

Fix the path for users which have an exception for a group share
This commit is contained in:
Morris Jobke 2015-07-08 10:33:42 +02:00
commit 0fe81d2f21
2 changed files with 167 additions and 19 deletions

View File

@ -65,7 +65,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
parent::tearDown();
}
function testUnshareFromSelf() {
public function testUnshareFromSelf() {
\OC_Group::createGroup('testGroup');
\OC_Group::addToGroup(self::TEST_FILES_SHARING_API_USER2, 'testGroup');
@ -103,7 +103,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
/**
* if a file was shared as group share and as individual share they should be grouped
*/
function testGroupingOfShares() {
public function testGroupingOfShares() {
$fileinfo = $this->view->getFileInfo($this->filename);
@ -171,7 +171,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
* single user share to user2. If he re-shares the file to user2 the same target
* then the group share should be used to group the item
*/
function testShareAndUnshareFromSelf() {
public function testShareAndUnshareFromSelf() {
$fileinfo = $this->view->getFileInfo($this->filename);
// share the file to group1 (user2 is a member of this group) and explicitely to user2
@ -217,7 +217,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
}
function verifyDirContent($content, $expected) {
public function verifyDirContent($content, $expected) {
foreach ($content as $c) {
if (!in_array($c['name'], $expected)) {
$this->assertTrue(false, "folder should only contain '" . implode(',', $expected) . "', found: " .$c['name']);
@ -225,7 +225,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
}
}
function testShareWithDifferentShareFolder() {
public function testShareWithDifferentShareFolder() {
$fileinfo = $this->view->getFileInfo($this->filename);
$folderinfo = $this->view->getFileInfo($this->folder);
@ -249,7 +249,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
\OC::$server->getConfig()->deleteSystemValue('share_folder');
}
function testShareWithGroupUniqueName() {
public function testShareWithGroupUniqueName() {
$this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
\OC\Files\Filesystem::file_put_contents('test.txt', 'test');
@ -283,9 +283,9 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
/**
* shared files should never have delete permissions
* @dataProvider DataProviderTestFileSharePermissions
* @dataProvider dataProviderTestFileSharePermissions
*/
function testFileSharePermissions($permission, $expectedPermissions) {
public function testFileSharePermissions($permission, $expectedPermissions) {
$fileinfo = $this->view->getFileInfo($this->filename);
@ -305,7 +305,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
$this->assertSame($expectedPermissions, $share['permissions']);
}
function DataProviderTestFileSharePermissions() {
public function dataProviderTestFileSharePermissions() {
$permission1 = \OCP\Constants::PERMISSION_ALL;
$permission3 = \OCP\Constants::PERMISSION_READ;
$permission4 = \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE;
@ -321,4 +321,134 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
);
}
/**
* @dataProvider dataProviderGetUsersSharingFile
*
* @param string $groupName name of group to share with
* @param bool $includeOwner whether to include the owner in the result
* @param bool $includePaths whether to include paths in the result
* @param array $expectedResult expected result of the API call
*/
public function testGetUsersSharingFile($groupName, $includeOwner, $includePaths, $expectedResult) {
$fileinfo = $this->view->getFileInfo($this->folder);
$result = \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
$groupName, \OCP\Constants::PERMISSION_READ);
$this->assertTrue($result);
// public share
$result = \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_LINK,
null, \OCP\Constants::PERMISSION_READ);
$this->assertNotNull($result); // returns the token!
// owner renames after sharing
$this->view->rename($this->folder, $this->folder . '_owner_renamed');
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$user2View = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
$user2View->rename($this->folder, $this->folder . '_renamed');
$ownerPath = $this->folder . '_owner_renamed';
$owner = self::TEST_FILES_SHARING_API_USER1;
$result = \OCP\Share::getUsersSharingFile($ownerPath, $owner, $includeOwner, $includePaths);
// sort users to make sure it matches
if ($includePaths) {
ksort($result);
} else {
sort($result['users']);
}
$this->assertEquals(
$expectedResult,
$result
);
}
public function dataProviderGetUsersSharingFile() {
// note: "group" contains user1 (the owner), user2 and user3
// and self::TEST_FILES_SHARING_API_GROUP1 contains only user2
return [
// share with group that contains owner
[
'group',
false,
false,
[
'users' =>
[
// because user1 was in group
self::TEST_FILES_SHARING_API_USER1,
self::TEST_FILES_SHARING_API_USER2,
self::TEST_FILES_SHARING_API_USER3,
],
'public' => true,
'remote' => false,
],
],
// share with group that does not contain owner
[
self::TEST_FILES_SHARING_API_GROUP1,
false,
false,
[
'users' =>
[
self::TEST_FILES_SHARING_API_USER2,
],
'public' => true,
'remote' => false,
],
],
// share with group that does not contain owner, include owner
[
self::TEST_FILES_SHARING_API_GROUP1,
true,
false,
[
'users' =>
[
self::TEST_FILES_SHARING_API_USER1,
self::TEST_FILES_SHARING_API_USER2,
],
'public' => true,
'remote' => false,
],
],
// include paths, with owner
[
'group',
true,
true,
[
self::TEST_FILES_SHARING_API_USER1 => self::TEST_FOLDER_NAME . '_owner_renamed',
self::TEST_FILES_SHARING_API_USER2 => self::TEST_FOLDER_NAME . '_renamed',
self::TEST_FILES_SHARING_API_USER3 => self::TEST_FOLDER_NAME,
],
],
// include paths, group without owner
[
self::TEST_FILES_SHARING_API_GROUP1,
false,
true,
[
self::TEST_FILES_SHARING_API_USER2 => self::TEST_FOLDER_NAME. '_renamed',
],
],
// include paths, include owner, group without owner
[
self::TEST_FILES_SHARING_API_GROUP1,
true,
true,
[
self::TEST_FILES_SHARING_API_USER1 => self::TEST_FOLDER_NAME . '_owner_renamed',
self::TEST_FILES_SHARING_API_USER2 => self::TEST_FOLDER_NAME . '_renamed',
],
],
];
}
}

View File

@ -142,15 +142,25 @@ class Share extends Constants {
while ($source !== -1) {
// Fetch all shares with another user
$query = \OC_DB::prepare(
'SELECT `share_with`, `file_source`, `file_target`
if (!$returnUserPaths) {
$query = \OC_DB::prepare(
'SELECT `share_with`, `file_source`, `file_target`
FROM
`*PREFIX*share`
WHERE
`item_source` = ? AND `share_type` = ? AND `item_type` IN (\'file\', \'folder\')'
);
$result = $query->execute(array($source, self::SHARE_TYPE_USER));
} else {
$query = \OC_DB::prepare(
'SELECT `share_with`, `file_source`, `file_target`
FROM
`*PREFIX*share`
WHERE
`item_source` = ? AND `share_type` = ? AND `item_type` IN (\'file\', \'folder\')'
);
$result = $query->execute(array($source, self::SHARE_TYPE_USER));
`item_source` = ? AND `share_type` IN (?, ?) AND `item_type` IN (\'file\', \'folder\')'
);
$result = $query->execute(array($source, self::SHARE_TYPE_USER, self::$shareTypeGroupUserUnique));
}
if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('OCP\Share', \OC_DB::getErrorMessage(), \OCP\Util::ERROR);
@ -182,7 +192,12 @@ class Share extends Constants {
$shares = array_merge($shares, $usersInGroup);
if ($returnUserPaths) {
foreach ($usersInGroup as $user) {
$fileTargets[(int) $row['file_source']][$user] = $row;
if (!isset($fileTargets[(int) $row['file_source']][$user])) {
// When the user already has an entry for this file source
// the file is either shared directly with him as well, or
// he has an exception entry (because of naming conflict).
$fileTargets[(int) $row['file_source']][$user] = $row;
}
}
}
}
@ -238,9 +253,6 @@ class Share extends Constants {
// Include owner in list of users, if requested
if ($includeOwner) {
$shares[] = $ownerUser;
if ($returnUserPaths) {
$sharePaths[$ownerUser] = $path;
}
}
if ($returnUserPaths) {
@ -268,6 +280,12 @@ class Share extends Constants {
}
}
if ($includeOwner) {
$sharePaths[$ownerUser] = $path;
} else {
unset($sharePaths[$ownerUser]);
}
return $sharePaths;
}