PluginProbe
CookieAdmin – Cookie Consent Banner / 1.0.2
CookieAdmin – Cookie Consent Banner v1.0.2
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
cookieadmin / includes / cookiecategorizer.php

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

123 lines 4.0 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(array $found_cookies, array $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(array $cookie_names): array {
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(array $prefixes): array {
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(array $found_cookies, array $db_candidates, array $old_categorized_cookies): array {
74 $categorized_cookies = [];
75 $old_categorized_cookies = [];
76 $remove_cookies = [];
77
78 foreach ($found_cookies as $scanned_name => $cookie_data) {
79 $best_match = null;
80 $longest_match_length = 0;
81
82 foreach ($db_candidates as $candidate) {
83
84 $candidate_name = $candidate['cookie_name'];
85
86 // Rule 1: Wildcard Match
87 if ($candidate['wildcard'] == 1 && strpos($scanned_name, $candidate_name) === 0) {
88 // "Best" is defined as the longest matching prefix.
89 if (strlen($candidate_name) > $longest_match_length) {
90 $longest_match_length = strlen($candidate_name);
91 $best_match = $candidate;
92 }
93 }
94 // Rule 2: Exact Match
95 else if ($candidate['wildcard'] == 0 && $scanned_name === $candidate_name) {
96 if (strlen($candidate_name) > $longest_match_length) {
97 $longest_match_length = strlen($candidate_name);
98 $best_match = $candidate;
99 break;
100 }
101 }
102 }
103
104 if (!empty($best_match)) {
105
106 if(!empty($old_categorized_cookies) && array_key_exists($best_match['cookie_name'], $old_categorized_cookies)){
107 $remove_cookies[] = $scanned_name;
108 continue;
109 }
110
111 $cookie_name = $best_match['cookie_name'];
112 $categorized_cookies[$cookie_name]['cookie_name'] = $cookie_name;
113 $categorized_cookies[$cookie_name]['raw_name'] = $scanned_name;
114 $categorized_cookies[$cookie_name]['category'] = $best_match['category'];
115 $categorized_cookies[$cookie_name]['description'] = $best_match['description'];
116 $categorized_cookies[$cookie_name]['patterns'] = $best_match['patterns'];
117
118 }
119 }
120 $categorized_cookies['remove_cookies'] = $remove_cookies;
121 return $categorized_cookies;
122 }
123 }