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