PluginProbe
User Access Manager / 2.2.25
User Access Manager v2.2.25
2.3.20 2.3.19 2.3.18 2.3.17 2.3.16 2.3.15 2.3.14 2.3.13 trunk 0.6 0.6.1 0.6.2 0.7 0.7 Beta 0.7.0.1 0.8 0.8.0.1 0.8.0.2 0.9 0.9.1 0.9.1.1 0.9.1.2 0.9.1.3 0.9.1.4 1.0 All 136 releases
← All changes | src/User/UserHandler.php +137 -55 trunk2.2.25 View file →
@@ -1,5 +1,18 @@
1 1 <?php
2 +/**
3 + * UserHandler.php
4 + *
5 + * The UserHandler class file.
6 + *
7 + * PHP versions 5
8 + *
9 + * @author Alexander Schneider <alexanderschneider85@gmail.com>
10 + * @copyright 2008-2017 Alexander Schneider
11 + * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2
12 + * @version SVN: $id$
13 + * @link http://wordpress.org/extend/plugins/user-access-manager/
14 + */
2 15
3 16 declare(strict_types=1);
4 17
5 18 namespace UserAccessManager\User;
@@ -7,76 +20,121 @@
7 20 use UserAccessManager\Config\MainConfig;
8 21 use UserAccessManager\Database\Database;
9 22 use UserAccessManager\Object\ObjectHandler;
10 23 use UserAccessManager\UserGroup\AbstractUserGroup;
24 +use UserAccessManager\UserGroup\UserGroup;
11 25 use UserAccessManager\Wrapper\Wordpress;
12 26 use WP_User;
13 27
28 +/**
29 + * Class UserHandler
30 + *
31 + * @package UserAccessManager\UserHandler
32 + */
14 33 class UserHandler
15 34 {
16 - public const MANAGE_USER_GROUPS_CAPABILITY = 'manage_user_groups';
35 + const MANAGE_USER_GROUPS_CAPABILITY = 'manage_user_groups';
17 36
18 - private const ROLES_BY_ASCENDING_RIGHTS = [
19 - AbstractUserGroup::NONE_ROLE,
20 - 'subscriber',
21 - 'contributor',
22 - 'author',
23 - 'editor',
24 - 'administrator'
25 - ];
37 + /**
38 + * @var Wordpress
39 + */
40 + private $wordpress;
26 41
42 + /**
43 + * @var MainConfig
44 + */
45 + private $config;
46 +
47 + /**
48 + * @var Database
49 + */
50 + private $database;
51 +
52 + /**
53 + * @var ObjectHandler
54 + */
55 + private $objectHandler;
56 +
57 + /**
58 + * The constructor
59 + * @param Wordpress $wordpress
60 + * @param MainConfig $config
61 + * @param Database $database
62 + * @param ObjectHandler $objectHandler
63 + */
27 64 public function __construct(
28 - private Wordpress $wordpress,
29 - private MainConfig $config,
30 - private Database $database,
31 - private ObjectHandler $objectHandler
65 + Wordpress $wordpress,
66 + MainConfig $config,
67 + Database $database,
68 + ObjectHandler $objectHandler
32 69 ) {
70 + $this->wordpress = $wordpress;
71 + $this->config = $config;
72 + $this->database = $database;
73 + $this->objectHandler = $objectHandler;
33 74 }
34 75
35 - private function calculateIp(string $ip): bool|string
76 + /**
77 + * Converts the ip to an integer.
78 + * @param string $ip
79 + * @return string|false
80 + */
81 + private function calculateIp(string $ip)
36 82 {
37 83 if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) {
38 84 return base_convert((string) ip2long($ip), 10, 2);
39 - }
40 -
41 - if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
85 + } elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
42 86 return false;
43 87 }
44 88
89 + $packedIp = inet_pton($ip);
90 + $bits = 15; // 16 x 8 bit = 128bit (ipv6)
45 91 $binaryIp = '';
46 92
47 - foreach (str_split(inet_pton($ip)) as $byte) {
48 - $binaryIp .= sprintf('%08b', ord($byte));
93 + while ($bits >= 0) {
94 + $binaryIp = sprintf('%08b', (ord($packedIp[$bits]))) . $binaryIp;
95 + $bits--;
49 96 }
50 97
51 98 return $binaryIp;
52 99 }
53 100
101 + /**
102 + * Calculates the ip range.
103 + * @param string $ipRange
104 + * @return array
105 + */
54 106 private function getCalculatedRange(string $ipRange): array
55 107 {
56 - $rangeBounds = explode('-', $ipRange);
108 + $ipRange = explode('-', $ipRange);
109 + $rangeBegin = $ipRange[0];
110 + $rangeEnd = $ipRange[1] ?? $ipRange[0];
57 111
58 112 return [
59 - $this->calculateIp($rangeBounds[0]),
60 - $this->calculateIp($rangeBounds[1] ?? $rangeBounds[0])
113 + $this->calculateIp($rangeBegin),
114 + $this->calculateIp($rangeEnd)
61 115 ];
62 116 }
63 117
118 + /**
119 + * Checks if the given ip matches with the range.
120 + * @param string $currentIp The ip of the current user.
121 + * @param array $ipRanges The ip ranges.
122 + * @return bool
123 + */
64 124 public function isIpInRange(string $currentIp, array $ipRanges): bool
65 125 {
66 - $calculatedCurrentIp = $this->calculateIp($currentIp);
126 + $currentIp = $this->calculateIp($currentIp);
67 127
68 - if ($calculatedCurrentIp === false) {
69 - return false;
70 - }
128 + if ($currentIp !== false) {
129 + foreach ($ipRanges as $ipRange) {
130 + $calculatedIpRange = $this->getCalculatedRange($ipRange);
71 131
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;
132 + if ($calculatedIpRange[0] !== false && $calculatedIpRange[1] !== false
133 + && $calculatedIpRange[0] <= $currentIp && $currentIp <= $calculatedIpRange[1]
134 + ) {
135 + return true;
136 + }
79 137 }
80 138 }
81 139
82 140 return false;
@@ -81,25 +139,31 @@
81 139
82 140 return false;
83 141 }
84 142
85 - public function getUserRole(WP_User|bool $user): array
143 + /**
144 + * Return the role of the user.
145 + * @param WP_User|false $user The user.
146 + * @return array
147 + */
148 + public function getUserRole($user): array
86 149 {
87 - $capabilitiesProperty = $this->database->getPrefix() . 'capabilities';
88 - $capabilities = ($user instanceof WP_User && isset($user->{$capabilitiesProperty}) === true)
89 - ? (array) $user->{$capabilitiesProperty}
90 - : [];
150 + if ($user instanceof WP_User && isset($user->{$this->database->getPrefix() . 'capabilities'}) === true) {
151 + $capabilities = (array) $user->{$this->database->getPrefix() . 'capabilities'};
152 + } else {
153 + $capabilities = [];
154 + }
91 155
92 - return ($capabilities !== []) ? array_keys($capabilities) : [AbstractUserGroup::NONE_ROLE];
156 + return (count($capabilities) > 0) ? array_keys($capabilities) : [AbstractUserGroup::NONE_ROLE];
93 157 }
94 158
95 - private function getRolesMap(WP_User|bool $user): array
159 + /**
160 + * Checks the user access by user level.
161 + * @param bool|string $allowedCapability If set check also for the capability.
162 + * @return bool
163 + */
164 + public function checkUserAccess($allowedCapability = false): bool
96 165 {
97 - return array_flip($this->getUserRole($user));
98 - }
99 -
100 - public function checkUserAccess(bool|string $allowedCapability = false): bool
101 - {
102 166 $currentUser = $this->wordpress->getCurrentUser();
103 167
104 168 if ($this->wordpress->isSuperAdmin($currentUser->ID) === true
105 169 || $allowedCapability !== false && $currentUser->has_cap($allowedCapability) === true
@@ -106,22 +170,40 @@
106 170 ) {
107 171 return true;
108 172 }
109 173
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;
174 + $roles = $this->getUserRole($currentUser);
175 + $rolesMap = array_flip($roles);
176 +
177 + $orderedRoles = [
178 + AbstractUserGroup::NONE_ROLE,
179 + 'subscriber',
180 + 'contributor',
181 + 'author',
182 + 'editor',
183 + 'administrator'
184 + ];
185 + $orderedRolesMap = array_flip($orderedRoles);
186 +
187 + $userRoles = array_intersect_key($orderedRolesMap, $rolesMap);
188 + $rightsLevel = (count($userRoles) > 0) ? end($userRoles) : -1;
114 189 $fullAccessRole = $this->config->getFullAccessRole();
115 190
116 - return isset($rightsLevelByRole[$fullAccessRole]) === true
117 - && $rightsLevel >= $rightsLevelByRole[$fullAccessRole]
118 - || isset($rolesMap['administrator']) === true;
191 + return (isset($orderedRolesMap[$fullAccessRole]) === true && $rightsLevel >= $orderedRolesMap[$fullAccessRole]
192 + || isset($rolesMap['administrator']) === true
193 + );
119 194 }
120 195
121 - public function userIsAdmin(int|string|null $userId): bool
196 + /**
197 + * Checks if the user is an admin user
198 + * @param int|string $userId The user id.
199 + * @return bool
200 + */
201 + public function userIsAdmin($userId): bool
122 202 {
123 - $rolesMap = $this->getRolesMap($this->objectHandler->getUser($userId));
203 + $user = $this->objectHandler->getUser($userId);
204 + $roles = $this->getUserRole($user);
205 + $rolesMap = array_flip($roles);
124 206
125 - return isset($rolesMap['administrator']) === true || $this->wordpress->isSuperAdmin($userId) === true;
207 + return (isset($rolesMap['administrator']) === true || $this->wordpress->isSuperAdmin($userId) === true);
126 208 }
127 209 }