diff --git a/scripts/pi-hole/php/database.php b/scripts/pi-hole/php/database.php
index 2bad73db..cf250d13 100644
--- a/scripts/pi-hole/php/database.php
+++ b/scripts/pi-hole/php/database.php
@@ -107,6 +107,16 @@ function add_to_table($db, $table, $domains, $comment, $wildcardstyle=false, $re
return "Error: Unable to begin transaction for $table table.";
}
+ // To which column should the record be added to?
+ if ($table === "adlist")
+ {
+ $field = "address";
+ }
+ else
+ {
+ $field = "domain";
+ }
+
// Get initial count of domains in this table
if($type === -1)
{
@@ -121,11 +131,11 @@ function add_to_table($db, $table, $domains, $comment, $wildcardstyle=false, $re
// Prepare INSERT SQLite statememt
if($type === -1)
{
- $querystr = "INSERT OR IGNORE INTO $table (domain,comment) VALUES (:domain, :comment);";
+ $querystr = "INSERT OR IGNORE INTO $table ($field,comment) VALUES (:$field, :comment);";
}
else
{
- $querystr = "INSERT OR IGNORE INTO $table (domain,comment,type) VALUES (:domain, :comment, $type);";
+ $querystr = "INSERT OR IGNORE INTO $table ($field,comment,type) VALUES (:$field, :comment, $type);";
}
$stmt = $db->prepare($querystr);
@@ -135,7 +145,7 @@ function add_to_table($db, $table, $domains, $comment, $wildcardstyle=false, $re
if($returnnum)
return 0;
else
- return "Error: Failed to prepare statement for $table table (type = $type).";
+ return "Error: Failed to prepare statement for $table table (type = $type, field = $field).";
}
// Loop over domains and inject the lines into the database
@@ -149,7 +159,7 @@ function add_to_table($db, $table, $domains, $comment, $wildcardstyle=false, $re
if($wildcardstyle)
$domain = "(\\.|^)".str_replace(".","\\.",$domain)."$";
- $stmt->bindValue(":domain", $domain, SQLITE3_TEXT);
+ $stmt->bindValue(":$field", $domain, SQLITE3_TEXT);
$stmt->bindValue(":comment", $comment, SQLITE3_TEXT);
if($stmt->execute() && $stmt->reset())
diff --git a/scripts/pi-hole/php/teleporter.php b/scripts/pi-hole/php/teleporter.php
index 7c34c47f..84f96bc8 100644
--- a/scripts/pi-hole/php/teleporter.php
+++ b/scripts/pi-hole/php/teleporter.php
@@ -185,7 +185,7 @@ function archive_restore_table($file, $table, $flush=false)
/**
* Create table rows from an uploaded archive file
*
- * @param $file object The file of the file in the archive to import
+ * @param $file object The file in the archive to import
* @param $table string The target table
* @param $flush boolean Whether to flush the table before importing the archived data
* @param $wildcardstyle boolean Whether to format the input domains in legacy wildcard notation
@@ -193,22 +193,69 @@ function archive_restore_table($file, $table, $flush=false)
*/
function archive_insert_into_table($file, $table, $flush=false, $wildcardstyle=false)
{
- global $db, $flushed_tables;
+ global $db;
$domains = array_filter(explode("\n",file_get_contents($file)));
// Return early if we cannot extract the lines in the file
if(is_null($domains))
return 0;
- // Flush table if requested, only flush each table once
- if($flush && !in_array($table, $flushed_tables))
- {
- $db->exec("DELETE FROM ".$table);
- array_push($flushed_tables, $table);
+ // Generate comment
+ $prefix = "phar:///tmp/";
+ if (substr($file, 0, strlen($prefix)) == $prefix) {
+ $file = substr($file, strlen($prefix));
+ }
+ $comment = "Imported from ".$file;
+
+ // Determine table and type to import to
+ $type = null;
+ if($table === "whitelist") {
+ $table = "domainlist";
+ $type = ListType::whitelist;
+ } else if($table === "blacklist") {
+ $table = "domainlist";
+ $type = ListType::blacklist;
+ } else if($table === "regex_blacklist") {
+ $table = "domainlist";
+ $type = ListType::regex_blacklist;
+ } else if($table === "domain_audit") {
+ $table = "domain_audit";
+ $type = -1; // -1 -> not used inside add_to_table()
+ } else if($table === "adlist") {
+ $table = "adlist";
+ $type = -1; // -1 -> not used inside add_to_table()
+ }
+
+ // Flush table if requested
+ if($flush) {
+ flush_table($table, $type);
}
// Add domains to requested table
- return add_to_table($db, $table, $domains, $wildcardstyle, true);
+ return add_to_table($db, $table, $domains, $comment, $wildcardstyle, true, $type);
+}
+
+/**
+ * Flush table if requested. This subroutine flushes each table only once
+ *
+ * @param $table string The target table
+ * @param $type integer Type of item to flush in table (applies only to domainlist table)
+ */
+function flush_table($table, $type=null)
+{
+ global $db, $flushed_tables;
+
+ if(!in_array($table, $flushed_tables))
+ {
+ if($type !== null) {
+ $sql = "DELETE FROM ".$table." WHERE type = ".$type;
+ array_push($flushed_tables, $table.$type);
+ } else {
+ $sql = "DELETE FROM ".$table;
+ array_push($flushed_tables, $table);
+ }
+ $db->exec($sql);
+ }
}
function archive_add_directory($path,$subdir="")
@@ -311,7 +358,14 @@ if(isset($_POST["action"]))
if(isset($_POST["auditlog"]) && $file->getFilename() === "auditlog.list")
{
$num = archive_insert_into_table($file, "domain_audit", $flushtables);
- echo "Processed blacklist (regex) (".$num." entries)
\n";
+ echo "Processed audit log (".$num." entries)
\n";
+ $importedsomething = true;
+ }
+
+ if(isset($_POST["adlist"]) && $file->getFilename() === "adlists.list")
+ {
+ $num = archive_insert_into_table($file, "adlist", $flushtables);
+ echo "Processed adlists (".$num." entries)
\n";
$importedsomething = true;
}