mirror of
https://github.com/pi-hole/pi-hole
synced 2024-11-20 07:08:13 +00:00
Merge pull request #1065 from pi-hole/wildcardblacklisting
Add blacklisting wildcard support
This commit is contained in:
commit
10f77df8bb
@ -15,6 +15,7 @@ basename=pihole
|
|||||||
piholeDir=/etc/${basename}
|
piholeDir=/etc/${basename}
|
||||||
whitelist=${piholeDir}/whitelist.txt
|
whitelist=${piholeDir}/whitelist.txt
|
||||||
blacklist=${piholeDir}/blacklist.txt
|
blacklist=${piholeDir}/blacklist.txt
|
||||||
|
readonly wildcardlist="/etc/dnsmasq.d/03-pihole-wildcard.conf"
|
||||||
reload=false
|
reload=false
|
||||||
addmode=true
|
addmode=true
|
||||||
verbose=true
|
verbose=true
|
||||||
@ -47,13 +48,17 @@ helpFunc() {
|
|||||||
::: -h, --help Show this help dialog
|
::: -h, --help Show this help dialog
|
||||||
::: -l, --list Display your ${word}listed domains
|
::: -l, --list Display your ${word}listed domains
|
||||||
EOM
|
EOM
|
||||||
|
if [[ "${letter}" == "b" ]]; then
|
||||||
|
echo "::: -wild, --wildcard Add whitecard entry (only blacklist)"
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
EscapeRegexp() {
|
EscapeRegexp() {
|
||||||
# This way we may safely insert an arbitrary
|
# This way we may safely insert an arbitrary
|
||||||
# string in our regular expressions
|
# string in our regular expressions
|
||||||
echo $* | sed "s/[]\\.|$(){}?+*^]/\\\\&/g" | sed "s/\\//\\\\\//g"
|
# Also remove leading "." if present
|
||||||
|
echo $* | sed 's/^\.//' | sed "s/[]\\.|$(){}?+*^]/\\\\&/g" | sed "s/\\//\\\\\//g"
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleOther(){
|
HandleOther(){
|
||||||
@ -89,22 +94,51 @@ AddDomain() {
|
|||||||
list="$2"
|
list="$2"
|
||||||
domain=$(EscapeRegexp "$1")
|
domain=$(EscapeRegexp "$1")
|
||||||
|
|
||||||
bool=true
|
if [[ "${list}" == "${whitelist}" || "${list}" == "${blacklist}" ]]; then
|
||||||
#Is the domain in the list we want to add it to?
|
|
||||||
grep -Ex -q "${domain}" ${list} > /dev/null 2>&1 || bool=false
|
|
||||||
|
|
||||||
if [[ "${bool}" == false ]]; then
|
bool=true
|
||||||
#domain not found in the whitelist file, add it!
|
#Is the domain in the list we want to add it to?
|
||||||
if [[ "${verbose}" == true ]]; then
|
grep -Ex -q "${domain}" "${list}" > /dev/null 2>&1 || bool=false
|
||||||
echo "::: Adding $1 to $list..."
|
|
||||||
fi
|
if [[ "${bool}" == false ]]; then
|
||||||
reload=true
|
#domain not found in the whitelist file, add it!
|
||||||
# Add it to the list we want to add it to
|
if [[ "${verbose}" == true ]]; then
|
||||||
echo "$1" >> ${list}
|
echo "::: Adding $1 to $list..."
|
||||||
else
|
fi
|
||||||
if [[ "${verbose}" == true ]]; then
|
reload=true
|
||||||
echo "::: ${1} already exists in ${list}, no need to add!"
|
# Add it to the list we want to add it to
|
||||||
fi
|
echo "$1" >> "${list}"
|
||||||
|
else
|
||||||
|
if [[ "${verbose}" == true ]]; then
|
||||||
|
echo "::: ${1} already exists in ${list}, no need to add!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [[ "${list}" == "${wildcardlist}" ]]; then
|
||||||
|
|
||||||
|
source "${piholeDir}/setupVars.conf"
|
||||||
|
#Remove the /* from the end of the IPv4addr.
|
||||||
|
IPV4_ADDRESS=${IPV4_ADDRESS%/*}
|
||||||
|
IPV6_ADDRESS=${IPV6_ADDRESS}
|
||||||
|
|
||||||
|
bool=true
|
||||||
|
#Is the domain in the list?
|
||||||
|
grep -e "address=\/${domain}\/" "${wildcardlist}" > /dev/null 2>&1 || bool=false
|
||||||
|
|
||||||
|
if [[ "${bool}" == false ]]; then
|
||||||
|
if [[ "${verbose}" == true ]]; then
|
||||||
|
echo "::: Adding $1 to wildcard blacklist..."
|
||||||
|
fi
|
||||||
|
reload=true
|
||||||
|
echo "address=/$1/${IPV4_ADDRESS}" >> "${wildcardlist}"
|
||||||
|
if [[ ${#IPV6_ADDRESS} > 0 ]] ; then
|
||||||
|
echo "address=/$1/${IPV6_ADDRESS}" >> "${wildcardlist}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ "${verbose}" == true ]]; then
|
||||||
|
echo "::: ${1} already exists in wildcard blacklist, no need to add!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,18 +146,38 @@ RemoveDomain() {
|
|||||||
list="$2"
|
list="$2"
|
||||||
domain=$(EscapeRegexp "$1")
|
domain=$(EscapeRegexp "$1")
|
||||||
|
|
||||||
bool=true
|
if [[ "${list}" == "${whitelist}" || "${list}" == "${blacklist}" ]]; then
|
||||||
#Is it in the list? Logic follows that if its whitelisted it should not be blacklisted and vice versa
|
|
||||||
grep -Ex -q "${domain}" ${list} > /dev/null 2>&1 || bool=false
|
bool=true
|
||||||
if [[ "${bool}" == true ]]; then
|
#Is it in the list? Logic follows that if its whitelisted it should not be blacklisted and vice versa
|
||||||
# Remove it from the other one
|
grep -Ex -q "${domain}" "${list}" > /dev/null 2>&1 || bool=false
|
||||||
echo "::: Removing $1 from $list..."
|
if [[ "${bool}" == true ]]; then
|
||||||
# /I flag: search case-insensitive
|
# Remove it from the other one
|
||||||
sed -i "/${domain}/Id" ${list}
|
echo "::: Removing $1 from $list..."
|
||||||
reload=true
|
# /I flag: search case-insensitive
|
||||||
else
|
sed -i "/${domain}/Id" "${list}"
|
||||||
if [[ "${verbose}" == true ]]; then
|
reload=true
|
||||||
echo "::: ${1} does not exist in ${list}, no need to remove!"
|
else
|
||||||
|
if [[ "${verbose}" == true ]]; then
|
||||||
|
echo "::: ${1} does not exist in ${list}, no need to remove!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [[ "${list}" == "${wildcardlist}" ]]; then
|
||||||
|
|
||||||
|
bool=true
|
||||||
|
#Is it in the list?
|
||||||
|
grep -e "address=\/${domain}\/" "${wildcardlist}" > /dev/null 2>&1 || bool=false
|
||||||
|
if [[ "${bool}" == true ]]; then
|
||||||
|
# Remove it from the other one
|
||||||
|
echo "::: Removing $1 from $list..."
|
||||||
|
# /I flag: search case-insensitive
|
||||||
|
sed -i "/address=\/${domain}/Id" "${list}"
|
||||||
|
reload=true
|
||||||
|
else
|
||||||
|
if [[ "${verbose}" == true ]]; then
|
||||||
|
echo "::: ${1} does not exist in ${list}, no need to remove!"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -153,6 +207,7 @@ for var in "$@"; do
|
|||||||
case "${var}" in
|
case "${var}" in
|
||||||
"-w" | "whitelist" ) listMain="${whitelist}"; listAlt="${blacklist}";;
|
"-w" | "whitelist" ) listMain="${whitelist}"; listAlt="${blacklist}";;
|
||||||
"-b" | "blacklist" ) listMain="${blacklist}"; listAlt="${whitelist}";;
|
"-b" | "blacklist" ) listMain="${blacklist}"; listAlt="${whitelist}";;
|
||||||
|
"-wild" | "wildcard" ) listMain="${wildcardlist}";;
|
||||||
"-nr"| "--noreload" ) reload=false;;
|
"-nr"| "--noreload" ) reload=false;;
|
||||||
"-d" | "--delmode" ) addmode=false;;
|
"-d" | "--delmode" ) addmode=false;;
|
||||||
"-f" | "--force" ) force=true;;
|
"-f" | "--force" ) force=true;;
|
||||||
|
@ -74,7 +74,9 @@ if($uri == "/")
|
|||||||
<a class='safe33' id="whitelisting">Whitelist this page</a>
|
<a class='safe33' id="whitelisting">Whitelist this page</a>
|
||||||
<a class='safe33' href='javascript:window.close()'>Close window</a>
|
<a class='safe33' href='javascript:window.close()'>Close window</a>
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 98%; text-align: center; padding: 10px;" hidden="true" id="whitelistingform">Password required!<br/>
|
<div style="width: 98%; text-align: center; padding: 10px;" hidden="true" id="whitelistingform">
|
||||||
|
<p>Note that whitelisting domains which are blocked using the wildcard method won't work.</p>
|
||||||
|
<p>Password required!</p><br/>
|
||||||
<form>
|
<form>
|
||||||
<input name="list" type="hidden" value="white"><br/>
|
<input name="list" type="hidden" value="white"><br/>
|
||||||
Domain:<br/>
|
Domain:<br/>
|
||||||
@ -88,6 +90,16 @@ if($uri == "/")
|
|||||||
</main>
|
</main>
|
||||||
<footer>Generated <?php echo date('D g:i A, M d'); ?> by Pi-hole <?php echo $piHoleVersion; ?></footer>
|
<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 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 () {
|
||||||
|
return origAppend.apply(this, arguments).trigger("append");
|
||||||
|
};
|
||||||
|
})(jQuery);
|
||||||
|
</script>
|
||||||
<script src="http://pi.hole/admin/scripts/pi-hole/js/queryads.js"></script>
|
<script src="http://pi.hole/admin/scripts/pi-hole/js/queryads.js"></script>
|
||||||
<script>
|
<script>
|
||||||
function inIframe () {
|
function inIframe () {
|
||||||
@ -115,6 +127,15 @@ else
|
|||||||
|
|
||||||
$( "#whitelisting" ).on( "click", function(){ $( "#whitelistingform" ).removeAttr( "hidden" ); });
|
$( "#whitelisting" ).on( "click", function(){ $( "#whitelistingform" ).removeAttr( "hidden" ); });
|
||||||
|
|
||||||
|
// Remove whitelist functionality if the domain was blocked because of a wildcard
|
||||||
|
$( "#output" ).bind("append", function(){
|
||||||
|
if($( "#output" ).contents()[0].data.indexOf("Wildcard blocking") !== -1)
|
||||||
|
{
|
||||||
|
$( "#whitelisting" ).hide();
|
||||||
|
$( "#whitelistingform" ).hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
function add() {
|
function add() {
|
||||||
var domain = $("#domain");
|
var domain = $("#domain");
|
||||||
var pw = $("#pw");
|
var pw = $("#pw");
|
||||||
|
46
pihole
46
pihole
@ -11,6 +11,7 @@
|
|||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
PI_HOLE_SCRIPT_DIR="/opt/pihole"
|
PI_HOLE_SCRIPT_DIR="/opt/pihole"
|
||||||
|
readonly wildcardlist="/etc/dnsmasq.d/03-pihole-wildcard.conf"
|
||||||
# Must be root to use this tool
|
# Must be root to use this tool
|
||||||
if [[ ! $EUID -eq 0 ]];then
|
if [[ ! $EUID -eq 0 ]];then
|
||||||
if [ -x "$(command -v sudo)" ];then
|
if [ -x "$(command -v sudo)" ];then
|
||||||
@ -38,6 +39,11 @@ blacklistFunc() {
|
|||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wildcardFunc() {
|
||||||
|
"${PI_HOLE_SCRIPT_DIR}"/list.sh "$@"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
debugFunc() {
|
debugFunc() {
|
||||||
"${PI_HOLE_SCRIPT_DIR}"/piholeDebug.sh
|
"${PI_HOLE_SCRIPT_DIR}"/piholeDebug.sh
|
||||||
exit 0
|
exit 0
|
||||||
@ -79,19 +85,52 @@ scanList(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
processWildcards() {
|
||||||
|
IFS="." read -r -a array <<< "${1}"
|
||||||
|
for (( i=${#array[@]}-1; i>=0; i-- )); do
|
||||||
|
ar=""
|
||||||
|
for (( j=${#array[@]}-1; j>${#array[@]}-i-2; j-- )); do
|
||||||
|
if [[ $j == $((${#array[@]}-1)) ]]; then
|
||||||
|
ar="${array[$j]}"
|
||||||
|
else
|
||||||
|
ar="${array[$j]}.${ar}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "${ar}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
queryFunc() {
|
queryFunc() {
|
||||||
domain="${2}"
|
domain="${2}"
|
||||||
method="${3}"
|
method="${3}"
|
||||||
lists=( /etc/pihole/list.* /etc/pihole/blacklist.txt)
|
lists=( /etc/pihole/list.* /etc/pihole/blacklist.txt)
|
||||||
for list in ${lists[@]}; do
|
for list in ${lists[@]}; do
|
||||||
result=$(scanList ${domain} ${list} ${method})
|
if [ -e "${list}" ]; then
|
||||||
|
result=$(scanList ${domain} ${list} ${method})
|
||||||
|
# Remove empty lines before couting number of results
|
||||||
|
count=$(sed '/^\s*$/d' <<< "$result" | wc -l)
|
||||||
|
echo "::: ${list} (${count} results)"
|
||||||
|
if [[ ${count} > 0 ]]; then
|
||||||
|
echo "${result}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo "::: ${list} does not exist"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Scan for possible wildcard matches
|
||||||
|
local wildcards=($(processWildcards "${domain}"))
|
||||||
|
for domain in ${wildcards[@]}; do
|
||||||
|
result=$(scanList "\/${domain}\/" ${wildcardlist})
|
||||||
# Remove empty lines before couting number of results
|
# Remove empty lines before couting number of results
|
||||||
count=$(sed '/^\s*$/d' <<< "$result" | wc -l)
|
count=$(sed '/^\s*$/d' <<< "$result" | wc -l)
|
||||||
echo "::: ${list} (${count} results)"
|
|
||||||
if [[ ${count} > 0 ]]; then
|
if [[ ${count} > 0 ]]; then
|
||||||
|
echo "::: Wildcard blocking ${domain} (${count} results)"
|
||||||
echo "${result}"
|
echo "${result}"
|
||||||
|
echo ""
|
||||||
fi
|
fi
|
||||||
echo ""
|
|
||||||
done
|
done
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
@ -275,6 +314,7 @@ fi
|
|||||||
case "${1}" in
|
case "${1}" in
|
||||||
"-w" | "whitelist" ) whitelistFunc "$@";;
|
"-w" | "whitelist" ) whitelistFunc "$@";;
|
||||||
"-b" | "blacklist" ) blacklistFunc "$@";;
|
"-b" | "blacklist" ) blacklistFunc "$@";;
|
||||||
|
"-wild" | "wildcard" ) wildcardFunc "$@";;
|
||||||
"-d" | "debug" ) debugFunc;;
|
"-d" | "debug" ) debugFunc;;
|
||||||
"-f" | "flush" ) flushFunc;;
|
"-f" | "flush" ) flushFunc;;
|
||||||
"-up" | "updatePihole" ) updatePiholeFunc;;
|
"-up" | "updatePihole" ) updatePiholeFunc;;
|
||||||
|
Loading…
Reference in New Issue
Block a user