mirror of
https://github.com/pi-hole/pi-hole.git
synced 2024-12-24 13:50:17 +00:00
Update index.php
* An "About Pi-hole" link on the block page provides an ELI5 explanation to those not familiar with Pi-hole * An email contact link on the block page provides users of your Pi-hole with a means to easily get in touch with you * Browsing to your Pi-hole's address will show a simple "landing page", which can be replaced by adding "landing.php" within "/var/www/html" * Users manually browsing to file/image based content (i.e: non HTML based content) on blocked sites will be greeted with a small "Blocked by Pi-hole" image * Sites that are manually blacklisted will display a notice of this on the block page * Sites that aren't directly blocked, but have a CNAME record, will show a notification on the block page (e.g: If raw.githubusercontent.com is not blocked, but github.map.fastly.net is) * On the block page, "Back to Safety" now directs the user to "about:home" if Javascript is disabled * Whitelisting is disabled for installs without a password, or if a client does not have Javascript * Known issues: * Admin Console needs a text field under "Web User Interface" where the admin can enter a preferred contact email when a site needs to be whitelisted, to be saved to setupVars.conf with the key "ADMIN_EMAIL" * Admin Console needs a text field under "Networking" where the admin can enter their Pi-hole's externally contactable FQDN, allowing access to their landing page when browsing to mypi.duckdns.org, to be saved to setupVars.conf with the key "FQDN" * I am not aware of expected output of `$_SERVER["VIRTUAL_HOST"]`, so I have assumed it should be filtered as if it's a domain
This commit is contained in:
parent
88944a31ec
commit
551add5f44
1 changed files with 299 additions and 188 deletions
|
@ -1,224 +1,335 @@
|
||||||
<?php
|
<?php
|
||||||
/* Detailed Pi-hole Block Page: Show "Website Blocked" if user browses to site, but not to image/file requests based on the work of WaLLy3K for DietPi & Pi-Hole */
|
/* Pi-hole: A black hole for Internet advertisements
|
||||||
|
* (c) 2017 Pi-hole, LLC (https://pi-hole.net)
|
||||||
|
* Network-wide ad blocking via your own hardware.
|
||||||
|
*
|
||||||
|
* This file is copyright under the latest version of the EUPL.
|
||||||
|
* Please see LICENSE file for your rights under this license. */
|
||||||
|
|
||||||
function validIP($address){
|
// Function to validate server name (Including underscores & IPv6)
|
||||||
if (preg_match('/[.:0]/', $address) && !preg_match('/[1-9a-f]/', $address)) {
|
ini_set("pcre.recursion_limit", 1500);
|
||||||
// Test if address contains either `:` or `0` but not 1-9 or a-f
|
function validate_server_name($domain) { // Cr: http://stackoverflow.com/a/4694816
|
||||||
return false;
|
if (filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) return TRUE;
|
||||||
}
|
return (preg_match("/^([a-z\d]((-|_)*[a-z\d])*)(\.([a-z\d]((-|_)*[a-z\d])*))*$/i", $domain) // Valid chars check
|
||||||
return !filter_var($address, FILTER_VALIDATE_IP) === false;
|
&& preg_match("/^.{1,253}$/", $domain) // Overall length check
|
||||||
|
&& preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $domain)); // Length of each label
|
||||||
}
|
}
|
||||||
|
|
||||||
$uri = escapeshellcmd($_SERVER['REQUEST_URI']);
|
// Validate SERVER_NAME output
|
||||||
$serverName = escapeshellcmd($_SERVER['SERVER_NAME']);
|
if (validate_server_name($_SERVER["SERVER_NAME"]) === TRUE) {
|
||||||
|
$serverName = $_SERVER["SERVER_NAME"];
|
||||||
// If the server name is 'pi.hole', it's likely a user trying to get to the admin panel.
|
} else {
|
||||||
// Let's be nice and redirect them.
|
die("[ERROR]: <code>SERVER_NAME</code> header output does not appear to be valid: <code>".$_SERVER["SERVER_NAME"]."</code>");
|
||||||
if ($serverName === 'pi.hole')
|
|
||||||
{
|
|
||||||
header('HTTP/1.1 301 Moved Permanently');
|
|
||||||
header("Location: /admin/");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve server URI extension (EG: jpg, exe, php)
|
// Get values from setupVars.conf
|
||||||
ini_set('pcre.recursion_limit',100);
|
|
||||||
$uriExt = pathinfo($uri, PATHINFO_EXTENSION);
|
|
||||||
|
|
||||||
// Define which URL extensions get rendered as "Website Blocked"
|
|
||||||
$webExt = array('asp', 'htm', 'html', 'php', 'rss', 'xml');
|
|
||||||
|
|
||||||
// Get IPv4 and IPv6 addresses from setupVars.conf (if available)
|
|
||||||
$setupVars = parse_ini_file("/etc/pihole/setupVars.conf");
|
$setupVars = parse_ini_file("/etc/pihole/setupVars.conf");
|
||||||
$ipv4 = isset($setupVars["IPV4_ADDRESS"]) ? explode("/", $setupVars["IPV4_ADDRESS"])[0] : $_SERVER['SERVER_ADDR'];
|
$svFQDN = (!empty($setupVars["FQDN"]) && validate_server_name($setupVars["FQDN"]) === TRUE) ? $setupVars["FQDN"] : "";
|
||||||
$ipv6 = isset($setupVars["IPV6_ADDRESS"]) ? explode("/", $setupVars["IPV6_ADDRESS"])[0] : $_SERVER['SERVER_ADDR'];
|
$svPasswd = !empty($setupVars["WEBPASSWORD"]);
|
||||||
|
$svEmail = (!empty($setupVars["ADMIN_EMAIL"]) && filter_var($setupVars["ADMIN_EMAIL"], FILTER_VALIDATE_EMAIL)) ? $setupVars["ADMIN_EMAIL"] : "";
|
||||||
|
unset($setupVars);
|
||||||
|
|
||||||
$AUTHORIZED_HOSTNAMES = array(
|
// Set landing page name, found within /var/www/html/
|
||||||
$ipv4,
|
$landPage = "landing.php";
|
||||||
$ipv6,
|
|
||||||
str_replace(array("[","]"), array("",""), $_SERVER["SERVER_ADDR"]),
|
|
||||||
"pi.hole",
|
|
||||||
"localhost");
|
|
||||||
// Allow user set virtual hostnames
|
|
||||||
$virtual_host = getenv('VIRTUAL_HOST');
|
|
||||||
if (!empty($virtual_host))
|
|
||||||
array_push($AUTHORIZED_HOSTNAMES, $virtual_host);
|
|
||||||
|
|
||||||
// Immediately quit since we didn't block this page (the IP address or pi.hole is explicitly requested)
|
// Set empty array for hostnames to be accepted as self address for splash page
|
||||||
if(validIP($serverName) || in_array($serverName,$AUTHORIZED_HOSTNAMES))
|
$authorizedHosts = [];
|
||||||
{
|
|
||||||
http_response_code(404);
|
// Append FQDN to $authorizedHosts
|
||||||
die();
|
if (!empty($svFQDN)) array_push($authorizedHosts, $svFQDN);
|
||||||
|
|
||||||
|
// Append virtual hostname to $authorizedHosts
|
||||||
|
if (!empty($_SERVER["VIRTUAL_HOST"])) {
|
||||||
|
if (validate_server_name($_SERVER["VIRTUAL_HOST"]) === TRUE) {
|
||||||
|
array_push($authorizedHosts, $_SERVER["VIRTUAL_HOST"]);
|
||||||
|
} else {
|
||||||
|
die("[ERROR]: <code>VIRTUAL_HOST</code> header output does not appear to be valid: <code>".$_SERVER["VIRTUAL_HOST"]."</code>");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(in_array($uriExt, $webExt) || empty($uriExt))
|
// Set which extension types get rendered as "Website Blocked" (Including "" for index file extensions)
|
||||||
{
|
$validExtTypes = array("asp", "htm", "html", "php", "rss", "xml", "");
|
||||||
// Requested resource has an extension listed in $webExt
|
|
||||||
// or no extension (index access to some folder incl. the root dir)
|
// Get extension of current URL
|
||||||
$showPage = true;
|
$currentUrlExt = pathinfo($_SERVER["REQUEST_URI"], PATHINFO_EXTENSION);
|
||||||
}
|
|
||||||
else
|
// Set mobile friendly viewport
|
||||||
{
|
$viewPort = '<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>';
|
||||||
// Something else
|
|
||||||
$showPage = false;
|
// Set response header
|
||||||
|
function setHeader($type = "x") {
|
||||||
|
header("X-Pi-hole: A black hole for Internet advertisements.");
|
||||||
|
if (isset($type) && $type === "js") header("Content-Type: application/javascript");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle incoming URI types
|
// Determine block page redirect
|
||||||
if (!$showPage)
|
if ($serverName === "pi.hole") {
|
||||||
{
|
exit(header("Location: /admin"));
|
||||||
?>
|
} elseif (filter_var($serverName, FILTER_VALIDATE_IP) || in_array($serverName, $authorizedHosts)) {
|
||||||
<html>
|
// Show splash page or landing page when directly browsing via IP or auth'd hostname
|
||||||
<head>
|
$splashPage = "
|
||||||
<script>window.close();</script></head>
|
<html><head>
|
||||||
<body>
|
$viewPort
|
||||||
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
|
<link rel='stylesheet' href='/blockpage.css' type='text/css'/>
|
||||||
</body>
|
</head><body id='splashpage'><img src='/admin/img/logo.svg'/><br/>Pi-<b>hole</b>: Your black hole for Internet advertisements</body></html>
|
||||||
</html>
|
";
|
||||||
<?php
|
$pageType = is_file(getcwd()."/$landPage") ? include $landPage : "$splashPage";
|
||||||
die();
|
unset($serverName, $svFQDN, $svPasswd, $svEmail, $authorizedHosts, $validExtTypes, $currentUrlExt, $viewPort);
|
||||||
|
exit($pageType);
|
||||||
|
} elseif ($currentUrlExt === "js") {
|
||||||
|
// Set Javascript redirect for blocked sources
|
||||||
|
exit(setHeader("js").'var x = "Pi-hole: A black hole for Internet advertisements."');
|
||||||
|
} elseif (strpos($_SERVER["REQUEST_URI"], "?") !== FALSE && isset($_SERVER["HTTP_REFERER"])) {
|
||||||
|
// Set blank image upon receiving REQUEST_URI w/ query string & HTTP_REFERRER (Presumably from iframe)
|
||||||
|
exit(setHeader().'<html>
|
||||||
|
<head><script>window.close();</script></head>
|
||||||
|
<body><img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs="></body>
|
||||||
|
</html>');
|
||||||
|
} elseif (!in_array($currentUrlExt, $validExtTypes) || substr_count($_SERVER["REQUEST_URI"], "?")) {
|
||||||
|
// Set svg image upon receiving non $validExtTypes URL extension or query string (Presumably not from an iframe)
|
||||||
|
$blockImg = '<a href="/"><svg xmlns="http://www.w3.org/2000/svg" width="110" height="16"><defs><style>a {text-decoration: none;} circle {stroke: rgba(152,2,2,0.5); fill: none; stroke-width: 2;} rect {fill: rgba(152,2,2,0.5);} text {opacity: 0.3; font: 11px Arial;}</style></defs><circle cx="8" cy="8" r="7"/><rect x="10.3" y="-6" width="2" height="12" transform="rotate(45)"/><text x="19.3" y="12">Blocked by Pi-hole</text></svg></a>';
|
||||||
|
exit(setHeader()."<html>
|
||||||
|
<head>$viewPort</head>
|
||||||
|
<body>$blockImg</body>
|
||||||
|
</html>");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get Pi-hole version
|
/* Start processing block page from here */
|
||||||
$piHoleVersion = exec('cd /etc/.pihole/ && git describe --tags --abbrev=0');
|
|
||||||
|
|
||||||
// Don't show the URI if it is the root directory
|
// Get Pi-hole core branch name
|
||||||
if($uri == "/")
|
$phBranch = exec("cd /etc/.pihole/ && git rev-parse --abbrev-ref HEAD");
|
||||||
{
|
if ($phBranch !== "master") {
|
||||||
$uri = "";
|
error_reporting(E_ALL);
|
||||||
|
ini_set("display_errors", 1);
|
||||||
|
ini_set("display_startup_errors", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate SERVER_IP output
|
||||||
|
if (filter_var($_SERVER['SERVER_ADDR'], FILTER_VALIDATE_IP)) {
|
||||||
|
$serverAddr = $_SERVER["SERVER_ADDR"];
|
||||||
|
} else {
|
||||||
|
die("[ERROR]: <code>SERVER_IP</code> header output does not appear to be valid: <code>".$_SERVER["SERVER_ADDR"]."</code>");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine placeholder text based off $svPasswd presence
|
||||||
|
$wlPlaceHolder = empty($svPasswd) ? "No admin password set" : "Javascript disabled";
|
||||||
|
|
||||||
|
// Get admin email address
|
||||||
|
$bpAskAdmin = !empty($svEmail) ? '<a href="mailto:'.$svEmail.'?subject=Site Blocked: '.$serverName.'"></a>' : "<span/>";
|
||||||
|
|
||||||
|
// Determine if at least one block list has been generated
|
||||||
|
if (empty(glob("/etc/pihole/list.0.*.domains"))) die("[ERROR]: There are no domain lists generated lists within <code>/etc/pihole/</code>! Please update gravity by running <code>pihole -g</code>, or repair Pi-hole using <code>pihole -r</code>.");
|
||||||
|
|
||||||
|
// Get contents of adlist.list
|
||||||
|
$adLists = is_file("/etc/pihole/adlists.list") ? "/etc/pihole/adlists.list" : "/etc/pihole/adlists.default";
|
||||||
|
if (!is_file($adLists)) die("[ERROR]: Unable to find file: <code>$adLists</code>");
|
||||||
|
|
||||||
|
// Get all URLs starting with "http" or "www" from $adLists and re-index array numerically
|
||||||
|
$adlistsUrls = array_values(preg_grep("/(^http)|(^www)/i", file($adLists, FILE_IGNORE_NEW_LINES)));
|
||||||
|
if (empty($adlistsUrls)) die("[ERROR]: There are no adlist URL's found within <code>$adLists</code>");
|
||||||
|
$adlistsCount = count($adlistsUrls) + 3; // +1 because array starts at 0, +2 for Blacklist & Wildcard lists
|
||||||
|
|
||||||
|
// Get results of queryads.php exact search
|
||||||
|
ini_set("default_socket_timeout", 3);
|
||||||
|
function queryAds($serverName) {
|
||||||
|
$preQueryTime = microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"];
|
||||||
|
$queryAds = file("http://127.0.0.1/admin/scripts/pi-hole/php/queryads.php?domain=$serverName&exact", FILE_IGNORE_NEW_LINES);
|
||||||
|
$queryTime = sprintf("%.0f", (microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"]) - $preQueryTime);
|
||||||
|
try {
|
||||||
|
if ($queryTime >= ini_get("default_socket_timeout")) {
|
||||||
|
throw new Exception ("Connection timeout (".ini_get("default_socket_timeout")."s)");
|
||||||
|
} elseif ($queryAds[0][0] === ":") {
|
||||||
|
if (strpos($queryAds[0], "Invalid") !== FALSE) throw new Exception ("Invalid Domain ($serverName)");
|
||||||
|
if (strpos($queryAds[0], "No exact") !== FALSE) return array("0" => "none");
|
||||||
|
throw new Exception ("Unhandled error message (<code>$queryAds[0]</code>)");
|
||||||
|
} elseif ($queryAds[0][0] !== "/") {
|
||||||
|
throw new Exception ("Unexpected output (<code>$queryAds[0]</code>)");
|
||||||
|
}
|
||||||
|
return $queryAds;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
return array("0" => "error", "1" => $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$queryAds = queryAds($serverName);
|
||||||
|
|
||||||
|
if ($queryAds[0] === "error") {
|
||||||
|
die("[ERROR]: Unable to parse results from <i>queryads.php</i>: <code>".$queryAds[1]."</code>");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter, sort, and count $queryAds array
|
||||||
|
if ($queryAds[0] !== "none") {
|
||||||
|
$queryAds = preg_replace("/(\/etc\/pihole\/)|(\/etc\/dnsmasq\.d\/)/", "", $queryAds);
|
||||||
|
$queryAds = preg_replace("/(^list\.)|(\..*domains)/", "", $queryAds);
|
||||||
|
$featuredTotal = count($queryAds);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine if domain has been blacklisted or wildcarded
|
||||||
|
if ($queryAds[0] === "blacklist.txt") {
|
||||||
|
$intBlacklist = array("π" => $queryAds[0]);
|
||||||
|
$queryAds[0] = "π"; // Manually blacklisted sites do not have a number
|
||||||
|
$notableFlagClass = "blacklist";
|
||||||
|
} elseif ($queryAds[0] === "03-pihole-wildcard.conf") {
|
||||||
|
$intBlacklist = array("π" => $queryAds[0]);
|
||||||
|
$queryAds[0] = "π";
|
||||||
|
$notableFlagClass = "wildcard";
|
||||||
|
} elseif ($queryAds[0] === "none") {
|
||||||
|
$featuredTotal = "0";
|
||||||
|
$notableFlagClass = "noblock";
|
||||||
|
|
||||||
|
// Determine appropriate info message if CNAME exists
|
||||||
|
$dnsRecord = dns_get_record("$serverName")[0];
|
||||||
|
if (array_key_exists("target", $dnsRecord)) {
|
||||||
|
$wlInfo = $dnsRecord['target'];
|
||||||
|
} else {
|
||||||
|
$wlInfo = "recentwl";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Merge $intBlacklist with $adlistsUrls if domain has been blacklisted or wildcarded
|
||||||
|
if (isset($intBlacklist)) $adlistsUrls = array_merge($intBlacklist, $adlistsUrls);
|
||||||
|
|
||||||
|
// Set #bpOutput notification
|
||||||
|
$wlOutputClass = (isset($wlInfo) && $wlInfo === "recentwl") ? $wlInfo : "hidden";
|
||||||
|
$wlOutput = (isset($wlInfo) && $wlInfo !== "recentwl") ? "<a href='http://$wlInfo'>$wlInfo</a>" : "";
|
||||||
|
|
||||||
|
// Get Pi-hole core version
|
||||||
|
if ($phBranch !== "master") {
|
||||||
|
$phVersion = exec("cd /etc/.pihole/ && git describe --long --dirty --tags");
|
||||||
|
$execTime = microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"];
|
||||||
|
} else {
|
||||||
|
$phVersion = exec("cd /etc/.pihole/ && git describe --tags --abbrev=0");
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
|
<!-- Pi-hole: A black hole for Internet advertisements
|
||||||
|
* (c) 2017 Pi-hole, LLC (https://pi-hole.net)
|
||||||
|
* Network-wide ad blocking via your own hardware.
|
||||||
|
*
|
||||||
|
* This file is copyright under the latest version of the EUPL. -->
|
||||||
<head>
|
<head>
|
||||||
<meta charset='UTF-8'/>
|
<meta charset="UTF-8">
|
||||||
<title>Website Blocked</title>
|
<?=$viewPort ?>
|
||||||
<link rel='stylesheet' href='http://pi.hole/pihole/blockingpage.css'/>
|
<?=setHeader() ?>
|
||||||
<link rel='shortcut icon' href='http://pi.hole/admin/img/favicon.png' type='image/png'/>
|
<meta name="robots" content="noindex,nofollow"/>
|
||||||
<meta name='viewport' content='width=device-width,initial-scale=1.0,maximum-scale=1.0, user-scalable=no'/>
|
<meta http-equiv="x-dns-prefetch-control" content="off">
|
||||||
<meta name='robots' content='noindex,nofollow'/>
|
<link rel="shortcut icon" href="http://<?=$serverAddr ?>/admin/img/favicon.png" type="image/x-icon"/>
|
||||||
|
<link rel="stylesheet" href="http://<?=$serverAddr ?>/blockpage.css" type="text/css"/>
|
||||||
|
<title>● <?=$serverName ?></title>
|
||||||
|
<script src="http://<?=$serverAddr ?>/admin/scripts/vendor/jquery.min.js"></script>
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
<?php
|
||||||
|
// Remove href fallback from "Back to safety" button
|
||||||
|
if ($featuredTotal > 0) echo '$("#bpBack").removeAttr("href");';
|
||||||
|
// Enable whitelisting if $svPasswd is present & JS is available
|
||||||
|
if (!empty($svPasswd) && $featuredTotal > 0) {
|
||||||
|
echo '$("#bpWLPassword, #bpWhitelist").prop("disabled", false);';
|
||||||
|
echo '$("#bpWLPassword").attr("placeholder", "Password");';
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
}
|
||||||
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body id="body">
|
<body id="blockpage"><div id="bpWrapper">
|
||||||
<header>
|
<header>
|
||||||
<h1><a href='/'>Website Blocked</a></h1>
|
<h1 id="bpTitle">
|
||||||
|
<a class="title" href="/"><?php //Website Blocked ?></a>
|
||||||
|
</h1>
|
||||||
|
<div class="spc"></div>
|
||||||
|
|
||||||
|
<input id="bpAboutToggle" type="checkbox"/>
|
||||||
|
<div id="bpAbout">
|
||||||
|
<div class="aboutPH">
|
||||||
|
<div class="aboutImg"/></div>
|
||||||
|
<p>Open Source Ad Blocker
|
||||||
|
<small>Designed for Raspberry Pi</small>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="aboutLink">
|
||||||
|
<a class="linkPH" href="https://github.com/pi-hole/pi-hole/wiki/What-is-Pi-hole%3F-A-simple-explanation"><?php //About PH ?></a>
|
||||||
|
<?php if (!empty($svEmail)) echo '<a class="linkEmail" href="mailto:'.$svEmail.'"></a>'; ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="bpAlt">
|
||||||
|
<label class="altBtn" for="bpAboutToggle"><?php //Why am I here? ?></label>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
<div>Access to the following site has been blocked:<br/>
|
<div id="bpOutput" class="<?=$wlOutputClass ?>"><?=$wlOutput ?></div>
|
||||||
<span class='pre msg'><?php echo $serverName.$uri; ?></span></div>
|
<div id="bpBlock">
|
||||||
<div>If you have an ongoing use for this website, please ask the owner of the Pi-hole in your network to have it whitelisted.</div>
|
<p class="blockMsg"><?=$serverName ?></p>
|
||||||
<input id="domain" type="hidden" value="<?php echo $serverName; ?>">
|
</div>
|
||||||
<input id="quiet" type="hidden" value="yes">
|
<?php if(isset($notableFlagClass)) { ?>
|
||||||
<button id="btnSearch" class="buttons blocked" type="button" style="visibility: hidden;"></button>
|
<div id="bpFlag">
|
||||||
This page is blocked because it is explicitly contained within the following block list(s):
|
<p class="flagMsg <?=$notableFlagClass ?>"></p>
|
||||||
<pre id="output" style="width: 100%; height: 100%;" hidden="true"></pre><br/>
|
</div>
|
||||||
<div class='buttons blocked'>
|
<?php } ?>
|
||||||
<a class='safe33' href='javascript:history.back()'>Go back</a>
|
<div id="bpHelpTxt"><?=$bpAskAdmin ?></div>
|
||||||
<a class='safe33' id="whitelisting">Whitelist this page</a>
|
<div id="bpButtons" class="buttons">
|
||||||
<a class='safe33' href='javascript:window.close()'>Close window</a>
|
<a id="bpBack" onclick="javascript:history.back()" href="about:home"></a>
|
||||||
</div>
|
<?php if ($featuredTotal > 0) echo '<label id="bpInfo" for="bpMoreToggle"></label>'; ?>
|
||||||
<div style="width: 98%; text-align: center; padding: 10px;" hidden="true" id="whitelistingform">
|
</div>
|
||||||
<p>Note that whitelisting domains which are blocked using the wildcard method won't work.</p>
|
<input id="bpMoreToggle" type="checkbox">
|
||||||
<p>Password required!</p><br/>
|
<div id="bpMoreInfo">
|
||||||
<form>
|
<span id="bpFoundIn"><span><?=$featuredTotal ?></span><?=$adlistsCount ?></span>
|
||||||
<input name="list" type="hidden" value="white"><br/>
|
<pre id='bpQueryOutput'><?php if ($featuredTotal > 0) foreach ($queryAds as $num) { echo "<span>[$num]:</span>$adlistsUrls[$num]\n"; } ?></pre>
|
||||||
Domain:<br/>
|
<form id="bpWLButtons" class="buttons">
|
||||||
<input name="domain" value="<?php echo $serverName ?>" disabled><br/><br/>
|
<input id="bpWLDomain" type="text" value="<?=$serverName ?>" disabled/>
|
||||||
Password:<br/>
|
<input id="bpWLPassword" type="password" placeholder="<?=$wlPlaceHolder ?>" disabled/><button id="bpWhitelist" type="button" disabled></button>
|
||||||
<input type="password" id="pw" name="pw"><br/><br/>
|
</form>
|
||||||
<button class="buttons33 safe" id="btnAdd" type="button">Whitelist</button>
|
</div>
|
||||||
</form><br/>
|
|
||||||
<pre id="whitelistingoutput" style="width: 100%; height: 100%; padding: 5px;" hidden="true"></pre><br/>
|
|
||||||
</div>
|
|
||||||
</main>
|
</main>
|
||||||
<footer>Generated <?php echo date('D g:i A, M d'); ?> by Pi-hole <?php echo $piHoleVersion; ?></footer>
|
|
||||||
<script src="http://pi.hole/admin/scripts/vendor/jquery.min.js"></script>
|
|
||||||
<script>
|
|
||||||
// Create event for when the output is appended to
|
|
||||||
(function($) {
|
|
||||||
var origAppend = $.fn.append;
|
|
||||||
|
|
||||||
$.fn.append = function () {
|
<footer><span><?=date("l g:i A, F dS"); ?>.</span> Pi-hole <?=$phVersion ?> (<?=gethostname()."/".$serverAddr; if (isset($execTime)) printf("/%.2fs", $execTime); ?>)</footer>
|
||||||
return origAppend.apply(this, arguments).trigger("append");
|
</div>
|
||||||
};
|
|
||||||
})(jQuery);
|
|
||||||
</script>
|
|
||||||
<script src="http://pi.hole/admin/scripts/pi-hole/js/queryads.js"></script>
|
|
||||||
<script>
|
<script>
|
||||||
function inIframe () {
|
function add() {
|
||||||
try {
|
$("#bpOutput").removeClass("hidden error exception");
|
||||||
return window.self !== window.top;
|
$("#bpOutput").addClass("add");
|
||||||
} catch (e) {
|
var domain = "<?=$serverName ?>";
|
||||||
return true;
|
var pw = $("#bpWLPassword");
|
||||||
|
if(domain.length === 0) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Try to detect if page is loaded within iframe
|
$.ajax({
|
||||||
if(inIframe())
|
url: "/admin/scripts/pi-hole/php/add.php",
|
||||||
{
|
method: "post",
|
||||||
// Within iframe
|
data: {"domain":domain, "list":"white", "pw":pw.val()},
|
||||||
// hide content of page
|
success: function(response) {
|
||||||
$('#body').hide();
|
if(response.indexOf("Pi-hole blocking") !== -1) {
|
||||||
// remove background
|
setTimeout(function(){window.location.reload(1);}, 10000);
|
||||||
document.body.style.backgroundImage = "none";
|
$("#bpOutput").removeClass("add");
|
||||||
}
|
$("#bpOutput").addClass("success");
|
||||||
else
|
} else {
|
||||||
{
|
$("#bpOutput").removeClass("add");
|
||||||
// Query adlists
|
$("#bpOutput").addClass("error");
|
||||||
$( "#btnSearch" ).click();
|
$("#bpOutput").html(""+response+"");
|
||||||
}
|
}
|
||||||
|
|
||||||
$( "#whitelisting" ).on( "click", function(){ $( "#whitelistingform" ).removeAttr( "hidden" ); });
|
},
|
||||||
|
error: function(jqXHR, exception) {
|
||||||
|
$("#bpOutput").removeClass("add");
|
||||||
|
$("#bpOutput").addClass("exception");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Remove whitelist functionality if the domain was blocked because of a wildcard
|
<?php if ($featuredTotal > 0) { ?>
|
||||||
$( "#output" ).bind("append", function(){
|
$(document).keypress(function(e) {
|
||||||
if($( "#output" ).contents()[0].data.indexOf("Wildcard blocking") !== -1)
|
if(e.which === 13 && $("#bpWLPassword").is(":focus")) {
|
||||||
{
|
add();
|
||||||
$( "#whitelisting" ).hide();
|
}
|
||||||
$( "#whitelistingform" ).hide();
|
});
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function add() {
|
$("#bpWhitelist").on("click", function() {
|
||||||
var domain = $("#domain");
|
|
||||||
var pw = $("#pw");
|
|
||||||
if(domain.val().length === 0){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: "admin/scripts/pi-hole/php/add.php",
|
|
||||||
method: "post",
|
|
||||||
data: {"domain":domain.val(), "list":"white", "pw":pw.val()},
|
|
||||||
success: function(response) {
|
|
||||||
$( "#whitelistingoutput" ).removeAttr( "hidden" );
|
|
||||||
if(response.indexOf("Pi-hole blocking") !== -1)
|
|
||||||
{
|
|
||||||
// Reload page after 5 seconds
|
|
||||||
setTimeout(function(){window.location.reload(1);}, 5000);
|
|
||||||
$( "#whitelistingoutput" ).html("---> Success <---<br/>You may have to flush your DNS cache");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$( "#whitelistingoutput" ).html("---> "+response+" <---");
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
error: function(jqXHR, exception) {
|
|
||||||
$( "#whitelistingoutput" ).removeAttr( "hidden" );
|
|
||||||
$( "#whitelistingoutput" ).html("---> Unknown Error <---");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// Handle enter button for adding domains
|
|
||||||
$(document).keypress(function(e) {
|
|
||||||
if(e.which === 13 && $("#pw").is(":focus")) {
|
|
||||||
add();
|
add();
|
||||||
}
|
});
|
||||||
});
|
<?php } ?>
|
||||||
|
|
||||||
// Handle buttons
|
|
||||||
$("#btnAdd").on("click", function() {
|
|
||||||
add();
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
|
||||||
</html>
|
</body></html>
|
||||||
|
|
Loading…
Reference in a new issue