Merge branch '3.0'
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / system / category / CategoryPermissionHandler.class.php
1 <?php
2 namespace wcf\system\category;
3 use wcf\data\category\Category;
4 use wcf\data\user\User;
5 use wcf\system\cache\builder\CategoryACLOptionCacheBuilder;
6 use wcf\system\SingletonFactory;
7 use wcf\system\WCF;
8
9 /**
10 * Handles the category permissions.
11 *
12 * @author Matthias Schmidt
13 * @copyright 2001-2018 WoltLab GmbH
14 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
15 * @package WoltLabSuite\Core\System\Category
16 */
17 class CategoryPermissionHandler extends SingletonFactory {
18 /**
19 * cached category acl options
20 * @var array
21 */
22 protected $categoryPermissions = [];
23
24 /**
25 * Returns the acl options for the given category and for the given user.
26 * If no user is given, the active user is used.
27 *
28 * @param Category $category
29 * @param User $user
30 * @return integer[]
31 */
32 public function getPermissions(Category $category, User $user = null) {
33 if ($user === null) {
34 $user = WCF::getUser();
35 }
36
37 $permissions = [];
38 if (isset($this->categoryPermissions[$category->categoryID])) {
39 if (isset($this->categoryPermissions[$category->categoryID]['group'])) {
40 foreach ($user->getGroupIDs() as $groupID) {
41 if (isset($this->categoryPermissions[$category->categoryID]['group'][$groupID])) {
42 foreach ($this->categoryPermissions[$category->categoryID]['group'][$groupID] as $optionName => $optionValue) {
43 if (isset($permissions[$optionName])) {
44 $permissions[$optionName] = $permissions[$optionName] || $optionValue;
45 }
46 else {
47 $permissions[$optionName] = $optionValue;
48 }
49 }
50 }
51 }
52 }
53
54 if (isset($this->categoryPermissions[$category->categoryID]['user']) && isset($this->categoryPermissions[$category->categoryID]['user'][$user->userID])) {
55 foreach ($this->categoryPermissions[$category->categoryID]['user'][$user->userID] as $optionName => $optionValue) {
56 $permissions[$optionName] = $optionValue;
57 }
58 }
59 }
60
61 return $permissions;
62 }
63
64 /**
65 * @inheritDoc
66 */
67 protected function init() {
68 $this->categoryPermissions = CategoryACLOptionCacheBuilder::getInstance()->getData();
69 }
70
71 /**
72 * Resets the category permission cache.
73 */
74 public function resetCache() {
75 CategoryACLOptionCacheBuilder::getInstance()->reset();
76 }
77 }