From 403547f0ea9f34b82fa0ea5e9d7ebc1144ffa0e7 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Fri, 29 Jan 2016 10:07:28 +0100 Subject: [PATCH] [Share 2.0] Allow recipient to be passed in to getShareById * This allows us to retrieve usergroup shares for a given id. If the user deleted a share or moved it this will be a different share --- lib/private/share20/defaultshareprovider.php | 24 ++++++------ lib/private/share20/manager.php | 11 ++---- lib/public/share/imanager.php | 10 +++-- lib/public/share/ishareprovider.php | 3 +- .../lib/share20/defaultshareprovidertest.php | 38 +++++++++++++++++++ 5 files changed, 62 insertions(+), 24 deletions(-) diff --git a/lib/private/share20/defaultshareprovider.php b/lib/private/share20/defaultshareprovider.php index 0fa1552a1e7..261ba5d4884 100644 --- a/lib/private/share20/defaultshareprovider.php +++ b/lib/private/share20/defaultshareprovider.php @@ -448,13 +448,9 @@ class DefaultShareProvider implements IShareProvider { } /** - * Get share by id - * - * @param int $id - * @return \OCP\Share\IShare - * @throws ShareNotFound + * @inheritdoc */ - public function getShareById($id) { + public function getShareById($id, $recipient = null) { $qb = $this->dbConn->getQueryBuilder(); $qb->select('*') @@ -463,12 +459,11 @@ class DefaultShareProvider implements IShareProvider { ->andWhere( $qb->expr()->in( 'share_type', - [ - $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), - $qb->expr()->literal(\OCP\Share::SHARE_TYPE_GROUP), - $qb->expr()->literal(\OCP\Share::SHARE_TYPE_LINK), - $qb->expr()->literal(self::SHARE_TYPE_USERGROUP), - ] + $qb->createNamedParameter([ + \OCP\Share::SHARE_TYPE_USER, + \OCP\Share::SHARE_TYPE_GROUP, + \OCP\Share::SHARE_TYPE_LINK, + ], IQueryBuilder::PARAM_INT_ARRAY) ) ); @@ -486,6 +481,11 @@ class DefaultShareProvider implements IShareProvider { throw new ShareNotFound(); } + // If the recipient is set for a group share resolve to that user + if ($recipient !== null && $share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) { + $share = $this->resolveGroupShare($share, $recipient); + } + return $share; } diff --git a/lib/private/share20/manager.php b/lib/private/share20/manager.php index e45fa4b40f9..3c65f67e486 100644 --- a/lib/private/share20/manager.php +++ b/lib/private/share20/manager.php @@ -746,14 +746,9 @@ class Manager implements IManager { } /** - * Retrieve a share by the share id - * - * @param string $id - * @return Share - * - * @throws ShareNotFound + * @inheritdoc */ - public function getShareById($id) { + public function getShareById($id, $recipient = null) { if ($id === null) { throw new ShareNotFound(); } @@ -761,7 +756,7 @@ class Manager implements IManager { list($providerId, $id) = $this->splitFullId($id); $provider = $this->factory->getProvider($providerId); - $share = $provider->getShareById($id); + $share = $provider->getShareById($id, $recipient); return $share; } diff --git a/lib/public/share/imanager.php b/lib/public/share/imanager.php index b2d9953e9ef..6919fea00de 100644 --- a/lib/public/share/imanager.php +++ b/lib/public/share/imanager.php @@ -101,14 +101,18 @@ interface IManager { public function getSharedWith(IUser $user, $shareType, $node = null, $limit = 50, $offset = 0); /** - * Retrieve a share by the share id + * Retrieve a share by the share id. + * If the recipient is set make sure to retrieve the file for that user. + * This makes sure that if a user has moved/deleted a group share this + * is reflected. * * @param string $id - * @return Share + * @param IUser|null $recipient + * @return IShare * @throws ShareNotFound * @since 9.0.0 */ - public function getShareById($id); + public function getShareById($id, $recipient = null); /** * Get the share by token possible with password diff --git a/lib/public/share/ishareprovider.php b/lib/public/share/ishareprovider.php index 8507462cbed..9dc56dc37ad 100644 --- a/lib/public/share/ishareprovider.php +++ b/lib/public/share/ishareprovider.php @@ -97,11 +97,12 @@ interface IShareProvider { * Get share by id * * @param int $id + * @param IUser|null $recipient * @return \OCP\Share\IShare * @throws ShareNotFound * @since 9.0.0 */ - public function getShareById($id); + public function getShareById($id, $recipient = null); /** * Get shares for a given path diff --git a/tests/lib/share20/defaultshareprovidertest.php b/tests/lib/share20/defaultshareprovidertest.php index 28b57435e1d..4145e9e5ec6 100644 --- a/tests/lib/share20/defaultshareprovidertest.php +++ b/tests/lib/share20/defaultshareprovidertest.php @@ -247,6 +247,44 @@ class DefaultShareProviderTest extends \Test\TestCase { $this->assertEquals('myTarget', $share->getTarget()); } + public function testGetShareByIdUserGroupShare() { + $id = $this->addShareToDB(\OCP\Share::SHARE_TYPE_GROUP, 'group0', 'user0', 'user0', 'file', 42, 'myTarget', 31, null, null); + $this->addShareToDB(2, 'user1', 'user0', 'user0', 'file', 42, 'userTarget', 0, null, null, $id); + + $user0 = $this->getMock('OCP\IUser'); + $user0->method('getUID')->willReturn('user0'); + $user1 = $this->getMock('OCP\IUser'); + $user1->method('getUID')->willReturn('user1'); + + $group0 = $this->getMock('OCP\IGroup'); + $group0->method('inGroup')->with($user1)->willReturn(true); + + $node = $this->getMock('\OCP\Files\Folder'); + $node->method('getId')->willReturn(42); + + $this->rootFolder->method('getUserFolder')->with('user0')->will($this->returnSelf()); + $this->rootFolder->method('getById')->willReturn([$node]); + + $this->userManager->method('get')->will($this->returnValueMap([ + ['user0', $user0], + ['user1', $user1], + ])); + $this->groupManager->method('get')->with('group0')->willReturn($group0); + + $share = $this->provider->getShareById($id, $user1); + + $this->assertEquals($id, $share->getId()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_GROUP, $share->getShareType()); + $this->assertSame($group0, $share->getSharedWith()); + $this->assertSame($user0, $share->getSharedBy()); + $this->assertSame($user0, $share->getShareOwner()); + $this->assertSame($node, $share->getNode()); + $this->assertEquals(0, $share->getPermissions()); + $this->assertEquals(null, $share->getToken()); + $this->assertEquals(null, $share->getExpirationDate()); + $this->assertEquals('userTarget', $share->getTarget()); + } + public function testGetShareByIdLinkShare() { $qb = $this->dbConn->getQueryBuilder(); -- 2.39.5