fix unshareFromSelf()

This commit is contained in:
Bjoern Schiessle 2014-06-04 18:41:47 +02:00 committed by Robin Appelman
parent 09970e1816
commit 86d7371d0c
3 changed files with 115 additions and 32 deletions

View File

@ -403,15 +403,18 @@ class Shared extends \OC\Files\Storage\Common {
|| $shares
) {
foreach ($shares as $share) {
$mount = new SharedMount(
'\OC\Files\Storage\Shared',
$options['user_dir'] . '/' . $share['file_target'],
array(
'share' => $share,
),
$loader
);
$manager->addMount($mount);
// don't mount shares where we have no permissions
if ($share['permissions'] > 0) {
$mount = new SharedMount(
'\OC\Files\Storage\Shared',
$options['user_dir'] . '/' . $share['file_target'],
array(
'share' => $share,
),
$loader
);
$manager->addMount($mount);
}
}
}
}

View File

@ -60,6 +60,71 @@ class Test_Files_Sharing extends Test_Files_Sharing_Base {
parent::tearDown();
}
function testUnshareFromSelf() {
\OC_Group::createGroup('testGroup');
\OC_Group::addToGroup(self::TEST_FILES_SHARING_API_USER2, 'testGroup');
\OC_Group::addToGroup(self::TEST_FILES_SHARING_API_USER3, 'testGroup');
$fileinfo = $this->view->getFileInfo($this->filename);
$pathinfo = pathinfo($this->filename);
$duplicate = '/' . $pathinfo['filename'] . ' (2).' . $pathinfo['extension'];
$result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
\Test_Files_Sharing::TEST_FILES_SHARING_API_USER2, 31);
$this->assertTrue($result);
$result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
'testGroup', 31);
$this->assertTrue($result);
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$this->assertTrue(\OC\Files\Filesystem::file_exists($this->filename));
$this->assertTrue(\OC\Files\Filesystem::file_exists($duplicate));
self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
$this->assertTrue(\OC\Files\Filesystem::file_exists($this->filename));
$this->assertFalse(\OC\Files\Filesystem::file_exists($duplicate));
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
\OC\Files\Filesystem::unlink($this->filename);
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$this->assertFalse(\OC\Files\Filesystem::file_exists($this->filename));
$this->assertTrue(\OC\Files\Filesystem::file_exists($duplicate));
// for user3 nothing should change
self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
$this->assertTrue(\OC\Files\Filesystem::file_exists($this->filename));
$this->assertFalse(\OC\Files\Filesystem::file_exists($duplicate));
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
\OC\Files\Filesystem::unlink($duplicate);
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$this->assertFalse(\OC\Files\Filesystem::file_exists($this->filename));
$this->assertFalse(\OC\Files\Filesystem::file_exists($duplicate));
// for user3 nothing should change
self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
$this->assertTrue(\OC\Files\Filesystem::file_exists($this->filename));
$this->assertFalse(\OC\Files\Filesystem::file_exists($duplicate));
//cleanup
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
\OCP\Share::unshare('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
'testGroup');
\OCP\Share::unshare('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
self::TEST_FILES_SHARING_API_USER2);
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER2, 'testGroup');
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER2, 'testGroup');
\OC_Group::deleteGroup('testGroup');
}
/**
* shared files should never have delete permissions
* @dataProvider DataProviderTestFileSharePermissions

View File

@ -717,33 +717,48 @@ class Share extends \OC\Share\Constants {
* Unsharing from self is not allowed for items inside collections
*/
public static function unshareFromSelf($itemType, $itemTarget) {
$item = self::getItemSharedWith($itemType, $itemTarget);
if (!empty($item)) {
if ((int)$item['share_type'] === self::SHARE_TYPE_GROUP) {
// Insert an extra row for the group share and set permission
// to 0 to prevent it from showing up for the user
$query = \OC_DB::prepare('INSERT INTO `*PREFIX*share`'
if ($itemType === 'file' || $itemType === 'folder') {
$statement = 'SELECT * FROM `*PREFIX*share` WHERE `item_type` = ? and `file_target` = ?';
} else {
$statement = 'SELECT * FROM `*PREFIX*share` WHERE `item_type` = ? and `item_target` = ?';
}
$query = \OCP\DB::prepare($statement);
$result = $query->execute(array($itemType, $itemTarget));
$shares = $result->fetchAll();
$itemUnshared = false;
foreach ($shares as $share) {
if ((int)$share['share_type'] === \OCP\Share::SHARE_TYPE_USER) {
Helper::delete($share['id']);
$itemUnshared = true;
break;
} elseif ((int)$share['share_type'] === \OCP\Share::SHARE_TYPE_GROUP) {
$groupShare = $share;
} elseif ((int)$share['share_type'] === self::$shareTypeGroupUserUnique) {
$uniqueGroupShare = $share;
}
}
if (!$itemUnshared && isset($groupShare)) {
$query = \OC_DB::prepare('INSERT INTO `*PREFIX*share`'
.' (`item_type`, `item_source`, `item_target`, `parent`, `share_type`,'
.' `share_with`, `uid_owner`, `permissions`, `stime`, `file_source`, `file_target`)'
.' VALUES (?,?,?,?,?,?,?,?,?,?,?)');
$query->execute(array($item['item_type'], $item['item_source'], $item['item_target'],
$item['id'], self::$shareTypeGroupUserUnique,
\OC_User::getUser(), $item['uid_owner'], 0, $item['stime'], $item['file_source'],
$item['file_target']));
\OC_DB::insertid('*PREFIX*share');
// Delete all reshares by this user of the group share
Helper::delete($item['id'], true, \OC_User::getUser());
} else if ((int)$item['share_type'] === self::$shareTypeGroupUserUnique) {
// Set permission to 0 to prevent it from showing up for the user
$query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `permissions` = ? WHERE `id` = ?');
$query->execute(array(0, $item['id']));
Helper::delete($item['id'], true);
} else {
Helper::delete($item['id']);
}
return true;
$query->execute(array($groupShare['item_type'], $groupShare['item_source'], $groupShare['item_target'],
$groupShare['id'], self::$shareTypeGroupUserUnique,
\OC_User::getUser(), $groupShare['uid_owner'], 0, $groupShare['stime'], $groupShare['file_source'],
$groupShare['file_target']));
$itemUnshared = true;
} elseif (!$itemUnshared && isset($uniqueGroupShare)) {
$query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `permissions` = ? WHERE `id` = ?');
$query->execute(array(0, $uniqueGroupShare['id']));
$itemUnshared = true;
}
return false;
return $itemUnshared;
}
/**