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

260 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(string $objectType, int|string $objectId, bool $ignoreDates = false): array
150 {
151 if ($this->objectHandler->isValidObjectType($objectType) === false) {
152 return [];
153 }
154
155 if (isset($this->objectUserGroups[$ignoreDates][$objectType][$objectId]) === false) {
156 $objectUserGroups = [];
157 $userGroups = $this->getFullUserGroups();
158
159 foreach ($userGroups as $userGroup) {
160 $userGroup->setIgnoreDates($ignoreDates);
161
162 if ($userGroup->isObjectMember($objectType, $objectId) === true) {
163 $objectUserGroups[$userGroup->getId()] = $userGroup;
164 }
165 }
166
167 $this->objectUserGroups[$ignoreDates][$objectType][$objectId] = $objectUserGroups;
168 }
169
170 return $this->objectUserGroups[$ignoreDates][$objectType][$objectId];
171 }
172
173 public function unsetUserGroupsForObject(): void
174 {
175 $this->objectUserGroups = [];
176 }
177
178 private function checkUserGroupAccess(UserGroup $userGroup): bool
179 {
180 $extraIpHeader = $this->mainConfig->getExtraIpHeader();
181 $userIp = $extraIpHeader !== null ?
182 $_SERVER[$extraIpHeader] ?? ($_SERVER['REMOTE_ADDR'] ?? '') :
183 $_SERVER['REMOTE_ADDR'] ?? '';
184
185 return $this->userHandler->isIpInRange($userIp, $userGroup->getIpRangeArray())
186 || $this->wordpressConfig->atAdminPanel() === false && $userGroup->getReadAccess() === 'all'
187 || $this->wordpressConfig->atAdminPanel() === true && $userGroup->getWriteAccess() === 'all';
188 }
189
190 /**
191 * @throws UserGroupTypeException
192 */
193 private function assignDynamicUserGroupsForUser(WP_User $currentUser, array &$userGroupsForUser): void
194 {
195 $userUserGroup = $this->userGroupFactory->createDynamicUserGroup(
196 DynamicUserGroup::USER_TYPE,
197 $currentUser->ID
198 );
199 $userGroupsForUser[$userUserGroup->getId()] = $userUserGroup;
200 $roles = $this->userHandler->getUserRole($currentUser);
201
202 foreach ($roles as $role) {
203 $group = $this->userGroupFactory->createDynamicUserGroup(
204 DynamicUserGroup::ROLE_TYPE,
205 $role
206 );
207
208 $userGroupsForUser[$group->getId()] = $group;
209 }
210 }
211
212 /**
213 * @return AbstractUserGroup[]|null
214 * @throws UserGroupTypeException
215 */
216 public function getUserGroupsForUser(): ?array
217 {
218 if ($this->userHandler->checkUserAccess(UserHandler::MANAGE_USER_GROUPS_CAPABILITY) === true) {
219 return $this->getUserGroups();
220 }
221
222 if ($this->userGroupsForUser === null) {
223 $currentUser = $this->wordpress->getCurrentUser();
224 $userGroupsForUser = $this->getUserGroupsForObject(
225 ObjectHandler::GENERAL_USER_OBJECT_TYPE,
226 $currentUser->ID
227 );
228
229 $this->assignDynamicUserGroupsForUser($currentUser, $userGroupsForUser);
230 $userGroups = $this->getUserGroups();
231
232 foreach ($userGroups as $userGroup) {
233 if (isset($userGroupsForUser[$userGroup->getId()]) === false
234 && $this->checkUserGroupAccess($userGroup) === true
235 ) {
236 $userGroupsForUser[$userGroup->getId()] = $userGroup;
237 }
238 }
239
240 $this->userGroupsForUser = $userGroupsForUser;
241 }
242
243 return $this->userGroupsForUser;
244 }
245
246 /**
247 * @return AbstractUserGroup[]
248 * @throws UserGroupTypeException
249 */
250 public function getFilteredUserGroupsForObject(
251 string $objectType,
252 int|string $objectId,
253 bool $ignoreDates = false
254 ): array {
255 $userGroups = $this->getUserGroupsForObject($objectType, $objectId, $ignoreDates);
256 $userUserGroups = $this->getUserGroupsForUser() + $this->getDynamicUserGroups();
257 return array_intersect_key($userGroups, $userUserGroups);
258 }
259 }
260