PluginProbe ʕ •ᴥ•ʔ
Advanced Access Manager – Access Governance for WordPress / trunk
Advanced Access Manager – Access Governance for WordPress vtrunk
6.8.4 6.8.5 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13 6.9.14 6.9.15 6.9.16 6.9.17 6.9.18 6.9.19 6.9.2 6.9.20 6.9.21 6.9.22 6.9.23 6.9.24 6.9.25 6.9.26 6.9.27 6.9.28 6.9.29 6.9.3 6.9.30 6.9.31 6.9.32 6.9.33 6.9.34 6.9.35 6.9.36 6.9.37 6.9.38 6.9.39 6.9.4 6.9.41 6.9.42 6.9.43 6.9.44 6.9.45 6.9.46 6.9.47 6.9.48 6.9.49 6.9.5 6.9.51 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.0-alpha.6 7.0.0-alpha.7 7.0.0-beta.1 7.0.0-rc1 7.0.0-rc2 7.0.0-rc3 7.0.1 7.0.10 7.0.11 7.0.2 7.0.3 7.0.4 7.0.5 7.0.6 7.0.7 7.0.8 7.0.9 7.1.0 7.1.1 trunk 3.0 4.0 4.0.1 4.1 4.2 4.3 4.4 4.4.1 4.5 4.6 4.6.1 4.6.2 4.7 4.7.1 4.7.2 4.7.5 4.7.6 4.8 4.8.1 4.9 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 4.9.5.1 4.9.5.2 5.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1 5.1.1 5.10 5.11 5.2 5.2.1 5.2.5 5.2.6 5.2.7 5.3 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.4 5.4.1 5.4.2 5.4.3 5.4.3.1 5.4.3.2 5.5 5.5.1 5.5.2 5.6 5.6.1 5.6.1.1 5.7 5.7.1 5.7.2 5.7.3 5.8 5.8.1 5.8.2 5.8.3 5.9 5.9.1 5.9.1.1 5.9.2 5.9.2.1 5.9.3 5.9.4 5.9.5 5.9.6 5.9.6.1 5.9.6.2 5.9.6.3 5.9.7 5.9.7.1 5.9.7.2 5.9.7.3 5.9.8 5.9.8.1 5.9.9 5.9.9.1 6.0.0 6.0.1 6.0.2 6.0.3 6.0.4 6.0.5 6.1.0 6.1.1 6.2.0 6.2.1 6.2.2 6.3.0 6.3.1 6.3.2 6.3.3 6.4.0 6.4.1 6.4.2 6.4.3 6.5.0 6.5.1 6.5.2 6.5.3 6.5.4 6.6.0 6.6.1 6.6.2 6.6.3 6.6.4 6.7.0 6.7.1 6.7.2 6.7.3 6.7.4 6.7.5 6.7.6 6.7.7 6.7.8 6.7.9 6.8.0 6.8.1 6.8.2 6.8.3
advanced-access-manager / application / Service / Shortcode / Handler / Content.php
advanced-access-manager / application / Service / Shortcode / Handler Last commit date
Content.php 1 year ago LoginForm.php 1 year ago LoginRedirect.php 1 year ago PostList.php 1 year ago
Content.php
223 lines
1 <?php
2
3 /**
4 * ======================================================================
5 * LICENSE: This file is subject to the terms and conditions defined in *
6 * file 'license.txt', which is part of this source code package. *
7 * ======================================================================
8 */
9
10 use Vectorface\Whip\Whip;
11
12 /**
13 * AAM shortcode handler for content visibility
14 *
15 * @package AAM
16 * @version 7.0.0
17 */
18 class AAM_Service_Shortcode_Handler_Content
19 {
20
21 /**
22 * Shortcode arguments
23 *
24 * @var array
25 * @access protected
26 *
27 * @version 7.0.0
28 */
29 protected $args;
30
31 /**
32 * Wrapped by shortcode content
33 *
34 * @var string
35 * @access protected
36 *
37 * @version 7.0.0
38 */
39 protected $content;
40
41 /**
42 * Initialize shortcode decorator
43 *
44 * Expecting attributes in $args are:
45 * "hide" => comma-separated list of role, caps, user IDs to hide content
46 * "show" => comma-separated list of role, caps, user IDs to show content
47 * "limit" => comma-separated list of role, caps, user IDs to limit content
48 * "message" => message to show if "limit" is defined
49 *
50 * @param array $args
51 * @param string $content
52 *
53 * @return void
54 * @access public
55 *
56 * @version 7.0.0
57 */
58 public function __construct($args, $content)
59 {
60 $this->args = $args;
61 $this->content = do_shortcode($content);
62 }
63
64 /**
65 * Process shortcode
66 *
67 * @return string
68 * @access public
69 *
70 * @version 7.0.0
71 */
72 public function run()
73 {
74 // Prepare list of subjects
75 if (get_current_user_id()) {
76 $roles = array_merge(AAM::current_user()->roles);
77
78 // Build the list of assigned capabilities
79 $caps = array();
80 foreach(AAM::current_user()->allcaps as $key => $effect) {
81 if (!empty($effect)) {
82 $caps[] = $key;
83 }
84 }
85
86 if (AAM::api()->config->get('core.settings.multi_access_levels')) {
87 $parts = array_merge([ (string) AAM::current_user()->ID ], $roles);
88 } else {
89 $parts = [ (string) AAM::current_user()->ID, array_shift($roles) ];
90 }
91
92 $parts = array_merge($parts, $caps);
93 } else {
94 $parts = array('visitor');
95 }
96
97 $show = $this->getAccess('show');
98 $limit = $this->getAccess('limit');
99 $hide = $this->getAccess('hide');
100 $msg = $this->getMessage();
101
102 $content = $this->content;
103
104 // #1. Check if content is restricted for current user
105 if (in_array('all', $hide, true) || $this->check($parts, $hide)) {
106 $content = '';
107 }
108
109 // #2. Check if content is limited for current user
110 if (in_array('all', $limit, true) || $this->check($parts, $limit)) {
111 $content = do_shortcode($msg);
112 }
113
114 // #3. Check if content is allowed for current user
115 if ($this->check($parts, $show)) {
116 $content = $this->content;
117 }
118
119 return $content;
120 }
121
122 /**
123 * Check if visibility condition is matched
124 *
125 * @param mixed $subject
126 * @param array $conditions
127 *
128 * @return boolean
129 * @access protected
130 *
131 * @version 7.0.0
132 */
133 protected function check($subject, $conditions)
134 {
135 $match = false;
136 $auth = get_current_user_id();
137 $whip = new Whip();
138
139 foreach ($conditions as $condition) {
140 if (($condition === 'authenticated') && $auth) {
141 $match = true;
142 } else if (preg_match('/^[\d*-]+\.[\d*-]+[\d\.*-]*[\d\.*-]*$/', $condition)) {
143 $match = $this->checkIP(
144 $condition, $whip->getValidIpAddress()
145 );
146 } else {
147 $match = in_array($condition, $subject, true);
148 }
149
150 if ($match) {
151 break;
152 }
153 }
154
155 return $match;
156 }
157
158 /**
159 * Check user IP for match
160 *
161 * @param string $ip
162 * @param string $userIp
163 *
164 * @return boolean
165 * @access protected
166 *
167 * @version 7.0.0
168 */
169 protected function checkIP($ip, $userIp)
170 {
171 $match = true;
172
173 $ipSplit = preg_split('/[\.:]/', $ip);
174 $uipSplit = preg_split('/[\.:]/', $userIp);
175
176 foreach ($ipSplit as $i => $group) {
177 if (strpos($group, '-') !== false) { //range
178 $parts = explode('-', $group);
179
180 if ($uipSplit[$i] < $parts[0] || $uipSplit[$i] > $parts[1]) {
181 $match = false;
182 break;
183 }
184 } elseif ($group !== '*') {
185 if ($group !== $uipSplit[$i]) {
186 $match = false;
187 break;
188 }
189 }
190 }
191
192 return $match;
193 }
194
195 /**
196 * Get access preference by type
197 *
198 * @return array
199 * @access public
200 *
201 * @version 7.0.0
202 */
203 public function getAccess($type)
204 {
205 $access = (isset($this->args[$type]) ? $this->args[$type] : null);
206
207 return is_string($access) ? array_map('trim', explode(',', $access)) : [];
208 }
209
210 /**
211 * Get replacement message
212 *
213 * @return string|null
214 * @access public
215 *
216 * @version 7.0.0
217 */
218 public function getMessage()
219 {
220 return isset($this->args['message']) ? esc_js($this->args['message']) : null;
221 }
222
223 }