Merge pull request #19872 from owncloud/share2.0_sharemanager
Share2.0 sharemanager
This commit is contained in:
commit
3ae5a987a7
|
@ -0,0 +1,69 @@
|
|||
<?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 OCSShareWrapper {
|
||||
|
||||
/**
|
||||
* @return Share20OCS
|
||||
*/
|
||||
private function getShare20OCS() {
|
||||
return new Share20OCS(new \OC\Share20\Manager(
|
||||
\OC::$server->getUserSession()->getUser(),
|
||||
\OC::$server->getUserManager(),
|
||||
\OC::$server->getGroupManager(),
|
||||
\OC::$server->getLogger(),
|
||||
\OC::$server->getAppConfig(),
|
||||
\OC::$server->getUserFolder(),
|
||||
new \OC\Share20\DefaultShareProvider(
|
||||
\OC::$server->getDatabaseConnection(),
|
||||
\OC::$server->getUserManager(),
|
||||
\OC::$server->getGroupManager(),
|
||||
\OC::$server->getUserFolder()
|
||||
)
|
||||
),
|
||||
\OC::$server->getGroupManager(),
|
||||
\OC::$server->getUserManager(),
|
||||
\OC::$server->getRequest(),
|
||||
\OC::$server->getUserFolder());
|
||||
}
|
||||
|
||||
public function getAllShares($params) {
|
||||
return \OCA\Files_Sharing\API\Local::getAllShares($params);
|
||||
}
|
||||
|
||||
public function createShare($params) {
|
||||
return \OCA\Files_Sharing\API\Local::createShare($params);
|
||||
}
|
||||
|
||||
public function getShare($params) {
|
||||
return \OCA\Files_Sharing\API\Local::getShare($params);
|
||||
}
|
||||
|
||||
public function updateShare($params) {
|
||||
return \OCA\Files_Sharing\API\Local::updateShare($params);
|
||||
}
|
||||
|
||||
public function deleteShare($params) {
|
||||
$id = (int)$params['id'];
|
||||
return $this->getShare20OCS()->deleteShare($id);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
<?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.');
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME
|
||||
* User the old code path for remote shares until we have our remoteshareprovider
|
||||
*/
|
||||
if ($share->getShareType() === \OCP\Share::SHARE_TYPE_REMOTE) {
|
||||
\OCA\Files_Sharing\API\Local::deleteShare(['id' => $id]);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
|
@ -61,29 +61,31 @@ $this->create('sharing_external_add', '/external')
|
|||
|
||||
//TODO: SET: mail notification, waiting for PR #4689 to be accepted
|
||||
|
||||
$OCSShare = new \OCA\Files_Sharing\API\OCSShareWrapper();
|
||||
|
||||
API::register('get',
|
||||
'/apps/files_sharing/api/v1/shares',
|
||||
array('\OCA\Files_Sharing\API\Local', 'getAllShares'),
|
||||
[$OCSShare, 'getAllShares'],
|
||||
'files_sharing');
|
||||
|
||||
API::register('post',
|
||||
'/apps/files_sharing/api/v1/shares',
|
||||
array('\OCA\Files_Sharing\API\Local', 'createShare'),
|
||||
[$OCSShare, 'createShare'],
|
||||
'files_sharing');
|
||||
|
||||
API::register('get',
|
||||
'/apps/files_sharing/api/v1/shares/{id}',
|
||||
array('\OCA\Files_Sharing\API\Local', 'getShare'),
|
||||
[$OCSShare, 'getShare'],
|
||||
'files_sharing');
|
||||
|
||||
API::register('put',
|
||||
'/apps/files_sharing/api/v1/shares/{id}',
|
||||
array('\OCA\Files_Sharing\API\Local', 'updateShare'),
|
||||
[$OCSShare, 'updateShare'],
|
||||
'files_sharing');
|
||||
|
||||
API::register('delete',
|
||||
'/apps/files_sharing/api/v1/shares/{id}',
|
||||
array('\OCA\Files_Sharing\API\Local', 'deleteShare'),
|
||||
[$OCSShare, 'deleteShare'],
|
||||
'files_sharing');
|
||||
|
||||
API::register('get',
|
||||
|
@ -130,3 +132,4 @@ API::register('get',
|
|||
'/apps/files_sharing/api/v1/sharees',
|
||||
[$sharees, 'search'],
|
||||
'files_sharing', API::USER_AUTH);
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,275 @@
|
|||
<?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);
|
||||
|
||||
// Fetch share to make sure it exists
|
||||
$share = $this->getShareById($share->getId());
|
||||
|
||||
$shareType = $share->getShareType();
|
||||
$sharedWith = '';
|
||||
if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
|
||||
$sharedWith = $share->getSharedWith()->getUID();
|
||||
} else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
|
||||
$sharedWith = $share->getSharedWith()->getGID();
|
||||
}
|
||||
|
||||
$hookParams = [
|
||||
'id' => $share->getId(),
|
||||
'itemType' => $share->getPath() instanceof \OCP\Files\File ? 'file' : 'folder',
|
||||
'itemSource' => $share->getPath()->getId(),
|
||||
'shareType' => $shareType,
|
||||
'shareWith' => $sharedWith,
|
||||
'itemparent' => $share->getParent(),
|
||||
'uidOwner' => $share->getSharedBy()->getUID(),
|
||||
'fileSource' => $share->getPath()->getId(),
|
||||
'fileTarget' => $share->getTarget()
|
||||
];
|
||||
|
||||
\OC_Hook::emit('OCP\Share', 'pre_unshare', $hookParams);
|
||||
|
||||
$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();
|
||||
}
|
||||
|
||||
\OC_Hook::emit('OCP\Share', 'post_unshare', $hookParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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'])
|
||||
->setTarget($data['file_target']);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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 {
|
||||
|
||||
}
|
|
@ -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 {
|
||||
|
||||
}
|
|
@ -0,0 +1,156 @@
|
|||
<?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();
|
||||
|
||||
/**
|
||||
* Get the target of this share
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTarget();
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
<?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;
|
||||
|
||||
interface IShareProvider {
|
||||
|
||||
/**
|
||||
* Share a path
|
||||
*
|
||||
* @param Share $share
|
||||
* @return Share The share object
|
||||
*/
|
||||
public function create(Share $share);
|
||||
|
||||
/**
|
||||
* Update a share
|
||||
*
|
||||
* @param Share $share
|
||||
* @return Share The share object
|
||||
*/
|
||||
public function update(Share $share);
|
||||
|
||||
/**
|
||||
* Delete a share
|
||||
*
|
||||
* @param Share $share
|
||||
* @throws BackendError
|
||||
*/
|
||||
public function delete(IShare $share);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* Get share by id
|
||||
*
|
||||
* @param int $id
|
||||
* @return IShare
|
||||
* @throws ShareNotFound
|
||||
*/
|
||||
public function getShareById($id);
|
||||
|
||||
/**
|
||||
* Get shares for a given path
|
||||
*
|
||||
* @param \OCP\Files\Node $path
|
||||
* @param Share[]
|
||||
*/
|
||||
public function getSharesByPath(\OCP\IUser $user, \OCP\Files\Node $path);
|
||||
|
||||
/**
|
||||
* Get shared with the given user
|
||||
*
|
||||
* @param IUser $user
|
||||
* @param int $shareType
|
||||
* @param Share
|
||||
*/
|
||||
public function getSharedWithMe(IUser $user, $shareType = null);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
|
@ -0,0 +1,212 @@
|
|||
<?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\IAppConfig;
|
||||
use OCP\IUserManager;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\IUser;
|
||||
use OCP\ILogger;
|
||||
use OCP\Files\Folder;
|
||||
|
||||
use OC\Share20\Exception\ShareNotFound;
|
||||
|
||||
/**
|
||||
* This class is the communication hub for all sharing related operations.
|
||||
*/
|
||||
class Manager {
|
||||
|
||||
/**
|
||||
* @var IShareProvider[]
|
||||
*/
|
||||
private $defaultProvider;
|
||||
|
||||
/** @var IUser */
|
||||
private $currentUser;
|
||||
|
||||
/** @var IUserManager */
|
||||
private $userManager;
|
||||
|
||||
/** @var IGroupManager */
|
||||
private $groupManager;
|
||||
|
||||
/** @var ILogger */
|
||||
private $logger;
|
||||
|
||||
/** @var IAppConfig */
|
||||
private $appConfig;
|
||||
|
||||
/** @var IFolder */
|
||||
private $userFolder;
|
||||
|
||||
public function __construct(IUser $user,
|
||||
IUserManager $userManager,
|
||||
IGroupManager $groupManager,
|
||||
ILogger $logger,
|
||||
IAppConfig $appConfig,
|
||||
Folder $userFolder,
|
||||
IShareProvider $defaultProvider) {
|
||||
$this->currentUser = $user;
|
||||
$this->userManager = $userManager;
|
||||
$this->groupManager = $groupManager;
|
||||
$this->logger = $logger;
|
||||
$this->appConfig = $appConfig;
|
||||
$this->userFolder = $userFolder;
|
||||
|
||||
// TEMP SOLUTION JUST TO GET STARTED
|
||||
$this->defaultProvider = $defaultProvider;
|
||||
}
|
||||
|
||||
/**
|
||||
* Share a path
|
||||
*
|
||||
* @param Share $share
|
||||
* @return Share The share object
|
||||
*/
|
||||
public function createShare(Share $share) {
|
||||
throw new \Exception();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a share
|
||||
*
|
||||
* @param Share $share
|
||||
* @return Share The share object
|
||||
*/
|
||||
public function updateShare(Share $share) {
|
||||
throw new \Exception();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a share
|
||||
*
|
||||
* @param Share $share
|
||||
* @throws ShareNotFound
|
||||
* @throws \OC\Share20\Exception\BackendError
|
||||
*/
|
||||
public function deleteShare(IShare $share) {
|
||||
if ($share->getId() === null) {
|
||||
throw new ShareNotFound();
|
||||
}
|
||||
|
||||
$this->defaultProvider->delete($share);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all shares by the current user
|
||||
*
|
||||
* @param int $page
|
||||
* @param int $perPage
|
||||
* @return Share[]
|
||||
*/
|
||||
public function getShares($page=0, $perPage=50) {
|
||||
throw new \Exception();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a share by the share id
|
||||
*
|
||||
* @param string $id
|
||||
* @return Share
|
||||
*
|
||||
* @throws ShareNotFound
|
||||
*/
|
||||
public function getShareById($id) {
|
||||
$share = $this->defaultProvider->getShareById($id);
|
||||
|
||||
if ($share->getSharedWith() !== $this->currentUser &&
|
||||
$share->getSharedBy() !== $this->currentUser &&
|
||||
$share->getShareOwner() !== $this->currentUser) {
|
||||
throw new ShareNotFound();
|
||||
}
|
||||
|
||||
return $share;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the shares for a given path
|
||||
*
|
||||
* @param \OCP\Files\Node $path
|
||||
* @param int $page
|
||||
* @param int $perPage
|
||||
*
|
||||
* @return Share[]
|
||||
*/
|
||||
public function getSharesByPath(\OCP\Files\Node $path, $page=0, $perPage=50) {
|
||||
throw new \Exception();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all shares that are shared with the current user
|
||||
*
|
||||
* @param int $shareType
|
||||
* @param int $page
|
||||
* @param int $perPage
|
||||
*
|
||||
* @return Share[]
|
||||
*/
|
||||
public function getSharedWithMe($shareType = null, $page=0, $perPage=50) {
|
||||
throw new \Exception();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the share by token possible with password
|
||||
*
|
||||
* @param string $token
|
||||
* @param string $password
|
||||
*
|
||||
* @return Share
|
||||
*
|
||||
* @throws ShareNotFoundException
|
||||
*/
|
||||
public function getShareByToken($token, $password=null) {
|
||||
throw new \Exception();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get access list to a path. This means
|
||||
* all the users and groups that can access a given path.
|
||||
*
|
||||
* Consider:
|
||||
* -root
|
||||
* |-folder1
|
||||
* |-folder2
|
||||
* |-fileA
|
||||
*
|
||||
* fileA is shared with user1
|
||||
* folder2 is shared with group2
|
||||
* folder1 is shared with user2
|
||||
*
|
||||
* Then the access list will to '/folder1/folder2/fileA' is:
|
||||
* [
|
||||
* 'users' => ['user1', 'user2'],
|
||||
* 'groups' => ['group2']
|
||||
* ]
|
||||
*
|
||||
* This is required for encryption
|
||||
*
|
||||
* @param \OCP\Files\Node $path
|
||||
*/
|
||||
public function getAccessList(\OCP\Files\Node $path) {
|
||||
throw new \Exception();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,318 @@
|
|||
<?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\Node;
|
||||
use OCP\IUser;
|
||||
use OCP\IGroup;
|
||||
|
||||
class Share implements IShare {
|
||||
|
||||
/** @var string */
|
||||
private $id;
|
||||
|
||||
/** @var Node */
|
||||
private $path;
|
||||
|
||||
/** @var int */
|
||||
private $shareType;
|
||||
|
||||
/** @var IUser|IGroup|string */
|
||||
private $sharedWith;
|
||||
|
||||
/** @var IUser|string */
|
||||
private $sharedBy;
|
||||
|
||||
/** @var IUser|string */
|
||||
private $shareOwner;
|
||||
|
||||
/** @var int */
|
||||
private $permissions;
|
||||
|
||||
/** @var \DateTime */
|
||||
private $expireDate;
|
||||
|
||||
/** @var string */
|
||||
private $password;
|
||||
|
||||
/** @var string */
|
||||
private $token;
|
||||
|
||||
/** @var int */
|
||||
private $parent;
|
||||
|
||||
/** @var string */
|
||||
private $target;
|
||||
|
||||
/**
|
||||
* Set the id of the share
|
||||
*
|
||||
* @param int id
|
||||
* @return Share The modified object
|
||||
*/
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the id of the share
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the path of this share
|
||||
*
|
||||
* @param Node $path
|
||||
* @return Share The modified object
|
||||
*/
|
||||
public function setPath(Node $path) {
|
||||
$this->path = $path;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the path of this share for the current user
|
||||
*
|
||||
* @return Node
|
||||
*/
|
||||
public function getPath() {
|
||||
return $this->path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the shareType
|
||||
*
|
||||
* @param int $shareType
|
||||
* @return Share The modified object
|
||||
*/
|
||||
public function setShareType($shareType) {
|
||||
$this->shareType = $shareType;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the shareType
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getShareType() {
|
||||
return $this->shareType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the receiver of this share
|
||||
*
|
||||
* @param IUser|IGroup|string
|
||||
* @return Share The modified object
|
||||
*/
|
||||
public function setSharedWith($sharedWith) {
|
||||
$this->sharedWith = $sharedWith;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the receiver of this share
|
||||
*
|
||||
* @return IUser|IGroup|string
|
||||
*/
|
||||
public function getSharedWith() {
|
||||
return $this->sharedWith;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the permissions
|
||||
*
|
||||
* @param int $permissions
|
||||
* @return Share The modified object
|
||||
*/
|
||||
public function setPermissions($permissions) {
|
||||
//TODO checkes
|
||||
|
||||
$this->permissions = $permissions;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the share permissions
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getPermissions() {
|
||||
return $this->permissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the expiration date
|
||||
*
|
||||
* @param \DateTime $expireDate
|
||||
* @return Share The modified object
|
||||
*/
|
||||
public function setExpirationDate(\DateTime $expireDate) {
|
||||
//TODO checks
|
||||
|
||||
$this->expireDate = $expireDate;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the share expiration date
|
||||
*
|
||||
* @return \DateTime
|
||||
*/
|
||||
public function getExpirationDate() {
|
||||
return $this->expireDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the sharer of the path
|
||||
*
|
||||
* @param IUser|string $sharedBy
|
||||
* @return Share The modified object
|
||||
*/
|
||||
public function setSharedBy($sharedBy) {
|
||||
//TODO checks
|
||||
$this->sharedBy = $sharedBy;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get share sharer
|
||||
*
|
||||
* @return IUser|string
|
||||
*/
|
||||
public function getSharedBy() {
|
||||
//TODO check if set
|
||||
return $this->sharedBy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the original share owner (who owns the path)
|
||||
*
|
||||
* @param IUser|string
|
||||
*
|
||||
* @return Share The modified object
|
||||
*/
|
||||
public function setShareOwner($shareOwner) {
|
||||
//TODO checks
|
||||
|
||||
$this->shareOwner = $shareOwner;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the original share owner (who owns the path)
|
||||
*
|
||||
* @return IUser|string
|
||||
*/
|
||||
public function getShareOwner() {
|
||||
//TODO check if set
|
||||
return $this->shareOwner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the password
|
||||
*
|
||||
* @param string $password
|
||||
*
|
||||
* @return Share The modified object
|
||||
*/
|
||||
public function setPassword($password) {
|
||||
//TODO verify
|
||||
|
||||
$this->password = $password;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the password
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the target of this share
|
||||
*
|
||||
* @param string target
|
||||
* @return Share The modified object
|
||||
*/
|
||||
public function setTarget($target) {
|
||||
$this->target = $target;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the target of this share
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTarget() {
|
||||
return $this->target;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,654 @@
|
|||
<?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([
|
||||
'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
|
||||
'share_with' => $qb->expr()->literal('sharedWith'),
|
||||
'uid_owner' => $qb->expr()->literal('sharedBy'),
|
||||
'item_type' => $qb->expr()->literal('file'),
|
||||
'file_source' => $qb->expr()->literal(42),
|
||||
'file_target' => $qb->expr()->literal('myTarget'),
|
||||
'permissions' => $qb->expr()->literal(13),
|
||||
]);
|
||||
$qb->execute();
|
||||
|
||||
// Get the id
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$cursor = $qb->select('id')
|
||||
->from('share')
|
||||
->setMaxResults(1)
|
||||
->orderBy('id', 'DESC')
|
||||
->execute();
|
||||
$id = $cursor->fetch();
|
||||
$id = $id['id'];
|
||||
$cursor->closeCursor();
|
||||
|
||||
$storage = $this->getMock('OC\Files\Storage\Storage');
|
||||
$storage
|
||||
->expects($this->once())
|
||||
->method('getOwner')
|
||||
->willReturn('shareOwner');
|
||||
$path = $this->getMock('OCP\Files\File');
|
||||
$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($id);
|
||||
|
||||
$this->assertEquals($id, $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());
|
||||
$this->assertEquals('myTarget', $share->getTarget());
|
||||
}
|
||||
|
||||
public function testGetShareByIdGroupShare() {
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
|
||||
$qb->insert('share')
|
||||
->values([
|
||||
'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_GROUP),
|
||||
'share_with' => $qb->expr()->literal('sharedWith'),
|
||||
'uid_owner' => $qb->expr()->literal('sharedBy'),
|
||||
'item_type' => $qb->expr()->literal('file'),
|
||||
'file_source' => $qb->expr()->literal(42),
|
||||
'file_target' => $qb->expr()->literal('myTarget'),
|
||||
'permissions' => $qb->expr()->literal(13),
|
||||
]);
|
||||
$this->assertEquals(1, $qb->execute());
|
||||
|
||||
// Get the id
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$cursor = $qb->select('id')
|
||||
->from('share')
|
||||
->setMaxResults(1)
|
||||
->orderBy('id', 'DESC')
|
||||
->execute();
|
||||
$id = $cursor->fetch();
|
||||
$id = $id['id'];
|
||||
$cursor->closeCursor();
|
||||
|
||||
$storage = $this->getMock('OC\Files\Storage\Storage');
|
||||
$storage
|
||||
->expects($this->once())
|
||||
->method('getOwner')
|
||||
->willReturn('shareOwner');
|
||||
$path = $this->getMock('OCP\Files\Folder');
|
||||
$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($id);
|
||||
|
||||
$this->assertEquals($id, $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());
|
||||
$this->assertEquals('myTarget', $share->getTarget());
|
||||
}
|
||||
|
||||
public function testGetShareByIdLinkShare() {
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
|
||||
$qb->insert('share')
|
||||
->values([
|
||||
'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_LINK),
|
||||
'share_with' => $qb->expr()->literal('sharedWith'),
|
||||
'uid_owner' => $qb->expr()->literal('sharedBy'),
|
||||
'item_type' => $qb->expr()->literal('file'),
|
||||
'file_source' => $qb->expr()->literal(42),
|
||||
'file_target' => $qb->expr()->literal('myTarget'),
|
||||
'permissions' => $qb->expr()->literal(13),
|
||||
'token' => $qb->expr()->literal('token'),
|
||||
'expiration' => $qb->expr()->literal('2000-01-02 00:00:00'),
|
||||
]);
|
||||
$this->assertEquals(1, $qb->execute());
|
||||
|
||||
// Get the id
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$cursor = $qb->select('id')
|
||||
->from('share')
|
||||
->setMaxResults(1)
|
||||
->orderBy('id', 'DESC')
|
||||
->execute();
|
||||
$id = $cursor->fetch();
|
||||
$id = $id['id'];
|
||||
$cursor->closeCursor();
|
||||
|
||||
$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($id);
|
||||
|
||||
$this->assertEquals($id, $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());
|
||||
$this->assertEquals('myTarget', $share->getTarget());
|
||||
}
|
||||
|
||||
public function testGetShareByIdRemoteShare() {
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
|
||||
$qb->insert('share')
|
||||
->values([
|
||||
'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_REMOTE),
|
||||
'share_with' => $qb->expr()->literal('sharedWith'),
|
||||
'uid_owner' => $qb->expr()->literal('sharedBy'),
|
||||
'item_type' => $qb->expr()->literal('file'),
|
||||
'file_source' => $qb->expr()->literal(42),
|
||||
'file_target' => $qb->expr()->literal('myTarget'),
|
||||
'permissions' => $qb->expr()->literal(13),
|
||||
]);
|
||||
$this->assertEquals(1, $qb->execute());
|
||||
|
||||
// Get the id
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$cursor = $qb->select('id')
|
||||
->from('share')
|
||||
->setMaxResults(1)
|
||||
->orderBy('id', 'DESC')
|
||||
->execute();
|
||||
$id = $cursor->fetch();
|
||||
$id = $id['id'];
|
||||
$cursor->closeCursor();
|
||||
|
||||
|
||||
$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($id);
|
||||
|
||||
$this->assertEquals($id, $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());
|
||||
$this->assertEquals('myTarget', $share->getTarget());
|
||||
}
|
||||
|
||||
public function testDeleteSingleShare() {
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$qb->insert('share')
|
||||
->values([
|
||||
'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
|
||||
'share_with' => $qb->expr()->literal('sharedWith'),
|
||||
'uid_owner' => $qb->expr()->literal('sharedBy'),
|
||||
'item_type' => $qb->expr()->literal('file'),
|
||||
'file_source' => $qb->expr()->literal(42),
|
||||
'file_target' => $qb->expr()->literal('myTarget'),
|
||||
'permissions' => $qb->expr()->literal(13),
|
||||
]);
|
||||
$this->assertEquals(1, $qb->execute());
|
||||
|
||||
// Get the id
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$cursor = $qb->select('id')
|
||||
->from('share')
|
||||
->setMaxResults(1)
|
||||
->orderBy('id', 'DESC')
|
||||
->execute();
|
||||
$id = $cursor->fetch();
|
||||
$id = $id['id'];
|
||||
$cursor->closeCursor();
|
||||
|
||||
|
||||
$path = $this->getMock('OCP\Files\File');
|
||||
$path
|
||||
->expects($this->exactly(2))
|
||||
->method('getId')
|
||||
->willReturn(42);
|
||||
|
||||
$sharedWith = $this->getMock('OCP\IUser');
|
||||
$sharedWith
|
||||
->expects($this->once())
|
||||
->method('getUID')
|
||||
->willReturn('sharedWith');
|
||||
$sharedBy = $this->getMock('OCP\IUser');
|
||||
$sharedBy
|
||||
->expects($this->once())
|
||||
->method('getUID')
|
||||
->willReturn('sharedBy');
|
||||
|
||||
$share = $this->getMock('OC\Share20\IShare');
|
||||
$share
|
||||
->method('getId')
|
||||
->willReturn($id);
|
||||
$share
|
||||
->expects($this->once())
|
||||
->method('getShareType')
|
||||
->willReturn(\OCP\Share::SHARE_TYPE_USER);
|
||||
$share
|
||||
->expects($this->exactly(3))
|
||||
->method('getPath')
|
||||
->willReturn($path);
|
||||
$share
|
||||
->expects($this->once())
|
||||
->method('getSharedWith')
|
||||
->willReturn($sharedWith);
|
||||
$share
|
||||
->expects($this->once())
|
||||
->method('getSharedBy')
|
||||
->willReturn($sharedBy);
|
||||
$share
|
||||
->expects($this->once())
|
||||
->method('getTarget')
|
||||
->willReturn('myTarget');
|
||||
|
||||
$provider = $this->getMockBuilder('OC\Share20\DefaultShareProvider')
|
||||
->setConstructorArgs([
|
||||
$this->dbConn,
|
||||
$this->userManager,
|
||||
$this->groupManager,
|
||||
$this->userFolder,
|
||||
]
|
||||
)
|
||||
->setMethods(['deleteChildren', 'getShareById'])
|
||||
->getMock();
|
||||
$provider
|
||||
->expects($this->once())
|
||||
->method('deleteChildren');
|
||||
$provider
|
||||
->expects($this->once())
|
||||
->method('getShareById')
|
||||
->willReturn($share);
|
||||
|
||||
$hookListner = $this->getMockBuilder('Dummy')->setMethods(['listen'])->getMock();
|
||||
\OCP\Util::connectHook('OCP\Share', 'pre_unshare', $hookListner, 'listen');
|
||||
\OCP\Util::connectHook('OCP\Share', 'post_unshare', $hookListner, 'listen');
|
||||
|
||||
$hookListnerExpects = [
|
||||
'id' => $id,
|
||||
'itemType' => 'file',
|
||||
'itemSource' => 42,
|
||||
'shareType' => \OCP\Share::SHARE_TYPE_USER,
|
||||
'shareWith' => 'sharedWith',
|
||||
'itemparent' => null,
|
||||
'uidOwner' => 'sharedBy',
|
||||
'fileSource' => 42,
|
||||
'fileTarget' => 'myTarget',
|
||||
];
|
||||
|
||||
$hookListner
|
||||
->expects($this->exactly(2))
|
||||
->method('listen')
|
||||
->with($hookListnerExpects);
|
||||
|
||||
|
||||
$provider->delete($share);
|
||||
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$qb->select('*')
|
||||
->from('share');
|
||||
|
||||
$cursor = $qb->execute();
|
||||
$result = $cursor->fetchAll();
|
||||
$cursor->closeCursor();
|
||||
|
||||
$this->assertEmpty($result);
|
||||
}
|
||||
|
||||
public function testDeleteNestedShares() {
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$qb->insert('share')
|
||||
->values([
|
||||
'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
|
||||
'share_with' => $qb->expr()->literal('sharedWith'),
|
||||
'uid_owner' => $qb->expr()->literal('sharedBy'),
|
||||
'item_type' => $qb->expr()->literal('file'),
|
||||
'file_source' => $qb->expr()->literal(42),
|
||||
'file_target' => $qb->expr()->literal('myTarget'),
|
||||
'permissions' => $qb->expr()->literal(13),
|
||||
]);
|
||||
$this->assertEquals(1, $qb->execute());
|
||||
|
||||
// Get the id
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$cursor = $qb->select('id')
|
||||
->from('share')
|
||||
->setMaxResults(1)
|
||||
->orderBy('id', 'DESC')
|
||||
->execute();
|
||||
$id1 = $cursor->fetch();
|
||||
$id1 = $id1['id'];
|
||||
$cursor->closeCursor();
|
||||
|
||||
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$qb->insert('share')
|
||||
->values([
|
||||
'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
|
||||
'share_with' => $qb->expr()->literal('sharedWith'),
|
||||
'uid_owner' => $qb->expr()->literal('sharedBy'),
|
||||
'item_type' => $qb->expr()->literal('file'),
|
||||
'file_source' => $qb->expr()->literal(42),
|
||||
'file_target' => $qb->expr()->literal('myTarget'),
|
||||
'permissions' => $qb->expr()->literal(13),
|
||||
'parent' => $qb->expr()->literal($id1),
|
||||
]);
|
||||
$this->assertEquals(1, $qb->execute());
|
||||
|
||||
// Get the id
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$cursor = $qb->select('id')
|
||||
->from('share')
|
||||
->setMaxResults(1)
|
||||
->orderBy('id', 'DESC')
|
||||
->execute();
|
||||
$id2 = $cursor->fetch();
|
||||
$id2 = $id2['id'];
|
||||
$cursor->closeCursor();
|
||||
|
||||
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$qb->insert('share')
|
||||
->values([
|
||||
'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
|
||||
'share_with' => $qb->expr()->literal('sharedWith'),
|
||||
'uid_owner' => $qb->expr()->literal('sharedBy'),
|
||||
'item_type' => $qb->expr()->literal('file'),
|
||||
'file_source' => $qb->expr()->literal(42),
|
||||
'file_target' => $qb->expr()->literal('myTarget'),
|
||||
'permissions' => $qb->expr()->literal(13),
|
||||
'parent' => $qb->expr()->literal($id2),
|
||||
]);
|
||||
$this->assertEquals(1, $qb->execute());
|
||||
|
||||
$storage = $this->getMock('OC\Files\Storage\Storage');
|
||||
$storage
|
||||
->method('getOwner')
|
||||
->willReturn('shareOwner');
|
||||
$path = $this->getMock('OCP\Files\Node');
|
||||
$path
|
||||
->method('getStorage')
|
||||
->wilLReturn($storage);
|
||||
$this->userFolder
|
||||
->method('getById')
|
||||
->with(42)
|
||||
->willReturn([$path]);
|
||||
|
||||
$sharedWith = $this->getMock('OCP\IUser');
|
||||
$sharedWith
|
||||
->method('getUID')
|
||||
->willReturn('sharedWith');
|
||||
$sharedBy = $this->getMock('OCP\IUser');
|
||||
$sharedBy
|
||||
->method('getUID')
|
||||
->willReturn('sharedBy');
|
||||
$shareOwner = $this->getMock('OCP\IUser');
|
||||
$this->userManager
|
||||
->method('get')
|
||||
->will($this->returnValueMap([
|
||||
['sharedWith', $sharedWith],
|
||||
['sharedBy', $sharedBy],
|
||||
['shareOwner', $shareOwner],
|
||||
]));
|
||||
|
||||
$share = $this->provider->getShareById($id1);
|
||||
$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');
|
||||
$share
|
||||
->method('getId')
|
||||
->willReturn(42);
|
||||
$share
|
||||
->expects($this->once())
|
||||
->method('getShareType')
|
||||
->willReturn(\OCP\Share::SHARE_TYPE_LINK);
|
||||
|
||||
$path = $this->getMock('OCP\Files\Folder');
|
||||
$path
|
||||
->expects($this->exactly(2))
|
||||
->method('getId')
|
||||
->willReturn(100);
|
||||
$share
|
||||
->expects($this->exactly(3))
|
||||
->method('getPath')
|
||||
->willReturn($path);
|
||||
|
||||
$sharedBy = $this->getMock('OCP\IUser');
|
||||
$sharedBy
|
||||
->expects($this->once())
|
||||
->method('getUID');
|
||||
$share
|
||||
->expects($this->once())
|
||||
->method('getSharedBy')
|
||||
->willReturn($sharedBy);
|
||||
|
||||
$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', 'getShareById'])
|
||||
->getMock();
|
||||
$provider
|
||||
->expects($this->once())
|
||||
->method('deleteChildren')
|
||||
->with($share);
|
||||
$provider
|
||||
->expects($this->once())
|
||||
->method('getShareById')
|
||||
->with(42)
|
||||
->willReturn($share);
|
||||
|
||||
$provider->delete($share);
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue