[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
This commit is contained in:
Roeland Jago Douma 2016-01-29 10:07:28 +01:00
parent 4777f78187
commit 403547f0ea
5 changed files with 62 additions and 24 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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();