This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
1 | <?php |
||||
2 | /** |
||||
3 | * Privilege Util basic class. |
||||
4 | * |
||||
5 | * @package App |
||||
6 | * |
||||
7 | * @copyright YetiForce S.A. |
||||
8 | * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com) |
||||
9 | * @author Mariusz Krzaczkowski <[email protected]> |
||||
10 | * @author Radosław Skrzypczak <[email protected]> |
||||
11 | */ |
||||
12 | |||||
13 | namespace App; |
||||
14 | |||||
15 | class PrivilegeUtil |
||||
16 | { |
||||
17 | /** @var int Allowed group nests */ |
||||
18 | public const GROUP_LOOP_LIMIT = 5; |
||||
19 | |||||
20 | /** Function to get parent record owner. |
||||
21 | * @param $tabid -- tabid :: Type integer |
||||
0 ignored issues
–
show
Documentation
Bug
introduced
by
![]() |
|||||
22 | * @param $parModId -- parent module id :: Type integer |
||||
23 | * @param $recordId -- record id :: Type integer |
||||
24 | * @returns $parentRecOwner -- parentRecOwner:: Type integer |
||||
25 | */ |
||||
26 | public static function getParentRecordOwner($tabid, $parModId, $recordId) |
||||
27 | { |
||||
28 | Log::trace("Entering getParentRecordOwner($tabid,$parModId,$recordId) method ..."); |
||||
29 | $parentRecOwner = []; |
||||
30 | $parentTabName = Module::getModuleName($parModId); |
||||
31 | $relTabName = Module::getModuleName($tabid); |
||||
32 | $fnName = 'get' . $relTabName . 'Related' . $parentTabName; |
||||
33 | $entId = static::$fnName($recordId); |
||||
34 | if ('' !== $entId) { |
||||
35 | $recordMetaData = \vtlib\Functions::getCRMRecordMetadata($entId); |
||||
36 | if ($recordMetaData) { |
||||
0 ignored issues
–
show
The expression
$recordMetaData of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent. Consider making the comparison explicit by using ![]() |
|||||
37 | $ownerId = $recordMetaData['smownerid']; |
||||
38 | $type = \App\Fields\Owner::getType($ownerId); |
||||
39 | $parentRecOwner[$type] = $ownerId; |
||||
40 | } |
||||
41 | } |
||||
42 | Log::trace('Exiting getParentRecordOwner method ...'); |
||||
43 | return $parentRecOwner; |
||||
44 | } |
||||
45 | |||||
46 | /** |
||||
47 | 1 | * Function return related account with ticket. |
|||
48 | * |
||||
49 | 1 | * @param int $recordId |
|||
50 | 1 | * |
|||
51 | 1 | * @return int |
|||
52 | */ |
||||
53 | private static function getHelpDeskRelatedAccounts($recordId) |
||||
54 | { |
||||
55 | return (new Db\Query())->select(['parent_id'])->from('vtiger_troubletickets') |
||||
0 ignored issues
–
show
|
|||||
56 | ->innerJoin('vtiger_crmentity', 'vtiger_troubletickets.parent_id = vtiger_crmentity.crmid') |
||||
57 | ->where(['ticketid' => $recordId, 'vtiger_crmentity.setype' => 'Accounts'])->scalar(); |
||||
58 | } |
||||
59 | |||||
60 | protected static $datashareRelatedCache = false; |
||||
61 | 2 | ||||
62 | /** |
||||
63 | 2 | * Function to get data share related modules. |
|||
64 | 1 | * |
|||
65 | 1 | * @return array |
|||
66 | 1 | */ |
|||
67 | 1 | public static function getDatashareRelatedModules() |
|||
68 | 1 | { |
|||
69 | if (false === static::$datashareRelatedCache) { |
||||
70 | $relModSharArr = []; |
||||
71 | $dataReader = (new \App\Db\Query())->from('vtiger_datashare_relatedmodules')->createCommand()->query(); |
||||
72 | 1 | while ($row = $dataReader->read()) { |
|||
73 | 1 | $relTabId = $row['relatedto_tabid']; |
|||
74 | if (isset($relModSharArr[$relTabId]) && \is_array($relModSharArr[$relTabId])) { |
||||
75 | 1 | $temArr = $relModSharArr[$relTabId]; |
|||
76 | $temArr[] = $row['tabid']; |
||||
77 | 1 | } else { |
|||
78 | $temArr = []; |
||||
79 | 2 | $temArr[] = $row['tabid']; |
|||
80 | } |
||||
81 | $relModSharArr[$relTabId] = $temArr; |
||||
82 | } |
||||
83 | static::$datashareRelatedCache = $relModSharArr; |
||||
84 | } |
||||
85 | return static::$datashareRelatedCache; |
||||
0 ignored issues
–
show
|
|||||
86 | } |
||||
87 | |||||
88 | protected static $defaultSharingActionCache = false; |
||||
89 | 2 | ||||
90 | /** |
||||
91 | 2 | * This Function returns the Default Organisation Sharing Action Array for all modules. |
|||
92 | 1 | * |
|||
93 | 1 | * @return array |
|||
94 | */ |
||||
95 | 2 | public static function getAllDefaultSharingAction() |
|||
96 | { |
||||
97 | if (false === static::$defaultSharingActionCache) { |
||||
98 | Log::trace('getAllDefaultSharingAction'); |
||||
99 | static::$defaultSharingActionCache = array_map('intval', (new \App\Db\Query())->select(['tabid', 'permission'])->from('vtiger_def_org_share')->createCommand()->queryAllByGroup(0)); |
||||
100 | } |
||||
101 | return static::$defaultSharingActionCache; |
||||
0 ignored issues
–
show
|
|||||
102 | } |
||||
103 | |||||
104 | /** |
||||
105 | 3 | * Function to get the vtiger_role related user ids. |
|||
106 | * |
||||
107 | 3 | * @param string $roleId Role ID |
|||
108 | * |
||||
109 | * @return array $users Role related user array |
||||
110 | 3 | */ |
|||
111 | 3 | public static function getUsersByRole($roleId): array |
|||
112 | 3 | { |
|||
113 | 3 | if (Cache::has('getUsersByRole', $roleId)) { |
|||
114 | return Cache::get('getUsersByRole', $roleId); |
||||
115 | } |
||||
116 | $users = static::getQueryToUsersByRole($roleId)->column(); |
||||
117 | $users = array_map('intval', $users); |
||||
118 | Cache::save('getUsersByRole', $roleId, $users); |
||||
119 | return $users; |
||||
120 | } |
||||
121 | |||||
122 | /** |
||||
123 | 2 | * Function to get the users names by role. |
|||
124 | * |
||||
125 | 2 | * @param int $roleId |
|||
126 | * |
||||
127 | * @return array $users |
||||
128 | 2 | */ |
|||
129 | 2 | public static function getUsersNameByRole($roleId) |
|||
130 | 2 | { |
|||
131 | 1 | if (Cache::has('getUsersNameByRole', $roleId)) { |
|||
132 | 1 | return Cache::get('getUsersNameByRole', $roleId); |
|||
133 | } |
||||
134 | $users = static::getUsersByRole($roleId); |
||||
135 | 2 | $roleRelatedUsers = []; |
|||
136 | 2 | if ($users) { |
|||
0 ignored issues
–
show
The expression
$users of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent. Consider making the comparison explicit by using ![]() |
|||||
137 | foreach ($users as $userId) { |
||||
138 | $roleRelatedUsers[$userId] = Fields\Owner::getUserLabel($userId); |
||||
139 | } |
||||
140 | } |
||||
141 | Cache::save('getUsersNameByRole', $roleId, $roleRelatedUsers); |
||||
142 | return $roleRelatedUsers; |
||||
143 | } |
||||
144 | 14 | ||||
145 | /** |
||||
146 | 14 | * Function to get the role related user ids. |
|||
147 | 2 | * |
|||
148 | * @param int $userId RoleId :: Type varchar |
||||
149 | 14 | */ |
|||
150 | 14 | public static function getRoleByUsers($userId) |
|||
151 | 14 | { |
|||
152 | 14 | if (Cache::has('getRoleByUsers', $userId)) { |
|||
153 | 14 | return Cache::get('getRoleByUsers', $userId); |
|||
154 | } |
||||
155 | $roleId = (new \App\Db\Query())->select(['roleid']) |
||||
156 | ->from('vtiger_user2role')->where(['userid' => $userId]) |
||||
157 | ->scalar(); |
||||
158 | Cache::save('getRoleByUsers', $userId, $roleId); |
||||
159 | return $roleId; |
||||
160 | } |
||||
161 | |||||
162 | /** |
||||
163 | 14 | * Function to get user groups. |
|||
164 | * |
||||
165 | 14 | * @param int $userId |
|||
166 | * |
||||
167 | * @return array - groupId's |
||||
168 | 14 | */ |
|||
169 | 14 | public static function getUserGroups($userId) |
|||
170 | 14 | { |
|||
171 | 14 | if (Cache::has('UserGroups', $userId)) { |
|||
172 | return Cache::get('UserGroups', $userId); |
||||
173 | } |
||||
174 | $groupIds = (new \App\Db\Query())->select(['groupid'])->from('vtiger_users2group')->where(['userid' => $userId])->column(); |
||||
175 | $groupIds = array_map('intval', $groupIds); |
||||
176 | Cache::save('UserGroups', $userId, $groupIds); |
||||
177 | return $groupIds; |
||||
178 | } |
||||
179 | |||||
180 | /** |
||||
181 | 5778 | * This function is to retreive the vtiger_profiles associated with the the specified role. |
|||
182 | * |
||||
183 | 5778 | * @param string $roleId |
|||
184 | 5778 | * |
|||
185 | 5771 | * @return array |
|||
186 | */ |
||||
187 | 14 | public static function getProfilesByRole($roleId) |
|||
188 | 14 | { |
|||
189 | 14 | $profiles = Cache::staticGet('getProfilesByRole', $roleId); |
|||
190 | 14 | if ($profiles) { |
|||
191 | 14 | return $profiles; |
|||
192 | 14 | } |
|||
193 | 14 | $profiles = (new \App\Db\Query()) |
|||
194 | 14 | ->select(['profileid']) |
|||
195 | ->from('vtiger_role2profile') |
||||
196 | ->where(['roleid' => $roleId]) |
||||
197 | ->column(); |
||||
198 | $profiles = array_map('intval', $profiles); |
||||
199 | Cache::staticSave('getProfilesByRole', $roleId, $profiles); |
||||
200 | return $profiles; |
||||
201 | } |
||||
202 | |||||
203 | /** |
||||
204 | 2 | * This function is to retreive the vtiger_profiles associated with the the specified user. |
|||
205 | * |
||||
206 | 2 | * @param int $userId |
|||
207 | * |
||||
208 | 2 | * @return array |
|||
209 | */ |
||||
210 | public static function getProfilesByUser($userId) |
||||
211 | { |
||||
212 | $roleId = static::getRoleByUsers($userId); |
||||
213 | |||||
214 | return static::getProfilesByRole($roleId); |
||||
215 | } |
||||
216 | |||||
217 | const MEMBER_TYPE_USERS = 'Users'; |
||||
218 | const MEMBER_TYPE_GROUPS = 'Groups'; |
||||
219 | const MEMBER_TYPE_ROLES = 'Roles'; |
||||
220 | const MEMBER_TYPE_ROLE_AND_SUBORDINATES = 'RoleAndSubordinates'; |
||||
221 | |||||
222 | protected static $membersCache = false; |
||||
223 | |||||
224 | /** |
||||
225 | * Function to get all members. |
||||
226 | * |
||||
227 | * @return array |
||||
228 | */ |
||||
229 | public static function getMembers() |
||||
230 | { |
||||
231 | if (false === static::$membersCache) { |
||||
232 | $members = []; |
||||
233 | $owner = new \App\Fields\Owner(); |
||||
234 | foreach ($owner->initUsers() as $id => $user) { |
||||
235 | $members[static::MEMBER_TYPE_USERS][static::MEMBER_TYPE_USERS . ':' . $id] = ['name' => $user['fullName'], 'id' => $id, 'type' => static::MEMBER_TYPE_USERS]; |
||||
236 | } |
||||
237 | foreach ($owner->getGroups(false) as $id => $groupName) { |
||||
238 | $members[static::MEMBER_TYPE_GROUPS][static::MEMBER_TYPE_GROUPS . ':' . $id] = ['name' => $groupName, 'id' => $id, 'type' => static::MEMBER_TYPE_GROUPS]; |
||||
239 | } |
||||
240 | foreach (\Settings_Roles_Record_Model::getAll() as $id => $roleModel) { |
||||
241 | $members[static::MEMBER_TYPE_ROLES][static::MEMBER_TYPE_ROLES . ':' . $id] = ['name' => $roleModel->getName(), 'id' => $id, 'type' => static::MEMBER_TYPE_ROLES]; |
||||
242 | $members[static::MEMBER_TYPE_ROLE_AND_SUBORDINATES][static::MEMBER_TYPE_ROLE_AND_SUBORDINATES . ':' . $id] = ['name' => $roleModel->getName(), 'id' => $id, 'type' => static::MEMBER_TYPE_ROLE_AND_SUBORDINATES]; |
||||
243 | } |
||||
244 | static::$membersCache = $members; |
||||
245 | } |
||||
246 | return static::$membersCache; |
||||
0 ignored issues
–
show
|
|||||
247 | } |
||||
248 | |||||
249 | /** |
||||
250 | 1 | * Get list of users based on members, eg. Users:2, Roles:H2. |
|||
251 | * |
||||
252 | 1 | * @param string $member |
|||
253 | * |
||||
254 | * @return array |
||||
255 | 1 | */ |
|||
256 | 1 | public static function getUserByMember($member) |
|||
257 | 1 | { |
|||
258 | 1 | if (Cache::has('getUserByMember', $member)) { |
|||
259 | 1 | return Cache::get('getUserByMember', $member); |
|||
260 | 1 | } |
|||
261 | 1 | [$type, $id] = explode(':', $member); |
|||
262 | 1 | $users = []; |
|||
263 | 1 | switch ($type) { |
|||
264 | 1 | case 'Users': |
|||
265 | 1 | $users[] = (int) $id; |
|||
266 | 1 | break; |
|||
267 | 1 | case 'Groups': |
|||
268 | 1 | $users = array_merge($users, static::getUsersByGroup($id)); |
|||
0 ignored issues
–
show
$id of type string is incompatible with the type integer expected by parameter $groupId of App\PrivilegeUtil::getUsersByGroup() .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
269 | 1 | break; |
|||
270 | case 'Roles': |
||||
271 | $users = array_merge($users, static::getUsersByRole($id)); |
||||
272 | break; |
||||
273 | 1 | case 'RoleAndSubordinates': |
|||
274 | 1 | $users = array_merge($users, static::getUsersByRoleAndSubordinate($id)); |
|||
275 | 1 | break; |
|||
276 | default: |
||||
277 | break; |
||||
278 | } |
||||
279 | $users = array_unique($users); |
||||
280 | Cache::save('getUserByMember', $member, $users, Cache::LONG); |
||||
281 | return $users; |
||||
282 | } |
||||
283 | |||||
284 | /** |
||||
285 | * Get list of users based on group id. |
||||
286 | * |
||||
287 | 1 | * @param int $groupId |
|||
288 | * @param array|bool $subGroups |
||||
289 | 1 | * @param int $i |
|||
290 | 1 | * |
|||
291 | * @return array |
||||
292 | */ |
||||
293 | public static function getUsersByGroup($groupId, $subGroups = false, $i = 0) |
||||
294 | 1 | { |
|||
295 | $cacheKey = $groupId . (false === $subGroups ? '' : '#'); |
||||
296 | 1 | if (Cache::has('getUsersByGroup', $cacheKey)) { |
|||
297 | 1 | return Cache::get('getUsersByGroup', $cacheKey); |
|||
298 | 1 | } |
|||
299 | 1 | if (false === $subGroups) { |
|||
300 | $users = static::getQueryToUsersByGroup($groupId)->column(); |
||||
301 | } else { |
||||
302 | 1 | $users = static::getQueryToUsersByGroup($groupId, false)->column(); |
|||
303 | 1 | if ($i < self::GROUP_LOOP_LIMIT) { |
|||
304 | 1 | ++$i; |
|||
305 | 1 | if (true === $subGroups) { |
|||
306 | $subGroups = []; |
||||
307 | 1 | } |
|||
308 | 1 | $dataReader = (new \App\Db\Query())->select(['containsgroupid'])->from('vtiger_group2grouprel')->where(['groupid' => $groupId])->createCommand()->query(); |
|||
309 | $containsGroups = []; |
||||
310 | while ($containsGroupId = $dataReader->readColumn(0)) { |
||||
311 | $roleUsers = static::getUsersByGroup($containsGroupId, $subGroups, $i); |
||||
312 | 1 | $containsGroups = array_merge($containsGroups, $roleUsers['users']); |
|||
313 | 1 | if (!isset($subGroups[$containsGroupId])) { |
|||
314 | 1 | $subGroups[$containsGroupId] = $containsGroups; |
|||
315 | } |
||||
316 | foreach ($roleUsers['subGroups'] as $key => $value) { |
||||
317 | if (!isset($subGroups[$key])) { |
||||
318 | $subGroups[$key] = $containsGroups; |
||||
319 | } |
||||
320 | } |
||||
321 | } |
||||
322 | if ($containsGroups) { |
||||
323 | $users = array_merge($users, $containsGroups); |
||||
324 | } |
||||
325 | } else { |
||||
326 | Log::error('Exceeded the recursive limit, a loop might have been created. Group ID:' . $groupId); |
||||
327 | } |
||||
328 | } |
||||
329 | $users = array_unique($users); |
||||
330 | 1 | $return = (false === $subGroups ? $users : ['users' => $users, 'subGroups' => $subGroups]); |
|||
331 | Cache::save('getUsersByGroup', $cacheKey, $return, Cache::LONG); |
||||
332 | return $return; |
||||
333 | } |
||||
334 | |||||
335 | /** |
||||
336 | 1 | * Gets query to users by members. |
|||
337 | 1 | * |
|||
338 | 1 | * @param array $members |
|||
339 | 1 | * |
|||
340 | * @return Db\Query |
||||
341 | */ |
||||
342 | public static function getQueryToUsersByMembers(array $members): Db\Query |
||||
343 | { |
||||
344 | $queryGenerator = (new \App\QueryGenerator('Users'))->setFields(['id']); |
||||
345 | $columName = $queryGenerator->getColumnName('id'); |
||||
346 | $conditions = ['or']; |
||||
347 | foreach ($members as $member) { |
||||
348 | [$type, $id] = explode(':', $member); |
||||
349 | 1 | switch ($type) { |
|||
350 | case self::MEMBER_TYPE_USERS: |
||||
351 | 1 | if (!isset($conditions[$type])) { |
|||
352 | $conditions[$type][$columName] = [(int) $id]; |
||||
353 | } else { |
||||
354 | 1 | $conditions[$type][$columName][] = (int) $id; |
|||
355 | 1 | } |
|||
356 | 1 | break; |
|||
357 | 1 | case self::MEMBER_TYPE_GROUPS: |
|||
358 | 1 | $conditions[] = [$columName => (new \App\Db\Query())->select(['userid'])->from(["condition_{$type}_{$id}_" . \App\Layout::getUniqueId() => self::getQueryToUsersByGroup((int) $id)])]; |
|||
359 | 1 | break; |
|||
360 | case self::MEMBER_TYPE_ROLES: |
||||
361 | 1 | $conditions[] = [$columName => self::getQueryToUsersByRole($id)]; |
|||
362 | break; |
||||
363 | case self::MEMBER_TYPE_ROLE_AND_SUBORDINATES: |
||||
364 | $conditions[] = [$columName => self::getQueryToUsersByRoleAndSubordinate($id)]; |
||||
365 | break; |
||||
366 | default: |
||||
367 | break; |
||||
368 | } |
||||
369 | } |
||||
370 | if (\count($conditions) <= 1) { |
||||
371 | 5788 | $conditions[] = [$columName => -1]; |
|||
372 | } |
||||
373 | 5788 | ||||
374 | 5782 | return $queryGenerator->setFields(['id'])->addNativeCondition(array_values($conditions))->createQuery(); |
|||
375 | } |
||||
376 | 20 | ||||
377 | 20 | /** |
|||
378 | 20 | * Gets query to users by group. |
|||
379 | 20 | * |
|||
380 | 20 | * @param int $groupId |
|||
381 | 20 | * @param bool $recursive |
|||
382 | 20 | * @param int $depth |
|||
383 | * |
||||
384 | 20 | * @return Db\Query |
|||
385 | 20 | */ |
|||
386 | public static function getQueryToUsersByGroup(int $groupId, bool $recursive = true, int $depth = 0): Db\Query |
||||
387 | { |
||||
388 | ++$depth; |
||||
389 | $query = (new \App\Db\Query())->select(['userid'])->from('vtiger_users2group')->where(['groupid' => $groupId]) |
||||
390 | ->union( |
||||
391 | (new \App\Db\Query())->select(['vtiger_user2role.userid']) |
||||
392 | ->from('vtiger_group2role') |
||||
393 | ->innerJoin('vtiger_user2role', 'vtiger_group2role.roleid=vtiger_user2role.roleid')->where(['groupid' => $groupId]) |
||||
394 | ) |
||||
395 | 4 | ->union( |
|||
396 | (new \App\Db\Query())->select(['vtiger_user2role.userid'])->from('vtiger_group2rs') |
||||
397 | 4 | ->innerJoin('vtiger_role', "vtiger_group2rs.roleandsubid=vtiger_role.roleid OR vtiger_role.parentrole like CONCAT('%', vtiger_group2rs.roleandsubid, '::%')") |
|||
398 | 4 | ->innerJoin('vtiger_user2role', 'vtiger_role.roleid=vtiger_user2role.roleid') |
|||
399 | ->where(['vtiger_group2rs.groupid' => $groupId]) |
||||
400 | ); |
||||
401 | if ($recursive) { |
||||
402 | if ($depth < self::GROUP_LOOP_LIMIT) { |
||||
403 | $dataReader = (new \App\Db\Query())->select(['containsgroupid'])->from('vtiger_group2grouprel')->where(['groupid' => $groupId])->createCommand()->query(); |
||||
404 | while ($containsGroupId = $dataReader->readColumn(0)) { |
||||
405 | $query->union((new \App\Db\Query())->select(['userid'])->from(["query_{$groupId}_{$containsGroupId}_{$depth}" => static::getQueryToUsersByGroup($containsGroupId, $recursive, $depth)])); |
||||
406 | } |
||||
407 | $dataReader->close(); |
||||
408 | } else { |
||||
409 | 14 | Log::error('Exceeded the recursive limit, a loop might have been created. Group ID:' . $groupId); |
|||
410 | } |
||||
411 | 14 | } |
|||
412 | 14 | return $query; |
|||
413 | } |
||||
414 | |||||
415 | /** |
||||
416 | * Gets query to users by role. |
||||
417 | * |
||||
418 | * @param string $roleId |
||||
419 | * |
||||
420 | * @return Db\Query |
||||
421 | */ |
||||
422 | 2 | public static function getQueryToUsersByRole(string $roleId): Db\Query |
|||
423 | { |
||||
424 | 2 | return (new \App\Db\Query())->select(['userid'])->from('vtiger_user2role')->where(['roleid' => $roleId]); |
|||
425 | } |
||||
426 | |||||
427 | 2 | /** |
|||
428 | 2 | * Gets query to users by role and subordinate. |
|||
429 | 2 | * |
|||
430 | 2 | * @param string $roleId |
|||
431 | 2 | * |
|||
432 | 2 | * @return Db\Query |
|||
433 | 2 | */ |
|||
434 | 2 | public static function getQueryToUsersByRoleAndSubordinate(string $roleId): Db\Query |
|||
435 | { |
||||
436 | $parentRole = static::getRoleDetail($roleId)['parentrole'] ?? '-'; |
||||
437 | return (new \App\Db\Query())->select(['vtiger_user2role.userid'])->from('vtiger_user2role') |
||||
438 | ->innerJoin('vtiger_role', 'vtiger_user2role.roleid = vtiger_role.roleid') |
||||
439 | ->where(['or', ['vtiger_role.parentrole' => $parentRole], ['like', 'vtiger_role.parentrole', "{$parentRole}::%", false]]); |
||||
440 | } |
||||
441 | |||||
442 | /** |
||||
443 | * Function to get the roles and subordinate users. |
||||
444 | 1 | * |
|||
445 | * @param string $roleId |
||||
446 | 1 | * |
|||
447 | 1 | * @return array |
|||
448 | */ |
||||
449 | public static function getUsersByRoleAndSubordinate($roleId) |
||||
450 | 1 | { |
|||
451 | 1 | if (Cache::has('getUsersByRoleAndSubordinate', $roleId)) { |
|||
452 | 1 | return Cache::get('getUsersByRoleAndSubordinate', $roleId); |
|||
453 | 1 | } |
|||
454 | 1 | $users = static::getQueryToUsersByRoleAndSubordinate($roleId)->column(); |
|||
455 | $users = array_map('intval', $users); |
||||
456 | Cache::save('getUsersByRoleAndSubordinate', $roleId, $users, Cache::LONG); |
||||
457 | |||||
458 | return $users; |
||||
459 | } |
||||
460 | |||||
461 | /** |
||||
462 | * Function to get the vtiger_role information of the specified vtiger_role. |
||||
463 | * |
||||
464 | 1 | * @param $roleId |
|||
465 | * |
||||
466 | 1 | * @return array|bool|string |
|||
467 | */ |
||||
468 | public static function getRoleDetail($roleId) |
||||
469 | 1 | { |
|||
470 | 1 | if (Cache::has('RoleDetail', $roleId)) { |
|||
471 | 1 | return Cache::get('RoleDetail', $roleId); |
|||
472 | 1 | } |
|||
473 | 1 | $row = (new Db\Query())->from('vtiger_role')->where(['roleid' => $roleId])->one(); |
|||
474 | if ($row) { |
||||
475 | $parentRoleArr = explode('::', $row['parentrole']); |
||||
476 | array_pop($parentRoleArr); |
||||
477 | $row['parentRoles'] = $parentRoleArr; |
||||
478 | $immediateParent = array_pop($parentRoleArr); |
||||
479 | $row['immediateParent'] = $immediateParent; |
||||
480 | } |
||||
481 | Cache::save('RoleDetail', $roleId, $row); |
||||
482 | return $row; |
||||
483 | 2 | } |
|||
484 | |||||
485 | 2 | /** |
|||
486 | * Function to get the role name. |
||||
487 | * |
||||
488 | 2 | * @param int $roleId |
|||
489 | 2 | * |
|||
490 | 2 | * @return string |
|||
491 | 2 | */ |
|||
492 | 1 | public static function getRoleName($roleId) |
|||
493 | 1 | { |
|||
494 | $roleInfo = static::getRoleDetail($roleId); |
||||
495 | return $roleInfo['rolename']; |
||||
496 | } |
||||
497 | |||||
498 | /** |
||||
499 | * To retreive the parent vtiger_role of the specified vtiger_role. |
||||
500 | * |
||||
501 | * @param $roleid -- The Role Id:: Type varchar |
||||
0 ignored issues
–
show
|
|||||
502 | * @param mixed $roleId |
||||
503 | * |
||||
504 | * @return parent vtiger_role array in the following format: |
||||
505 | 2 | */ |
|||
506 | 2 | public static function getParentRole($roleId) |
|||
507 | { |
||||
508 | $roleInfo = static::getRoleDetail($roleId); |
||||
509 | return $roleInfo['parentRoles']; |
||||
510 | } |
||||
511 | |||||
512 | /** |
||||
513 | * To retreive the subordinate vtiger_roles of the specified parent vtiger_role. |
||||
514 | * |
||||
515 | * @param int $roleId |
||||
516 | 2 | * |
|||
517 | * @return array |
||||
518 | 2 | */ |
|||
519 | public static function getRoleSubordinates($roleId) |
||||
520 | { |
||||
521 | 2 | if (Cache::has('getRoleSubordinates', $roleId)) { |
|||
522 | 2 | return Cache::get('getRoleSubordinates', $roleId); |
|||
523 | 2 | } |
|||
524 | 1 | $roleDetails = static::getRoleDetail($roleId); |
|||
525 | 1 | $roleSubordinates = (new \App\Db\Query()) |
|||
526 | ->select(['roleid']) |
||||
527 | ->from('vtiger_role') |
||||
528 | ->where(['like', 'parentrole', $roleDetails['parentrole'] . '::%', false]) |
||||
529 | ->column(); |
||||
530 | Cache::save('getRoleSubordinates', $roleId, $roleSubordinates, Cache::LONG); |
||||
531 | return $roleSubordinates; |
||||
532 | } |
||||
533 | |||||
534 | /** |
||||
535 | * Function to get the Profile Tab Permissions for the specified vtiger_profileid. |
||||
536 | * |
||||
537 | 2 | * @param int $profileid |
|||
538 | 2 | * |
|||
539 | 2 | * @return int[] |
|||
540 | */ |
||||
541 | 2 | public static function getProfileTabsPermission($profileid) |
|||
542 | 2 | { |
|||
543 | Log::trace('Entering getProfileTabsPermission(' . $profileid . ') method ...'); |
||||
544 | if (Cache::has('getProfileTabsPermission', $profileid)) { |
||||
545 | return Cache::get('getProfileTabsPermission', $profileid); |
||||
546 | } |
||||
547 | $profileData = (new Db\Query())->select(['tabid', 'permissions'])->from('vtiger_profile2tab')->where(['profileid' => $profileid])->createCommand()->queryAllByGroup(0); |
||||
548 | $profileData = array_map('intval', $profileData); |
||||
549 | Cache::save('getProfileTabsPermission', $profileid, $profileData); |
||||
550 | Log::trace('Exiting getProfileTabsPermission method ...'); |
||||
551 | return $profileData; |
||||
552 | 1 | } |
|||
553 | |||||
554 | 1 | /** |
|||
555 | 1 | * Function to get the Profile Global Information for the specified vtiger_profileid. |
|||
556 | 1 | * |
|||
557 | 1 | * @param int $profileid |
|||
558 | 1 | * |
|||
559 | * @return int[] |
||||
560 | 1 | */ |
|||
561 | public static function getProfileGlobalPermission($profileid) |
||||
562 | { |
||||
563 | if (Cache::has('getProfileGlobalPermission', $profileid)) { |
||||
564 | return Cache::get('getProfileGlobalPermission', $profileid); |
||||
565 | } |
||||
566 | $profileData = (new Db\Query())->select(['globalactionid', 'globalactionpermission'])->from('vtiger_profile2globalpermissions') |
||||
567 | ->where(['profileid' => $profileid])->createCommand()->queryAllByGroup(0); |
||||
568 | $profileData = array_map('intval', $profileData); |
||||
569 | Cache::save('getProfileGlobalPermission', $profileid, $profileData); |
||||
570 | 1 | return $profileData; |
|||
571 | } |
||||
572 | 1 | ||||
573 | 1 | /** |
|||
574 | 1 | * To retreive the global permission of the specifed user from the various vtiger_profiles associated with the user. |
|||
575 | 1 | * |
|||
576 | 1 | * @param int $userId |
|||
577 | * |
||||
578 | 1 | * @return int[] |
|||
579 | */ |
||||
580 | public static function getCombinedUserGlobalPermissions($userId) |
||||
581 | { |
||||
582 | if (Cache::staticHas('getCombinedUserGlobalPermissions', $userId)) { |
||||
583 | return Cache::staticGet('getCombinedUserGlobalPermissions', $userId); |
||||
584 | } |
||||
585 | $userGlobalPerrArr = []; |
||||
586 | $profArr = static::getProfilesByUser($userId); |
||||
587 | $profileId = array_shift($profArr); |
||||
588 | 1 | if ($profileId) { |
|||
589 | $userGlobalPerrArr = static::getProfileGlobalPermission($profileId); |
||||
590 | 1 | foreach ($profArr as $profileId) { |
|||
591 | $tempUserGlobalPerrArr = static::getProfileGlobalPermission($profileId); |
||||
592 | foreach ($userGlobalPerrArr as $globalActionId => $globalActionPermission) { |
||||
593 | 1 | if (1 === $globalActionPermission) { |
|||
594 | 1 | $permission = $tempUserGlobalPerrArr[$globalActionId]; |
|||
595 | 1 | if (0 === $permission) { |
|||
596 | 1 | $userGlobalPerrArr[$globalActionId] = $permission; |
|||
597 | 1 | } |
|||
598 | 1 | } |
|||
599 | } |
||||
600 | 1 | } |
|||
601 | } |
||||
602 | 1 | Cache::staticSave('getCombinedUserGlobalPermissions', $userId, $userGlobalPerrArr); |
|||
603 | 1 | return $userGlobalPerrArr; |
|||
604 | } |
||||
605 | |||||
606 | /** |
||||
607 | * To retreive the vtiger_tab permissions of the specifed user from the various vtiger_profiles associated with the user. |
||||
608 | * |
||||
609 | * @param int $userId |
||||
610 | * |
||||
611 | * @return array |
||||
612 | */ |
||||
613 | 2 | public static function getCombinedUserModulesPermissions($userId) |
|||
614 | { |
||||
615 | 2 | if (Cache::staticHas('getCombinedUserModulesPermissions', $userId)) { |
|||
616 | 2 | return Cache::staticGet('getCombinedUserModulesPermissions', $userId); |
|||
617 | 2 | } |
|||
618 | 1 | $profArr = static::getProfilesByUser($userId); |
|||
619 | 1 | $profileId = array_shift($profArr); |
|||
620 | if ($profileId) { |
||||
621 | 2 | $userTabPerrArr = static::getProfileTabsPermission($profileId); |
|||
622 | 2 | foreach ($profArr as $profileId) { |
|||
623 | $tempUserTabPerrArr = static::getProfileTabsPermission($profileId); |
||||
624 | foreach ($userTabPerrArr as $tabId => $tabPermission) { |
||||
625 | if (1 === $tabPermission) { |
||||
626 | $permission = $tempUserTabPerrArr[$tabId]; |
||||
627 | if (0 === $permission) { |
||||
628 | $userTabPerrArr[$tabId] = $permission; |
||||
629 | } |
||||
630 | } |
||||
631 | } |
||||
632 | } |
||||
633 | } |
||||
634 | $homeId = Module::getModuleId('Home'); |
||||
635 | if (!isset($userTabPerrArr[$homeId])) { |
||||
636 | 2 | $dashBoardId = Module::getModuleId('Dashboard'); |
|||
637 | $userTabPerrArr[$homeId] = $userTabPerrArr[$dashBoardId] ?? 1; |
||||
638 | } |
||||
639 | Cache::staticSave('getCombinedUserModulesPermissions', $userId, $userTabPerrArr); |
||||
640 | return $userTabPerrArr; |
||||
641 | } |
||||
642 | |||||
643 | /** |
||||
644 | * Function to get all the vtiger_tab utility action permission for the specified vtiger_profile. |
||||
645 | * |
||||
646 | * @param int $profileid |
||||
647 | * |
||||
648 | * @return array |
||||
649 | */ |
||||
650 | public static function getUtilityPermissions($profileid) |
||||
651 | { |
||||
652 | $permissions = []; |
||||
653 | $dataReader = (new Db\Query())->from('vtiger_profile2utility') |
||||
654 | ->where(['profileid' => $profileid])->createCommand()->query(); |
||||
655 | while ($row = $dataReader->read()) { |
||||
656 | $permissions[$row['tabid']][$row['activityid']] = (int) $row['permission']; |
||||
657 | } |
||||
658 | return $permissions; |
||||
659 | } |
||||
660 | |||||
661 | /** |
||||
662 | * Function to get the Profile Action Permissions for the specified vtiger_profileid. |
||||
663 | * |
||||
664 | * @param int $profileid |
||||
665 | * |
||||
666 | * @return array |
||||
667 | */ |
||||
668 | 2 | public static function getStandardPermissions($profileid) |
|||
669 | { |
||||
670 | 2 | $permissions = []; |
|||
671 | 2 | $dataReader = (new Db\Query())->from('vtiger_profile2standardpermissions') |
|||
672 | ->where(['profileid' => $profileid])->createCommand()->query(); |
||||
673 | while ($row = $dataReader->read()) { |
||||
674 | 2 | $permissions[$row['tabid']][$row['operation']] = (int) $row['permissions']; |
|||
675 | 2 | } |
|||
676 | 2 | return $permissions; |
|||
677 | 2 | } |
|||
678 | 2 | ||||
679 | 2 | /** |
|||
680 | * Function to get the Standard and Utility Profile Action Permissions for the specified vtiger_profileid. |
||||
681 | 2 | * |
|||
682 | 2 | * @param int $profileid |
|||
683 | 2 | * |
|||
684 | * @return array |
||||
685 | */ |
||||
686 | public static function getAllProfilePermissions($profileid) |
||||
687 | { |
||||
688 | if (Cache::staticHas(__METHOD__, $profileid)) { |
||||
689 | return Cache::staticGet(__METHOD__, $profileid); |
||||
690 | } |
||||
691 | $allActions = static::getStandardPermissions($profileid); |
||||
692 | $utilityActions = static::getUtilityPermissions($profileid); |
||||
693 | foreach ($utilityActions as $tabid => $utilityAction) { |
||||
694 | $actionTabs = $allActions[$tabid] ?? []; |
||||
695 | foreach ($utilityAction as $utilityId => $utilityPermission) { |
||||
696 | $actionTabs[$utilityId] = (int) $utilityPermission; |
||||
697 | } |
||||
698 | 2 | $allActions[$tabid] = $actionTabs; |
|||
699 | } |
||||
700 | 2 | Cache::staticSave(__METHOD__, $profileid, $allActions); |
|||
701 | 2 | return $allActions; |
|||
702 | 2 | } |
|||
703 | 2 | ||||
704 | 2 | /** |
|||
705 | * To retreive the vtiger_tab acion permissions of the specifed user from the various vtiger_profiles associated with the user. |
||||
706 | 2 | * |
|||
707 | * @param int $userId |
||||
708 | 2 | * |
|||
709 | 2 | * @return array |
|||
710 | */ |
||||
711 | 2 | public static function getCombinedUserActionsPermissions($userId) |
|||
712 | { |
||||
713 | $profiles = static::getProfilesByUser($userId); |
||||
714 | $actionPermissions = []; |
||||
715 | if (isset($profiles[0])) { |
||||
716 | $actionPermissions = static::getAllProfilePermissions($profiles[0]); |
||||
717 | unset($profiles[0]); |
||||
718 | } |
||||
719 | if (\is_array($profiles)) { |
||||
0 ignored issues
–
show
|
|||||
720 | foreach ($profiles as $profileId) { |
||||
721 | $tempActionPerrArr = static::getAllProfilePermissions($profileId); |
||||
722 | foreach ($actionPermissions as $tabId => $permissionsInModule) { |
||||
723 | foreach ($permissionsInModule as $actionId => $permission) { |
||||
724 | if (1 == $permission) { |
||||
725 | $nowPermission = $tempActionPerrArr[$tabId][$actionId]; |
||||
726 | if (0 == $nowPermission && '' != $nowPermission) { |
||||
727 | $actionPermissions[$tabId][$actionId] = $nowPermission; |
||||
728 | } |
||||
729 | } |
||||
730 | 2 | } |
|||
731 | 2 | } |
|||
732 | 2 | } |
|||
733 | 1 | } |
|||
734 | return $actionPermissions; |
||||
735 | } |
||||
736 | 2 | ||||
737 | 2 | protected static $dataShareStructure = [ |
|||
738 | 'role2role' => ['vtiger_datashare_role2role', 'to_roleid'], |
||||
739 | 'role2rs' => ['vtiger_datashare_role2rs', 'to_roleandsubid'], |
||||
740 | 'role2group' => ['vtiger_datashare_role2group', 'to_groupid'], |
||||
741 | 'role2user' => ['vtiger_datashare_role2us', 'to_userid'], |
||||
742 | 'rs2role' => ['vtiger_datashare_rs2role', 'to_roleid'], |
||||
743 | 'rs2rs' => ['vtiger_datashare_rs2rs', 'to_roleandsubid'], |
||||
744 | 'rs2group' => ['vtiger_datashare_rs2grp', 'to_groupid'], |
||||
745 | 'rs2user' => ['vtiger_datashare_rs2us', 'to_userid'], |
||||
746 | 'group2role' => ['vtiger_datashare_grp2role', 'to_roleid'], |
||||
747 | 'group2rs' => ['vtiger_datashare_grp2rs', 'to_roleandsubid'], |
||||
748 | 'group2user' => ['vtiger_datashare_grp2us', 'to_userid'], |
||||
749 | 'group2group' => ['vtiger_datashare_grp2grp', 'to_groupid'], |
||||
750 | 'user2user' => ['vtiger_datashare_us2us', 'to_userid'], |
||||
751 | 'user2group' => ['vtiger_datashare_us2grp', 'to_groupid'], |
||||
752 | 'user2role' => ['vtiger_datashare_us2role', 'to_roleid'], |
||||
753 | 'user2rs' => ['vtiger_datashare_us2rs', 'to_roleandsubid'], |
||||
754 | ]; |
||||
755 | |||||
756 | 2 | /** |
|||
757 | 2 | * Get data share. |
|||
758 | 1 | * |
|||
759 | * @param int $tabId |
||||
760 | 2 | * @param int $roleId |
|||
761 | 2 | * @param mixed $type |
|||
762 | * @param mixed $data |
||||
763 | * |
||||
764 | * @return array |
||||
765 | */ |
||||
766 | public static function getDatashare($type, $tabId, $data) |
||||
767 | { |
||||
768 | $cacheKey = "$type|$tabId|" . (\is_array($data) ? implode(',', $data) : $data); |
||||
769 | if (Cache::staticHas('getDatashare', $cacheKey)) { |
||||
770 | return Cache::staticGet('getDatashare', $cacheKey); |
||||
771 | } |
||||
772 | $structure = static::$dataShareStructure[$type]; |
||||
773 | $query = (new \App\Db\Query())->select([$structure[0] . '.*'])->from($structure[0]) |
||||
774 | ->innerJoin('vtiger_datashare_module_rel', "$structure[0].shareid = vtiger_datashare_module_rel.shareid") |
||||
775 | ->where(['vtiger_datashare_module_rel.tabid' => $tabId]); |
||||
776 | if ($data) { |
||||
777 | $query->andWhere([$structure[1] => $data]); |
||||
778 | } |
||||
779 | $rows = $query->all(); |
||||
780 | Cache::staticSave('getDatashare', $cacheKey, $rows); |
||||
781 | 2 | return $rows; |
|||
782 | 2 | } |
|||
783 | |||||
784 | /** |
||||
785 | * Gives an array which contains the information for what all roles, groups and user data is to be shared with the spcified user for the specified module. |
||||
786 | * |
||||
787 | * @param string $module module name |
||||
788 | * @param int $userid user id |
||||
789 | * @param array $defOrgShare default organization sharing permission array |
||||
790 | * @param string $currentUserRoles roleid |
||||
791 | * @param string $parentRoles parent roles |
||||
792 | * @param int $currentUserGroups user id |
||||
793 | * |
||||
794 | * @return array array which contains the id of roles,group and users data shared with specifed user for the specified module |
||||
795 | */ |
||||
796 | public static function getUserModuleSharingObjects($module, $userid, $defOrgShare, $currentUserRoles, $parentRoles, $currentUserGroups) |
||||
797 | { |
||||
798 | $modTabId = Module::getModuleId($module); |
||||
799 | $modShareWritePermission = $modShareReadPermission = ['ROLE' => [], 'GROUP' => []]; |
||||
800 | 2 | $modDefOrgShare = null; |
|||
801 | if (isset($defOrgShare[$modTabId])) { |
||||
802 | $modDefOrgShare = $defOrgShare[$modTabId]; |
||||
803 | } |
||||
804 | $shareIdMembers = []; |
||||
805 | //If Sharing of leads is Private |
||||
806 | if (3 === $modDefOrgShare || 0 === $modDefOrgShare) { |
||||
807 | $roleWritePer = $roleWritePer = $grpReadPer = $grpWritePer = $roleReadPer = []; |
||||
0 ignored issues
–
show
|
|||||
808 | //Retreiving from vtiger_role to vtiger_role |
||||
809 | foreach (static::getDatashare('role2role', $modTabId, $currentUserRoles) as $row) { |
||||
810 | $shareRoleId = $row['share_roleid']; |
||||
811 | $shareIdRoles = []; |
||||
812 | $shareIdRoles[] = $shareRoleId; |
||||
813 | $shareIdMembers[$row['shareid']] = ['ROLE' => $shareIdRoles]; |
||||
814 | if (1 === (int) $row['permission']) { |
||||
815 | if (3 === $modDefOrgShare && !isset($roleReadPer[$shareRoleId])) { |
||||
816 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
817 | } |
||||
818 | if (!isset($roleWritePer[$shareRoleId])) { |
||||
819 | $roleWritePer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
820 | 2 | } |
|||
821 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
822 | if (!isset($roleReadPer[$shareRoleId])) { |
||||
823 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
824 | } |
||||
825 | } |
||||
826 | } |
||||
827 | //Retreiving from role to rs |
||||
828 | $parRoleList = []; |
||||
829 | if (\is_array($parentRoles)) { |
||||
0 ignored issues
–
show
|
|||||
830 | foreach ($parentRoles as $par_role_id) { |
||||
831 | $parRoleList[] = $par_role_id; |
||||
832 | } |
||||
833 | } |
||||
834 | $parRoleList[] = $currentUserRoles; |
||||
835 | foreach (static::getDatashare('role2rs', $modTabId, $parRoleList) as $row) { |
||||
836 | $shareRoleId = $row['share_roleid']; |
||||
837 | $shareIdRoles = []; |
||||
838 | $shareIdRoles[] = $shareRoleId; |
||||
839 | $shareIdMembers[$row['shareid']] = ['ROLE' => $shareIdRoles]; |
||||
840 | 2 | if (1 === (int) $row['permission']) { |
|||
841 | if (3 === $modDefOrgShare && !isset($roleReadPer[$shareRoleId])) { |
||||
842 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
843 | } |
||||
844 | if (!isset($roleWritePer[$shareRoleId])) { |
||||
845 | $roleWritePer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
846 | } |
||||
847 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
848 | if (!isset($roleReadPer[$shareRoleId])) { |
||||
849 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
850 | } |
||||
851 | } |
||||
852 | } |
||||
853 | //Get roles from Role2Grp |
||||
854 | $groupList = $currentUserGroups; |
||||
855 | if (empty($groupList)) { |
||||
856 | $groupList = [0]; |
||||
857 | } |
||||
858 | if ($groupList) { |
||||
859 | foreach (static::getDatashare('role2group', $modTabId, $groupList) as $row) { |
||||
860 | 2 | $shareRoleId = $row['share_roleid']; |
|||
861 | $shareIdRoles = []; |
||||
862 | $shareIdRoles[] = $shareRoleId; |
||||
863 | $shareIdMembers[$row['shareid']] = ['ROLE' => $shareIdRoles]; |
||||
864 | if (1 === (int) $row['permission']) { |
||||
865 | if (3 === $modDefOrgShare && !isset($roleReadPer[$shareRoleId])) { |
||||
866 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
867 | } |
||||
868 | if (!isset($roleWritePer[$shareRoleId])) { |
||||
869 | $roleWritePer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
870 | } |
||||
871 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
872 | if (!isset($roleReadPer[$shareRoleId])) { |
||||
873 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
874 | } |
||||
875 | } |
||||
876 | } |
||||
877 | } |
||||
878 | //Get roles from Role2Us |
||||
879 | 2 | if (!empty($userid)) { |
|||
880 | 2 | foreach (static::getDatashare('role2user', $modTabId, $userid) as $row) { |
|||
881 | $shareRoleId = $row['share_roleid']; |
||||
882 | $shareIdRoles = []; |
||||
883 | 2 | $shareIdRoles[] = $shareRoleId; |
|||
884 | $shareIdMembers[$row['shareid']] = ['ROLE' => $shareIdRoles]; |
||||
885 | if (1 === (int) $row['permission']) { |
||||
886 | if (3 === $modDefOrgShare && !isset($roleReadPer[$shareRoleId])) { |
||||
887 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
888 | } |
||||
889 | if (!isset($roleWritePer[$shareRoleId])) { |
||||
890 | $roleWritePer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
891 | } |
||||
892 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare && !isset($roleReadPer[$shareRoleId])) { |
||||
893 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
894 | } |
||||
895 | } |
||||
896 | } |
||||
897 | //Retreiving from rs to vtiger_role |
||||
898 | foreach (static::getDatashare('rs2role', $modTabId, $currentUserRoles) as $row) { |
||||
899 | $shareRoleIds = static::getRoleSubordinates($row['share_roleandsubid']); |
||||
900 | $shareRoleIds[] = $row['share_roleandsubid']; |
||||
901 | foreach ($shareRoleIds as $shareRoleId) { |
||||
902 | if (1 === (int) $row['permission']) { |
||||
903 | if (3 === $modDefOrgShare && !isset($roleReadPer[$shareRoleId])) { |
||||
904 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
905 | } |
||||
906 | if (!isset($roleWritePer[$shareRoleId])) { |
||||
907 | $roleWritePer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
908 | } |
||||
909 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
910 | if (!isset($roleReadPer[$shareRoleId])) { |
||||
911 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
912 | } |
||||
913 | } |
||||
914 | } |
||||
915 | $shareIdMembers[$row['shareid']] = ['ROLE' => $shareRoleIds]; |
||||
916 | } |
||||
917 | //Retreiving from rs to rs |
||||
918 | foreach (static::getDatashare('rs2rs', $modTabId, $parRoleList) as $row) { |
||||
919 | $shareRoleIds = static::getRoleSubordinates($row['share_roleandsubid']); |
||||
920 | $shareRoleIds[] = $row['share_roleandsubid']; |
||||
921 | foreach ($shareRoleIds as $shareRoleId) { |
||||
922 | if (1 === (int) $row['permission']) { |
||||
923 | if (3 === $modDefOrgShare && !isset($roleReadPer[$shareRoleId])) { |
||||
924 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
925 | } |
||||
926 | if (!isset($roleWritePer[$shareRoleId])) { |
||||
927 | $roleWritePer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
928 | } |
||||
929 | 2 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
|||
930 | if (!isset($roleReadPer[$shareRoleId])) { |
||||
931 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
932 | } |
||||
933 | } |
||||
934 | } |
||||
935 | $shareIdMembers[$row['shareid']] = ['ROLE' => $shareRoleIds]; |
||||
936 | } |
||||
937 | //Get roles from Rs2Grp |
||||
938 | foreach (static::getDatashare('rs2group', $modTabId, $groupList) as $row) { |
||||
939 | $shareRoleIds = static::getRoleSubordinates($row['share_roleandsubid']); |
||||
940 | $shareRoleIds[] = $row['share_roleandsubid']; |
||||
941 | foreach ($shareRoleIds as $shareRoleId) { |
||||
942 | if (1 === (int) $row['permission']) { |
||||
943 | if (3 === $modDefOrgShare && !isset($roleReadPer[$shareRoleId])) { |
||||
944 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
945 | } |
||||
946 | if (!isset($roleWritePer[$shareRoleId])) { |
||||
947 | $roleWritePer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
948 | } |
||||
949 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
950 | if (!isset($roleReadPer[$shareRoleId])) { |
||||
951 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
952 | } |
||||
953 | } |
||||
954 | } |
||||
955 | $shareIdMembers[$row['shareid']] = ['ROLE' => $shareRoleIds]; |
||||
956 | } |
||||
957 | //Get roles from Rs2Us |
||||
958 | foreach (static::getDatashare('rs2user', $modTabId, $userid) as $row) { |
||||
959 | $shareRoleIds = static::getRoleSubordinates($row['share_roleandsubid']); |
||||
960 | $shareRoleIds[] = $row['share_roleandsubid']; |
||||
961 | foreach ($shareRoleIds as $shareRoleId) { |
||||
962 | if (1 === (int) $row['permission']) { |
||||
963 | if (3 === $modDefOrgShare && !isset($roleReadPer[$shareRoleId])) { |
||||
964 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
965 | } |
||||
966 | if (!isset($roleWritePer[$shareRoleId])) { |
||||
967 | $roleWritePer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
968 | } |
||||
969 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
970 | if (!isset($roleReadPer[$shareRoleId])) { |
||||
971 | $roleReadPer[$shareRoleId] = static::getUsersByRole($shareRoleId); |
||||
972 | } |
||||
973 | } |
||||
974 | } |
||||
975 | 2 | $shareIdMembers[$row['shareid']] = ['ROLE' => $shareRoleIds]; |
|||
976 | } |
||||
977 | $modShareReadPermission['ROLE'] = $roleReadPer; |
||||
978 | $modShareWritePermission['ROLE'] = $roleWritePer; |
||||
979 | |||||
980 | //Retreiving from the grp2role sharing |
||||
981 | foreach (static::getDatashare('group2role', $modTabId, $currentUserRoles) as $row) { |
||||
982 | $shareGrpId = (int) $row['share_groupid']; |
||||
983 | $shareIdGrps = []; |
||||
984 | $shareIdGrps[] = $shareGrpId; |
||||
985 | if (1 === (int) $row['permission']) { |
||||
986 | if (3 === $modDefOrgShare && !isset($grpReadPer[$shareGrpId])) { |
||||
987 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
988 | $grpReadPer[$shareGrpId] = $usersByGroup['users']; |
||||
989 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
990 | if (!isset($grpReadPer[$subgrpid])) { |
||||
991 | $grpReadPer[$subgrpid] = $subgrpusers; |
||||
992 | } |
||||
993 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
994 | $shareIdGrps[] = $subgrpid; |
||||
995 | } |
||||
996 | } |
||||
997 | } |
||||
998 | if (!isset($grpWritePer[$shareGrpId])) { |
||||
999 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
1000 | $grpWritePer[$shareGrpId] = $usersByGroup['users']; |
||||
1001 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1002 | if (!isset($grpWritePer[$subgrpid])) { |
||||
1003 | $grpWritePer[$subgrpid] = $subgrpusers; |
||||
1004 | } |
||||
1005 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
1006 | $shareIdGrps[] = $subgrpid; |
||||
1007 | } |
||||
1008 | } |
||||
1009 | } |
||||
1010 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
1011 | if (!isset($grpReadPer[$shareGrpId])) { |
||||
1012 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
1013 | $grpReadPer[$shareGrpId] = $usersByGroup['users']; |
||||
1014 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1015 | if (!isset($grpReadPer[$subgrpid])) { |
||||
1016 | $grpReadPer[$subgrpid] = $subgrpusers; |
||||
1017 | } |
||||
1018 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
1019 | $shareIdGrps[] = $subgrpid; |
||||
1020 | } |
||||
1021 | 2 | } |
|||
1022 | } |
||||
1023 | } |
||||
1024 | $shareIdMembers[$row['shareid']] = ['GROUP' => $shareIdGrps]; |
||||
1025 | } |
||||
1026 | //Retreiving from the grp2rs sharing |
||||
1027 | foreach (static::getDatashare('group2rs', $modTabId, $parRoleList) as $row) { |
||||
1028 | $shareGrpId = (int) $row['share_groupid']; |
||||
1029 | $shareIdGrps = []; |
||||
1030 | $shareIdGrps[] = $shareGrpId; |
||||
1031 | if (1 === (int) $row['permission']) { |
||||
1032 | if (3 === $modDefOrgShare && !isset($grpReadPer[$shareGrpId])) { |
||||
1033 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
1034 | $grpReadPer[$shareGrpId] = $usersByGroup['users']; |
||||
1035 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1036 | if (!isset($grpReadPer[$subgrpid])) { |
||||
1037 | $grpReadPer[$subgrpid] = $subgrpusers; |
||||
1038 | } |
||||
1039 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
1040 | $shareIdGrps[] = $subgrpid; |
||||
1041 | } |
||||
1042 | } |
||||
1043 | } |
||||
1044 | if (!isset($grpWritePer[$shareGrpId])) { |
||||
1045 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
1046 | $grpWritePer[$shareGrpId] = $usersByGroup['users']; |
||||
1047 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1048 | if (!isset($grpWritePer[$subgrpid])) { |
||||
1049 | $grpWritePer[$subgrpid] = $subgrpusers; |
||||
1050 | } |
||||
1051 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
1052 | $shareIdGrps[] = $subgrpid; |
||||
1053 | } |
||||
1054 | } |
||||
1055 | } |
||||
1056 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
1057 | if (!isset($grpReadPer[$shareGrpId])) { |
||||
1058 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
1059 | $grpReadPer[$shareGrpId] = $usersByGroup['users']; |
||||
1060 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1061 | if (!isset($grpReadPer[$subgrpid])) { |
||||
1062 | $grpReadPer[$subgrpid] = $subgrpusers; |
||||
1063 | } |
||||
1064 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
1065 | $shareIdGrps[] = $subgrpid; |
||||
1066 | } |
||||
1067 | 2 | } |
|||
1068 | } |
||||
1069 | } |
||||
1070 | $shareIdMembers[$row['shareid']] = ['GROUP' => $shareIdGrps]; |
||||
1071 | } |
||||
1072 | //Retreiving from the grp2us sharing |
||||
1073 | foreach (static::getDatashare('group2user', $modTabId, $userid) as $row) { |
||||
1074 | $shareGrpId = (int) $row['share_groupid']; |
||||
1075 | $shareIdGrps = []; |
||||
1076 | $shareIdGrps[] = $shareGrpId; |
||||
1077 | if (1 === (int) $row['permission']) { |
||||
1078 | if (3 === $modDefOrgShare && !isset($grpReadPer[$shareGrpId])) { |
||||
1079 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
1080 | $grpReadPer[$shareGrpId] = $usersByGroup['users']; |
||||
1081 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1082 | if (!isset($grpReadPer[$subgrpid])) { |
||||
1083 | $grpReadPer[$subgrpid] = $subgrpusers; |
||||
1084 | } |
||||
1085 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
1086 | 2 | $shareIdGrps[] = $subgrpid; |
|||
1087 | } |
||||
1088 | } |
||||
1089 | } |
||||
1090 | if (!isset($grpWritePer[$shareGrpId])) { |
||||
1091 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
1092 | $grpWritePer[$shareGrpId] = $usersByGroup['users']; |
||||
1093 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1094 | if (!isset($grpWritePer[$subgrpid])) { |
||||
1095 | $grpWritePer[$subgrpid] = $subgrpusers; |
||||
1096 | } |
||||
1097 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
1098 | $shareIdGrps[] = $subgrpid; |
||||
1099 | } |
||||
1100 | } |
||||
1101 | } |
||||
1102 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
1103 | if (!isset($grpReadPer[$shareGrpId])) { |
||||
1104 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
1105 | 2 | $grpReadPer[$shareGrpId] = $usersByGroup['users']; |
|||
1106 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1107 | if (!isset($grpReadPer[$subgrpid])) { |
||||
1108 | $grpReadPer[$subgrpid] = $subgrpusers; |
||||
1109 | } |
||||
1110 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
1111 | $shareIdGrps[] = $subgrpid; |
||||
1112 | } |
||||
1113 | } |
||||
1114 | } |
||||
1115 | } |
||||
1116 | $shareIdMembers[$row['shareid']] = ['GROUP' => $shareIdGrps]; |
||||
1117 | } |
||||
1118 | //Retreiving from the grp2grp sharing |
||||
1119 | foreach (static::getDatashare('group2group', $modTabId, $groupList) as $row) { |
||||
1120 | $shareGrpId = (int) $row['share_groupid']; |
||||
1121 | $shareIdGrps = []; |
||||
1122 | $shareIdGrps[] = $shareGrpId; |
||||
1123 | if (1 === (int) $row['permission']) { |
||||
1124 | if (3 === $modDefOrgShare && !isset($grpReadPer[$shareGrpId])) { |
||||
1125 | 2 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
|||
1126 | $grpReadPer[$shareGrpId] = $usersByGroup['users']; |
||||
1127 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1128 | if (!isset($grpReadPer[$subgrpid])) { |
||||
1129 | $grpReadPer[$subgrpid] = $subgrpusers; |
||||
1130 | } |
||||
1131 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
1132 | $shareIdGrps[] = $subgrpid; |
||||
1133 | } |
||||
1134 | } |
||||
1135 | } |
||||
1136 | if (!isset($grpWritePer[$shareGrpId])) { |
||||
1137 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
1138 | $grpWritePer[$shareGrpId] = $usersByGroup['users']; |
||||
1139 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1140 | if (!isset($grpWritePer[$subgrpid])) { |
||||
1141 | $grpWritePer[$subgrpid] = $subgrpusers; |
||||
1142 | } |
||||
1143 | 2 | if (!\in_array($subgrpid, $shareIdGrps)) { |
|||
1144 | 2 | $shareIdGrps[] = $subgrpid; |
|||
1145 | } |
||||
1146 | } |
||||
1147 | 2 | } |
|||
1148 | 2 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
|||
1149 | 2 | if (!isset($grpReadPer[$shareGrpId])) { |
|||
1150 | $usersByGroup = static::getUsersByGroup($shareGrpId, true); |
||||
1151 | $grpReadPer[$shareGrpId] = $usersByGroup['users']; |
||||
1152 | foreach ($usersByGroup['subGroups'] as $subgrpid => $subgrpusers) { |
||||
1153 | if (!isset($grpReadPer[$subgrpid])) { |
||||
1154 | $grpReadPer[$subgrpid] = $subgrpusers; |
||||
1155 | } |
||||
1156 | if (!\in_array($subgrpid, $shareIdGrps)) { |
||||
1157 | $shareIdGrps[] = $subgrpid; |
||||
1158 | } |
||||
1159 | } |
||||
1160 | 5778 | } |
|||
1161 | } |
||||
1162 | 5778 | $shareIdMembers[$row['shareid']] = ['GROUP' => $shareIdGrps]; |
|||
1163 | 5767 | } |
|||
1164 | //Get roles from Us2Us |
||||
1165 | 14 | foreach (static::getDatashare('user2user', $modTabId, $userid) as $row) { |
|||
1166 | 14 | $shareUserId = (int) $row['share_userid']; |
|||
1167 | 14 | $shareIdUsers = []; |
|||
1168 | 14 | $shareIdUsers[] = $shareUserId; |
|||
1169 | 14 | if (1 === (int) $row['permission']) { |
|||
1170 | 14 | if (3 === $modDefOrgShare && !isset($grpReadPer[$shareUserId])) { |
|||
1171 | 14 | $grpReadPer[$shareUserId] = [$shareUserId]; |
|||
1172 | 14 | } |
|||
1173 | 14 | if (!isset($grpWritePer[$shareUserId])) { |
|||
1174 | 13 | $grpWritePer[$shareUserId] = [$shareUserId]; |
|||
1175 | } |
||||
1176 | 14 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
|||
1177 | if (!isset($grpReadPer[$shareUserId])) { |
||||
1178 | $grpReadPer[$shareUserId] = [$shareUserId]; |
||||
1179 | 14 | } |
|||
1180 | } |
||||
1181 | 14 | $shareIdMembers[$row['shareid']] = ['GROUP' => $shareIdUsers]; |
|||
1182 | } |
||||
1183 | //Get roles from Us2Grp |
||||
1184 | foreach (static::getDatashare('user2group', $modTabId, $groupList) as $row) { |
||||
1185 | $shareUserId = (int) $row['share_userid']; |
||||
1186 | $shareIdUsers = []; |
||||
1187 | $shareIdUsers[] = $shareUserId; |
||||
1188 | if (1 === (int) $row['permission']) { |
||||
1189 | if (3 === $modDefOrgShare && !isset($grpReadPer[$shareUserId])) { |
||||
1190 | $grpReadPer[$shareUserId] = [$shareUserId]; |
||||
1191 | } |
||||
1192 | 13 | if (!isset($grpWritePer[$shareUserId])) { |
|||
1193 | $grpWritePer[$shareUserId] = [$shareUserId]; |
||||
1194 | 13 | } |
|||
1195 | 13 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
|||
1196 | 13 | if (!isset($grpReadPer[$shareUserId])) { |
|||
1197 | 13 | $grpReadPer[$shareUserId] = [$shareUserId]; |
|||
1198 | } |
||||
1199 | } |
||||
1200 | $shareIdMembers[$row['shareid']] = ['GROUP' => $shareIdUsers]; |
||||
1201 | } |
||||
1202 | //Get roles from Us2role |
||||
1203 | 13 | foreach (static::getDatashare('user2role', $modTabId, $currentUserRoles) as $row) { |
|||
1204 | $shareUserId = (int) $row['share_userid']; |
||||
1205 | $shareIdUsers = []; |
||||
1206 | $shareIdUsers[] = $shareUserId; |
||||
1207 | if (1 === (int) $row['permission']) { |
||||
1208 | if (3 === $modDefOrgShare && !isset($grpReadPer[$shareUserId])) { |
||||
1209 | $grpReadPer[$shareUserId] = [$shareUserId]; |
||||
1210 | } |
||||
1211 | if (!isset($grpWritePer[$shareUserId])) { |
||||
1212 | $grpWritePer[$shareUserId] = [$shareUserId]; |
||||
1213 | } |
||||
1214 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
1215 | if (!isset($grpReadPer[$shareUserId])) { |
||||
1216 | $grpReadPer[$shareUserId] = [$shareUserId]; |
||||
1217 | } |
||||
1218 | } |
||||
1219 | |||||
1220 | $shareIdMembers[$row['shareid']] = ['GROUP' => $shareIdUsers]; |
||||
1221 | } |
||||
1222 | //Get roles from Us2rs |
||||
1223 | foreach (static::getDatashare('user2rs', $modTabId, $parRoleList) as $row) { |
||||
1224 | $shareUserId = (int) $row['share_userid']; |
||||
1225 | $shareIdUsers = []; |
||||
1226 | $shareIdUsers[] = $shareUserId; |
||||
1227 | if (1 === (int) $row['permission']) { |
||||
1228 | if (3 === $modDefOrgShare && !isset($grpReadPer[$shareUserId])) { |
||||
1229 | $grpReadPer[$shareUserId] = [$shareUserId]; |
||||
1230 | } |
||||
1231 | if (!isset($grpWritePer[$shareUserId])) { |
||||
1232 | $grpWritePer[$shareUserId] = [$shareUserId]; |
||||
1233 | } |
||||
1234 | } elseif (0 === (int) $row['permission'] && 3 === $modDefOrgShare) { |
||||
1235 | if (!isset($grpReadPer[$shareUserId])) { |
||||
1236 | $grpReadPer[$shareUserId] = [$shareUserId]; |
||||
1237 | } |
||||
1238 | } |
||||
1239 | $shareIdMembers[$row['shareid']] = ['GROUP' => $shareIdUsers]; |
||||
1240 | } |
||||
1241 | $modShareReadPermission['GROUP'] = $grpReadPer; |
||||
1242 | $modShareWritePermission['GROUP'] = $grpWritePer; |
||||
1243 | } |
||||
1244 | return [ |
||||
1245 | 'read' => $modShareReadPermission, |
||||
1246 | 'write' => $modShareWritePermission, |
||||
1247 | 'sharingrules' => $shareIdMembers, |
||||
1248 | ]; |
||||
1249 | } |
||||
1250 | |||||
1251 | /** |
||||
1252 | * Get all groups by user id. |
||||
1253 | * |
||||
1254 | * @param int $userId |
||||
1255 | * |
||||
1256 | * @return int[] |
||||
1257 | */ |
||||
1258 | public static function getAllGroupsByUser($userId) |
||||
1259 | { |
||||
1260 | if (Cache::has('getAllGroupsByUser', $userId)) { |
||||
1261 | return Cache::get('getAllGroupsByUser', $userId); |
||||
1262 | } |
||||
1263 | $userGroups = static::getUserGroups($userId); |
||||
1264 | $userRole = static::getRoleByUsers($userId); |
||||
1265 | $roleGroups = (new \App\Db\Query())->select(['groupid'])->from('vtiger_group2role')->where(['roleid' => $userRole])->column(); |
||||
1266 | $roles = static::getParentRole($userRole); |
||||
1267 | $roles[] = $userRole; |
||||
1268 | $rsGroups = (new \App\Db\Query())->select(['groupid'])->from('vtiger_group2rs')->where(['roleandsubid' => $roles])->column(); |
||||
1269 | $allGroups = array_unique(array_merge($userGroups, $roleGroups, $rsGroups)); |
||||
1270 | $parentGroups = []; |
||||
1271 | foreach ($allGroups as $groupId) { |
||||
1272 | $parentGroups = array_merge($parentGroups, static::getParentGroups($groupId)); |
||||
1273 | } |
||||
1274 | if ($parentGroups) { |
||||
1275 | $allGroups = array_unique(array_merge($allGroups, $parentGroups)); |
||||
1276 | } |
||||
1277 | Cache::save('getAllGroupsByUser', $userId, $allGroups, Cache::LONG); |
||||
1278 | |||||
1279 | return $allGroups; |
||||
1280 | } |
||||
1281 | |||||
1282 | /** |
||||
1283 | * Get parent grioups by group id. |
||||
1284 | * |
||||
1285 | * @param int $groupId |
||||
1286 | * @param int $i |
||||
1287 | * |
||||
1288 | * @return int[] |
||||
1289 | */ |
||||
1290 | public static function getParentGroups($groupId, $i = 0) |
||||
1291 | { |
||||
1292 | $groups = []; |
||||
1293 | 4 | if ($i < 10) { |
|||
1294 | $dataReader = (new \App\Db\Query())->select(['groupid'])->from('vtiger_group2grouprel')->where(['containsgroupid' => $groupId])->createCommand()->query(); |
||||
1295 | 4 | while ($parentGroupId = $dataReader->readColumn(0)) { |
|||
1296 | 4 | $groups = array_merge($groups, [$parentGroupId], static::getParentGroups($parentGroupId, $i++)); |
|||
1297 | 4 | } |
|||
1298 | 4 | } else { |
|||
1299 | 4 | Log::warning('Exceeded the recursive limit, a loop might have been created. Group ID:' . $groupId); |
|||
1300 | 4 | } |
|||
1301 | 4 | return $groups; |
|||
1302 | 4 | } |
|||
1303 | |||||
1304 | 4 | /** |
|||
1305 | 4 | * Creates a query to all groups where the user is a member.. |
|||
1306 | * |
||||
1307 | * @param int $userId |
||||
1308 | 4 | * |
|||
1309 | * @return Db\Query |
||||
1310 | 4 | */ |
|||
1311 | 4 | public static function getQueryToGroupsByUserId(int $userId): Db\Query |
|||
1312 | { |
||||
1313 | return (new \App\Db\Query())->select(['groupid'])->from('vtiger_groups')->where(['groupid' => self::getAllGroupsByUser($userId)]); |
||||
1314 | } |
||||
1315 | |||||
1316 | /** |
||||
1317 | * Returns the leaders of the groups where the user is a member. |
||||
1318 | 1 | * |
|||
1319 | * @param int $userId |
||||
1320 | 1 | * |
|||
1321 | 1 | * @return array |
|||
1322 | */ |
||||
1323 | public static function getLeadersGroupByUserId(int $userId): array |
||||
1324 | { |
||||
1325 | $db = \App\Db::getInstance(); |
||||
1326 | $query = self::getQueryToGroupsByUserId($userId)->andWhere(['<>', 'parentid', 0])->andWhere(['not', ['parentid' => null]]); |
||||
1327 | $member = new \yii\db\Expression('CASE WHEN vtiger_users.id IS NOT NULL THEN CONCAT(' . $db->quoteValue(self::MEMBER_TYPE_USERS) . ',\':\', parentid) ELSE CONCAT(' . $db->quoteValue(self::MEMBER_TYPE_GROUPS) . ',\':\', parentid) END'); |
||||
1328 | $query->select(['groupid', 'member' => $member])->leftJoin('vtiger_users', 'vtiger_groups.parentid=vtiger_users.id'); |
||||
1329 | 1 | ||||
1330 | return $query->createCommand()->queryAllByGroup(0); |
||||
1331 | 1 | } |
|||
1332 | 1 | ||||
1333 | 1 | /** |
|||
1334 | 1 | * Returns groups whose leader is the user. |
|||
1335 | 1 | * |
|||
1336 | 1 | * @param int $userId |
|||
1337 | 1 | * |
|||
1338 | * @return array |
||||
1339 | */ |
||||
1340 | public static function getGroupsWhereUserIsLeader(int $userId): array |
||||
1341 | { |
||||
1342 | return (new \App\Db\Query())->select(['groupid'])->from('vtiger_groups')->where(['or', ['parentid' => $userId], ['parentid' => self::getQueryToGroupsByUserId($userId)]])->column(); |
||||
1343 | } |
||||
1344 | 1 | ||||
1345 | 1 | /** |
|||
1346 | 1 | * Tables to sharing rules. |
|||
1347 | * |
||||
1348 | * @var array |
||||
1349 | */ |
||||
1350 | private static $shareRulesTables = [ |
||||
1351 | 'US::GRP' => 'vtiger_datashare_us2grp', |
||||
1352 | 'US::ROLE' => 'vtiger_datashare_us2role', |
||||
1353 | 1 | 'US::RS' => 'vtiger_datashare_us2rs', |
|||
1354 | 1 | 'US::US' => 'vtiger_datashare_us2us', |
|||
1355 | 1 | 'GRP::GRP' => 'vtiger_datashare_grp2grp', |
|||
1356 | 1 | 'GRP::ROLE' => 'vtiger_datashare_grp2role', |
|||
1357 | 'GRP::RS' => 'vtiger_datashare_grp2rs', |
||||
1358 | 'GRP::US' => 'vtiger_datashare_grp2us', |
||||
1359 | 'ROLE::GRP' => 'vtiger_datashare_role2group', |
||||
1360 | 'ROLE::ROLE' => 'vtiger_datashare_role2role', |
||||
1361 | 'ROLE::RS' => 'vtiger_datashare_role2rs', |
||||
1362 | 'ROLE::US' => 'vtiger_datashare_role2us', |
||||
1363 | 'RS::GRP' => 'vtiger_datashare_rs2grp', |
||||
1364 | 1 | 'RS::ROLE' => 'vtiger_datashare_rs2role', |
|||
1365 | 1 | 'RS::RS' => 'vtiger_datashare_rs2rs', |
|||
1366 | 'RS::US' => 'vtiger_datashare_rs2us', |
||||
1367 | ]; |
||||
1368 | |||||
1369 | /** |
||||
1370 | * List tables where sharing rules are save for users, groups and roles. |
||||
1371 | * |
||||
1372 | * @var array |
||||
1373 | */ |
||||
1374 | private static $shareRulesTablesIndex = [ |
||||
1375 | 'Users' => [ |
||||
1376 | 'vtiger_datashare_us2us' => 'share_userid::to_userid', |
||||
1377 | 'vtiger_datashare_us2grp' => 'share_userid', |
||||
1378 | 'vtiger_datashare_us2role' => 'share_userid', |
||||
1379 | 'vtiger_datashare_us2rs' => 'share_userid', |
||||
1380 | 'vtiger_datashare_grp2us' => 'to_userid', |
||||
1381 | 'vtiger_datashare_rs2us' => 'to_userid', |
||||
1382 | 'vtiger_datashare_role2us' => 'to_userid', |
||||
1383 | ], |
||||
1384 | 'Roles' => [ |
||||
1385 | 'vtiger_datashare_us2role' => 'to_roleid', |
||||
1386 | 'vtiger_datashare_us2rs' => 'to_roleandsubid', |
||||
1387 | 'vtiger_datashare_grp2role' => 'to_roleid', |
||||
1388 | 'vtiger_datashare_grp2rs' => 'to_roleandsubid', |
||||
1389 | 1 | 'vtiger_datashare_role2group' => 'share_roleid', |
|||
1390 | 'vtiger_datashare_role2us' => 'share_roleid', |
||||
1391 | 'vtiger_datashare_role2role' => 'share_roleid::to_roleid', |
||||
1392 | 1 | 'vtiger_datashare_role2rs' => 'share_roleid::to_roleandsubid', |
|||
1393 | 'vtiger_datashare_rs2grp' => 'share_roleandsubid', |
||||
1394 | 'vtiger_datashare_rs2us' => 'share_roleandsubid', |
||||
1395 | 'vtiger_datashare_rs2role' => 'share_roleandsubid::to_roleid', |
||||
1396 | 'vtiger_datashare_rs2rs' => 'share_roleandsubid::to_roleandsubid', |
||||
1397 | ], |
||||
1398 | 'Groups' => [ |
||||
1399 | 'vtiger_datashare_grp2grp' => 'share_groupid::to_groupid', |
||||
1400 | 'vtiger_datashare_grp2role' => 'share_groupid', |
||||
1401 | 'vtiger_datashare_grp2rs' => 'share_groupid', |
||||
1402 | 'vtiger_datashare_grp2us' => 'share_groupid', |
||||
1403 | 'vtiger_datashare_role2group' => 'to_groupid', |
||||
1404 | 'vtiger_datashare_rs2grp' => 'to_groupid', |
||||
1405 | 'vtiger_datashare_us2grp' => 'to_groupid', |
||||
1406 | ], |
||||
1407 | ]; |
||||
1408 | |||||
1409 | /** |
||||
1410 | * This function is to delete the organisation level sharing rule |
||||
1411 | * It takes the following input parameters:. |
||||
1412 | * |
||||
1413 | * @param int $shareid Id of the Sharing Rule to be updated |
||||
1414 | */ |
||||
1415 | private static function deleteSharingRule($shareid) |
||||
1416 | { |
||||
1417 | Log::trace('Entering deleteSharingRule(' . $shareid . ') method ...'); |
||||
1418 | $dbCommand = Db::getInstance()->createCommand(); |
||||
1419 | $typestr = (new Db\Query())->select(['relationtype'])->from('vtiger_datashare_module_rel')->where(['shareid' => $shareid])->scalar(); |
||||
1420 | $dbCommand->delete(static::$shareRulesTables[$typestr], ['shareid' => $shareid])->execute(); |
||||
0 ignored issues
–
show
|
|||||
1421 | $dbCommand->delete('vtiger_datashare_module_rel', ['shareid' => $shareid])->execute(); |
||||
1422 | $dbCommand->delete('vtiger_datashare_relatedmodule_permission', ['shareid' => $shareid])->execute(); |
||||
1423 | Log::trace('Exiting deleteSharingRule method ...'); |
||||
1424 | } |
||||
1425 | |||||
1426 | /** |
||||
1427 | * Function to remove sharing rules from tables. |
||||
1428 | * |
||||
1429 | * @param int|string $id |
||||
1430 | * @param string $type |
||||
1431 | */ |
||||
1432 | public static function deleteRelatedSharingRules($id, $type) |
||||
1433 | { |
||||
1434 | Log::trace('Entering deleteRelatedSharingRules(' . $id . ') method ...'); |
||||
1435 | foreach (static::$shareRulesTablesIndex[$type] as $tablename => $colname) { |
||||
0 ignored issues
–
show
|
|||||
1436 | $colNameArr = explode('::', $colname); |
||||
1437 | $query = (new Db\Query())->select(['shareid']) |
||||
1438 | ->from($tablename) |
||||
1439 | ->where([$colNameArr[0] => $id]); |
||||
1440 | if (isset($colNameArr[1])) { |
||||
1441 | $query->orWhere([$colNameArr[1] => $id]); |
||||
1442 | } |
||||
1443 | $dataReader = $query->createCommand()->query(); |
||||
1444 | while ($shareid = $dataReader->readColumn(0)) { |
||||
1445 | static::deleteSharingRule($shareid); |
||||
1446 | } |
||||
1447 | $dataReader->close(); |
||||
1448 | } |
||||
1449 | Log::trace('Exiting deleteRelatedSharingRules method ...'); |
||||
1450 | } |
||||
1451 | |||||
1452 | /** |
||||
1453 | * Function for test to check privilege utils. |
||||
1454 | * |
||||
1455 | * @param int $recordId |
||||
1456 | */ |
||||
1457 | public static function testPrivileges($recordId) |
||||
1458 | { |
||||
1459 | static::getHelpDeskRelatedAccounts($recordId); |
||||
1460 | return true; |
||||
1461 | } |
||||
1462 | |||||
1463 | /** |
||||
1464 | * Recalculate sharing rules by user id. |
||||
1465 | * |
||||
1466 | * @param int $id |
||||
1467 | */ |
||||
1468 | public static function recalculateSharingRulesByUser($id) |
||||
1469 | { |
||||
1470 | $userModel = \App\User::getUserModel($id); |
||||
1471 | if (!$userModel->getId()) { |
||||
1472 | return null; |
||||
1473 | } |
||||
1474 | $roles = explode('::', $userModel->getParentRolesSeq()); |
||||
1475 | $groups = $userModel->getGroups(); |
||||
1476 | $sharing = []; |
||||
1477 | foreach (\Settings_SharingAccess_Rule_Model::$dataShareTableColArr['ROLE'] as $key => $item) { |
||||
1478 | $row = (new \App\Db\Query())->select([$item['target_id']])->from($item['table'])->where([$item['source_id'] => $roles])->column(); |
||||
1479 | if ($row) { |
||||
1480 | if (!isset($sharing[$key])) { |
||||
1481 | $sharing[$key] = []; |
||||
1482 | } |
||||
1483 | $sharing[$key] = array_merge($sharing[$key], $row); |
||||
1484 | } |
||||
1485 | } |
||||
1486 | foreach (\Settings_SharingAccess_Rule_Model::$dataShareTableColArr['RS'] as $key => $item) { |
||||
1487 | $row = (new \App\Db\Query())->select([$item['target_id']])->from($item['table'])->where([$item['source_id'] => $roles])->column(); |
||||
1488 | if ($row) { |
||||
1489 | if (!isset($sharing[$key])) { |
||||
1490 | $sharing[$key] = []; |
||||
1491 | } |
||||
1492 | $sharing[$key] = array_merge($sharing[$key], $row); |
||||
1493 | } |
||||
1494 | } |
||||
1495 | if ($groups) { |
||||
1496 | foreach (\Settings_SharingAccess_Rule_Model::$dataShareTableColArr['GRP'] as $key => $item) { |
||||
1497 | $row = (new \App\Db\Query())->select([$item['target_id']])->from($item['table'])->where([$item['source_id'] => $groups])->column(); |
||||
1498 | if ($row) { |
||||
1499 | if (!isset($sharing[$key])) { |
||||
1500 | $sharing[$key] = []; |
||||
1501 | } |
||||
1502 | $sharing[$key] = array_merge($sharing[$key], $row); |
||||
1503 | } |
||||
1504 | } |
||||
1505 | } |
||||
1506 | $users = [[]]; |
||||
1507 | foreach ($sharing as $type => $item) { |
||||
1508 | switch ($type) { |
||||
1509 | case 'US': |
||||
1510 | $users[] = array_unique($item); |
||||
1511 | break; |
||||
1512 | case 'GRP': |
||||
1513 | foreach ($item as $grpId) { |
||||
1514 | $users[] = static::getUsersByGroup($grpId); |
||||
1515 | } |
||||
1516 | break; |
||||
1517 | case 'ROLE': |
||||
1518 | foreach ($item as $roleId) { |
||||
1519 | $users[] = static::getUsersByRole($roleId); |
||||
1520 | } |
||||
1521 | break; |
||||
1522 | case 'RS': |
||||
1523 | foreach ($item as $roleId) { |
||||
1524 | $users[] = static::getUsersByRoleAndSubordinate($roleId); |
||||
1525 | } |
||||
1526 | break; |
||||
1527 | default: |
||||
1528 | break; |
||||
1529 | } |
||||
1530 | } |
||||
1531 | foreach (array_unique(array_merge(...$users)) as $userId) { |
||||
1532 | UserPrivilegesFile::createUserSharingPrivilegesfile($userId); |
||||
1533 | } |
||||
1534 | } |
||||
1535 | |||||
1536 | /** |
||||
1537 | * Modify permissions for actions and views. |
||||
1538 | * |
||||
1539 | * @param string $moduleName |
||||
1540 | * @param array $actions |
||||
1541 | * @param bool $mode true: add, false: remove |
||||
1542 | * |
||||
1543 | * @return bool |
||||
1544 | */ |
||||
1545 | public static function modifyPermissions(string $moduleName, array $actions, bool $mode): bool |
||||
1546 | { |
||||
1547 | $dbCommand = \App\Db::getInstance()->createCommand(); |
||||
1548 | $result = false; |
||||
1549 | $tabId = Module::getModuleId($moduleName); |
||||
1550 | $actions = array_diff($actions, array_merge(\Vtiger_Action_Model::$nonConfigurableActions, \Vtiger_Action_Model::$standardActions)); |
||||
1551 | $actionIds = array_filter(array_map('\App\Module::getActionId', $actions)); |
||||
1552 | if ($mode) { |
||||
1553 | $profilesByAction = (new Db\Query())->select(['profileid', 'activityid']) |
||||
1554 | ->from('vtiger_profile2utility') |
||||
1555 | ->where(['tabid' => $tabId, 'activityid' => $actionIds])->createCommand()->queryAllByGroup(2); |
||||
1556 | foreach (\vtlib\Profile::getAllIds() as $profileId) { |
||||
1557 | $add = !isset($profilesByAction[$profileId]) ? $actionIds : array_diff($actionIds, $profilesByAction[$profileId]); |
||||
1558 | foreach ($add as $actionId) { |
||||
1559 | $result = $dbCommand->insert('vtiger_profile2utility', ['profileid' => $profileId, 'tabid' => $tabId, 'activityid' => $actionId, 'permission' => 1])->execute() || $result; |
||||
1560 | } |
||||
1561 | } |
||||
1562 | } else { |
||||
1563 | $result = $dbCommand->delete('vtiger_profile2utility', ['tabid' => $tabId, 'activityid' => $actionIds])->execute(); |
||||
1564 | } |
||||
1565 | return $result; |
||||
0 ignored issues
–
show
|
|||||
1566 | } |
||||
1567 | |||||
1568 | /** |
||||
1569 | * Check if element exists in organization structure. |
||||
1570 | * |
||||
1571 | * @param int|string $member |
||||
1572 | * |
||||
1573 | * @return bool |
||||
1574 | */ |
||||
1575 | public static function isExists($member): bool |
||||
1576 | { |
||||
1577 | $type = is_numeric($member) ? \App\Fields\Owner::getType($member) : 'Roles'; |
||||
1578 | switch ($type) { |
||||
1579 | case 'Users': |
||||
1580 | $exists = \App\User::isExists($member); |
||||
1581 | break; |
||||
1582 | case 'Groups': |
||||
1583 | $exists = (new \App\Db\Query())->from('vtiger_groups')->where(['groupid' => $member])->exists(); |
||||
1584 | break; |
||||
1585 | case 'Roles': |
||||
1586 | $exists = !empty(self::getRoleDetail($member)); |
||||
1587 | break; |
||||
1588 | default: |
||||
1589 | $exists = false; |
||||
1590 | break; |
||||
1591 | } |
||||
1592 | |||||
1593 | return $exists; |
||||
1594 | } |
||||
1595 | } |
||||
1596 |