PluginProbe
CookieAdmin – Cookie Consent Banner / 1.2.4
CookieAdmin – Cookie Consent Banner v1.2.4
1.2.4 1.2.3 1.2.2 1.2.1 1.2.0 1.1.9 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8
← All changes | includes/enduser.php +223 -19 1.2.11.2.4 View file →
@@ -12,10 +12,10 @@
12 12 static $categorized_cookies = array();
13 13
14 14 static function enqueue_scripts(){
15 15 global $wpdb;
16 -
17 - $view = get_option('cookieadmin_law', 'cookieadmin_gdpr');
16 +
17 + $view = get_option('cookieadmin_law', 'cookieadmin_gdpr');
18 18 $policy = cookieadmin_load_policy();
19 19 $table_name = esc_sql($wpdb->prefix . 'cookieadmin_cookies');
20 20 //cookieadmin_r_print($view);
21 21 //cookieadmin_r_print($policy);
@@ -20,8 +20,10 @@
20 20 //cookieadmin_r_print($view);
21 21 //cookieadmin_r_print($policy);
22 22
23 23 if(!empty($policy) && !empty($view) && !cookieadmin_is_editor_mode()){
24 +
25 + add_filter('mepr_design_style_handle_prefixes', '\CookieAdmin\Enduser::memberpress_allow_style_prefix');
24 26
25 27 wp_enqueue_style('cookieadmin-style', COOKIEADMIN_PLUGIN_URL . 'assets/css/consent.css', [], COOKIEADMIN_VERSION);
26 28
27 29 $js_deps = [];
@@ -71,28 +73,210 @@
71 73
72 74 }
73 75 }
74 76
75 - /* static function cookieadmin_block_cookie_init_php(){
77 + static function cookieadmin_block_cookie_init_php(){
76 78
77 - //New - To catch, remove and send cookies in WP enqueue
79 + if(headers_sent() || (is_admin() && !wp_doing_ajax()) || defined('COOKIEADMIN_SCANNER') || cookieadmin_is_editor_mode()){
80 + return;
81 + }
82 +
83 + $view = get_option('cookieadmin_law', 'cookieadmin_gdpr');
84 +
85 + if(empty($view)){
86 + return;
87 + }
88 +
78 89 $http_cookies = array();
79 - $headers = headers_list();
90 + $set_cookie_headers = array();
80 91
81 - foreach($headers as $header) {
82 -
83 - if (stripos(trim($header), 'Set-Cookie:') === 0) {
92 + foreach(headers_list() as $header) {
93 + if(stripos(trim($header), 'Set-Cookie:') === 0){
84 94 $header = trim(substr($header, strlen('Set-Cookie:')));
85 - $name = trim(explode('=', $header)[0]);
86 - $http_cookies[$name]['string'] = trim($header);
87 - setcookie($name, '', time() - 999999, '/');
95 + $set_cookie_headers[] = $header;
88 96 }
89 97 }
90 98
99 + if(empty($set_cookie_headers)){
100 + return;
101 + }
102 +
103 + $policy = cookieadmin_load_policy();
104 +
105 + if(empty($policy) || empty($policy[$view])){
106 + return;
107 + }
108 +
109 + $categories = self::get_cookie_categories();
110 + $consent = self::get_consent();
111 + $preload = self::get_preload_categories($policy, $view);
112 + $allowed_headers = array();
113 +
114 + foreach($set_cookie_headers as $set_cookie){
115 + $name = self::get_cookie_name_from_header($set_cookie);
116 +
117 + if(empty($name)){
118 + continue;
119 + }
120 +
121 + if(self::is_response_cookie_allowed($set_cookie, $categories, $consent, $preload)){
122 + $allowed_headers[] = $set_cookie;
123 + continue;
124 + }
125 +
126 + $http_cookies[$name]['string'] = trim($set_cookie);
127 + }
128 +
129 + header_remove('Set-Cookie');
130 +
131 + foreach($allowed_headers as $set_cookie){
132 + header('Set-Cookie: ' . $set_cookie, false);
133 + }
134 +
91 135 $http_cookies['cookieadmin_consent'] = ["string" => "cookieadmin_consent=CookieAdmin Cookie Initialization"];
92 136
93 137 self::$http_cookies = $http_cookies;
94 - } */
138 + }
139 +
140 + static function get_cookie_categories(){
141 + global $wpdb;
142 +
143 + $table_name = $wpdb->prefix . 'cookieadmin_cookies';
144 + if(!self::cookieadmin_table_exists($table_name)){
145 + return array();
146 + }
147 +
148 + $categories = array(
149 + 'exact' => array(),
150 + 'prefix' => array(),
151 + );
152 + $rows = $wpdb->get_results("SELECT cookie_name, raw_name, category FROM {$table_name}");
153 +
154 + foreach($rows as $row){
155 + if(!empty($row->cookie_name) && !empty($row->category)){
156 + $category = strtolower($row->category);
157 + $categories['exact'][$row->cookie_name] = $category;
158 +
159 + if(!empty($row->raw_name)){
160 + $categories['exact'][$row->raw_name] = $category;
161 +
162 + if($row->raw_name !== $row->cookie_name && strpos($row->raw_name, $row->cookie_name) === 0){
163 + $categories['prefix'][$row->cookie_name] = $category;
164 + }
165 + }
166 + }
167 + }
168 +
169 + uksort($categories['prefix'], function($a, $b){
170 + return strlen($b) - strlen($a);
171 + });
172 +
173 + return $categories;
174 + }
175 +
176 + static function get_consent(){
177 + if(empty($_COOKIE['cookieadmin_consent'])){
178 + return array();
179 + }
180 +
181 + $consent = json_decode(wp_unslash($_COOKIE['cookieadmin_consent']), true);
182 + if(!is_array($consent)){
183 + return array();
184 + }
185 +
186 + $sanitized = array();
187 + foreach($consent as $key => $value){
188 + $sanitized[sanitize_key($key)] = sanitize_text_field($value);
189 + }
190 +
191 + return $sanitized;
192 + }
193 +
194 + static function get_preload_categories($policy, $view){
195 + if(empty($policy) || empty($policy[$view]['preload']) || !is_array($policy[$view]['preload'])){
196 + return array();
197 + }
198 +
199 + $preload = array();
200 + foreach($policy[$view]['preload'] as $category){
201 + $preload[] = strtolower(sanitize_key($category));
202 + }
203 +
204 + return $preload;
205 + }
206 +
207 + static function get_cookie_name_from_header($set_cookie){
208 + $parts = explode('=', $set_cookie, 2);
209 + $name = trim($parts[0]);
210 +
211 + if(empty($name)){
212 + return '';
213 + }
214 +
215 + return $name;
216 + }
217 +
218 + static function is_response_cookie_allowed($set_cookie, $categories, $consent, $preload = array()){
219 + $name = self::get_cookie_name_from_header($set_cookie);
220 +
221 + if(empty($name)){
222 + return false;
223 + }
224 +
225 + // A deletion never adds a cookie and must not be prevented.
226 + if(preg_match('/(?:^|;)\s*max-age\s*=\s*(-?\d+)/i', $set_cookie, $age) && (int) $age[1] <= 0){
227 + return true;
228 + }
229 +
230 + if(preg_match('/(?:^|;)\s*expires\s*=\s*([^;]+)/i', $set_cookie, $expires)){
231 + $expires_at = strtotime($expires[1]);
232 + if($expires_at !== false && $expires_at < time()){
233 + return true;
234 + }
235 + }
236 +
237 + if($name === 'cookieadmin_consent'){
238 + return true;
239 + }
240 +
241 + $category = self::get_cookie_category($name, $categories);
242 +
243 + if(empty($category)){
244 + return !empty($consent['accept']) && $consent['accept'] === 'true';
245 + }
246 +
247 + if($category === 'necessary' || in_array($category, $preload, true)){
248 + return true;
249 + }
250 +
251 + if(!empty($consent['reject']) && $consent['reject'] === 'true'){
252 + return false;
253 + }
254 +
255 + if(!empty($consent['accept']) && $consent['accept'] === 'true'){
256 + return true;
257 + }
258 +
259 + return !empty($consent[$category]) && $consent[$category] === 'true';
260 + }
261 +
262 + static function get_cookie_category($name, $categories){
263 + if(!empty($categories['exact'][$name])){
264 + return $categories['exact'][$name];
265 + }
266 +
267 + if(empty($categories['prefix'])){
268 + return '';
269 + }
270 +
271 + foreach($categories['prefix'] as $prefix => $category){
272 + if(strpos($name, $prefix) === 0){
273 + return $category;
274 + }
275 + }
276 +
277 + return '';
278 + }
95 279
96 280 static function block_scripts(){
97 281
98 282 if(wp_doing_ajax() || is_admin() || defined('REST_REQUEST') || defined('COOKIEADMIN_SCANNER') || cookieadmin_is_editor_mode()){
@@ -99,12 +283,11 @@
99 283 return;
100 284 }
101 285
102 286 $settings = get_option('cookieadmin_settings');
103 -
104 - // If block scripts is disabled, we don't need to make any changes
287 +
105 288 if(empty($settings) || empty($settings['block_scripts'])){
106 - return;
289 + return;
107 290 }
108 291
109 292 $view = get_option('cookieadmin_law', 'cookieadmin_gdpr');
110 293 $policy = cookieadmin_load_policy();
@@ -115,8 +298,9 @@
115 298 ob_start([__CLASS__, 'update_tracking_scripts']);
116 299 }
117 300
118 301 static function update_tracking_scripts($html){
302 + global $cookieadmin_settings;
119 303
120 304 if(stripos($html, '<script') === false){
121 305 return $html;
122 306 }
@@ -136,9 +320,9 @@
136 320 } );
137 321
138 322 $html = preg_replace_callback(
139 323 '/<script\b([^>]*)>([\s\S]*?)<\/script>/i',
140 - function($match) use ($cookieadmin_consent){
324 + function($match) use ($cookieadmin_consent, $cookieadmin_settings){
141 325 $attrs = $match[1];
142 326 $content = $match[2];
143 327 $full_tag = $match[0];
144 328
@@ -166,8 +350,19 @@
166 350
167 351 if(empty($match_against)){
168 352 return $full_tag;
169 353 }
354 +
355 + if(!empty($cookieadmin_settings['cookieadmin_google_advance_consent_mode'])){
356 + // External Google tag loader
357 + if(!empty($src) && stripos($src, 'googletagmanager.com/gtag/js') !== false){
358 + return $full_tag;
359 + }
360 + // Inline gtag() snippet
361 + if(empty($src) && stripos($content, 'gtag(') !== false){
362 + return $full_tag;
363 + }
364 + }
170 365
171 366 foreach (self::$categorized_cookies as $item) {
172 367 $category = !empty($item->category) ? strtolower($item->category) : '';
173 368 $patterns = !empty($item->patterns) ? json_decode($item->patterns, true) : '';
@@ -201,11 +396,16 @@
201 396 return $html;
202 397 }
203 398
204 399 static function cookieadmin_show_banner(){
205 -
206 - $view = get_option('cookieadmin_law', 'cookieadmin_gdpr');
400 +
401 + $view = get_option('cookieadmin_law', 'cookieadmin_gdpr');
207 402 $policy = cookieadmin_load_policy();
403 +
404 + // Do not show banner if banner is off via Geo rule
405 + if(empty($view)){
406 + return;
407 + }
208 408
209 409 $raw_template = cookieadmin_load_consent_template($policy[$view], $view);
210 410
211 411 if(!is_array($raw_template) || empty($raw_template)){
@@ -228,6 +428,10 @@
228 428 $query = $wpdb->prepare("SHOW TABLES LIKE %s", $table_name);
229 429
230 430 return $wpdb->get_var($query) === $table_name;
231 431 }
432 +
433 + static function memberpress_allow_style_prefix($prefix_arr){
434 + $prefix_arr[] = 'cookieadmin';
435 + return $prefix_arr;
436 + }
232 437 }
233 -