PluginProbe
User Access Manager / 2.3.20
User Access Manager v2.3.20
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 / User / UserHandler.php

UserHandler.php in User Access Manager 2.3.20, at src/User/UserHandler.php

128 lines 3.8 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\User;
6
7 use UserAccessManager\Config\MainConfig;
8 use UserAccessManager\Database\Database;
9 use UserAccessManager\Object\ObjectHandler;
10 use UserAccessManager\UserGroup\AbstractUserGroup;
11 use UserAccessManager\Wrapper\Wordpress;
12 use WP_User;
13
14 class UserHandler
15 {
16 public const MANAGE_USER_GROUPS_CAPABILITY = 'manage_user_groups';
17
18 private const ROLES_BY_ASCENDING_RIGHTS = [
19 AbstractUserGroup::NONE_ROLE,
20 'subscriber',
21 'contributor',
22 'author',
23 'editor',
24 'administrator'
25 ];
26
27 public function __construct(
28 private Wordpress $wordpress,
29 private MainConfig $config,
30 private Database $database,
31 private ObjectHandler $objectHandler
32 ) {
33 }
34
35 private function calculateIp(string $ip): bool|string
36 {
37 if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) {
38 return base_convert((string) ip2long($ip), 10, 2);
39 }
40
41 if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
42 return false;
43 }
44
45 $binaryIp = '';
46
47 foreach (str_split(inet_pton($ip)) as $byte) {
48 $binaryIp .= sprintf('%08b', ord($byte));
49 }
50
51 return $binaryIp;
52 }
53
54 private function getCalculatedRange(string $ipRange): array
55 {
56 $rangeBounds = explode('-', $ipRange);
57
58 return [
59 $this->calculateIp($rangeBounds[0]),
60 $this->calculateIp($rangeBounds[1] ?? $rangeBounds[0])
61 ];
62 }
63
64 public function isIpInRange(string $currentIp, array $ipRanges): bool
65 {
66 $calculatedCurrentIp = $this->calculateIp($currentIp);
67
68 if ($calculatedCurrentIp === false) {
69 return false;
70 }
71
72 foreach ($ipRanges as $ipRange) {
73 [$rangeBegin, $rangeEnd] = $this->getCalculatedRange($ipRange);
74
75 if ($rangeBegin !== false && $rangeEnd !== false
76 && $rangeBegin <= $calculatedCurrentIp && $calculatedCurrentIp <= $rangeEnd
77 ) {
78 return true;
79 }
80 }
81
82 return false;
83 }
84
85 public function getUserRole(WP_User|bool $user): array
86 {
87 $capabilitiesProperty = $this->database->getPrefix() . 'capabilities';
88 $capabilities = ($user instanceof WP_User && isset($user->{$capabilitiesProperty}) === true)
89 ? (array) $user->{$capabilitiesProperty}
90 : [];
91
92 return ($capabilities !== []) ? array_keys($capabilities) : [AbstractUserGroup::NONE_ROLE];
93 }
94
95 private function getRolesMap(WP_User|bool $user): array
96 {
97 return array_flip($this->getUserRole($user));
98 }
99
100 public function checkUserAccess(bool|string $allowedCapability = false): bool
101 {
102 $currentUser = $this->wordpress->getCurrentUser();
103
104 if ($this->wordpress->isSuperAdmin($currentUser->ID) === true
105 || $allowedCapability !== false && $currentUser->has_cap($allowedCapability) === true
106 ) {
107 return true;
108 }
109
110 $rolesMap = $this->getRolesMap($currentUser);
111 $rightsLevelByRole = array_flip(self::ROLES_BY_ASCENDING_RIGHTS);
112 $userRightsLevels = array_intersect_key($rightsLevelByRole, $rolesMap);
113 $rightsLevel = ($userRightsLevels !== []) ? end($userRightsLevels) : -1;
114 $fullAccessRole = $this->config->getFullAccessRole();
115
116 return isset($rightsLevelByRole[$fullAccessRole]) === true
117 && $rightsLevel >= $rightsLevelByRole[$fullAccessRole]
118 || isset($rolesMap['administrator']) === true;
119 }
120
121 public function userIsAdmin(int|string|null $userId): bool
122 {
123 $rolesMap = $this->getRolesMap($this->objectHandler->getUser($userId));
124
125 return isset($rolesMap['administrator']) === true || $this->wordpress->isSuperAdmin($userId) === true;
126 }
127 }
128