| 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 |
} |