PluginProbe
CookieAdmin – Cookie Consent Banner / 1.2.6
CookieAdmin – Cookie Consent Banner v1.2.6
1.2.6 1.2.5 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 All 26 releases
cookieadmin / includes / cookiecategorizer.php

cookiecategorizer.php in CookieAdmin – Cookie Consent Banner 1.2.6, at includes/cookiecategorizer.php

122 lines 3.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace CookieAdmin;
4
5 if(!defined('COOKIEADMIN_VERSION') || !defined('ABSPATH')){
6 die('Hacking Attempt');
7 }
8
9 class CookieCategorizer {
10
11 /**
12 * Takes the raw output from the scanner and enriches it with data from the knowledge base.
13 *
14 * @param array $found_cookies The array of cookies from the Scanner class.
15 * @return array The enriched list of cookies.
16 */
17 static function categorize_cookies($found_cookies, $categorized_cookies) {
18 if (empty($found_cookies)) {
19 return [];
20 }
21
22 $prefixes = self::generate_query_prefixes(array_keys($found_cookies));
23
24 if (empty($prefixes)) {
25 return $found_cookies;
26 }
27
28 $db_candidates = self::fetch_candidates_from_db($prefixes);
29
30 if (empty($db_candidates)) {
31 return $found_cookies;
32 }
33
34 return self::match_and_enrich_cookies($found_cookies, $db_candidates, $categorized_cookies);
35 }
36
37
38 static function generate_query_prefixes($cookie_names){
39 $prefixes = [];
40 foreach ($cookie_names as $name) {
41
42 $parts = explode('_', $name, 2);
43 $prefix = $parts[0];
44
45 // Add a simple rule to avoid tiny, useless prefixes like "a" or "b"
46 if (strlen($prefix) >= 3) {
47 $prefixes[] = $prefix;
48 } else {
49 // If prefix is too short, use the full name up to a limit
50 $prefixes[] = substr($name, 0, 3);
51 }
52 }
53 return array_unique($prefixes);
54 }
55
56
57 static function fetch_candidates_from_db($prefixes){
58
59 if (empty($prefixes)) {
60 return [];
61 }
62
63 $cookies_info = cookieadmin_load_cookies_csv($prefixes, 1);
64
65 if(empty($cookies_info) || is_wp_error($cookies_info)){
66 return [];
67 }
68
69 return $cookies_info;
70 }
71
72
73 static function match_and_enrich_cookies($found_cookies, $db_candidates, $old_categorized_cookies){
74 $categorized_cookies = [];
75 $remove_cookies = [];
76
77 foreach ($found_cookies as $scanned_name => $cookie_data) {
78 $best_match = null;
79 $longest_match_length = 0;
80
81 foreach ($db_candidates as $candidate) {
82
83 $candidate_name = $candidate['cookie_name'];
84
85 // Rule 1: Wildcard Match
86 if ($candidate['wildcard'] == 1 && strpos($scanned_name, $candidate_name) === 0) {
87 // "Best" is defined as the longest matching prefix.
88 if (strlen($candidate_name) > $longest_match_length) {
89 $longest_match_length = strlen($candidate_name);
90 $best_match = $candidate;
91 }
92 }
93 // Rule 2: Exact Match
94 else if ($candidate['wildcard'] == 0 && $scanned_name === $candidate_name) {
95 if (strlen($candidate_name) > $longest_match_length) {
96 $longest_match_length = strlen($candidate_name);
97 $best_match = $candidate;
98 break;
99 }
100 }
101 }
102
103 if (!empty($best_match)) {
104
105 $cookie_name = $best_match['cookie_name'];
106
107 if(!empty($old_categorized_cookies) && array_key_exists($cookie_name, $old_categorized_cookies)){
108 $remove_cookies[] = $old_categorized_cookies[$cookie_name];
109 }
110
111 $categorized_cookies[$cookie_name]['cookie_name'] = $cookie_name;
112 $categorized_cookies[$cookie_name]['raw_name'] = $scanned_name;
113 $categorized_cookies[$cookie_name]['category'] = $best_match['category'];
114 $categorized_cookies[$cookie_name]['description'] = $best_match['description'];
115 $categorized_cookies[$cookie_name]['patterns'] = $best_match['patterns'];
116
117 }
118 }
119 $categorized_cookies['remove_cookies'] = $remove_cookies;
120 return $categorized_cookies;
121 }
122 }