diff options
Diffstat (limited to 'lib/private/share20')
-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 |
7 files changed, 532 insertions, 103 deletions
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; + } } |