From 4b7f20cfaecbebcc2296aad58975f63a1e0cc6cf Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Tue, 20 Dec 2016 13:11:15 -0500 Subject: [PATCH 1/6] Take into account the whitelist and blacklist --- data.php | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/data.php b/data.php index 7060dc4e..5be0a459 100644 --- a/data.php +++ b/data.php @@ -5,6 +5,8 @@ $hosts = file_exists("/etc/hosts") ? file("/etc/hosts") : array(); $log = new \SplFileObject('/var/log/pihole.log'); $gravity = new \SplFileObject('/etc/pihole/list.preEventHorizon'); + $whitelist = new \SplFileObject('/etc/pihole/whitelist.txt'); + $blacklist = new \SplFileObject('/etc/pihole/blacklist.txt'); /******* Public Members ********/ function getSummaryData() { @@ -183,10 +185,15 @@ } function getAllQueries($orderBy) { - global $log,$gravity,$showBlocked,$showPermitted; + global $log,$gravity,$showBlocked,$showPermitted,$whitelist,$blacklist; $allQueries = array("data" => array()); $dns_queries = getDnsQueriesAll($log); - $gravity_domains = getGravityDomains($gravity); + $gravity_domains = getDomains($gravity, true); + $whitelist_domains = getDomains($whitelist, false); + $blacklist_domains = getDomains($blacklist, true); + + $gravity_domains = array_merge($gravity_domains, $whitelist_domains, $blacklist_domains); + foreach ($dns_queries as $query) { $time = date_create(substr($query, 0, 16)); @@ -198,7 +205,9 @@ if (substr($tmp, 0, 5) == "query") { - $status = isset($gravity_domains[$domain]) ? "Pi-holed" : "OK"; + $status = isset($gravity_domains[$domain]) ? + $gravity_domains[$domain] === true ? "Pi-holed" : "OK" + : "OK"; if(($status === "Pi-holed" && $showBlocked) || ($status === "OK" && $showPermitted)) { $type = substr($exploded[count($exploded)-4], 6, -1); @@ -265,13 +274,13 @@ return $lines; } - function getGravityDomains($gravity){ - $gravity->rewind(); + function getDomains($file, $default_value){ + $file->rewind(); $lines=[]; - foreach ($gravity as $line) { + foreach ($file as $line) { // Strip newline (and possibly carriage return) from end of string // using rtrim() - $lines[rtrim($line)] = true; + $lines[rtrim($line)] = $default_value; } return $lines; From f9a601c5b0490d2ab8b52bdd13af5787596e15e3 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Tue, 20 Dec 2016 13:38:42 -0500 Subject: [PATCH 2/6] Avoid array_merge Simply unset and set when applying whitelist and blacklist --- data.php | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/data.php b/data.php index 5be0a459..713ba25a 100644 --- a/data.php +++ b/data.php @@ -188,11 +188,21 @@ global $log,$gravity,$showBlocked,$showPermitted,$whitelist,$blacklist; $allQueries = array("data" => array()); $dns_queries = getDnsQueriesAll($log); - $gravity_domains = getDomains($gravity, true); - $whitelist_domains = getDomains($whitelist, false); - $blacklist_domains = getDomains($blacklist, true); + $gravity_domains = getDomains($gravity); + $whitelist_domains = getDomains($whitelist); + $blacklist_domains = getDomains($blacklist); - $gravity_domains = array_merge($gravity_domains, $whitelist_domains, $blacklist_domains); + // Remove whitelisted domains + foreach($gravity_domains as $domain) { + if(isset($whitelist_domains[$domain])) { + unset($gravity_domains[$domain]); + } + } + + // Add blacklisted domains if they aren't already there + foreach($blacklist_domains as $domain) { + $gravity_domains[$domain] = null; + } foreach ($dns_queries as $query) { @@ -274,13 +284,13 @@ return $lines; } - function getDomains($file, $default_value){ + function getDomains($file){ $file->rewind(); $lines=[]; foreach ($file as $line) { // Strip newline (and possibly carriage return) from end of string // using rtrim() - $lines[rtrim($line)] = $default_value; + $lines[rtrim($line)] = null; } return $lines; From b298f1ab06231a771b844758f8ae286b137aa815 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 20 Dec 2016 21:19:49 +0100 Subject: [PATCH 3/6] Loop over $whiteList, simplified code slightly --- data.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/data.php b/data.php index 713ba25a..8c7bf2df 100644 --- a/data.php +++ b/data.php @@ -188,20 +188,22 @@ global $log,$gravity,$showBlocked,$showPermitted,$whitelist,$blacklist; $allQueries = array("data" => array()); $dns_queries = getDnsQueriesAll($log); - $gravity_domains = getDomains($gravity); + + $gravity_domains = getDomains($gravity); $whitelist_domains = getDomains($whitelist); $blacklist_domains = getDomains($blacklist); - // Remove whitelisted domains - foreach($gravity_domains as $domain) { - if(isset($whitelist_domains[$domain])) { + // Remove whitelisted domains if they exist in + // $gravity_domains + foreach($whitelist_domains as $domain) { + if(isset($gravity_domains[$domain])) { unset($gravity_domains[$domain]); } } - // Add blacklisted domains if they aren't already there + // Add blacklisted domains (do not need to check if they are already there) foreach($blacklist_domains as $domain) { - $gravity_domains[$domain] = null; + $gravity_domains[$domain] = true; } @@ -215,9 +217,7 @@ if (substr($tmp, 0, 5) == "query") { - $status = isset($gravity_domains[$domain]) ? - $gravity_domains[$domain] === true ? "Pi-holed" : "OK" - : "OK"; + $status = isset($gravity_domains[$domain]) ? "Pi-holed" : "OK"; if(($status === "Pi-holed" && $showBlocked) || ($status === "OK" && $showPermitted)) { $type = substr($exploded[count($exploded)-4], 6, -1); @@ -290,7 +290,7 @@ foreach ($file as $line) { // Strip newline (and possibly carriage return) from end of string // using rtrim() - $lines[rtrim($line)] = null; + $lines[rtrim($line)] = true; } return $lines; From be5a6cb5df53dbbf2ec7f47d669bcd6adc38d5c6 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 20 Dec 2016 21:31:49 +0100 Subject: [PATCH 4/6] Use only one array, no additional loops --- api.php | 2 +- data.php | 57 ++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/api.php b/api.php index 3c3ad7d1..150dc9e2 100644 --- a/api.php +++ b/api.php @@ -77,7 +77,7 @@ } if (isset($_GET['getGravityDomains'])) { - $data = array_merge($data, getGravityDomains($gravity)); + $data = array_merge($data, getGravity()); } function filterArray(&$inArray) { diff --git a/data.php b/data.php index 8c7bf2df..c12dec25 100644 --- a/data.php +++ b/data.php @@ -185,27 +185,12 @@ } function getAllQueries($orderBy) { - global $log,$gravity,$showBlocked,$showPermitted,$whitelist,$blacklist; + global $log,$showBlocked,$showPermitted; $allQueries = array("data" => array()); $dns_queries = getDnsQueriesAll($log); - $gravity_domains = getDomains($gravity); - $whitelist_domains = getDomains($whitelist); - $blacklist_domains = getDomains($blacklist); - - // Remove whitelisted domains if they exist in - // $gravity_domains - foreach($whitelist_domains as $domain) { - if(isset($gravity_domains[$domain])) { - unset($gravity_domains[$domain]); - } - } - - // Add blacklisted domains (do not need to check if they are already there) - foreach($blacklist_domains as $domain) { - $gravity_domains[$domain] = true; - } - + // Create empty array for gravity + $gravity_domains = getGravity(); foreach ($dns_queries as $query) { $time = date_create(substr($query, 0, 16)); @@ -284,18 +269,46 @@ return $lines; } - function getDomains($file){ + function getDomains($file, &$array, $action){ $file->rewind(); $lines=[]; foreach ($file as $line) { - // Strip newline (and possibly carriage return) from end of string - // using rtrim() - $lines[rtrim($line)] = true; + // Strip newline (and possibly carriage return) from end of key + $key = rtrim($line); + // if $action = true -> we want that domain to be ADDED to the list + // doesn't harm to do this if it has already been set before + // (e.g. once in gravity list, once in blacklist) + if($action && strlen($key) > 0) + { + $lines[$key] = true; + } + elseif(isset($lines[$key])) + { + // $action is not true (we want to remove) *and* key is set + unset($lines[$key]); + } + // else: Remove, but not set -> don't have to don anything } return $lines; } + function getGravity() { + global $gravity,$whitelist,$blacklist; + $domains = []; + + // ADD (true) preEventHorizon domains + getDomains($gravity, $domains, true); + + // ADD (true) blacklist domains + getDomains($blacklist, $domains, true); + + // REMOVE (false) whitelist domains + getDomains($whitelist, $domains, false); + + return $domains; + } + function getBlockedQueries(\SplFileObject $log) { $log->rewind(); $lines = []; From d89fb7a0e0961cc5e21e5538eefe6cdff55c69be Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 20 Dec 2016 21:38:51 +0100 Subject: [PATCH 5/6] Have to modify the correct array for this to work... --- data.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/data.php b/data.php index c12dec25..dd5c5c5b 100644 --- a/data.php +++ b/data.php @@ -271,7 +271,6 @@ function getDomains($file, &$array, $action){ $file->rewind(); - $lines=[]; foreach ($file as $line) { // Strip newline (and possibly carriage return) from end of key $key = rtrim($line); @@ -280,17 +279,15 @@ // (e.g. once in gravity list, once in blacklist) if($action && strlen($key) > 0) { - $lines[$key] = true; + $array[$key] = true; } - elseif(isset($lines[$key])) + elseif(isset($array[$key])) { // $action is not true (we want to remove) *and* key is set - unset($lines[$key]); + unset($array[$key]); } // else: Remove, but not set -> don't have to don anything } - - return $lines; } function getGravity() { From b01d8293db978fa72220f10c4f0bb7f9eced1fd0 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 20 Dec 2016 21:40:19 +0100 Subject: [PATCH 6/6] Improved comments --- data.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data.php b/data.php index dd5c5c5b..43ba51e6 100644 --- a/data.php +++ b/data.php @@ -279,14 +279,14 @@ // (e.g. once in gravity list, once in blacklist) if($action && strlen($key) > 0) { + // $action is true (we want to add) *and* key is not empty $array[$key] = true; } - elseif(isset($array[$key])) + elseif(!$action && isset($array[$key])) { - // $action is not true (we want to remove) *and* key is set + // $action is false (we want to remove) *and* key is set unset($array[$key]); } - // else: Remove, but not set -> don't have to don anything } }