PluginProbe
User Access Manager / 2.3.15
User Access Manager v2.3.15
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.3.15, at src/UserGroup/UserGroupHandler.php

263 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 declare(strict_types=1);
4
5 namespace UserAccessManager\UserGroup;
6
7 use Exception;
8 use UserAccessManager\Config\MainConfig;
9 use UserAccessManager\Config\WordpressConfig;
10 use UserAccessManager\Database\Database;
11 use UserAccessManager\Object\ObjectHandler;
12 use UserAccessManager\User\UserHandler;
13 use UserAccessManager\Wrapper\Wordpress;
14 use WP_User;
15
16 class UserGroupHandler
17 {
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 = [];
26
27 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
35 ) {
36 }
37
38 /**
39 * @return null|UserGroup[]
40 * @throws UserGroupTypeException
41 */
42 public function getUserGroups(): ?array
43 {
44 if ($this->userGroups === null) {
45 $this->userGroups = [];
46
47 $query = "SELECT ID FROM {$this->database->getUserGroupTable()}";
48 $userGroups = (array) $this->database->getResults($query);
49
50 foreach ($userGroups as $userGroup) {
51 $group = $this->userGroupFactory->createUserGroup($userGroup->ID);
52 $this->userGroups[$group->getId()] = $group;
53 }
54 }
55
56 return $this->userGroups;
57 }
58
59 /**
60 * @return null|DynamicUserGroup[]
61 * @throws UserGroupTypeException
62 */
63 public function getDynamicUserGroups(): ?array
64 {
65 if ($this->dynamicUserGroups === null) {
66 $this->dynamicUserGroups = [];
67
68 $notLoggedInUserGroup = $this->userGroupFactory->createDynamicUserGroup(
69 DynamicUserGroup::USER_TYPE,
70 DynamicUserGroup::NOT_LOGGED_IN_USER_ID
71 );
72 $this->dynamicUserGroups[$notLoggedInUserGroup->getId()] = $notLoggedInUserGroup;
73
74 $userGroupTypes = implode('\', \'', [DynamicUserGroup::ROLE_TYPE, DynamicUserGroup::USER_TYPE]);
75
76 $query = "SELECT group_id AS id, group_type AS type
77 FROM {$this->database->getUserGroupToObjectTable()}
78 WHERE group_type IN ('$userGroupTypes')
79 GROUP BY group_type, group_id";
80
81 $dynamicUserGroups = (array) $this->database->getResults($query);
82
83 foreach ($dynamicUserGroups as $dynamicUserGroup) {
84 $group = $this->userGroupFactory->createDynamicUserGroup(
85 $dynamicUserGroup->type,
86 $dynamicUserGroup->id
87 );
88
89 $this->dynamicUserGroups[$group->getId()] = $group;
90 }
91 }
92
93 return $this->dynamicUserGroups;
94 }
95
96 /**
97 * @return null|AbstractUserGroup[]
98 * @throws UserGroupTypeException
99 */
100 public function getFullUserGroups(): ?array
101 {
102 return $this->getUserGroups() + $this->getDynamicUserGroups();
103 }
104
105 /**
106 * @return AbstractUserGroup[]
107 * @throws UserGroupTypeException
108 */
109 public function getFilteredUserGroups(): array
110 {
111 $userGroups = $this->getFullUserGroups();
112 $userUserGroups = $this->getUserGroupsForUser() + $this->getDynamicUserGroups();
113 return array_intersect_key($userGroups, $userUserGroups);
114 }
115
116 /**
117 * @throws UserGroupTypeException
118 */
119 public function addUserGroup(UserGroup $userGroup): void
120 {
121 $this->getUserGroups();
122 $this->userGroups[$userGroup->getId()] = $userGroup;
123 }
124
125 /**
126 * @throws UserGroupTypeException
127 * @throws Exception
128 */
129 public function deleteUserGroup(int|string $userGroupId): bool
130 {
131 $userGroups = $this->getUserGroups();
132
133 if (isset($userGroups[$userGroupId])
134 && $userGroups[$userGroupId]->delete() === true
135 ) {
136 unset($this->userGroups[$userGroupId]);
137
138 return true;
139 }
140
141 return false;
142 }
143
144 /**
145 * @return AbstractUserGroup[]
146 * @throws UserGroupTypeException
147 * @throws Exception
148 */
149 public function getUserGroupsForObject(
150 string $objectType,
151 int|string|null $objectId,
152 bool $ignoreDates = false
153 ): array {
154 if ($this->objectHandler->isValidObjectType($objectType) === false) {
155 return [];
156 }
157
158 if (isset($this->objectUserGroups[$ignoreDates][$objectType][$objectId]) === false) {
159 $objectUserGroups = [];
160 $userGroups = $this->getFullUserGroups();
161
162 foreach ($userGroups as $userGroup) {
163 $userGroup->setIgnoreDates($ignoreDates);
164
165 if ($userGroup->isObjectMember($objectType, $objectId) === true) {
166 $objectUserGroups[$userGroup->getId()] = $userGroup;
167 }
168 }
169
170 $this->objectUserGroups[$ignoreDates][$objectType][$objectId] = $objectUserGroups;
171 }
172
173 return $this->objectUserGroups[$ignoreDates][$objectType][$objectId];
174 }
175
176 public function unsetUserGroupsForObject(): void
177 {
178 $this->objectUserGroups = [];
179 }
180
181 private function checkUserGroupAccess(UserGroup $userGroup): bool
182 {
183 $extraIpHeader = $this->mainConfig->getExtraIpHeader();
184 $userIp = $extraIpHeader !== null ?
185 $_SERVER[$extraIpHeader] ?? ($_SERVER['REMOTE_ADDR'] ?? '') :
186 $_SERVER['REMOTE_ADDR'] ?? '';
187
188 return $this->userHandler->isIpInRange($userIp, $userGroup->getIpRangeArray())
189 || $this->wordpressConfig->atAdminPanel() === false && $userGroup->getReadAccess() === 'all'
190 || $this->wordpressConfig->atAdminPanel() === true && $userGroup->getWriteAccess() === 'all';
191 }
192
193 /**
194 * @throws UserGroupTypeException
195 */
196 private function assignDynamicUserGroupsForUser(WP_User $currentUser, array &$userGroupsForUser): void
197 {
198 $userUserGroup = $this->userGroupFactory->createDynamicUserGroup(
199 DynamicUserGroup::USER_TYPE,
200 $currentUser->ID
201 );
202 $userGroupsForUser[$userUserGroup->getId()] = $userUserGroup;
203 $roles = $this->userHandler->getUserRole($currentUser);
204
205 foreach ($roles as $role) {
206 $group = $this->userGroupFactory->createDynamicUserGroup(
207 DynamicUserGroup::ROLE_TYPE,
208 $role
209 );
210
211 $userGroupsForUser[$group->getId()] = $group;
212 }
213 }
214
215 /**
216 * @return AbstractUserGroup[]|null
217 * @throws UserGroupTypeException
218 */
219 public function getUserGroupsForUser(): ?array
220 {
221 if ($this->userHandler->checkUserAccess(UserHandler::MANAGE_USER_GROUPS_CAPABILITY) === true) {
222 return $this->getUserGroups();
223 }
224
225 if ($this->userGroupsForUser === null) {
226 $currentUser = $this->wordpress->getCurrentUser();
227 $userGroupsForUser = $this->getUserGroupsForObject(
228 ObjectHandler::GENERAL_USER_OBJECT_TYPE,
229 $currentUser->ID
230 );
231
232 $this->assignDynamicUserGroupsForUser($currentUser, $userGroupsForUser);
233 $userGroups = $this->getUserGroups();
234
235 foreach ($userGroups as $userGroup) {
236 if (isset($userGroupsForUser[$userGroup->getId()]) === false
237 && $this->checkUserGroupAccess($userGroup) === true
238 ) {
239 $userGroupsForUser[$userGroup->getId()] = $userGroup;
240 }
241 }
242
243 $this->userGroupsForUser = $userGroupsForUser;
244 }
245
246 return $this->userGroupsForUser;
247 }
248
249 /**
250 * @return AbstractUserGroup[]
251 * @throws UserGroupTypeException
252 */
253 public function getFilteredUserGroupsForObject(
254 string $objectType,
255 int|string|null $objectId,
256 bool $ignoreDates = false
257 ): array {
258 $userGroups = $this->getUserGroupsForObject($objectType, $objectId, $ignoreDates);
259 $userUserGroups = $this->getUserGroupsForUser() + $this->getDynamicUserGroups();
260 return array_intersect_key($userGroups, $userUserGroups);
261 }
262 }
263