PluginProbe
User Access Manager / 2.1.7
User Access Manager v2.1.7
2.3.20 2.3.19 2.3.18 2.3.17 2.3.16 2.3.15 2.3.14 2.3.13 trunk 0.6 0.6.1 0.6.2 0.7 0.7 Beta 0.7.0.1 0.8 0.8.0.1 0.8.0.2 0.9 0.9.1 0.9.1.1 0.9.1.2 0.9.1.3 0.9.1.4 1.0 All 136 releases
user-access-manager / src / Access / AccessHandler.php

AccessHandler.php in User Access Manager 2.1.7, at src/Access/AccessHandler.php

297 lines 8.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * AccessHandler.php
4 *
5 * The AccessHandler class file.
6 *
7 * PHP versions 5
8 *
9 * @author Alexander Schneider <alexanderschneider85@gmail.com>
10 * @copyright 2008-2017 Alexander Schneider
11 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2
12 * @version SVN: $id$
13 * @link http://wordpress.org/extend/plugins/user-access-manager/
14 */
15 namespace UserAccessManager\Access;
16
17 use UserAccessManager\Config\MainConfig;
18 use UserAccessManager\Database\Database;
19 use UserAccessManager\Object\ObjectHandler;
20 use UserAccessManager\UserGroup\AbstractUserGroup;
21 use UserAccessManager\User\UserHandler;
22 use UserAccessManager\UserGroup\UserGroupHandler;
23 use UserAccessManager\Wrapper\Wordpress;
24
25 /**
26 * Class AccessHandler
27 *
28 * @package UserAccessManager\AccessHandler
29 */
30 class AccessHandler
31 {
32 /**
33 * @var Wordpress
34 */
35 private $wordpress;
36
37 /**
38 * @var MainConfig
39 */
40 private $mainConfig;
41
42 /**
43 * @var Database
44 */
45 private $database;
46
47 /**
48 * @var ObjectHandler
49 */
50 private $objectHandler;
51
52 /**
53 * @var UserHandler
54 */
55 private $userHandler;
56
57 /**
58 * @var UserGroupHandler
59 */
60 private $userGroupHandler;
61
62 /**
63 * @var null|array
64 */
65 private $excludedTerms = null;
66
67 /**
68 * @var null|array
69 */
70 private $excludedPosts = null;
71
72 /**
73 * @var array
74 */
75 private $objectAccess = [];
76
77 /**
78 * @var null|array
79 */
80 private $noneHiddenPostTypes = null;
81
82 /**
83 * AccessHandler constructor.
84 *
85 * @param Wordpress $wordpress
86 * @param MainConfig $mainConfig
87 * @param Database $database
88 * @param ObjectHandler $objectHandler
89 * @param UserHandler $userHandler
90 * @param UserGroupHandler $userGroupHandler
91 */
92 public function __construct(
93 Wordpress $wordpress,
94 MainConfig $mainConfig,
95 Database $database,
96 ObjectHandler $objectHandler,
97 UserHandler $userHandler,
98 UserGroupHandler $userGroupHandler
99 ) {
100 $this->wordpress = $wordpress;
101 $this->mainConfig = $mainConfig;
102 $this->database = $database;
103 $this->objectHandler = $objectHandler;
104 $this->userHandler = $userHandler;
105 $this->userGroupHandler = $userGroupHandler;
106 }
107
108 /**
109 * Checks it the user has access because he is the author.
110 *
111 * @param string $objectType
112 * @param string $objectId
113 *
114 * @return bool
115 */
116 private function hasAuthorAccess($objectType, $objectId)
117 {
118 if ($this->mainConfig->authorsHasAccessToOwn() === true
119 && $this->objectHandler->isPostType($objectType)
120 ) {
121 $currentUser = $this->wordpress->getCurrentUser();
122 $post = $this->objectHandler->getPost($objectId);
123 return ($post !== false && $currentUser->ID === (int)$post->post_author);
124 }
125
126 return false;
127 }
128
129 /**
130 * Returns the user user groups filtered by the write access.
131 *
132 * @return AbstractUserGroup[]
133 */
134 private function getUserUserGroupsForObjectAccess()
135 {
136 $userUserGroups = $this->userGroupHandler->getUserGroupsForUser();
137
138 if ($this->wordpress->isAdmin() === true) {
139 $userUserGroups = array_filter(
140 $userUserGroups,
141 function (AbstractUserGroup $userGroup) {
142 return $userGroup->getWriteAccess() !== 'none';
143 }
144 );
145 }
146
147 return $userUserGroups;
148 }
149
150 /**
151 * Checks if the current_user has access to the given post.
152 *
153 * @param string $objectType The object type which should be checked.
154 * @param integer $objectId The id of the object.
155 *
156 * @return bool
157 */
158 public function checkObjectAccess($objectType, $objectId)
159 {
160 $admin = $this->wordpress->isAdmin() === true ? 'admin' : 'noAdmin';
161
162 if (isset($this->objectAccess[$admin][$objectType][$objectId]) === false) {
163 if ($this->objectHandler->isValidObjectType($objectType) === false
164 || $this->userHandler->checkUserAccess(UserHandler::MANAGE_USER_GROUPS_CAPABILITY) === true
165 || $this->hasAuthorAccess($objectType, $objectId) === true
166 ) {
167 $access = true;
168 } else {
169 $membership = $this->userGroupHandler->getUserGroupsForObject($objectType, $objectId);
170 $access = $membership === []
171 || array_intersect_key($membership, $this->getUserUserGroupsForObjectAccess()) !== [];
172 }
173
174 $this->objectAccess[$admin][$objectType][$objectId] = $access;
175 }
176
177 return $this->objectAccess[$admin][$objectType][$objectId];
178 }
179
180 /**
181 * Returns the excluded objects.
182 *
183 * @param string $type
184 * @param array $filterTypesMap
185 *
186 * @return array
187 */
188 private function getExcludedObjects($type, array $filterTypesMap = [])
189 {
190 $excludedObjects = [];
191 $userGroups = $this->userGroupHandler->getUserGroups();
192
193 foreach ($userGroups as $userGroup) {
194 $excludedObjects += $userGroup->getAssignedObjectsByType($type);
195 }
196
197 $userUserGroups = $this->userGroupHandler->getUserGroupsForUser();
198
199 foreach ($userUserGroups as $userGroup) {
200 $excludedObjects = array_diff_key($excludedObjects, $userGroup->getAssignedObjectsByType($type));
201 }
202
203 if ($filterTypesMap !== []) {
204 $excludedObjects = array_filter(
205 $excludedObjects,
206 function ($element) use ($filterTypesMap) {
207 return isset($filterTypesMap[$element]) === false;
208 }
209 );
210 }
211
212 $objectIds = array_keys($excludedObjects);
213 return array_combine($objectIds, $objectIds);
214 }
215
216 /**
217 * Returns the excluded terms for a user.
218 *
219 * @return array
220 */
221 public function getExcludedTerms()
222 {
223 if ($this->userHandler->checkUserAccess(UserHandler::MANAGE_USER_GROUPS_CAPABILITY)) {
224 $this->excludedTerms = [];
225 }
226
227 if ($this->excludedTerms === null) {
228 $this->excludedTerms = $this->getExcludedObjects(ObjectHandler::GENERAL_TERM_OBJECT_TYPE);
229 }
230
231 return $this->excludedTerms;
232 }
233
234 /**
235 * Returns the none hidden post types map.
236 *
237 * @return array
238 */
239 private function getNoneHiddenPostTypes()
240 {
241 if ($this->noneHiddenPostTypes === null) {
242 $this->noneHiddenPostTypes = [];
243
244 if ($this->wordpress->isAdmin() === false) {
245 $postTypes = $this->objectHandler->getPostTypes();
246
247 foreach ($postTypes as $postType) {
248 if ($this->mainConfig->hidePostType($postType) === false) {
249 $this->noneHiddenPostTypes[$postType] = $postType;
250 }
251 }
252 }
253 }
254
255 return $this->noneHiddenPostTypes;
256 }
257
258 /**
259 * Returns the excluded posts.
260 *
261 * @return array
262 */
263 public function getExcludedPosts()
264 {
265 if ($this->userHandler->checkUserAccess(UserHandler::MANAGE_USER_GROUPS_CAPABILITY)) {
266 $this->excludedPosts = [];
267 }
268
269 if ($this->excludedPosts === null) {
270 $noneHiddenPostTypes = $this->getNoneHiddenPostTypes();
271 $excludedPosts = $this->getExcludedObjects(ObjectHandler::GENERAL_POST_OBJECT_TYPE, $noneHiddenPostTypes);
272
273 if ($this->mainConfig->authorsHasAccessToOwn() === true) {
274 $query = $this->database->prepare(
275 "SELECT ID
276 FROM {$this->database->getPostsTable()}
277 WHERE post_author = %d",
278 $this->wordpress->getCurrentUser()->ID
279 );
280
281 $ownPosts = (array)$this->database->getResults($query);
282 $ownPostIds = [];
283
284 foreach ($ownPosts as $ownPost) {
285 $ownPostIds[$ownPost->ID] = $ownPost->ID;
286 }
287
288 $excludedPosts = array_diff_key($excludedPosts, $ownPostIds);
289 }
290
291 $this->excludedPosts = $excludedPosts;
292 }
293
294 return $this->excludedPosts;
295 }
296 }
297