PluginProbe
User Access Manager / 2.3.14
User Access Manager v2.3.14
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.14, at src/User/UserHandler.php

147 lines 4.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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
16 declare(strict_types=1);
17
18 namespace UserAccessManager\User;
19
20 use UserAccessManager\Config\MainConfig;
21 use UserAccessManager\Database\Database;
22 use UserAccessManager\Object\ObjectHandler;
23 use UserAccessManager\UserGroup\AbstractUserGroup;
24 use UserAccessManager\Wrapper\Wordpress;
25 use WP_User;
26
27 /**
28 * Class UserHandler
29 *
30 * @package UserAccessManager\UserHandler
31 */
32 class UserHandler
33 {
34 public const MANAGE_USER_GROUPS_CAPABILITY = 'manage_user_groups';
35
36 public function __construct(
37 private Wordpress $wordpress,
38 private MainConfig $config,
39 private Database $database,
40 private ObjectHandler $objectHandler
41 ) {
42 }
43
44 private function calculateIp(string $ip): bool|string
45 {
46 if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) {
47 return base_convert((string) ip2long($ip), 10, 2);
48 } elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
49 return false;
50 }
51
52 $packedIp = inet_pton($ip);
53 $bits = 15; // 16 x 8 bit = 128bit (ipv6)
54 $binaryIp = '';
55
56 while ($bits >= 0) {
57 $binaryIp = sprintf('%08b', (ord($packedIp[$bits]))) . $binaryIp;
58 $bits--;
59 }
60
61 return $binaryIp;
62 }
63
64 private function getCalculatedRange(string $ipRange): array
65 {
66 $ipRange = explode('-', $ipRange);
67 $rangeBegin = $ipRange[0];
68 $rangeEnd = $ipRange[1] ?? $ipRange[0];
69
70 return [
71 $this->calculateIp($rangeBegin),
72 $this->calculateIp($rangeEnd)
73 ];
74 }
75
76 public function isIpInRange(string $currentIp, array $ipRanges): bool
77 {
78 $currentIp = $this->calculateIp($currentIp);
79
80 if ($currentIp !== false) {
81 foreach ($ipRanges as $ipRange) {
82 $calculatedIpRange = $this->getCalculatedRange($ipRange);
83
84 if ($calculatedIpRange[0] !== false && $calculatedIpRange[1] !== false
85 && $calculatedIpRange[0] <= $currentIp && $currentIp <= $calculatedIpRange[1]
86 ) {
87 return true;
88 }
89 }
90 }
91
92 return false;
93 }
94
95 public function getUserRole(WP_User|bool $user): array
96 {
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 }
102
103 return (count($capabilities) > 0) ? array_keys($capabilities) : [AbstractUserGroup::NONE_ROLE];
104 }
105
106 public function checkUserAccess(bool|string $allowedCapability = false): bool
107 {
108 $currentUser = $this->wordpress->getCurrentUser();
109
110 if ($this->wordpress->isSuperAdmin($currentUser->ID) === true
111 || $allowedCapability !== false && $currentUser->has_cap($allowedCapability) === true
112 ) {
113 return true;
114 }
115
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;
131 $fullAccessRole = $this->config->getFullAccessRole();
132
133 return (isset($orderedRolesMap[$fullAccessRole]) === true && $rightsLevel >= $orderedRolesMap[$fullAccessRole]
134 || isset($rolesMap['administrator']) === true
135 );
136 }
137
138 public function userIsAdmin(int|string|null $userId): bool
139 {
140 $user = $this->objectHandler->getUser($userId);
141 $roles = $this->getUserRole($user);
142 $rolesMap = array_flip($roles);
143
144 return (isset($rolesMap['administrator']) === true || $this->wordpress->isSuperAdmin($userId) === true);
145 }
146 }
147