diff options
-rw-r--r-- | lib/private/share20/defaultshareprovider.php | 31 | ||||
-rw-r--r-- | lib/private/share20/ishare.php | 7 | ||||
-rw-r--r-- | lib/private/share20/share.php | 23 | ||||
-rw-r--r-- | tests/lib/share20/defaultshareprovidertest.php | 229 |
4 files changed, 187 insertions, 103 deletions
diff --git a/lib/private/share20/defaultshareprovider.php b/lib/private/share20/defaultshareprovider.php index 41de81cf346..79bc809b9b2 100644 --- a/lib/private/share20/defaultshareprovider.php +++ b/lib/private/share20/defaultshareprovider.php @@ -112,8 +112,32 @@ class DefaultShareProvider implements IShareProvider { public function delete(IShare $share) { $this->deleteChildren($share); - $qb = $this->dbConn->getQueryBuilder(); + // Fetch share to make sure it exists + $share = $this->getShareById($share->getId()); + + $shareType = $share->getShareType(); + $sharedWith = ''; + if ($shareType === \OCP\Share::SHARE_TYPE_USER) { + $sharedWith = $share->getSharedWith()->getUID(); + } else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) { + $sharedWith = $share->getSharedWith()->getGID(); + } + + $hookParams = [ + 'id' => $share->getId(), + 'itemType' => $share->getPath() instanceof \OCP\Files\File ? 'file' : 'folder', + 'itemSource' => $share->getPath()->getId(), + 'shareType' => $shareType, + 'shareWith' => $sharedWith, + 'itemparent' => $share->getParent(), + 'uidOwner' => $share->getSharedBy()->getUID(), + 'fileSource' => $share->getPath()->getId(), + 'fileTarget' => $share->getTarget() + ]; + \OC_Hook::emit('OCP\Share', 'pre_unshare', $hookParams); + + $qb = $this->dbConn->getQueryBuilder(); $qb->delete('share') ->where($qb->expr()->eq('id', $qb->createParameter('id'))) ->setParameter(':id', $share->getId()); @@ -123,6 +147,8 @@ class DefaultShareProvider implements IShareProvider { } catch (\Exception $e) { throw new BackendError(); } + + \OC_Hook::emit('OCP\Share', 'post_unshare', $hookParams); } /** @@ -208,7 +234,8 @@ class DefaultShareProvider implements IShareProvider { $share = new Share(); $share->setId((int)$data['id']) ->setShareType((int)$data['share_type']) - ->setPermissions((int)$data['permissions']); + ->setPermissions((int)$data['permissions']) + ->setTarget($data['file_target']); if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) { $share->setSharedWith($this->userManager->get($data['share_with'])); diff --git a/lib/private/share20/ishare.php b/lib/private/share20/ishare.php index 7c5cce9b21e..fa7c1ea614c 100644 --- a/lib/private/share20/ishare.php +++ b/lib/private/share20/ishare.php @@ -146,4 +146,11 @@ interface IShare { * @return int */ public function getParent(); + + /** + * Get the target of this share + * + * @return string + */ + public function getTarget(); } diff --git a/lib/private/share20/share.php b/lib/private/share20/share.php index 380526fd281..989edd3c079 100644 --- a/lib/private/share20/share.php +++ b/lib/private/share20/share.php @@ -59,6 +59,9 @@ class Share implements IShare { /** @var int */ private $parent; + /** @var string */ + private $target; + /** * Set the id of the share * @@ -292,4 +295,24 @@ class Share implements IShare { public function getParent() { return $this->parent; } + + /** + * Set the target of this share + * + * @param string target + * @return Share The modified object + */ + public function setTarget($target) { + $this->target = $target; + return $this; + } + + /** + * Get the target of this share + * + * @return string + */ + public function getTarget() { + return $this->target; + } } diff --git a/tests/lib/share20/defaultshareprovidertest.php b/tests/lib/share20/defaultshareprovidertest.php index bf8306bf26c..c7ce36b6e6b 100644 --- a/tests/lib/share20/defaultshareprovidertest.php +++ b/tests/lib/share20/defaultshareprovidertest.php @@ -77,11 +77,12 @@ class DefaultShareProviderTest extends \Test\TestCase { $qb->insert('share') ->values([ 'id' => $qb->expr()->literal(1), - 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), - 'share_with' => $qb->expr()->literal('sharedWith'), - 'uid_owner' => $qb->expr()->literal('sharedBy'), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), 'file_source' => $qb->expr()->literal(42), 'permissions' => $qb->expr()->literal(13), + 'file_target' => $qb->expr()->literal('myTarget'), ]); $qb->execute(); @@ -123,6 +124,7 @@ class DefaultShareProviderTest extends \Test\TestCase { $this->assertEquals(13, $share->getPermissions()); $this->assertEquals(null, $share->getToken()); $this->assertEquals(null, $share->getExpirationDate()); + $this->assertEquals('myTarget', $share->getTarget()); } public function testGetShareByIdGroupShare() { @@ -136,6 +138,7 @@ class DefaultShareProviderTest extends \Test\TestCase { 'uid_owner' => $qb->expr()->literal('sharedBy'), 'file_source' => $qb->expr()->literal(42), 'permissions' => $qb->expr()->literal(13), + 'file_target' => $qb->expr()->literal('myTarget'), ]); $qb->execute(); @@ -181,6 +184,7 @@ class DefaultShareProviderTest extends \Test\TestCase { $this->assertEquals(13, $share->getPermissions()); $this->assertEquals(null, $share->getToken()); $this->assertEquals(null, $share->getExpirationDate()); + $this->assertEquals('myTarget', $share->getTarget()); } public function testGetShareByIdLinkShare() { @@ -196,6 +200,7 @@ class DefaultShareProviderTest extends \Test\TestCase { 'permissions' => $qb->expr()->literal(13), 'token' => $qb->expr()->literal('token'), 'expiration' => $qb->expr()->literal('2000-01-02 00:00:00'), + 'file_target' => $qb->expr()->literal('myTarget'), ]); $qb->execute(); @@ -235,6 +240,7 @@ class DefaultShareProviderTest extends \Test\TestCase { $this->assertEquals(13, $share->getPermissions()); $this->assertEquals('token', $share->getToken()); $this->assertEquals(\DateTime::createFromFormat('Y-m-d H:i:s', '2000-01-02 00:00:00'), $share->getExpirationDate()); + $this->assertEquals('myTarget', $share->getTarget()); } public function testGetShareByIdRemoteShare() { @@ -248,6 +254,7 @@ class DefaultShareProviderTest extends \Test\TestCase { 'uid_owner' => $qb->expr()->literal('sharedBy'), 'file_source' => $qb->expr()->literal(42), 'permissions' => $qb->expr()->literal(13), + 'file_target' => $qb->expr()->literal('myTarget'), ]); $qb->execute(); @@ -287,11 +294,11 @@ class DefaultShareProviderTest extends \Test\TestCase { $this->assertEquals(13, $share->getPermissions()); $this->assertEquals(null, $share->getToken()); $this->assertEquals(null, $share->getExpirationDate()); + $this->assertEquals('myTarget', $share->getTarget()); } public function testDeleteSingleShare() { $qb = $this->dbConn->getQueryBuilder(); - $qb->insert('share') ->values([ 'id' => $qb->expr()->literal(1), @@ -303,102 +310,89 @@ class DefaultShareProviderTest extends \Test\TestCase { ]); $qb->execute(); - $storage = $this->getMock('OC\Files\Storage\Storage'); - $storage - ->expects($this->once()) - ->method('getOwner') - ->willReturn('shareOwner'); - $path = $this->getMock('OCP\Files\Node'); + $path = $this->getMock('OCP\Files\File'); $path - ->expects($this->once()) - ->method('getStorage') - ->wilLReturn($storage); - $this->userFolder - ->expects($this->once()) - ->method('getById') - ->with(42) - ->willReturn([$path]); + ->expects($this->exactly(2)) + ->method('getId') + ->willReturn(42); $sharedWith = $this->getMock('OCP\IUser'); + $sharedWith + ->expects($this->once()) + ->method('getUID') + ->willReturn('sharedWith'); $sharedBy = $this->getMock('OCP\IUser'); - $shareOwner = $this->getMock('OCP\IUser'); - $this->userManager - ->method('get') - ->will($this->returnValueMap([ - ['sharedWith', $sharedWith], - ['sharedBy', $sharedBy], - ['shareOwner', $shareOwner], - ])); - - $share = $this->provider->getShareById(1); - $this->provider->delete($share); - - $qb = $this->dbConn->getQueryBuilder(); - $qb->select('*') - ->from('share'); - - $cursor = $qb->execute(); - $result = $cursor->fetchAll(); - $cursor->closeCursor(); - - $this->assertEmpty($result); - } - - public function testDeleteSingleShareKeepOther() { - $qb = $this->dbConn->getQueryBuilder(); - $qb->insert('share') - ->values([ - 'id' => $qb->expr()->literal(1), - 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), - 'share_with' => $qb->expr()->literal('sharedWith'), - 'uid_owner' => $qb->expr()->literal('sharedBy'), - 'file_source' => $qb->expr()->literal(42), - 'permissions' => $qb->expr()->literal(13), - ]); - $qb->execute(); - - $qb = $this->dbConn->getQueryBuilder(); - $qb->insert('share') - ->values([ - 'id' => $qb->expr()->literal(2), - 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), - 'share_with' => $qb->expr()->literal('sharedWith'), - 'uid_owner' => $qb->expr()->literal('sharedBy'), - 'file_source' => $qb->expr()->literal(42), - 'permissions' => $qb->expr()->literal(13), - ]); - $qb->execute(); - + $sharedBy + ->expects($this->once()) + ->method('getUID') + ->willReturn('sharedBy'); - $storage = $this->getMock('OC\Files\Storage\Storage'); - $storage + $share = $this->getMock('OC\Share20\IShare'); + $share + ->method('getId') + ->willReturn(1); + $share ->expects($this->once()) - ->method('getOwner') - ->willReturn('shareOwner'); - $path = $this->getMock('OCP\Files\Node'); - $path + ->method('getShareType') + ->willReturn(\OCP\Share::SHARE_TYPE_USER); + $share + ->expects($this->exactly(3)) + ->method('getPath') + ->willReturn($path); + $share ->expects($this->once()) - ->method('getStorage') - ->wilLReturn($storage); - $this->userFolder + ->method('getSharedWith') + ->willReturn($sharedWith); + $share ->expects($this->once()) - ->method('getById') - ->with(42) - ->willReturn([$path]); + ->method('getSharedBy') + ->willReturn($sharedBy); + $share + ->expects($this->once()) + ->method('getTarget') + ->willReturn('myTarget'); - $sharedWith = $this->getMock('OCP\IUser'); - $sharedBy = $this->getMock('OCP\IUser'); - $shareOwner = $this->getMock('OCP\IUser'); - $this->userManager - ->method('get') - ->will($this->returnValueMap([ - ['sharedWith', $sharedWith], - ['sharedBy', $sharedBy], - ['shareOwner', $shareOwner], - ])); + $provider = $this->getMockBuilder('OC\Share20\DefaultShareProvider') + ->setConstructorArgs([ + $this->dbConn, + $this->userManager, + $this->groupManager, + $this->userFolder, + ] + ) + ->setMethods(['deleteChildren', 'getShareById']) + ->getMock(); + $provider + ->expects($this->once()) + ->method('deleteChildren'); + $provider + ->expects($this->once()) + ->method('getShareById') + ->willReturn($share); + + $hookListner = $this->getMockBuilder('Dummy')->setMethods(['listen'])->getMock(); + \OCP\Util::connectHook('OCP\Share', 'pre_unshare', $hookListner, 'listen'); + \OCP\Util::connectHook('OCP\Share', 'post_unshare', $hookListner, 'listen'); + + $hookListnerExpects = [ + 'id' => 1, + 'itemType' => 'file', + 'itemSource' => 42, + 'shareType' => \OCP\Share::SHARE_TYPE_USER, + 'shareWith' => 'sharedWith', + 'itemparent' => null, + 'uidOwner' => 'sharedBy', + 'fileSource' => 42, + 'fileTarget' => 'myTarget', + ]; + + $hookListner + ->expects($this->exactly(2)) + ->method('listen') + ->with($hookListnerExpects); - $share = $this->provider->getShareById(1); - $this->provider->delete($share); + + $provider->delete($share); $qb = $this->dbConn->getQueryBuilder(); $qb->select('*') @@ -408,7 +402,7 @@ class DefaultShareProviderTest extends \Test\TestCase { $result = $cursor->fetchAll(); $cursor->closeCursor(); - $this->assertCount(1, $result); + $this->assertEmpty($result); } public function testDeleteNestedShares() { @@ -429,8 +423,8 @@ class DefaultShareProviderTest extends \Test\TestCase { ->values([ 'id' => $qb->expr()->literal(2), 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), - 'share_with' => $qb->expr()->literal('sharedWith2'), - 'uid_owner' => $qb->expr()->literal('sharedBy2'), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), 'file_source' => $qb->expr()->literal(42), 'permissions' => $qb->expr()->literal(13), 'parent' => $qb->expr()->literal(1), @@ -442,8 +436,8 @@ class DefaultShareProviderTest extends \Test\TestCase { ->values([ 'id' => $qb->expr()->literal(3), 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), - 'share_with' => $qb->expr()->literal('sharedWith2'), - 'uid_owner' => $qb->expr()->literal('sharedBy2'), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), 'file_source' => $qb->expr()->literal(42), 'permissions' => $qb->expr()->literal(13), 'parent' => $qb->expr()->literal(2), @@ -453,22 +447,25 @@ class DefaultShareProviderTest extends \Test\TestCase { $storage = $this->getMock('OC\Files\Storage\Storage'); $storage - ->expects($this->exactly(3)) ->method('getOwner') ->willReturn('shareOwner'); $path = $this->getMock('OCP\Files\Node'); $path - ->expects($this->exactly(3)) ->method('getStorage') ->wilLReturn($storage); $this->userFolder - ->expects($this->exactly(3)) ->method('getById') ->with(42) ->willReturn([$path]); $sharedWith = $this->getMock('OCP\IUser'); + $sharedWith + ->method('getUID') + ->willReturn('sharedWith'); $sharedBy = $this->getMock('OCP\IUser'); + $sharedBy + ->method('getUID') + ->willReturn('sharedBy'); $shareOwner = $this->getMock('OCP\IUser'); $this->userManager ->method('get') @@ -497,6 +494,33 @@ class DefaultShareProviderTest extends \Test\TestCase { */ public function testDeleteFails() { $share = $this->getMock('OC\Share20\IShare'); + $share + ->method('getId') + ->willReturn(42); + $share + ->expects($this->once()) + ->method('getShareType') + ->willReturn(\OCP\Share::SHARE_TYPE_LINK); + + $path = $this->getMock('OCP\Files\Folder'); + $path + ->expects($this->exactly(2)) + ->method('getId') + ->willReturn(100); + $share + ->expects($this->exactly(3)) + ->method('getPath') + ->willReturn($path); + + $sharedBy = $this->getMock('OCP\IUser'); + $sharedBy + ->expects($this->once()) + ->method('getUID'); + $share + ->expects($this->once()) + ->method('getSharedBy') + ->willReturn($sharedBy); + $expr = $this->getMock('OCP\DB\QueryBuilder\IExpressionBuilder'); $qb = $this->getMock('OCP\DB\QueryBuilder\IQueryBuilder'); $qb->expects($this->once()) @@ -529,15 +553,18 @@ class DefaultShareProviderTest extends \Test\TestCase { $this->userFolder, ] ) - ->setMethods(['deleteChildren']) + ->setMethods(['deleteChildren', 'getShareById']) ->getMock(); $provider ->expects($this->once()) ->method('deleteChildren') ->with($share); + $provider + ->expects($this->once()) + ->method('getShareById') + ->with(42) + ->willReturn($share); - $provider->delete($share); } - } |