diff options
author | Roeland Jago Douma <rullzer@owncloud.com> | 2015-10-30 13:10:08 +0100 |
---|---|---|
committer | Roeland Jago Douma <rullzer@owncloud.com> | 2015-11-05 15:59:09 +0100 |
commit | 6624fa212a4627217c9c95771f7bb933baaddbc1 (patch) | |
tree | ad1b76abd52b609dc41f40cdc05cc0b316d34038 | |
parent | 8b5179459afe1a7355e48f60545bcb76f1cf4699 (diff) | |
download | nextcloud-server-6624fa212a4627217c9c95771f7bb933baaddbc1.tar.gz nextcloud-server-6624fa212a4627217c9c95771f7bb933baaddbc1.zip |
The new sharing code now handles deletion
OCS -> ShareManager -> DefaultShareProvider
-rw-r--r-- | apps/files_sharing/api/ocssharewrapper.php | 13 | ||||
-rw-r--r-- | apps/files_sharing/api/share20ocs.php | 73 | ||||
-rw-r--r-- | apps/files_sharing/tests/api/share20ocstest.php | 113 | ||||
-rw-r--r-- | lib/private/share20/defaultshareprovider.php | 248 | ||||
-rw-r--r-- | lib/private/share20/exception/backenderror.php | 25 | ||||
-rw-r--r-- | lib/private/share20/exception/sharenotfound.php | 25 | ||||
-rw-r--r-- | lib/private/share20/ishare.php | 149 | ||||
-rw-r--r-- | lib/private/share20/ishareprovider.php | 8 | ||||
-rw-r--r-- | lib/private/share20/manager.php | 74 | ||||
-rw-r--r-- | lib/private/share20/share.php | 106 | ||||
-rw-r--r-- | tests/lib/share20/defaultshareprovidertest.php | 543 | ||||
-rw-r--r-- | tests/lib/share20/managertest.php | 198 |
12 files changed, 1469 insertions, 106 deletions
diff --git a/apps/files_sharing/api/ocssharewrapper.php b/apps/files_sharing/api/ocssharewrapper.php index 14fc995cda5..8c0d8f7d150 100644 --- a/apps/files_sharing/api/ocssharewrapper.php +++ b/apps/files_sharing/api/ocssharewrapper.php @@ -22,8 +22,11 @@ namespace OCA\Files_Sharing\API; class OCSShareWrapper { + /** + * @return Share20OCS + */ private function getShare20OCS() { - return new share20OCS(new \OC\Share20\Manager( + return new Share20OCS(new \OC\Share20\Manager( \OC::$server->getUserSession()->getUser(), \OC::$server->getUserManager(), \OC::$server->getGroupManager(), @@ -31,7 +34,10 @@ class OCSShareWrapper { \OC::$server->getAppConfig(), \OC::$server->getUserFolder(), new \OC\Share20\DefaultShareProvider( - \OC::$server->getDatabaseConnection() + \OC::$server->getDatabaseConnection(), + \OC::$server->getUserManager(), + \OC::$server->getGroupManager(), + \OC::$server->getUserFolder() ) ), \OC::$server->getGroupManager(), @@ -57,6 +63,7 @@ class OCSShareWrapper { } public function deleteShare($params) { - return \OCA\Files_Sharing\API\Local::deleteShare($params); + $id = (int)$params['id']; + return $this->getShare20OCS()->deleteShare($id); } } diff --git a/apps/files_sharing/api/share20ocs.php b/apps/files_sharing/api/share20ocs.php new file mode 100644 index 00000000000..aeeb3ee25b3 --- /dev/null +++ b/apps/files_sharing/api/share20ocs.php @@ -0,0 +1,73 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\Files_Sharing\API; + +class Share20OCS { + + /** @var OC\Share20\Manager */ + private $shareManager; + + /** @var OCP\IGroupManager */ + private $groupManager; + + /** @var OCP\IUserManager */ + private $userManager; + + /** @var OCP\IRequest */ + private $request; + + /** @var OCP\Files\Folder */ + private $userFolder; + + public function __construct(\OC\Share20\Manager $shareManager, + \OCP\IGroupManager $groupManager, + \OCP\IUserManager $userManager, + \OCP\IRequest $request, + \OCP\Files\Folder $userFolder) { + $this->shareManager = $shareManager; + $this->userManager = $userManager; + $this->groupManager = $groupManager; + $this->request = $request; + $this->userFolder = $userFolder; + } + + /** + * Delete a share + * + * @param int $id + * @return \OC_OCS_Result + */ + public function deleteShare($id) { + try { + $share = $this->shareManager->getShareById($id); + } catch (\OC\Share20\Exception\ShareNotFound $e) { + return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.'); + } + + try { + $this->shareManager->deleteShare($share); + } catch (\OC\Share20\Exception\BackendError $e) { + return new \OC_OCS_Result(null, 404, 'could not delete share'); + } + + return new \OC_OCS_Result(); + } +} diff --git a/apps/files_sharing/tests/api/share20ocstest.php b/apps/files_sharing/tests/api/share20ocstest.php new file mode 100644 index 00000000000..9c4377a2a7f --- /dev/null +++ b/apps/files_sharing/tests/api/share20ocstest.php @@ -0,0 +1,113 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\Files_Sharing\Tests\API; + +use OCA\Files_Sharing\API\Share20OCS; + +class Share20OCSTest extends \Test\TestCase { + + /** @var OC\Share20\Manager */ + private $shareManager; + + /** @var OCP\IGroupManager */ + private $groupManager; + + /** @var OCP\IUserManager */ + private $userManager; + + /** @var OCP\IRequest */ + private $request; + + /** @var OCP\Files\Folder */ + private $userFolder; + + /** @var OCS */ + private $ocs; + + protected function setUp() { + $this->shareManager = $this->getMockBuilder('OC\Share20\Manager') + ->disableOriginalConstructor() + ->getMock(); + $this->groupManager = $this->getMockBuilder('OCP\IGroupManager') + ->disableOriginalConstructor() + ->getMock(); + $this->userManager = $this->getMockBuilder('OCP\IUserManager') + ->disableOriginalConstructor() + ->getMock(); + $this->request = $this->getMockBuilder('OCP\IRequest') + ->disableOriginalConstructor() + ->getMock(); + $this->userFolder = $this->getMockBuilder('OCP\Files\Folder') + ->disableOriginalConstructor() + ->getMock(); + + $this->ocs = new Share20OCS($this->shareManager, + $this->groupManager, + $this->userManager, + $this->request, + $this->userFolder); + } + + public function testDeleteShareShareNotFound() { + $this->shareManager + ->expects($this->once()) + ->method('getShareById') + ->with(42) + ->will($this->throwException(new \OC\Share20\Exception\ShareNotFound())); + + $expected = new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.'); + $this->assertEquals($expected, $this->ocs->deleteShare(42)); + } + + public function testDeleteShareCouldNotDelete() { + $share = $this->getMock('OC\Share20\IShare'); + $this->shareManager + ->expects($this->once()) + ->method('getShareById') + ->with(42) + ->willReturn($share); + $this->shareManager + ->expects($this->once()) + ->method('deleteShare') + ->with($share) + ->will($this->throwException(new \OC\Share20\Exception\BackendError())); + + + $expected = new \OC_OCS_Result(null, 404, 'could not delete share'); + $this->assertEquals($expected, $this->ocs->deleteShare(42)); + } + + public function testDeleteShare() { + $share = $this->getMock('OC\Share20\IShare'); + $this->shareManager + ->expects($this->once()) + ->method('getShareById') + ->with(42) + ->willReturn($share); + $this->shareManager + ->expects($this->once()) + ->method('deleteShare') + ->with($share); + + $expected = new \OC_OCS_Result(); + $this->assertEquals($expected, $this->ocs->deleteShare(42)); + } +} diff --git a/lib/private/share20/defaultshareprovider.php b/lib/private/share20/defaultshareprovider.php new file mode 100644 index 00000000000..41de81cf346 --- /dev/null +++ b/lib/private/share20/defaultshareprovider.php @@ -0,0 +1,248 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OC\Share20; + +use OC\Share20\Exception\ShareNotFound; +use OC\Share20\Exception\BackendError; +use OCP\IUser; + +class DefaultShareProvider implements IShareProvider { + + /** @var \OCP\IDBConnection */ + private $dbConn; + + /** @var \OCP\IUserManager */ + private $userManager; + + /** @var \OCP\IGroupManager */ + private $groupManager; + + /** @var \OCP\Files\Folder */ + private $userFolder; + + public function __construct(\OCP\IDBConnection $connection, + \OCP\IUserManager $userManager, + \OCP\IGroupManager $groupManager, + \OCP\Files\Folder $userFolder) { + $this->dbConn = $connection; + $this->userManager = $userManager; + $this->groupManager = $groupManager; + $this->userFolder = $userFolder; + } + + /** + * Share a path + * + * @param Share $share + * @return Share The share object + */ + public function create(Share $share) { + throw new \Exception(); + } + + /** + * Update a share + * + * @param Share $share + * @return Share The share object + */ + public function update(Share $share) { + throw new \Exception(); + } + + /** + * Get all childre of this share + * + * @param IShare $share + * @return IShare[] + */ + private function getChildren(IShare $share) { + $children = []; + + $qb = $this->dbConn->getQueryBuilder(); + $qb->select('*') + ->from('share') + ->where($qb->expr()->eq('parent', $qb->createParameter('parent'))) + ->setParameter(':parent', $share->getId()); + + $cursor = $qb->execute(); + while($data = $cursor->fetch()) { + $children[] = $this->createShare($data); + } + $cursor->closeCursor(); + + return $children; + } + + /** + * Delete all the children of this share + * + * @param IShare $share + */ + protected function deleteChildren(IShare $share) { + foreach($this->getChildren($share) as $child) { + $this->delete($child); + } + } + + /** + * Delete a share + * + * @param Share $share + * @throws BackendError + */ + public function delete(IShare $share) { + $this->deleteChildren($share); + + $qb = $this->dbConn->getQueryBuilder(); + + $qb->delete('share') + ->where($qb->expr()->eq('id', $qb->createParameter('id'))) + ->setParameter(':id', $share->getId()); + + try { + $qb->execute(); + } catch (\Exception $e) { + throw new BackendError(); + } + } + + /** + * Get all shares by the given user + * + * @param IUser $user + * @param int $shareType + * @param int $offset + * @param int $limit + * @return Share[] + */ + public function getShares(IUser $user, $shareType, $offset, $limit) { + throw new \Exception(); + } + + /** + * Get share by id + * + * @param int $id + * @return IShare + * @throws ShareNotFound + */ + public function getShareById($id) { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->select('*') + ->from('share') + ->where($qb->expr()->eq('id', $qb->createParameter('id'))) + ->setParameter(':id', $id); + + $cursor = $qb->execute(); + $data = $cursor->fetch(); + $cursor->closeCursor(); + + if ($data === false) { + throw new ShareNotFound(); + } + + $share = $this->createShare($data); + + return $share; + } + + /** + * Get shares for a given path + * + * @param \OCP\Files\Node $path + * @param Share[] + */ + public function getSharesByPath(\OCP\IUser $user, \OCP\Files\Node $path) { + throw new \Exception(); + } + + /** + * Get shared with the given user + * + * @param IUser $user + * @param int $shareType + * @param Share + */ + public function getSharedWithMe(IUser $user, $shareType = null) { + throw new \Exception(); + } + + /** + * Get a share by token and if present verify the password + * + * @param string $token + * @param string $password + * @param Share + */ + public function getShareByToken($token, $password = null) { + throw new \Exception(); + } + + /** + * Create a share object from an database row + * + * @param mixed[] $data + * @return Share + */ + private function createShare($data) { + $share = new Share(); + $share->setId((int)$data['id']) + ->setShareType((int)$data['share_type']) + ->setPermissions((int)$data['permissions']); + + if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) { + $share->setSharedWith($this->userManager->get($data['share_with'])); + } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) { + $share->setSharedWith($this->groupManager->get($data['share_with'])); + } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) { + /* + * TODO: Clean this up, this should be set as password not sharedWith + */ + $share->setSharedWith($data['share_with']); + $share->setToken($data['token']); + } else { + $share->setSharedWith($data['share_with']); + } + + $share->setSharedBy($this->userManager->get($data['uid_owner'])); + + // TODO: getById can return an array. How to handle this properly?? + $path = $this->userFolder->getById($data['file_source']); + $path = $path[0]; + $share->setPath($path); + + $owner = $path->getStorage()->getOwner('.'); + if ($owner !== false) { + $share->setShareOwner($this->userManager->get($owner)); + } + + if ($data['expiration'] !== null) { + $expiration = \DateTime::createFromFormat('Y-m-d H:i:s', $data['expiration']); + $share->setExpirationDate($expiration); + } + + return $share; + } + + +} diff --git a/lib/private/share20/exception/backenderror.php b/lib/private/share20/exception/backenderror.php new file mode 100644 index 00000000000..2d661533171 --- /dev/null +++ b/lib/private/share20/exception/backenderror.php @@ -0,0 +1,25 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OC\Share20\Exception; + +class BackendError extends \Exception { + +} diff --git a/lib/private/share20/exception/sharenotfound.php b/lib/private/share20/exception/sharenotfound.php new file mode 100644 index 00000000000..0e18a96be68 --- /dev/null +++ b/lib/private/share20/exception/sharenotfound.php @@ -0,0 +1,25 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OC\Share20\Exception; + +class ShareNotFound extends \Exception { + +} diff --git a/lib/private/share20/ishare.php b/lib/private/share20/ishare.php new file mode 100644 index 00000000000..7c5cce9b21e --- /dev/null +++ b/lib/private/share20/ishare.php @@ -0,0 +1,149 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OC\Share20; + +use OCP\Files\File; +use OCP\Files\Folder; +use OCP\Files\Node; +use OCP\IUser; +use OCP\IGroup; + +interface IShare { + + /** + * Get the id of the share + * + * @return string + */ + public function getId(); + + /** + * Set the path of this share + * + * @param File|Folder $path + * @return Share The modified object + */ + public function setPath(Node $path); + + /** + * Get the path of this share for the current user + * + * @return File|Folder + */ + public function getPath(); + + /** + * Set the shareType + * + * @param int $shareType + * @return Share The modified object + */ + public function setShareType($shareType); + + /** + * Get the shareType + * + * @return int + */ + public function getShareType(); + + /** + * Set the receiver of this share + * + * @param IUser|IGroup|string + * @return Share The modified object + */ + public function setSharedWith($sharedWith); + + /** + * Get the receiver of this share + * + * @return IUser|IGroup|string + */ + public function getSharedWith(); + + /** + * Set the permissions + * + * @param int $permissions + * @return Share The modified object + */ + public function setPermissions($permissions); + + /** + * Get the share permissions + * + * @return int + */ + public function getPermissions(); + + /** + * Set the expiration date + * + * @param \DateTime $expireDate + * @return Share The modified object + */ + public function setExpirationDate(\DateTime $expireDate); + + /** + * Get the share expiration date + * + * @return \DateTime + */ + public function getExpirationDate(); + + /** + * Get share sharer + * + * @return IUser|string + */ + public function getSharedBy(); + + /** + * Get the original share owner (who owns the path) + * + * @return IUser|string + */ + public function getShareOwner(); + + /** + * Set the password + * + * @param string $password + * + * @return Share The modified object + */ + public function setPassword($password); + + /** + * Get the token + * + * @return string + */ + public function getToken(); + + /** + * Get the parent it + * + * @return int + */ + public function getParent(); +} diff --git a/lib/private/share20/ishareprovider.php b/lib/private/share20/ishareprovider.php index 22e10fdbbdd..b3f4eb6868f 100644 --- a/lib/private/share20/ishareprovider.php +++ b/lib/private/share20/ishareprovider.php @@ -20,6 +20,8 @@ */ namespace OC\Share20; +use OC\Share20\Exception\ShareNotFound; +use OC\Share20\Exception\BackendError; use OCP\IUser; interface IShareProvider { @@ -44,8 +46,9 @@ interface IShareProvider { * Delete a share * * @param Share $share + * @throws BackendError */ - public function delete(Share $share); + public function delete(IShare $share); /** * Get all shares by the given user @@ -62,7 +65,8 @@ interface IShareProvider { * Get share by id * * @param int $id - * @return Share + * @return IShare + * @throws ShareNotFound */ public function getShareById($id); diff --git a/lib/private/share20/manager.php b/lib/private/share20/manager.php index f32d8ee3bbf..52e43a9aa9f 100644 --- a/lib/private/share20/manager.php +++ b/lib/private/share20/manager.php @@ -28,8 +28,7 @@ use OCP\IUser; use OCP\ILogger; use OCP\Files\Folder; -use OC\Share20\Exceptions\ShareNotFoundException; -use OC\Share20\Exception\PreconditionFailed; +use OC\Share20\Exception\ShareNotFound; /** * This class is the communication hub for all sharing related operations. @@ -39,12 +38,7 @@ class Manager { /** * @var IShareProvider[] */ - private $shareProviders; - - /** - * @var string[] - */ - private $shareTypeToProviderId; + private $defaultProvider; /** @var IUser */ private $currentUser; @@ -79,47 +73,7 @@ class Manager { $this->userFolder = $userFolder; // TEMP SOLUTION JUST TO GET STARTED - $this->shareProviders['ocdef'] = $defaultProvider; - $this->shareTypeToProviderId = [ - \OCP\Share::SHARE_TYPE_USER => 'ocdef', - \OCP\Share::SHARE_TYPE_GROUP => 'ocdef', - \OCP\Share::SHARE_TYPE_LINK => 'ocdef', - ]; - - // TODO: Get storage share provider from primary storage - } - - /** - * Get a ShareProvider - * - * @param string $id - * @return IShareProvider - */ - private function getShareProvider($id) { - if (!isset($this->shareProviders[$id])) { - //Throw exception; - } - - // Check if we have instanciated this provider yet - if (!($this->shareProviders[$id] instanceOf \OC\Share20\IShareProvider)) { - throw new \Exception(); - } - - return $this->shareProviders[$id]; - } - - /** - * Get shareProvider based on shareType - * - * @param int $shareType - * @return IShareProvider - */ - private function getShareProviderByType($shareType) { - if (!isset($this->shareTypeToProviderId[$shareType])) { - //Throw exception - } - - return $this->getShareProvider($this->shareTypeToProviderId[$shareType]); + $this->defaultProvider = $defaultProvider; } /** @@ -146,9 +100,15 @@ class Manager { * Delete a share * * @param Share $share + * @throws ShareNotFound + * @throws \OC\Share20\Exception\BackendError */ - public function deleteShare(Share $share) { - throw new \Exception(); + public function deleteShare(IShare $share) { + if ($share->getId() === null) { + throw new ShareNotFound(); + } + + $this->defaultProvider->delete($share); } /** @@ -168,10 +128,18 @@ class Manager { * @param string $id * @return Share * - * @throws ShareNotFoundException + * @throws ShareNotFound */ public function getShareById($id) { - throw new \Exception(); + $share = $this->defaultProvider->getShareById($id); + + if ($share->getSharedWith() !== $this->currentUser && + $share->getSharedBy() !== $this->currentUser && + $share->getShareOwner() !== $this->currentUser) { + throw new ShareNotFound(); + } + + return $share; } /** diff --git a/lib/private/share20/share.php b/lib/private/share20/share.php index e8d81b96ad6..380526fd281 100644 --- a/lib/private/share20/share.php +++ b/lib/private/share20/share.php @@ -24,13 +24,10 @@ use OCP\Files\Node; use OCP\IUser; use OCP\IGroup; -class Share { +class Share implements IShare { /** @var string */ - private $internalId; - - /** @var string */ - private $providerId; + private $id; /** @var Node */ private $path; @@ -39,7 +36,7 @@ class Share { private $shareType; /** @var IUser|IGroup|string */ - private $shareWith; + private $sharedWith; /** @var IUser|string */ private $sharedBy; @@ -56,57 +53,30 @@ class Share { /** @var string */ private $password; - /** - * Set the id of the ShareProvider - * Should only be used by the share manager - * - * @param string $providerId - * @return Share The modified object - */ - public function setProviderId($providerId) { - $this->providerId = $providerId; - return $this; - } + /** @var string */ + private $token; - /** - * Get the id of the ShareProvider - * - * @return string - */ - public function getProviderId() { - return $this->providerId; - } + /** @var int */ + private $parent; /** - * Set the internal (to the provider) share id - * Should only be used by the share provider + * Set the id of the share * - * @param string $id + * @param int id * @return Share The modified object */ - public function setInternalId($id) { - $this->internalId = $id; + public function setId($id) { + $this->id = $id; return $this; } /** - * Get the internal (to the provider) share id - * Should only be used by the share provider - * - * @return string - */ - public function getInternalId() { - return $this->internalId; - } - - /** * Get the id of the share * * @return string */ public function getId() { - //TODO $id should be set as well as $providerId - return $this->providerId . ':' . $this->internalId; + return $this->id; } /** @@ -150,23 +120,23 @@ class Share { } /** - * Set the shareWith + * Set the receiver of this share * * @param IUser|IGroup|string * @return Share The modified object */ - public function setShareWith($shareWith) { - $this->shareWith = $shareWith; + public function setSharedWith($sharedWith) { + $this->sharedWith = $sharedWith; return $this; } /** - * Get the shareWith + * Get the receiver of this share * * @return IUser|IGroup|string */ - public function getShareWith() { - return $this->shareWith; + public function getSharedWith() { + return $this->sharedWith; } /** @@ -282,4 +252,44 @@ class Share { public function getPassword($password) { return $this->password; } + + /** + * Set the token + * + * @param string $token + * @return Share The modified object + */ + public function setToken($token) { + $this->token = $token; + return $this; + } + + /** + * Get the token + * + * @return string + */ + public function getToken() { + return $this->token; + } + + /** + * Set the parent id of this share + * + * @param int $parent + * @return Share The modified object + */ + public function setParent($parent) { + $this->parent = $parent; + return $this; + } + + /** + * Get the parent id of this share + * + * @return int + */ + public function getParent() { + return $this->parent; + } } diff --git a/tests/lib/share20/defaultshareprovidertest.php b/tests/lib/share20/defaultshareprovidertest.php new file mode 100644 index 00000000000..bf8306bf26c --- /dev/null +++ b/tests/lib/share20/defaultshareprovidertest.php @@ -0,0 +1,543 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace Test\Share20; + +use OCP\IDBConnection; +use OCP\IUserManager; +use OCP\IGroupManager; +use OCP\Files\Folder; +use OC\Share20\DefaultShareProvider; + +class DefaultShareProviderTest extends \Test\TestCase { + + /** @var IDBConnection */ + protected $dbConn; + + /** @var IUserManager */ + protected $userManager; + + /** @var IGroupManager */ + protected $groupManager; + + /** @var Folder */ + protected $userFolder; + + /** @var DefaultShareProvider */ + protected $provider; + + public function setUp() { + $this->dbConn = \OC::$server->getDatabaseConnection(); + $this->userManager = $this->getMock('OCP\IUserManager'); + $this->groupManager = $this->getMock('OCP\IGroupManager'); + $this->userFolder = $this->getMock('OCP\Files\Folder'); + + //Empty share table + $this->dbConn->getQueryBuilder()->delete('share')->execute(); + + $this->provider = new DefaultShareProvider( + $this->dbConn, + $this->userManager, + $this->groupManager, + $this->userFolder + ); + } + + public function tearDown() { + $this->dbConn->getQueryBuilder()->delete('share')->execute(); + } + + /** + * @expectedException OC\Share20\Exception\ShareNotFound + */ + public function testGetShareByIdNotExist() { + $this->provider->getShareById(1); + } + + public function testGetShareByIdUserShare() { + $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(); + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $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], + ])); + + $share = $this->provider->getShareById(1); + + $this->assertEquals(1, $share->getId()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_USER, $share->getShareType()); + $this->assertEquals($sharedWith, $share->getSharedWith()); + $this->assertEquals($sharedBy, $share->getSharedBy()); + $this->assertEquals($shareOwner, $share->getShareOwner()); + $this->assertEquals($path, $share->getPath()); + $this->assertEquals(13, $share->getPermissions()); + $this->assertEquals(null, $share->getToken()); + $this->assertEquals(null, $share->getExpirationDate()); + } + + public function testGetShareByIdGroupShare() { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(1), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_GROUP), + '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(); + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $sharedWith = $this->getMock('OCP\IGroup'); + $sharedBy = $this->getMock('OCP\IUser'); + $shareOwner = $this->getMock('OCP\IUser'); + $this->userManager + ->method('get') + ->will($this->returnValueMap([ + ['sharedBy', $sharedBy], + ['shareOwner', $shareOwner], + ])); + $this->groupManager + ->expects($this->once()) + ->method('get') + ->with('sharedWith') + ->willReturn($sharedWith); + + $share = $this->provider->getShareById(1); + + $this->assertEquals(1, $share->getId()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_GROUP, $share->getShareType()); + $this->assertEquals($sharedWith, $share->getSharedWith()); + $this->assertEquals($sharedBy, $share->getSharedBy()); + $this->assertEquals($shareOwner, $share->getShareOwner()); + $this->assertEquals($path, $share->getPath()); + $this->assertEquals(13, $share->getPermissions()); + $this->assertEquals(null, $share->getToken()); + $this->assertEquals(null, $share->getExpirationDate()); + } + + public function testGetShareByIdLinkShare() { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(1), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_LINK), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + 'token' => $qb->expr()->literal('token'), + 'expiration' => $qb->expr()->literal('2000-01-02 00:00:00'), + ]); + $qb->execute(); + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $sharedBy = $this->getMock('OCP\IUser'); + $shareOwner = $this->getMock('OCP\IUser'); + $this->userManager + ->method('get') + ->will($this->returnValueMap([ + ['sharedBy', $sharedBy], + ['shareOwner', $shareOwner], + ])); + + $share = $this->provider->getShareById(1); + + $this->assertEquals(1, $share->getId()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_LINK, $share->getShareType()); + $this->assertEquals('sharedWith', $share->getSharedWith()); + $this->assertEquals($sharedBy, $share->getSharedBy()); + $this->assertEquals($shareOwner, $share->getShareOwner()); + $this->assertEquals($path, $share->getPath()); + $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()); + } + + public function testGetShareByIdRemoteShare() { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(1), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_REMOTE), + '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(); + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $sharedBy = $this->getMock('OCP\IUser'); + $shareOwner = $this->getMock('OCP\IUser'); + $this->userManager + ->method('get') + ->will($this->returnValueMap([ + ['sharedBy', $sharedBy], + ['shareOwner', $shareOwner], + ])); + + $share = $this->provider->getShareById(1); + + $this->assertEquals(1, $share->getId()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_REMOTE, $share->getShareType()); + $this->assertEquals('sharedWith', $share->getSharedWith()); + $this->assertEquals($sharedBy, $share->getSharedBy()); + $this->assertEquals($shareOwner, $share->getShareOwner()); + $this->assertEquals($path, $share->getPath()); + $this->assertEquals(13, $share->getPermissions()); + $this->assertEquals(null, $share->getToken()); + $this->assertEquals(null, $share->getExpirationDate()); + } + + public function testDeleteSingleShare() { + $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(); + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $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], + ])); + + $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(); + + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $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], + ])); + + $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->assertCount(1, $result); + } + + public function testDeleteNestedShares() { + $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('sharedWith2'), + 'uid_owner' => $qb->expr()->literal('sharedBy2'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + 'parent' => $qb->expr()->literal(1), + ]); + $qb->execute(); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->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'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + 'parent' => $qb->expr()->literal(2), + ]); + $qb->execute(); + + + $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'); + $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); + } + + /** + * @expectedException \OC\Share20\Exception\BackendError + */ + public function testDeleteFails() { + $share = $this->getMock('OC\Share20\IShare'); + $expr = $this->getMock('OCP\DB\QueryBuilder\IExpressionBuilder'); + $qb = $this->getMock('OCP\DB\QueryBuilder\IQueryBuilder'); + $qb->expects($this->once()) + ->method('delete') + ->will($this->returnSelf()); + $qb->expects($this->once()) + ->method('expr') + ->willReturn($expr); + $qb->expects($this->once()) + ->method('where') + ->will($this->returnSelf()); + $qb->expects($this->once()) + ->method('setParameter') + ->will($this->returnSelf()); + $qb->expects($this->once()) + ->method('execute') + ->will($this->throwException(new \Exception)); + + $db = $this->getMock('OCP\IDBConnection'); + $db->expects($this->once()) + ->method('getQueryBuilder') + ->with() + ->willReturn($qb); + + $provider = $this->getMockBuilder('OC\Share20\DefaultShareProvider') + ->setConstructorArgs([ + $db, + $this->userManager, + $this->groupManager, + $this->userFolder, + ] + ) + ->setMethods(['deleteChildren']) + ->getMock(); + $provider + ->expects($this->once()) + ->method('deleteChildren') + ->with($share); + + + $provider->delete($share); + } + +} diff --git a/tests/lib/share20/managertest.php b/tests/lib/share20/managertest.php new file mode 100644 index 00000000000..fc6c30692f5 --- /dev/null +++ b/tests/lib/share20/managertest.php @@ -0,0 +1,198 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace Test\Share20; + +use OC\Share20\Manager; +use OC\Share20\Exception; + + +use OCP\IUser; +use OCP\IUserManager; +use OCP\IGroupManager; +use OCP\ILogger; +use OCP\IAppConfig; +use OCP\Files\Folder; +use OCP\Share20\IShareProvider; + +class ManagerTest extends \Test\TestCase { + + /** @var Manager */ + protected $manager; + + /** @var IUser */ + protected $user; + + /** @var IUserManager */ + protected $userManager; + + /** @var IGroupManager */ + protected $groupManager; + + /** @var ILogger */ + protected $logger; + + /** @var IAppConfig */ + protected $appConfig; + + /** @var Folder */ + protected $userFolder; + + /** @var IShareProvider */ + protected $defaultProvider; + + public function setUp() { + + $this->user = $this->getMock('\OCP\IUser'); + $this->userManager = $this->getMock('\OCP\IUserManager'); + $this->groupManager = $this->getMock('\OCP\IGroupManager'); + $this->logger = $this->getMock('\OCP\ILogger'); + $this->appConfig = $this->getMock('\OCP\IAppConfig'); + $this->userFolder = $this->getMock('\OCP\Files\Folder'); + $this->defaultProvider = $this->getMock('\OC\Share20\IShareProvider'); + + $this->manager = new Manager( + $this->user, + $this->userManager, + $this->groupManager, + $this->logger, + $this->appConfig, + $this->userFolder, + $this->defaultProvider + ); + } + + /** + * @expectedException OC\Share20\Exception\ShareNotFound + */ + public function testDeleteNoShareId() { + $share = $this->getMock('\OC\Share20\IShare'); + + $share + ->expects($this->once()) + ->method('getId') + ->with() + ->willReturn(null); + + $this->manager->deleteShare($share); + } + + public function testDelete() { + $share = $this->getMock('\OC\Share20\IShare'); + + $share + ->expects($this->once()) + ->method('getId') + ->with() + ->willReturn(42); + $this->defaultProvider + ->expects($this->once()) + ->method('delete') + ->with($share); + + $this->manager->deleteShare($share); + } + + /** + * @expectedException OC\Share20\Exception\ShareNotFound + */ + public function testGetShareByIdNotFoundInBackend() { + $this->defaultProvider + ->expects($this->once()) + ->method('getShareById') + ->with(42) + ->will($this->throwException(new \OC\Share20\Exception\ShareNotFound())); + + $this->manager->getShareById(42); + } + + /** + * @expectedException OC\Share20\Exception\ShareNotFound + */ + public function testGetShareByIdNotAuthorized() { + $otherUser1 = $this->getMock('\OCP\IUser'); + $otherUser2 = $this->getMock('\OCP\IUser'); + $otherUser3 = $this->getMock('\OCP\IUser'); + + $share = $this->getMock('\OC\Share20\IShare'); + $share + ->expects($this->once()) + ->method('getSharedWith') + ->with() + ->willReturn($otherUser1); + $share + ->expects($this->once()) + ->method('getSharedBy') + ->with() + ->willReturn($otherUser2); + $share + ->expects($this->once()) + ->method('getShareOwner') + ->with() + ->willReturn($otherUser3); + + $this->defaultProvider + ->expects($this->once()) + ->method('getShareById') + ->with(42) + ->willReturn($share); + + $this->manager->getShareById(42); + } + + public function dataGetShareById() { + return [ + ['getSharedWith'], + ['getSharedBy'], + ['getShareOwner'], + ]; + } + + /** + * @dataProvider dataGetShareById + */ + public function testGetShareById($currentUserIs) { + $otherUser1 = $this->getMock('\OCP\IUser'); + $otherUser2 = $this->getMock('\OCP\IUser'); + $otherUser3 = $this->getMock('\OCP\IUser'); + + $share = $this->getMock('\OC\Share20\IShare'); + $share + ->method('getSharedWith') + ->with() + ->willReturn($currentUserIs === 'getSharedWith' ? $this->user : $otherUser1); + $share + ->method('getSharedBy') + ->with() + ->willReturn($currentUserIs === 'getSharedBy' ? $this->user : $otherUser2); + $share + ->method('getShareOwner') + ->with() + ->willReturn($currentUserIs === 'getShareOwner' ? $this->user : $otherUser3); + + $this->defaultProvider + ->expects($this->once()) + ->method('getShareById') + ->with(42) + ->willReturn($share); + + $this->assertEquals($share, $this->manager->getShareById(42)); + } +} |