PluginProbe
User Access Manager / 2.1.10
User Access Manager v2.1.10
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.10, at src/Access/AccessHandler.php

313 lines 8.8 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 * Checks if the is admin value is set if not grabs it from the wordpress function.
131 *
132 * @param null|bool $isAdmin
133 *
134 * @return bool
135 */
136 private function isAdmin($isAdmin)
137 {
138 return ($isAdmin === null) ? $this->wordpress->isAdmin() : $isAdmin;
139 }
140
141 /**
142 * Returns the user user groups filtered by the write access.
143 *
144 * @param null|bool $isAdmin If set we force the admin mode.
145 *
146 * @return AbstractUserGroup[]
147 */
148 private function getUserUserGroupsForObjectAccess($isAdmin = null)
149 {
150 $userUserGroups = $this->userGroupHandler->getUserGroupsForUser();
151
152 if ($this->isAdmin($isAdmin) === true) {
153 $userUserGroups = array_filter(
154 $userUserGroups,
155 function (AbstractUserGroup $userGroup) {
156 return $userGroup->getWriteAccess() !== 'none';
157 }
158 );
159 }
160
161 return $this->wordpress->applyFilters('uam_get_user_user_groups_for_object_access', $userUserGroups, $isAdmin);
162 }
163
164 /**
165 * Checks if the current_user has access to the given post.
166 *
167 * @param string $objectType The object type which should be checked.
168 * @param int $objectId The id of the object.
169 * @param null|bool $isAdmin If set we force the admin mode.
170 *
171 * @return bool
172 */
173 public function checkObjectAccess($objectType, $objectId, $isAdmin = null)
174 {
175 $isAdmin = $this->isAdmin($isAdmin);
176 $admin = $isAdmin === true ? 'admin' : 'noAdmin';
177
178 if (isset($this->objectAccess[$admin][$objectType][$objectId]) === false) {
179 if ($this->objectHandler->isValidObjectType($objectType) === false
180 || $this->userHandler->checkUserAccess(UserHandler::MANAGE_USER_GROUPS_CAPABILITY) === true
181 || $this->hasAuthorAccess($objectType, $objectId) === true
182 ) {
183 $access = true;
184 } else {
185 $membership = $this->userGroupHandler->getUserGroupsForObject($objectType, $objectId);
186 $access = $membership === []
187 || array_intersect_key($membership, $this->getUserUserGroupsForObjectAccess($isAdmin)) !== [];
188 }
189
190 $this->objectAccess[$admin][$objectType][$objectId] = $access;
191 }
192
193 return $this->objectAccess[$admin][$objectType][$objectId];
194 }
195
196 /**
197 * Returns the excluded objects.
198 *
199 * @param string $type
200 * @param array $filterTypesMap
201 *
202 * @return array
203 */
204 private function getExcludedObjects($type, array $filterTypesMap = [])
205 {
206 $excludedObjects = [];
207 $userGroups = $this->userGroupHandler->getFullUserGroups();
208
209 foreach ($userGroups as $userGroup) {
210 $excludedObjects += $userGroup->getAssignedObjectsByType($type);
211 }
212
213 $userUserGroups = $this->userGroupHandler->getUserGroupsForUser();
214
215 foreach ($userUserGroups as $userGroup) {
216 $excludedObjects = array_diff_key($excludedObjects, $userGroup->getAssignedObjectsByType($type));
217 }
218
219 if ($filterTypesMap !== []) {
220 $excludedObjects = array_filter(
221 $excludedObjects,
222 function ($element) use ($filterTypesMap) {
223 return isset($filterTypesMap[$element]) === false;
224 }
225 );
226 }
227
228 $objectIds = array_keys($excludedObjects);
229 return array_combine($objectIds, $objectIds);
230 }
231
232 /**
233 * Returns the excluded terms for a user.
234 *
235 * @return array
236 */
237 public function getExcludedTerms()
238 {
239 if ($this->userHandler->checkUserAccess(UserHandler::MANAGE_USER_GROUPS_CAPABILITY)) {
240 $this->excludedTerms = [];
241 }
242
243 if ($this->excludedTerms === null) {
244 $this->excludedTerms = $this->getExcludedObjects(ObjectHandler::GENERAL_TERM_OBJECT_TYPE);
245 }
246
247 return $this->excludedTerms;
248 }
249
250 /**
251 * Returns the none hidden post types map.
252 *
253 * @return array
254 */
255 private function getNoneHiddenPostTypes()
256 {
257 if ($this->noneHiddenPostTypes === null) {
258 $this->noneHiddenPostTypes = [];
259
260 if ($this->wordpress->isAdmin() === false) {
261 $postTypes = $this->objectHandler->getPostTypes();
262
263 foreach ($postTypes as $postType) {
264 if ($this->mainConfig->hidePostType($postType) === false) {
265 $this->noneHiddenPostTypes[$postType] = $postType;
266 }
267 }
268 }
269 }
270
271 return $this->noneHiddenPostTypes;
272 }
273
274 /**
275 * Returns the excluded posts.
276 *
277 * @return array
278 */
279 public function getExcludedPosts()
280 {
281 if ($this->userHandler->checkUserAccess(UserHandler::MANAGE_USER_GROUPS_CAPABILITY)) {
282 $this->excludedPosts = [];
283 }
284
285 if ($this->excludedPosts === null) {
286 $noneHiddenPostTypes = $this->getNoneHiddenPostTypes();
287 $excludedPosts = $this->getExcludedObjects(ObjectHandler::GENERAL_POST_OBJECT_TYPE, $noneHiddenPostTypes);
288
289 if ($this->mainConfig->authorsHasAccessToOwn() === true) {
290 $query = $this->database->prepare(
291 "SELECT ID
292 FROM {$this->database->getPostsTable()}
293 WHERE post_author = %d",
294 $this->wordpress->getCurrentUser()->ID
295 );
296
297 $ownPosts = (array)$this->database->getResults($query);
298 $ownPostIds = [];
299
300 foreach ($ownPosts as $ownPost) {
301 $ownPostIds[$ownPost->ID] = $ownPost->ID;
302 }
303
304 $excludedPosts = array_diff_key($excludedPosts, $ownPostIds);
305 }
306
307 $this->excludedPosts = $excludedPosts;
308 }
309
310 return $this->excludedPosts;
311 }
312 }
313