PluginProbe
User Access Manager / 2.1.9
User Access Manager v2.1.9
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 / UserGroup / UserGroupHandler.php

UserGroupHandler.php in User Access Manager 2.1.9, at src/UserGroup/UserGroupHandler.php

351 lines 9.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * UserGroupHandler.php
4 *
5 * The UserGroupHandler 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\UserGroup;
16
17 use UserAccessManager\Config\WordpressConfig;
18 use UserAccessManager\Database\Database;
19 use UserAccessManager\Object\ObjectHandler;
20 use UserAccessManager\User\UserHandler;
21 use UserAccessManager\Wrapper\Wordpress;
22
23 /**
24 * Class UserGroupHandler
25 *
26 * @package UserAccessManager\UserGroup
27 */
28 class UserGroupHandler
29 {
30 /**
31 * @var Wordpress
32 */
33 private $wordpress;
34
35 /**
36 * @var WordpressConfig
37 */
38 private $wordpressConfig;
39
40 /**
41 * @var Database
42 */
43 private $database;
44
45 /**
46 * @var ObjectHandler
47 */
48 private $objectHandler;
49
50 /**
51 * @var UserHandler
52 */
53 private $userHandler;
54
55 /**
56 * @var UserGroupFactory
57 */
58 private $userGroupFactory;
59
60 /**
61 * @var null|UserGroup[]
62 */
63 private $userGroups = null;
64
65 /**
66 * @var null|DynamicUserGroup[]
67 */
68 private $dynamicUserGroups = null;
69
70 /**
71 * @var null|UserGroup[]
72 */
73 private $filteredUserGroups = null;
74
75 /**
76 * @var null|AbstractUserGroup[]
77 */
78 private $userGroupsForUser = null;
79
80 /**
81 * @var array
82 */
83 private $objectUserGroups = [];
84
85 public function __construct(
86 Wordpress $wordpress,
87 WordpressConfig $wordpressConfig,
88 Database $database,
89 ObjectHandler $objectHandler,
90 UserHandler $userHandler,
91 UserGroupFactory $userGroupFactory
92 ) {
93 $this->wordpress = $wordpress;
94 $this->wordpressConfig = $wordpressConfig;
95 $this->database = $database;
96 $this->objectHandler = $objectHandler;
97 $this->userHandler = $userHandler;
98 $this->userGroupFactory = $userGroupFactory;
99 }
100
101 /**
102 * Returns all user groups.
103 *
104 * @return UserGroup[]
105 */
106 public function getUserGroups()
107 {
108 if ($this->userGroups === null) {
109 $this->userGroups = [];
110
111 $query = "SELECT ID FROM {$this->database->getUserGroupTable()}";
112 $userGroups = (array)$this->database->getResults($query);
113
114 foreach ($userGroups as $userGroup) {
115 $group = $this->userGroupFactory->createUserGroup($userGroup->ID);
116 $this->userGroups[$group->getId()] = $group;
117 }
118 }
119
120 return $this->userGroups;
121 }
122
123 /**
124 * Returns all dynamic user groups.
125 *
126 * @return null|DynamicUserGroup[]
127 */
128 public function getDynamicUserGroups()
129 {
130 if ($this->dynamicUserGroups === null) {
131 $this->dynamicUserGroups = [];
132
133 $notLoggedInUserGroup = $this->userGroupFactory->createDynamicUserGroup(
134 DynamicUserGroup::USER_TYPE,
135 DynamicUserGroup::NOT_LOGGED_IN_USER_ID
136 );
137 $this->dynamicUserGroups[$notLoggedInUserGroup->getId()] = $notLoggedInUserGroup;
138
139 $userGroupTypes = implode('\', \'', [DynamicUserGroup::ROLE_TYPE, DynamicUserGroup::USER_TYPE]);
140
141 $query = "SELECT group_id AS id, group_type AS type
142 FROM {$this->database->getUserGroupToObjectTable()}
143 WHERE group_type IN ('{$userGroupTypes}')
144 GROUP BY group_type, group_id";
145
146 $dynamicUserGroups = (array)$this->database->getResults($query);
147
148 foreach ($dynamicUserGroups as $dynamicUserGroup) {
149 $group = $this->userGroupFactory->createDynamicUserGroup(
150 $dynamicUserGroup->type,
151 $dynamicUserGroup->id
152 );
153
154 $this->dynamicUserGroups[$group->getId()] = $group;
155 }
156 }
157
158 return $this->dynamicUserGroups;
159 }
160
161 /**
162 * Returns the full user groups
163 *
164 * @return AbstractUserGroup[]
165 */
166 public function getFullUserGroups()
167 {
168 return $this->getUserGroups() + $this->getDynamicUserGroups();
169 }
170
171 /**
172 * Returns the user groups filtered by the user user groups.
173 *
174 * @return AbstractUserGroup[]
175 */
176 public function getFilteredUserGroups()
177 {
178 $userGroups = $this->getFullUserGroups();
179 $userUserGroups = $this->getUserGroupsForUser() + $this->getDynamicUserGroups();
180 return array_intersect_key($userGroups, $userUserGroups);
181 }
182
183 /**
184 * Adds a user group.
185 *
186 * @param UserGroup $userGroup
187 */
188 public function addUserGroup(UserGroup $userGroup)
189 {
190 $this->getUserGroups();
191 $this->userGroups[$userGroup->getId()] = $userGroup;
192 $this->filteredUserGroups = null;
193 }
194
195 /**
196 * Deletes a user group.
197 *
198 * @param int $userGroupId
199 *
200 * @return bool
201 */
202 public function deleteUserGroup($userGroupId)
203 {
204 $userGroups = $this->getUserGroups();
205
206 if (isset($userGroups[$userGroupId])
207 && $userGroups[$userGroupId]->delete() === true
208 ) {
209 unset($this->userGroups[$userGroupId]);
210 $this->filteredUserGroups = null;
211
212 return true;
213 }
214
215 return false;
216 }
217
218 /**
219 * Returns the user groups for the given object.
220 *
221 * @param string $objectType The object type.
222 * @param integer $objectId The id of the object.
223 * @param bool $ignoreDates If true we ignore the dates for the object assignment.
224 *
225 * @return AbstractUserGroup[]
226 */
227 public function getUserGroupsForObject($objectType, $objectId, $ignoreDates = false)
228 {
229 if ($this->objectHandler->isValidObjectType($objectType) === false) {
230 return [];
231 }
232
233 if (isset($this->objectUserGroups[(int)$ignoreDates][$objectType][$objectId]) === false) {
234 $objectUserGroups = [];
235 $userGroups = $this->getFullUserGroups();
236
237 foreach ($userGroups as $userGroup) {
238 $userGroup->setIgnoreDates($ignoreDates);
239
240 if ($userGroup->isObjectMember($objectType, $objectId) === true) {
241 $objectUserGroups[$userGroup->getId()] = $userGroup;
242 }
243 }
244
245 $this->objectUserGroups[(int)$ignoreDates][$objectType][$objectId] = $objectUserGroups;
246 }
247
248 return $this->objectUserGroups[(int)$ignoreDates][$objectType][$objectId];
249 }
250
251 /**
252 * Unset the object user groups.
253 */
254 public function unsetUserGroupsForObject()
255 {
256 $this->objectUserGroups = [];
257 }
258
259 /**
260 * Checks if the current user is in the ip range or if the user group is public.
261 *
262 * @param UserGroup $userGroup
263 *
264 * @return bool
265 */
266 private function checkUserGroupAccess(UserGroup $userGroup)
267 {
268 $userIp = isset($_SERVER['HTTP_X_REAL_IP']) ? $_SERVER['HTTP_X_REAL_IP'] : $_SERVER['REMOTE_ADDR'];
269
270 return $this->userHandler->isIpInRange($userIp, $userGroup->getIpRangeArray())
271 || $this->wordpressConfig->atAdminPanel() === false && $userGroup->getReadAccess() === 'all'
272 || $this->wordpressConfig->atAdminPanel() === true && $userGroup->getWriteAccess() === 'all';
273 }
274
275 /**
276 * Assigns the dynamic user groups to the user user groups.
277 *
278 * @param \WP_User $currentUser
279 * @param array $userGroupsForUser
280 */
281 private function assignDynamicUserGroupsForUser(\WP_User $currentUser, array &$userGroupsForUser)
282 {
283 $userUserGroup = $this->userGroupFactory->createDynamicUserGroup(
284 DynamicUserGroup::USER_TYPE,
285 $currentUser->ID
286 );
287 $userGroupsForUser[$userUserGroup->getId()] = $userUserGroup;
288 $roles = $this->userHandler->getUserRole($currentUser);
289
290 foreach ($roles as $role) {
291 $group = $this->userGroupFactory->createDynamicUserGroup(
292 DynamicUserGroup::ROLE_TYPE,
293 $role
294 );
295
296 $userGroupsForUser[$group->getId()] = $group;
297 }
298 }
299
300 /**
301 * Returns the user groups for the user.
302 *
303 * @return AbstractUserGroup[]
304 */
305 public function getUserGroupsForUser()
306 {
307 if ($this->userHandler->checkUserAccess(UserHandler::MANAGE_USER_GROUPS_CAPABILITY) === true) {
308 return $this->getUserGroups();
309 }
310
311 if ($this->userGroupsForUser === null) {
312 $currentUser = $this->wordpress->getCurrentUser();
313 $userGroupsForUser = $this->getUserGroupsForObject(
314 ObjectHandler::GENERAL_USER_OBJECT_TYPE,
315 $currentUser->ID
316 );
317
318 $this->assignDynamicUserGroupsForUser($currentUser, $userGroupsForUser);
319 $userGroups = $this->getUserGroups();
320
321 foreach ($userGroups as $userGroup) {
322 if (isset($userGroupsForUser[$userGroup->getId()]) === false
323 && $this->checkUserGroupAccess($userGroup) === true
324 ) {
325 $userGroupsForUser[$userGroup->getId()] = $userGroup;
326 }
327 }
328
329 $this->userGroupsForUser = $userGroupsForUser;
330 }
331
332 return $this->userGroupsForUser;
333 }
334
335 /**
336 * Returns the user groups for the object filtered by the user user groups.
337 *
338 * @param string $objectType
339 * @param int $objectId
340 * @param bool $ignoreDates
341 *
342 * @return AbstractUserGroup[]
343 */
344 public function getFilteredUserGroupsForObject($objectType, $objectId, $ignoreDates = false)
345 {
346 $userGroups = $this->getUserGroupsForObject($objectType, $objectId, $ignoreDates);
347 $userUserGroups = $this->getUserGroupsForUser() + $this->getDynamicUserGroups();
348 return array_intersect_key($userGroups, $userUserGroups);
349 }
350 }
351