PluginProbe
User Access Manager / trunk
User Access Manager vtrunk
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 +47 -66 2.3.15trunk View file →
@@ -1,18 +1,5 @@
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 - */
15 2
16 3 declare(strict_types=1);
17 4
18 5 namespace UserAccessManager\User;
@@ -23,17 +10,21 @@
23 10 use UserAccessManager\UserGroup\AbstractUserGroup;
24 11 use UserAccessManager\Wrapper\Wordpress;
25 12 use WP_User;
26 13
27 -/**
28 - * Class UserHandler
29 - *
30 - * @package UserAccessManager\UserHandler
31 - */
32 14 class UserHandler
33 15 {
34 16 public const MANAGE_USER_GROUPS_CAPABILITY = 'manage_user_groups';
35 17
18 + private const ROLES_BY_ASCENDING_RIGHTS = [
19 + AbstractUserGroup::NONE_ROLE,
20 + 'subscriber',
21 + 'contributor',
22 + 'author',
23 + 'editor',
24 + 'administrator'
25 + ];
26 +
36 27 public function __construct(
37 28 private Wordpress $wordpress,
38 29 private MainConfig $config,
39 30 private Database $database,
@@ -44,19 +35,18 @@
44 35 private function calculateIp(string $ip): bool|string
45 36 {
46 37 if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) {
47 38 return base_convert((string) ip2long($ip), 10, 2);
48 - } elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
39 + }
40 +
41 + if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
49 42 return false;
50 43 }
51 44
52 - $packedIp = inet_pton($ip);
53 - $bits = 15; // 16 x 8 bit = 128bit (ipv6)
54 45 $binaryIp = '';
55 46
56 - while ($bits >= 0) {
57 - $binaryIp = sprintf('%08b', (ord($packedIp[$bits]))) . $binaryIp;
58 - $bits--;
47 + foreach (str_split(inet_pton($ip)) as $byte) {
48 + $binaryIp .= sprintf('%08b', ord($byte));
59 49 }
60 50
61 51 return $binaryIp;
62 52 }
@@ -62,31 +52,31 @@
62 52 }
63 53
64 54 private function getCalculatedRange(string $ipRange): array
65 55 {
66 - $ipRange = explode('-', $ipRange);
67 - $rangeBegin = $ipRange[0];
68 - $rangeEnd = $ipRange[1] ?? $ipRange[0];
56 + $rangeBounds = explode('-', $ipRange);
69 57
70 58 return [
71 - $this->calculateIp($rangeBegin),
72 - $this->calculateIp($rangeEnd)
59 + $this->calculateIp($rangeBounds[0]),
60 + $this->calculateIp($rangeBounds[1] ?? $rangeBounds[0])
73 61 ];
74 62 }
75 63
76 64 public function isIpInRange(string $currentIp, array $ipRanges): bool
77 65 {
78 - $currentIp = $this->calculateIp($currentIp);
66 + $calculatedCurrentIp = $this->calculateIp($currentIp);
79 67
80 - if ($currentIp !== false) {
81 - foreach ($ipRanges as $ipRange) {
82 - $calculatedIpRange = $this->getCalculatedRange($ipRange);
68 + if ($calculatedCurrentIp === false) {
69 + return false;
70 + }
83 71
84 - if ($calculatedIpRange[0] !== false && $calculatedIpRange[1] !== false
85 - && $calculatedIpRange[0] <= $currentIp && $currentIp <= $calculatedIpRange[1]
86 - ) {
87 - return true;
88 - }
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;
89 79 }
90 80 }
91 81
92 82 return false;
@@ -93,17 +83,21 @@
93 83 }
94 84
95 85 public function getUserRole(WP_User|bool $user): array
96 86 {
97 - if ($user instanceof WP_User && isset($user->{$this->database->getPrefix() . 'capabilities'}) === true) {
98 - $capabilities = (array) $user->{$this->database->getPrefix() . 'capabilities'};
99 - } else {
100 - $capabilities = [];
101 - }
87 + $capabilitiesProperty = $this->database->getPrefix() . 'capabilities';
88 + $capabilities = ($user instanceof WP_User && isset($user->{$capabilitiesProperty}) === true)
89 + ? (array) $user->{$capabilitiesProperty}
90 + : [];
102 91
103 - return (count($capabilities) > 0) ? array_keys($capabilities) : [AbstractUserGroup::NONE_ROLE];
92 + return ($capabilities !== []) ? array_keys($capabilities) : [AbstractUserGroup::NONE_ROLE];
104 93 }
105 94
95 + private function getRolesMap(WP_User|bool $user): array
96 + {
97 + return array_flip($this->getUserRole($user));
98 + }
99 +
106 100 public function checkUserAccess(bool|string $allowedCapability = false): bool
107 101 {
108 102 $currentUser = $this->wordpress->getCurrentUser();
109 103
@@ -112,35 +106,22 @@
112 106 ) {
113 107 return true;
114 108 }
115 109
116 - $roles = $this->getUserRole($currentUser);
117 - $rolesMap = array_flip($roles);
118 -
119 - $orderedRoles = [
120 - AbstractUserGroup::NONE_ROLE,
121 - 'subscriber',
122 - 'contributor',
123 - 'author',
124 - 'editor',
125 - 'administrator'
126 - ];
127 - $orderedRolesMap = array_flip($orderedRoles);
128 -
129 - $userRoles = array_intersect_key($orderedRolesMap, $rolesMap);
130 - $rightsLevel = (count($userRoles) > 0) ? end($userRoles) : -1;
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;
131 114 $fullAccessRole = $this->config->getFullAccessRole();
132 115
133 - return (isset($orderedRolesMap[$fullAccessRole]) === true && $rightsLevel >= $orderedRolesMap[$fullAccessRole]
134 - || isset($rolesMap['administrator']) === true
135 - );
116 + return isset($rightsLevelByRole[$fullAccessRole]) === true
117 + && $rightsLevel >= $rightsLevelByRole[$fullAccessRole]
118 + || isset($rolesMap['administrator']) === true;
136 119 }
137 120
138 121 public function userIsAdmin(int|string|null $userId): bool
139 122 {
140 - $user = $this->objectHandler->getUser($userId);
141 - $roles = $this->getUserRole($user);
142 - $rolesMap = array_flip($roles);
123 + $rolesMap = $this->getRolesMap($this->objectHandler->getUser($userId));
143 124
144 - return (isset($rolesMap['administrator']) === true || $this->wordpress->isSuperAdmin($userId) === true);
125 + return isset($rolesMap['administrator']) === true || $this->wordpress->isSuperAdmin($userId) === true;
145 126 }
146 127 }