diff options
author | Roeland Jago Douma <rullzer@owncloud.com> | 2016-01-26 12:58:41 +0100 |
---|---|---|
committer | Roeland Jago Douma <rullzer@owncloud.com> | 2016-01-26 14:14:54 +0100 |
commit | c090d709e769a2bf81fb2f46780714a753de8d74 (patch) | |
tree | dbad2c9df5ab8afb8049106bf3f77d88abae6714 | |
parent | 3da78c8f1c9355a726f289e834fa237366c3df20 (diff) | |
download | nextcloud-server-c090d709e769a2bf81fb2f46780714a753de8d74.tar.gz nextcloud-server-c090d709e769a2bf81fb2f46780714a753de8d74.zip |
We must resolve to the proper usergroup share
-rw-r--r-- | lib/private/share20/defaultshareprovider.php | 14 | ||||
-rw-r--r-- | tests/lib/share20/defaultshareprovidertest.php | 21 |
2 files changed, 32 insertions, 3 deletions
diff --git a/lib/private/share20/defaultshareprovider.php b/lib/private/share20/defaultshareprovider.php index 3d5462792cd..f2072fe21cd 100644 --- a/lib/private/share20/defaultshareprovider.php +++ b/lib/private/share20/defaultshareprovider.php @@ -495,6 +495,9 @@ class DefaultShareProvider implements IShareProvider { } else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) { $allGroups = $this->groupManager->getUserGroups($user); + /** @var Share[] $shares2 */ + $shares2 = []; + $start = 0; while(true) { $groups = array_slice($allGroups, $start, 100); @@ -528,7 +531,7 @@ class DefaultShareProvider implements IShareProvider { $offset--; continue; } - $shares[] = $this->createShare($data); + $shares2[] = $this->createShare($data); } $cursor->closeCursor(); } @@ -537,7 +540,9 @@ class DefaultShareProvider implements IShareProvider { * Resolve all group shares to user specific shares * TODO: Optmize this! */ - $shares = array_map([$this, 'resolveGroupShare'], $shares); + foreach($shares2 as $share) { + $shares[] = $this->resolveGroupShare($share, $user); + } } else { throw new BackendError('Invalid backend'); } @@ -674,15 +679,18 @@ class DefaultShareProvider implements IShareProvider { * Thus if the user moved their group share make sure this is properly reflected here. * * @param Share $share + * @param IUser $user * @return Share Returns the updated share if one was found else return the original share. */ - private function resolveGroupShare(Share $share) { + private function resolveGroupShare(Share $share, IUser $user) { $qb = $this->dbConn->getQueryBuilder(); $stmt = $qb->select('*') ->from('share') ->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId()))) ->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))) + ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($user->getUID()))) + ->setMaxResults(1) ->execute(); $data = $stmt->fetch(); diff --git a/tests/lib/share20/defaultshareprovidertest.php b/tests/lib/share20/defaultshareprovidertest.php index 574b1481c95..8a82be4161b 100644 --- a/tests/lib/share20/defaultshareprovidertest.php +++ b/tests/lib/share20/defaultshareprovidertest.php @@ -881,6 +881,27 @@ class DefaultShareProviderTest extends \Test\TestCase { $this->assertEquals(1, $qb->execute()); $id = $qb->getLastInsertId(); + /* + * Wrong share. Should not be taken by code. + */ + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(2), + 'share_with' => $qb->expr()->literal('user2'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('wrongTarget'), + 'permissions' => $qb->expr()->literal(31), + 'parent' => $qb->expr()->literal($id), + ]); + $this->assertEquals(1, $qb->execute()); + + /* + * Correct share. should be taken by code path. + */ $qb = $this->dbConn->getQueryBuilder(); $qb->insert('share') ->values([ |