diff options
author | Roeland Jago Douma <roeland@famdouma.nl> | 2015-08-08 22:15:12 +0200 |
---|---|---|
committer | Joas Schilling <nickvergessen@owncloud.com> | 2015-08-26 11:54:23 +0200 |
commit | 98301210a9172e6b0a44bcaf43b4ecf4b31f938e (patch) | |
tree | 0a6a08778194a38c7dc7783c49c34825f1ddf599 | |
parent | 27af0e82ddba29512a4a5fe08cbd060cc6251264 (diff) | |
download | nextcloud-server-98301210a9172e6b0a44bcaf43b4ecf4b31f938e.tar.gz nextcloud-server-98301210a9172e6b0a44bcaf43b4ecf4b31f938e.zip |
Start of OCS Share API sharees endpoint
-rw-r--r-- | apps/files_sharing/api/sharees.php | 234 | ||||
-rw-r--r-- | apps/files_sharing/appinfo/routes.php | 11 |
2 files changed, 245 insertions, 0 deletions
diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php new file mode 100644 index 00000000000..83acdd086c3 --- /dev/null +++ b/apps/files_sharing/api/sharees.php @@ -0,0 +1,234 @@ +<?php +/** + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @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; + +use OCP\IGroupManager; +use OCP\IUserManager; +use OCP\IAppConfig; +use OCP\IUserSession; +use OCP\IURLGenerator; + +class Sharees { + + /** @var IGroupManager */ + private $groupManager; + + /** @var IUserManager */ + private $userManager; + + /** @var \OCP\Contacts\IManager */ + private $contactsManager; + + /** @var IAppConfig */ + private $appConfig; + + /** @var IUserSession */ + private $userSession; + + /** @var IURLGenerator */ + private $urlGenerator; + + /** + * @param IGroupManager $groupManager + * @param IUserManager $userManager + * @param \OCP\Contacts\IManager $contactsManager + * @param IAppConfig $appConfig + * @param IUserSession $userSession + */ + public function __construct(IGroupManager $groupManager, + IUserManager $userManager, + \OCP\Contacts\IManager $contactsManager, + IAppConfig $appConfig, + IUserSession $userSession, + IURLGenerator $urlGenerator) { + $this->groupManager = $groupManager; + $this->userManager = $userManager; + $this->contactsManager = $contactsManager; + $this->appConfig = $appConfig; + $this->userSession = $userSession; + $this->urlGenerator = $urlGenerator; + } + + /** + * @param string $search + * @param bool $shareWithGroupOnly + * + * @return array possible sharees + */ + private function getUsers($search, $shareWithGroupOnly) { + $sharees = []; + + $users = []; + if ($shareWithGroupOnly) { + // Search in all the groups this user is part of + $userGroups = $this->groupManager->getUserGroupsIds($this->userSession->getUser()); + foreach ($userGroups as $userGroup) { + $users = array_merge($users, $this->groupManager->displayNamesInGroup($userGroup, $search)); + } + $users = array_unique($users); + } else { + // Search in all users + $users_tmp = $this->userManager->searchDisplayName($search); + + // Put in array that maps uid => displayName + foreach($users_tmp as $user) { + $users[$user->getUID()] = $user->getDisplayName(); + } + } + + + foreach ($users as $uid => $displayName) { + $sharees[] = [ + 'label' => $displayName, + 'value' => [ + 'shareType' => \OCP\Share::SHARE_TYPE_USER, + 'shareWith' => $uid + ] + ]; + } + + return $sharees; + } + + /** + * @param string $search + * @param bool $shareWithGroupOnly + * + * @return array possible sharees + */ + private function getGroups($search, $shareWithGroupOnly) { + $sharees = []; + $groups = $this->groupManager->search($search); + + if ($shareWithGroupOnly) { + // Intersect all the groups that match with the groups this user is a member of + $userGroups = $this->groupManager->getUserGroups($this->userSession->getUser()); + $groups = array_intersect($groups, $userGroups); + } + + foreach ($groups as $group) { + $sharees[] = [ + 'label' => $group->getGID(), + 'value' => [ + 'shareType' => \OCP\Share::SHARE_TYPE_GROUP, + 'shareWith' => $group->getGID() + ] + ]; + } + + return $sharees; + } + + /** + * @param string $search + * + * @return array possible sharees + */ + private function getRemote($search) { + $sharees = []; + + if (substr_count($search, '@') >= 1) { + $sharees[] = [ + 'label' => $search, + 'value' => [ + 'shareType' => \OCP\Share::SHARE_TYPE_REMOTE, + 'shareWith' => $search + ] + ]; + } + + // Search in contacts + $addressBookContacts = $this->contactsManager->search($search, ['CLOUD', 'FN']); + foreach ($addressBookContacts as $contact) { + if (isset($contact['CLOUD'])) { + foreach ($contact['CLOUD'] as $cloudId) { + $sharees[] = [ + 'label' => $contact['FN'] . ' (' . $cloudId . ')', + 'value' => [ + 'shareType' => \OCP\Share::SHARE_TYPE_REMOTE, + 'shareWith' => $cloudId + ] + ]; + } + } + } + + return $sharees; + } + + public function search($params) { + $search = isset($_GET['search']) ? (string)$_GET['search'] : ''; + $item_type = isset($_GET['item_type']) ? (string)$_GET['item_type'] : null; + $share_type = isset($_GET['share_type']) ? intval($_GET['share_type']) : null; + $page = isset($_GET['page']) ? intval($_GET['page']) : 1; + $per_page = isset($_GET['per_page']) ? intval($_GET['per_page']) : 200; + + // Verify arguments + if ($item_type === null) { + return new \OC_OCS_Result(null, 400, 'missing item_type'); + } + + $shareWithGroupOnly = $this->appConfig->getValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes' ? true : false; + + $sharees = []; + // Get users + if ($share_type === null || $share_type === \OCP\Share::SHARE_TYPE_USER) { + $sharees = array_merge($sharees, $this->getUsers($search, $shareWithGroupOnly)); + } + + // Get groups + if ($share_type === null || $share_type === \OCP\Share::SHARE_TYPE_GROUP) { + $sharees = array_merge($sharees, $this->getGroups($search, $shareWithGroupOnly)); + } + + // Get remote + if (($share_type === null || $share_type === \OCP\Share::SHARE_TYPE_REMOTE) && + \OCP\Share::getBackend($item_type)->isShareTypeAllowed(\OCP\Share::SHARE_TYPE_REMOTE)) { + $sharees = array_merge($sharees, $this->getRemote($search)); + } + + //Pagination + $start = ($page - 1) * $per_page; + $end = $page * $per_page; + $tot = count($sharees); + + $sharees = array_slice($sharees, $start, $per_page); + $response = new \OC_OCS_Result($sharees); + + // FIXME: Do this? + $response->setTotalItems($tot); + $response->setItemsPerPage($per_page); + + // TODO add other link rels + + if ($tot > $end) { + $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees?') . + 'search=' . $search . + '&item_type=' . $item_type . + '&share_type=' . $share_type . + '&page=' . ($page + 1) . + '&per_page=' . $per_page; + $response->addHeader('Link', '<' . $url . '> rel="next"'); + } + + return $response; + } +} diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php index 184ad29bba4..498b0eb55e9 100644 --- a/apps/files_sharing/appinfo/routes.php +++ b/apps/files_sharing/appinfo/routes.php @@ -102,3 +102,14 @@ API::register('delete', array('\OCA\Files_Sharing\API\Remote', 'declineShare'), 'files_sharing'); +$sharees = new \OCA\Files_Sharing\API\Sharees(\OC::$server->getGroupManager(), + \OC::$server->getUserManager(), + \OC::$server->getContactsManager(), + \OC::$server->getAppConfig(), + \OC::$server->getUserSession(), + \OC::$server->getURLGenerator()); + +API::register('get', + '/apps/files_sharing/api/v1/sharees', + [$sharees, 'search'], + 'files_sharing', API::USER_AUTH); |