diff options
Diffstat (limited to 'lib/private/Group/MetaData.php')
-rw-r--r-- | lib/private/Group/MetaData.php | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/lib/private/Group/MetaData.php b/lib/private/Group/MetaData.php new file mode 100644 index 00000000000..8e0866479c1 --- /dev/null +++ b/lib/private/Group/MetaData.php @@ -0,0 +1,200 @@ +<?php +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> + * @author Stephan Peijnik <speijnik@anexia-it.com> + * @author Thomas Müller <thomas.mueller@tmit.eu> + * + * @copyright Copyright (c) 2016, 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\Group; + +use OCP\IUserSession; + +class MetaData { + const SORT_NONE = 0; + const SORT_USERCOUNT = 1; // May have performance issues on LDAP backends + const SORT_GROUPNAME = 2; + + /** @var string */ + protected $user; + /** @var bool */ + protected $isAdmin; + /** @var array */ + protected $metaData = array(); + /** @var \OCP\IGroupManager */ + protected $groupManager; + /** @var bool */ + protected $sorting = false; + /** @var IUserSession */ + protected $userSession; + + /** + * @param string $user the uid of the current user + * @param bool $isAdmin whether the current users is an admin + * @param \OCP\IGroupManager $groupManager + * @param IUserSession $userSession + */ + public function __construct( + $user, + $isAdmin, + \OCP\IGroupManager $groupManager, + IUserSession $userSession + ) { + $this->user = $user; + $this->isAdmin = (bool)$isAdmin; + $this->groupManager = $groupManager; + $this->userSession = $userSession; + } + + /** + * returns an array with meta data about all available groups + * the array is structured as follows: + * [0] array containing meta data about admin groups + * [1] array containing meta data about unprivileged groups + * @param string $groupSearch only effective when instance was created with + * isAdmin being true + * @param string $userSearch the pattern users are search for + * @return array + */ + public function get($groupSearch = '', $userSearch = '') { + $key = $groupSearch . '::' . $userSearch; + if(isset($this->metaData[$key])) { + return $this->metaData[$key]; + } + + $adminGroups = array(); + $groups = array(); + $sortGroupsIndex = 0; + $sortGroupsKeys = array(); + $sortAdminGroupsIndex = 0; + $sortAdminGroupsKeys = array(); + + foreach($this->getGroups($groupSearch) as $group) { + $groupMetaData = $this->generateGroupMetaData($group, $userSearch); + if (strtolower($group->getGID()) !== 'admin') { + $this->addEntry( + $groups, + $sortGroupsKeys, + $sortGroupsIndex, + $groupMetaData); + } else { + //admin group is hard coded to 'admin' for now. In future, + //backends may define admin groups too. Then the if statement + //has to be adjusted accordingly. + $this->addEntry( + $adminGroups, + $sortAdminGroupsKeys, + $sortAdminGroupsIndex, + $groupMetaData); + } + } + + //whether sorting is necessary is will be checked in sort() + $this->sort($groups, $sortGroupsKeys); + $this->sort($adminGroups, $sortAdminGroupsKeys); + + $this->metaData[$key] = array($adminGroups, $groups); + return $this->metaData[$key]; + } + + /** + * sets the sort mode, see SORT_* constants for supported modes + * + * @param int $sortMode + */ + public function setSorting($sortMode) { + switch ($sortMode) { + case self::SORT_USERCOUNT: + case self::SORT_GROUPNAME: + $this->sorting = $sortMode; + break; + + default: + $this->sorting = self::SORT_NONE; + } + } + + /** + * adds an group entry to the resulting array + * @param array $entries the resulting array, by reference + * @param array $sortKeys the sort key array, by reference + * @param int $sortIndex the sort key index, by reference + * @param array $data the group's meta data as returned by generateGroupMetaData() + */ + private function addEntry(&$entries, &$sortKeys, &$sortIndex, $data) { + $entries[] = $data; + if ($this->sorting === self::SORT_USERCOUNT) { + $sortKeys[$sortIndex] = $data['usercount']; + $sortIndex++; + } else if ($this->sorting === self::SORT_GROUPNAME) { + $sortKeys[$sortIndex] = $data['name']; + $sortIndex++; + } + } + + /** + * creates an array containing the group meta data + * @param \OCP\IGroup $group + * @param string $userSearch + * @return array with the keys 'id', 'name' and 'usercount' + */ + private function generateGroupMetaData(\OCP\IGroup $group, $userSearch) { + return array( + 'id' => $group->getGID(), + 'name' => $group->getGID(), + 'usercount' => $this->sorting === self::SORT_USERCOUNT ? $group->count($userSearch) : 0, + ); + } + + /** + * sorts the result array, if applicable + * @param array $entries the result array, by reference + * @param array $sortKeys the array containing the sort keys + * @param return null + */ + private function sort(&$entries, $sortKeys) { + if ($this->sorting === self::SORT_USERCOUNT) { + array_multisort($sortKeys, SORT_DESC, $entries); + } else if ($this->sorting === self::SORT_GROUPNAME) { + array_multisort($sortKeys, SORT_ASC, $entries); + } + } + + /** + * returns the available groups + * @param string $search a search string + * @return \OCP\IGroup[] + */ + protected function getGroups($search = '') { + if($this->isAdmin) { + return $this->groupManager->search($search); + } else { + $userObject = $this->userSession->getUser(); + if($userObject !== null) { + $groups = $this->groupManager->getSubAdmin()->getSubAdminsGroups($userObject); + } else { + $groups = []; + } + + return $groups; + } + } +} |