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