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