From 10e4f2395ed42d50545ef9c3d73994b542e09dac Mon Sep 17 00:00:00 2001 From: ms Date: Fri, 30 Jun 2006 14:25:35 +0000 Subject: [PATCH] =?utf8?q?Hinzugef=C3=BCgt:=20=20=20*=20URL-Filter?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@185 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- config/cron/crontab | 7 +- config/etc/logrotate.conf | 9 + config/httpd/httpd.conf | 5 +- config/urlfilter/autoupdate.pl | 522 ++ config/urlfilter/autoupdate.urls | 9 + config/urlfilter/blacklists.tar.gz | Bin 0 -> 329408 bytes config/urlfilter/makeconf.pl | 159 + config/urlfilter/prebuild.pl | 96 + config/urlfilter/squidGuard.conf | 24 + html/cgi-bin/logs.cgi/urlfilter.dat | 1353 ++++ html/cgi-bin/proxy.cgi | 30 +- html/cgi-bin/redirect.cgi | 498 ++ html/cgi-bin/urlfilter.cgi | 9012 +++++++++++++++++++++ html/html/images/urlfilter/1x1.gif | Bin 0 -> 49 bytes html/html/images/urlfilter/background.jpg | Bin 0 -> 775 bytes html/html/images/urlfilter/led-green.gif | Bin 0 -> 898 bytes html/html/images/urlfilter/led-red.gif | Bin 0 -> 898 bytes langs/de/cgi-bin/de.pl | 192 + langs/en/cgi-bin/en.pl | 192 + lfs/configroot | 2 +- lfs/linux | 2 +- lfs/squid | 21 + lfs/squidguard | 2 +- 23 files changed, 12128 insertions(+), 7 deletions(-) create mode 100644 config/urlfilter/autoupdate.pl create mode 100644 config/urlfilter/autoupdate.urls create mode 100644 config/urlfilter/blacklists.tar.gz create mode 100644 config/urlfilter/makeconf.pl create mode 100644 config/urlfilter/prebuild.pl create mode 100644 config/urlfilter/squidGuard.conf create mode 100644 html/cgi-bin/logs.cgi/urlfilter.dat create mode 100644 html/cgi-bin/redirect.cgi create mode 100644 html/cgi-bin/urlfilter.cgi create mode 100644 html/html/images/urlfilter/1x1.gif create mode 100644 html/html/images/urlfilter/background.jpg create mode 100644 html/html/images/urlfilter/led-green.gif create mode 100644 html/html/images/urlfilter/led-red.gif diff --git a/config/cron/crontab b/config/cron/crontab index 9b08f06c40..2b74778155 100644 --- a/config/cron/crontab +++ b/config/cron/crontab @@ -33,4 +33,9 @@ HOME=/ find /var/log/logwatch/ -ctime +${LOGWATCH_KEEP=56} -exec rm -f '{}' ';' # hddshutdown -00 * * * * /usr/local/bin/hddshutdown >/dev/null \ No newline at end of file +00 * * * * /usr/local/bin/hddshutdown >/dev/null + +# URL Filter +%nightly * 3-5 /var/ipfire/urlfilter/autoupdate/cron.daily +%weekly * 3-5 /var/ipfire/urlfilter/autoupdate/cron.weekly +%monthly * 3-5 * /var/ipfire/urlfilter/autoupdate/cron.monthly diff --git a/config/etc/logrotate.conf b/config/etc/logrotate.conf index d4209369d0..3b29695074 100644 --- a/config/etc/logrotate.conf +++ b/config/etc/logrotate.conf @@ -73,3 +73,12 @@ compress /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript } + +/var/log/squidGuard/*.log { + weekly + rotate 4 + copytruncate + compress + notifempty + missingok +} diff --git a/config/httpd/httpd.conf b/config/httpd/httpd.conf index b5ba5db599..9ce0e7177c 100644 --- a/config/httpd/httpd.conf +++ b/config/httpd/httpd.conf @@ -18,7 +18,8 @@ MaxSpareServers 2 StartServers 2 MaxClients 10 MaxRequestsPerChild 100 -Port 444 +Port 81 +Listen 81 Listen 444 User nobody Group nobody @@ -44,7 +45,7 @@ RewriteRule .* - [F] AuthName "Restricted" AuthType Basic AuthUserFile /var/ipfire/auth/users - require user admin + Require user admin ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/ diff --git a/config/urlfilter/autoupdate.pl b/config/urlfilter/autoupdate.pl new file mode 100644 index 0000000000..9e61b44c43 --- /dev/null +++ b/config/urlfilter/autoupdate.pl @@ -0,0 +1,522 @@ +#!/usr/bin/perl + +# +# $Id: autoupdate.pl,v 1.0 2005/06/15 00:00:00 marco Exp $ +# +use strict; + +my $make_clean = 1; + +my $swroot = "/var/ipfire"; +my $target = "$swroot/urlfilter/download"; +my $dbdir = "$swroot/urlfilter/blacklists"; + +my $sourceurlfile = "$swroot/urlfilter/autoupdate/autoupdate.urls"; +my $updconffile = "$swroot/urlfilter/autoupdate/autoupdate.conf"; +my $updflagfile = "$swroot/urlfilter/blacklists/.autoupdate.last"; + +my %cgiparams; +my %updatesettings; +my $blacklist_url; +my $blacklist_src; +my $source_url; +my $source_name; +my @source_urllist; + +my $blacklist; +my $category; + +my $exitcode = 1; + +if (-e "$sourceurlfile") +{ + open(FILE, $sourceurlfile); + @source_urllist = ; + close(FILE); +} + +if (-e "$updconffile") { &readhash("$updconffile", \%updatesettings); } + +if (@ARGV[0] =~ m@^(f|h)tt?ps?://@) { $updatesettings{'UPDATE_SOURCE'} = @ARGV[0]; } + +if ($updatesettings{'UPDATE_SOURCE'} eq 'custom') +{ + $blacklist_url=$updatesettings{'CUSTOM_UPDATE_URL'}; +} else { + $blacklist_url=$updatesettings{'UPDATE_SOURCE'}; + foreach (@source_urllist) + { + chomp; + $source_name = substr($_,0,rindex($_,",")); + $source_url = substr($_,index($_,",")+1); + if ($blacklist_url eq $source_url) { $blacklist_src=$source_name; } + } +} + +if ($blacklist_src eq '') { $blacklist_src="custom source URL"; } + +$blacklist_url =~ s/\&/\\\&/; + +$blacklist=substr($blacklist_url,rindex($blacklist_url,"/")+1); +if (($blacklist =~ /\?/) || (!($blacklist =~ /\.t(ar\.)?gz$/))) { $blacklist = 'blacklist.tar.gz'; } +$blacklist=$target.'/'.$blacklist; + +unless ($blacklist_url eq '') +{ + + if (-d $target) { system("rm -rf $target"); } + system("mkdir $target"); + + system("/usr/bin/wget -o $target/wget.log -O $blacklist $blacklist_url"); + + if (-e $blacklist) + { + system("/bin/tar --no-same-owner -xzf $blacklist -C $target"); + if (-d "$target/blacklists") + { + open(FILE, ">$target/update.conf"); + flock FILE, 2; + print FILE "logdir $target\n"; + print FILE "dbhome $target/blacklists\n\n"; + + foreach (<$target/blacklists/*>) + { + if ((-d $_) && ((-s "$_/domains") || (-s "$_/urls"))) + { + $category=substr($_,rindex($_,"/")+1); + print FILE "dest $category {\n"; + if (-s "$_/domains") { print FILE " domainlist $category/domains\n"; } + if (-s "$_/urls") { print FILE " urllist $category/urls\n"; } + print FILE "}\n\n"; + } + } + print FILE "acl {\n"; + print FILE " default {\n"; + print FILE " pass none\n"; + print FILE " }\n"; + print FILE "}\n"; + close FILE; + + system("/usr/sbin/squidGuard -d -c $target/update.conf -C all"); + + system("cp -r $target/blacklists/* $dbdir"); + + system("chown -R nobody.nobody $dbdir"); + + foreach $category (<$dbdir/*>) + { + if (-d $category) + { + system("chmod 755 $category &> /dev/null"); + foreach $blacklist (<$category/*>) + { + if (-f $blacklist){ system("chmod 644 $blacklist &> /dev/null"); } + if (-d $blacklist){ system("chmod 755 $blacklist &> /dev/null"); } + } + system("chmod 666 $category/*.db &> /dev/null"); + } + } + + system("touch $updflagfile"); + system("chown nobody.nobody $updflagfile"); + + system("/usr/local/bin/restartsquid"); + + system("logger -t installpackage[urlfilter] \"URL filter blacklist - Update from $blacklist_src completed\""); + + $exitcode = 0; + + } else { + system("logger -t installpackage[urlfilter] \"URL filter blacklist - ERROR: Not a valid URL filter blacklist\""); + } + } else { + system("logger -t installpackage[urlfilter] \"URL filter blacklist - ERROR: Unable to retrieve blacklist from $blacklist_src\""); + } + +} else { + system("logger -t installpackage[urlfilter] \"URL filter blacklist - ERROR: No update source defined\""); +} + +if ((-d $target) && ($make_clean)) { system("rm -rf $target"); } + +exit $exitcode; + +# ------------------------------------------------------------------- + +sub readhash +{ + my $filename = $_[0]; + my $hash = $_[1]; + my ($var, $val); + + if (-e $filename) + { + open(FILE, $filename) or die "Unable to read file $filename"; + while () + { + chop; + ($var, $val) = split /=/, $_, 2; + if ($var) + { + $val =~ s/^\'//g; + $val =~ s/\'$//g; + + # Untaint variables read from hash + $var =~ /([A-Za-z0-9_-]*)/; $var = $1; + $val =~ /([\w\W]*)/; $val = $1; + $hash->{$var} = $val; + } + } + close FILE; + } +} + +# ------------------------------------------------------------------- +#!/usr/bin/perl + +# +# $Id: autoupdate.pl,v 1.0 2005/06/15 00:00:00 marco Exp $ +# +use strict; + +my $make_clean = 1; + +my $swroot = "/var/ipfire"; +my $target = "$swroot/urlfilter/download"; +my $dbdir = "$swroot/urlfilter/blacklists"; + +my $sourceurlfile = "$swroot/urlfilter/autoupdate/autoupdate.urls"; +my $updconffile = "$swroot/urlfilter/autoupdate/autoupdate.conf"; +my $updflagfile = "$swroot/urlfilter/blacklists/.autoupdate.last"; + +my %cgiparams; +my %updatesettings; +my $blacklist_url; +my $blacklist_src; +my $source_url; +my $source_name; +my @source_urllist; + +my $blacklist; +my $category; + +my $exitcode = 1; + +if (-e "$sourceurlfile") +{ + open(FILE, $sourceurlfile); + @source_urllist = ; + close(FILE); +} + +if (-e "$updconffile") { &readhash("$updconffile", \%updatesettings); } + +if (@ARGV[0] =~ m@^(f|h)tt?ps?://@) { $updatesettings{'UPDATE_SOURCE'} = @ARGV[0]; } + +if ($updatesettings{'UPDATE_SOURCE'} eq 'custom') +{ + $blacklist_url=$updatesettings{'CUSTOM_UPDATE_URL'}; +} else { + $blacklist_url=$updatesettings{'UPDATE_SOURCE'}; + foreach (@source_urllist) + { + chomp; + $source_name = substr($_,0,rindex($_,",")); + $source_url = substr($_,index($_,",")+1); + if ($blacklist_url eq $source_url) { $blacklist_src=$source_name; } + } +} + +if ($blacklist_src eq '') { $blacklist_src="custom source URL"; } + +$blacklist_url =~ s/\&/\\\&/; + +$blacklist=substr($blacklist_url,rindex($blacklist_url,"/")+1); +if (($blacklist =~ /\?/) || (!($blacklist =~ /\.t(ar\.)?gz$/))) { $blacklist = 'blacklist.tar.gz'; } +$blacklist=$target.'/'.$blacklist; + +unless ($blacklist_url eq '') +{ + + if (-d $target) { system("rm -rf $target"); } + system("mkdir $target"); + + system("/usr/bin/wget -o $target/wget.log -O $blacklist $blacklist_url"); + + if (-e $blacklist) + { + system("/bin/tar --no-same-owner -xzf $blacklist -C $target"); + if (-d "$target/blacklists") + { + open(FILE, ">$target/update.conf"); + flock FILE, 2; + print FILE "logdir $target\n"; + print FILE "dbhome $target/blacklists\n\n"; + + foreach (<$target/blacklists/*>) + { + if ((-d $_) && ((-s "$_/domains") || (-s "$_/urls"))) + { + $category=substr($_,rindex($_,"/")+1); + print FILE "dest $category {\n"; + if (-s "$_/domains") { print FILE " domainlist $category/domains\n"; } + if (-s "$_/urls") { print FILE " urllist $category/urls\n"; } + print FILE "}\n\n"; + } + } + print FILE "acl {\n"; + print FILE " default {\n"; + print FILE " pass none\n"; + print FILE " }\n"; + print FILE "}\n"; + close FILE; + + system("/usr/sbin/squidGuard -d -c $target/update.conf -C all"); + + system("cp -r $target/blacklists/* $dbdir"); + + system("chown -R nobody.nobody $dbdir"); + + foreach $category (<$dbdir/*>) + { + if (-d $category) + { + system("chmod 755 $category &> /dev/null"); + foreach $blacklist (<$category/*>) + { + if (-f $blacklist){ system("chmod 644 $blacklist &> /dev/null"); } + if (-d $blacklist){ system("chmod 755 $blacklist &> /dev/null"); } + } + system("chmod 666 $category/*.db &> /dev/null"); + } + } + + system("touch $updflagfile"); + system("chown nobody.nobody $updflagfile"); + + system("/usr/local/bin/restartsquid"); + + system("logger -t installpackage[urlfilter] \"URL filter blacklist - Update from $blacklist_src completed\""); + + $exitcode = 0; + + } else { + system("logger -t installpackage[urlfilter] \"URL filter blacklist - ERROR: Not a valid URL filter blacklist\""); + } + } else { + system("logger -t installpackage[urlfilter] \"URL filter blacklist - ERROR: Unable to retrieve blacklist from $blacklist_src\""); + } + +} else { + system("logger -t installpackage[urlfilter] \"URL filter blacklist - ERROR: No update source defined\""); +} + +if ((-d $target) && ($make_clean)) { system("rm -rf $target"); } + +exit $exitcode; + +# ------------------------------------------------------------------- + +sub readhash +{ + my $filename = $_[0]; + my $hash = $_[1]; + my ($var, $val); + + if (-e $filename) + { + open(FILE, $filename) or die "Unable to read file $filename"; + while () + { + chop; + ($var, $val) = split /=/, $_, 2; + if ($var) + { + $val =~ s/^\'//g; + $val =~ s/\'$//g; + + # Untaint variables read from hash + $var =~ /([A-Za-z0-9_-]*)/; $var = $1; + $val =~ /([\w\W]*)/; $val = $1; + $hash->{$var} = $val; + } + } + close FILE; + } +} + +# ------------------------------------------------------------------- +#!/usr/bin/perl + +# +# $Id: autoupdate.pl,v 1.0 2005/06/15 00:00:00 marco Exp $ +# +use strict; + +my $make_clean = 1; + +my $swroot = "/var/ipfire"; +my $target = "$swroot/urlfilter/download"; +my $dbdir = "$swroot/urlfilter/blacklists"; + +my $sourceurlfile = "$swroot/urlfilter/autoupdate/autoupdate.urls"; +my $updconffile = "$swroot/urlfilter/autoupdate/autoupdate.conf"; +my $updflagfile = "$swroot/urlfilter/blacklists/.autoupdate.last"; + +my %cgiparams; +my %updatesettings; +my $blacklist_url; +my $blacklist_src; +my $source_url; +my $source_name; +my @source_urllist; + +my $blacklist; +my $category; + +my $exitcode = 1; + +if (-e "$sourceurlfile") +{ + open(FILE, $sourceurlfile); + @source_urllist = ; + close(FILE); +} + +if (-e "$updconffile") { &readhash("$updconffile", \%updatesettings); } + +if (@ARGV[0] =~ m@^(f|h)tt?ps?://@) { $updatesettings{'UPDATE_SOURCE'} = @ARGV[0]; } + +if ($updatesettings{'UPDATE_SOURCE'} eq 'custom') +{ + $blacklist_url=$updatesettings{'CUSTOM_UPDATE_URL'}; +} else { + $blacklist_url=$updatesettings{'UPDATE_SOURCE'}; + foreach (@source_urllist) + { + chomp; + $source_name = substr($_,0,rindex($_,",")); + $source_url = substr($_,index($_,",")+1); + if ($blacklist_url eq $source_url) { $blacklist_src=$source_name; } + } +} + +if ($blacklist_src eq '') { $blacklist_src="custom source URL"; } + +$blacklist_url =~ s/\&/\\\&/; + +$blacklist=substr($blacklist_url,rindex($blacklist_url,"/")+1); +if (($blacklist =~ /\?/) || (!($blacklist =~ /\.t(ar\.)?gz$/))) { $blacklist = 'blacklist.tar.gz'; } +$blacklist=$target.'/'.$blacklist; + +unless ($blacklist_url eq '') +{ + + if (-d $target) { system("rm -rf $target"); } + system("mkdir $target"); + + system("/usr/bin/wget -o $target/wget.log -O $blacklist $blacklist_url"); + + if (-e $blacklist) + { + system("/bin/tar --no-same-owner -xzf $blacklist -C $target"); + if (-d "$target/blacklists") + { + open(FILE, ">$target/update.conf"); + flock FILE, 2; + print FILE "logdir $target\n"; + print FILE "dbhome $target/blacklists\n\n"; + + foreach (<$target/blacklists/*>) + { + if ((-d $_) && ((-s "$_/domains") || (-s "$_/urls"))) + { + $category=substr($_,rindex($_,"/")+1); + print FILE "dest $category {\n"; + if (-s "$_/domains") { print FILE " domainlist $category/domains\n"; } + if (-s "$_/urls") { print FILE " urllist $category/urls\n"; } + print FILE "}\n\n"; + } + } + print FILE "acl {\n"; + print FILE " default {\n"; + print FILE " pass none\n"; + print FILE " }\n"; + print FILE "}\n"; + close FILE; + + system("/usr/sbin/squidGuard -d -c $target/update.conf -C all"); + + system("cp -r $target/blacklists/* $dbdir"); + + system("chown -R nobody.nobody $dbdir"); + + foreach $category (<$dbdir/*>) + { + if (-d $category) + { + system("chmod 755 $category &> /dev/null"); + foreach $blacklist (<$category/*>) + { + if (-f $blacklist){ system("chmod 644 $blacklist &> /dev/null"); } + if (-d $blacklist){ system("chmod 755 $blacklist &> /dev/null"); } + } + system("chmod 666 $category/*.db &> /dev/null"); + } + } + + system("touch $updflagfile"); + system("chown nobody.nobody $updflagfile"); + + system("/usr/local/bin/restartsquid"); + + system("logger -t installpackage[urlfilter] \"URL filter blacklist - Update from $blacklist_src completed\""); + + $exitcode = 0; + + } else { + system("logger -t installpackage[urlfilter] \"URL filter blacklist - ERROR: Not a valid URL filter blacklist\""); + } + } else { + system("logger -t installpackage[urlfilter] \"URL filter blacklist - ERROR: Unable to retrieve blacklist from $blacklist_src\""); + } + +} else { + system("logger -t installpackage[urlfilter] \"URL filter blacklist - ERROR: No update source defined\""); +} + +if ((-d $target) && ($make_clean)) { system("rm -rf $target"); } + +exit $exitcode; + +# ------------------------------------------------------------------- + +sub readhash +{ + my $filename = $_[0]; + my $hash = $_[1]; + my ($var, $val); + + if (-e $filename) + { + open(FILE, $filename) or die "Unable to read file $filename"; + while () + { + chop; + ($var, $val) = split /=/, $_, 2; + if ($var) + { + $val =~ s/^\'//g; + $val =~ s/\'$//g; + + # Untaint variables read from hash + $var =~ /([A-Za-z0-9_-]*)/; $var = $1; + $val =~ /([\w\W]*)/; $val = $1; + $hash->{$var} = $val; + } + } + close FILE; + } +} + +# ------------------------------------------------------------------- diff --git a/config/urlfilter/autoupdate.urls b/config/urlfilter/autoupdate.urls new file mode 100644 index 0000000000..925465985a --- /dev/null +++ b/config/urlfilter/autoupdate.urls @@ -0,0 +1,9 @@ +squidGuard,http://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gz +MESD,http://squidguard.mesd.k12.or.us/blacklists.tgz +Univ. Toulouse,ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/blacklists.tar.gz +squidGuard,http://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gz +MESD,http://squidguard.mesd.k12.or.us/blacklists.tgz +Univ. Toulouse,ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/blacklists.tar.gz +squidGuard,http://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gz +MESD,http://squidguard.mesd.k12.or.us/blacklists.tgz +Univ. Toulouse,ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/blacklists.tar.gz diff --git a/config/urlfilter/blacklists.tar.gz b/config/urlfilter/blacklists.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..dc21990be9ff17fab3940dffb613ea3a0e0a4520 GIT binary patch literal 329408 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

$S6G6ZY6#G}JIGfX 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 +{ + if (-d $blacklist) + { + $lastslashpos = rindex($blacklist,"/"); + $section = substr($blacklist,$lastslashpos+1); + push(@categories,$section); + } +} +open(FILE, ">$swroot/urlfilter/squidGuard.conf"); +print FILE "logdir $logdir\n"; +print FILE "dbhome $dbdir\n\n"; +foreach $category (@categories) +{ + print FILE "dest $category {\n"; + if (-e "$dbdir/$category/domains") { + print FILE " domainlist $category\/domains\n"; + } + if (-e "$dbdir/$category/urls") { + print FILE " urllist $category\/urls\n"; + } + print FILE "}\n\n"; +} +print FILE "acl {\n"; +print FILE " default {\n"; +print FILE " pass all\n"; +print FILE " }\n"; +print FILE "}\n"; +close FILE; +print "\n"; + +print "Building blacklist databases "; +system("$swroot/urlfilter/bin/prebuild.pl"); +print "\n"; + +print "Creating custom directories "; +mkdir("$dbdir/custom"); +mkdir("$dbdir/custom/allowed"); +mkdir("$dbdir/custom/blocked"); +system("touch $dbdir/custom/allowed/domains"); +system("touch $dbdir/custom/allowed/urls"); +system("touch $dbdir/custom/blocked/domains"); +system("touch $dbdir/custom/blocked/urls"); +print "\n"; + +exit +#!/usr/bin/perl + +$swroot="/var/ipfire"; +$logdir="/var/log/squidGuard"; +$dbdir="/var/ipfire/urlfilter/blacklists"; + +print "Creating configuration file "; +foreach $blacklist (<$dbdir/*>) +{ + if (-d $blacklist) + { + $lastslashpos = rindex($blacklist,"/"); + $section = substr($blacklist,$lastslashpos+1); + push(@categories,$section); + } +} +open(FILE, ">$swroot/urlfilter/squidGuard.conf"); +print FILE "logdir $logdir\n"; +print FILE "dbhome $dbdir\n\n"; +foreach $category (@categories) +{ + print FILE "dest $category {\n"; + if (-e "$dbdir/$category/domains") { + print FILE " domainlist $category\/domains\n"; + } + if (-e "$dbdir/$category/urls") { + print FILE " urllist $category\/urls\n"; + } + print FILE "}\n\n"; +} +print FILE "acl {\n"; +print FILE " default {\n"; +print FILE " pass all\n"; +print FILE " }\n"; +print FILE "}\n"; +close FILE; +print "\n"; + +print "Building blacklist databases "; +system("$swroot/urlfilter/bin/prebuild.pl"); +print "\n"; + +print "Creating custom directories "; +mkdir("$dbdir/custom"); +mkdir("$dbdir/custom/allowed"); +mkdir("$dbdir/custom/blocked"); +system("touch $dbdir/custom/allowed/domains"); +system("touch $dbdir/custom/allowed/urls"); +system("touch $dbdir/custom/blocked/domains"); +system("touch $dbdir/custom/blocked/urls"); +print "\n"; + +exit +#!/usr/bin/perl + +$swroot="/var/ipfire"; +$logdir="/var/log/squidGuard"; +$dbdir="/var/ipfire/urlfilter/blacklists"; + +print "Creating configuration file "; +foreach $blacklist (<$dbdir/*>) +{ + if (-d $blacklist) + { + $lastslashpos = rindex($blacklist,"/"); + $section = substr($blacklist,$lastslashpos+1); + push(@categories,$section); + } +} +open(FILE, ">$swroot/urlfilter/squidGuard.conf"); +print FILE "logdir $logdir\n"; +print FILE "dbhome $dbdir\n\n"; +foreach $category (@categories) +{ + print FILE "dest $category {\n"; + if (-e "$dbdir/$category/domains") { + print FILE " domainlist $category\/domains\n"; + } + if (-e "$dbdir/$category/urls") { + print FILE " urllist $category\/urls\n"; + } + print FILE "}\n\n"; +} +print FILE "acl {\n"; +print FILE " default {\n"; +print FILE " pass all\n"; +print FILE " }\n"; +print FILE "}\n"; +close FILE; +print "\n"; + +print "Building blacklist databases "; +system("$swroot/urlfilter/bin/prebuild.pl"); +print "\n"; + +print "Creating custom directories "; +mkdir("$dbdir/custom"); +mkdir("$dbdir/custom/allowed"); +mkdir("$dbdir/custom/blocked"); +system("touch $dbdir/custom/allowed/domains"); +system("touch $dbdir/custom/allowed/urls"); +system("touch $dbdir/custom/blocked/domains"); +system("touch $dbdir/custom/blocked/urls"); +print "\n"; + +exit diff --git a/config/urlfilter/prebuild.pl b/config/urlfilter/prebuild.pl new file mode 100644 index 0000000000..87b9e721ac --- /dev/null +++ b/config/urlfilter/prebuild.pl @@ -0,0 +1,96 @@ +#!/usr/bin/perl +# +# This code is distributed under the terms of the GPL +# +# (c) written from scratch +# +# $Id: prebuild.pl,v 0.3 2005/04/16 00:00:00 marco Exp $ +# + +$dbdir="/var/ipfire/urlfilter/blacklists"; + +system("/usr/bin/squidGuard -C all"); + +if (-e "$dbdir/custom/allowed/domains.db") { unlink("$dbdir/custom/allowed/domains.db"); } +if (-e "$dbdir/custom/allowed/urls.db") { unlink("$dbdir/custom/allowed/urls.db"); } +if (-e "$dbdir/custom/blocked/domains.db") { unlink("$dbdir/custom/blocked/domains.db"); } +if (-e "$dbdir/custom/blocked/urls.db") { unlink("$dbdir/custom/blocked/urls.db"); } + +system("chown -R nobody.nobody $dbdir"); + +foreach $category (<$dbdir/*>) +{ + if (-d $category){ + system("chmod 755 $category &> /dev/null"); + foreach $blacklist (<$category/*>) + { + if (-f $blacklist){ system("chmod 644 $blacklist &> /dev/null"); } + if (-d $blacklist){ system("chmod 755 $blacklist &> /dev/null"); } + } + system("chmod 666 $category/*.db &> /dev/null"); + } +} +#!/usr/bin/perl +# +# This code is distributed under the terms of the GPL +# +# (c) written from scratch +# +# $Id: prebuild.pl,v 0.3 2005/04/16 00:00:00 marco Exp $ +# + +$dbdir="/var/ipfire/urlfilter/blacklists"; + +system("/usr/bin/squidGuard -C all"); + +if (-e "$dbdir/custom/allowed/domains.db") { unlink("$dbdir/custom/allowed/domains.db"); } +if (-e "$dbdir/custom/allowed/urls.db") { unlink("$dbdir/custom/allowed/urls.db"); } +if (-e "$dbdir/custom/blocked/domains.db") { unlink("$dbdir/custom/blocked/domains.db"); } +if (-e "$dbdir/custom/blocked/urls.db") { unlink("$dbdir/custom/blocked/urls.db"); } + +system("chown -R nobody.nobody $dbdir"); + +foreach $category (<$dbdir/*>) +{ + if (-d $category){ + system("chmod 755 $category &> /dev/null"); + foreach $blacklist (<$category/*>) + { + if (-f $blacklist){ system("chmod 644 $blacklist &> /dev/null"); } + if (-d $blacklist){ system("chmod 755 $blacklist &> /dev/null"); } + } + system("chmod 666 $category/*.db &> /dev/null"); + } +} +#!/usr/bin/perl +# +# This code is distributed under the terms of the GPL +# +# (c) written from scratch +# +# $Id: prebuild.pl,v 0.3 2005/04/16 00:00:00 marco Exp $ +# + +$dbdir="/var/ipfire/urlfilter/blacklists"; + +system("/usr/bin/squidGuard -C all"); + +if (-e "$dbdir/custom/allowed/domains.db") { unlink("$dbdir/custom/allowed/domains.db"); } +if (-e "$dbdir/custom/allowed/urls.db") { unlink("$dbdir/custom/allowed/urls.db"); } +if (-e "$dbdir/custom/blocked/domains.db") { unlink("$dbdir/custom/blocked/domains.db"); } +if (-e "$dbdir/custom/blocked/urls.db") { unlink("$dbdir/custom/blocked/urls.db"); } + +system("chown -R nobody.nobody $dbdir"); + +foreach $category (<$dbdir/*>) +{ + if (-d $category){ + system("chmod 755 $category &> /dev/null"); + foreach $blacklist (<$category/*>) + { + if (-f $blacklist){ system("chmod 644 $blacklist &> /dev/null"); } + if (-d $blacklist){ system("chmod 755 $blacklist &> /dev/null"); } + } + system("chmod 666 $category/*.db &> /dev/null"); + } +} diff --git a/config/urlfilter/squidGuard.conf b/config/urlfilter/squidGuard.conf new file mode 100644 index 0000000000..22454f55fd --- /dev/null +++ b/config/urlfilter/squidGuard.conf @@ -0,0 +1,24 @@ +logdir /var/log/squidGuard +dbhome /var/ipfire/urlfilter/blacklists + +acl { + default { + pass all + } +} +logdir /var/log/squidGuard +dbhome /var/ipfire/urlfilter/blacklists + +acl { + default { + pass all + } +} +logdir /var/log/squidGuard +dbhome /var/ipfire/urlfilter/blacklists + +acl { + default { + pass all + } +} diff --git a/html/cgi-bin/logs.cgi/urlfilter.dat b/html/cgi-bin/logs.cgi/urlfilter.dat new file mode 100644 index 0000000000..94d150c87e --- /dev/null +++ b/html/cgi-bin/logs.cgi/urlfilter.dat @@ -0,0 +1,1353 @@ +#!/usr/bin/perl +# +# SmoothWall CGIs +# +# This code is distributed under the terms of the GPL +# +# (c) The SmoothWall Team +# +# $Id: urlfilter.dat,v 1.4 2005/05/15 00:00:00 marco Exp $ +# + +use strict; + +# enable only the following on debugging purpose +#use warnings; +#use CGI::Carp 'fatalsToBrowser'; + +use POSIX(); + +require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl"; + +my $dbdir = "${General::swroot}/urlfilter/blacklists"; +my $logdir = "/var/log/squidGuard"; + +my %cgiparams=(); +my %logsettings=(); +my %filtersettings=(); +my %selected=(); + +my $errormessage=''; + +my @log=(); +my $logarch=''; +my $date=''; +my $time=''; +my $pid=''; +my @loginfo=(); +my @ip=(); +my @category=(); +my $dsturl=''; +my $site=''; +my $attr1=''; +my $attr2=''; + +my $start=0; +my $prev=0; +my $next=0; +my $lines=0; +my @slice=(); + +my @then=(); +my @temp=(); +my @temp_then=(); +my @temp_now=(); +my $lastleap=''; + +my $day=''; +my $daystr=''; +my $month=''; +my $monthstr=''; +my $longmonthstr=''; +my $year=''; + +my $logday=''; +my $logmonth=''; +my $logyear=''; + +my @shortmonths = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', + 'Sep', 'Oct', 'Nov', 'Dec' ); +my @longmonths = ( $Lang::tr{'january'}, $Lang::tr{'february'}, $Lang::tr{'march'}, + $Lang::tr{'april'}, $Lang::tr{'may'}, $Lang::tr{'june'}, $Lang::tr{'july'}, $Lang::tr{'august'}, + $Lang::tr{'september'}, $Lang::tr{'october'}, $Lang::tr{'november'}, + $Lang::tr{'december'} ); + +my @now = localtime(time); +my $doy = $now[7]; +my $tdoy = $now[7]; +my $year = $now[5]+1900; + +$cgiparams{'DAY'} = $now[3]; +$cgiparams{'MONTH'} = $now[4]; +$cgiparams{'LOGTYPE'} = 'urlfilter'; + +&Header::getcgihash(\%cgiparams); +$logsettings{'LOGVIEW_REVERSE'} = 'off'; +&General::readhash("${General::swroot}/logging/settings", \%logsettings); +if (-e "${General::swroot}/urlfilter/settings") +{ + &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); +} + +$now[4] = $cgiparams{'MONTH'}+1; +if($now[4] < 10) { + $now[4] = "0$now[4]"; } + +$start = -1; + +if ($ENV{'QUERY_STRING'} && $cgiparams{'ACTION'} ne $Lang::tr{'update'}) +{ + @temp = split(',',$ ENV{'QUERY_STRING'}); + $start = $temp[0]; + $cgiparams{'MONTH'} = $temp[1]; + $cgiparams{'DAY'} = $temp[2]; + $cgiparams{'LOGTYPE'} = $temp[3]; +} + +if (!($cgiparams{'MONTH'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11)$/) || + !($cgiparams{'DAY'} =~ /^(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)$/)) +{ + $cgiparams{'DAY'} = $now[3]; + $cgiparams{'MONTH'} = $now[4]; +} +elsif($cgiparams{'ACTION'} eq '>>') +{ + @temp_now = localtime(time); + $temp_now[4] = $cgiparams{'MONTH'}; + $temp_now[3] = $cgiparams{'DAY'}; + @temp_then = localtime(POSIX::mktime(@temp_now) + 86400); + ## Retrieve the same time on the next day - + ## 86400 seconds in a day + $cgiparams{'MONTH'} = $temp_then[4]; + $cgiparams{'DAY'} = $temp_then[3]; +} +elsif($cgiparams{'ACTION'} eq '<<') +{ + @temp_now = localtime(time); + $temp_now[4] = $cgiparams{'MONTH'}; + $temp_now[3] = $cgiparams{'DAY'}; + @temp_then = localtime(POSIX::mktime(@temp_now) - 86400); + ## Retrieve the same time on the previous day - + ## 86400 seconds in a day + $cgiparams{'MONTH'} = $temp_then[4]; + $cgiparams{'DAY'} = $temp_then[3]; +} + +$monthstr = $shortmonths[$cgiparams{'MONTH'}]; +$longmonthstr = $longmonths[$cgiparams{'MONTH'}]; + +if (($cgiparams{'DAY'} ne $now[3]) || ($cgiparams{'MONTH'} ne $now[4])) +{ + @then = (); + if ( ( $cgiparams{'MONTH'} eq $now[4]) && ($cgiparams{'DAY'} > $now[3]) || + ( $cgiparams{'MONTH'} > $now[4] ) ) { + @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1901 )); + } else { + @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1900 )); + } + $tdoy = $then[7]; + $lastleap=($year-1)%4; + if ($tdoy>$doy) { + if ($lastleap == 0 && $tdoy < 60) { + $doy=$tdoy+366; + } else { + $doy=$doy+365; + } + } +} + +$day = $cgiparams{'DAY'}; +if ($day <= 9) { + $daystr = " $day"; +} else { + $daystr = $day; +} +if ($day < 10) { + $day = "0$day"; +} + +&processevent; + +if ($cgiparams{'ACTION'} eq $Lang::tr{'export'}) +{ + print "Content-type: text/plain\n\n"; + print "IPCop URL filter log\r\n"; + print "Section: $cgiparams{'LOGTYPE'}\r\n"; + print "Date: $daystr $longmonthstr\r\n"; + print "\r\n"; + + if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse @log; } + + foreach (@log) + { + ($date,$time,$pid,@loginfo) = split(/ /); + @ip = split(/\//,$loginfo[2]); + @category = split(/\//,$loginfo[0]); + $dsturl = $loginfo[1]; + $loginfo[3] =~ s/\%5c/\\/; + print "$date "; + print "$time "; + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') + { + print "$pid "; + print "@loginfo"; + } else { + print "$category[1] "; + print "$ip[0] "; + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "$loginfo[3] "; } + print "$dsturl"; + print "\n"; + } + } + + exit; +} + +&Header::showhttpheaders(); + +&Header::openpage($Lang::tr{'urlfilter log viewer'}, 1, ''); + +&Header::openbigbox('100%', 'left', '', $errormessage); + +if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print "$errormessage \n"; + &Header::closebox(); +} + +&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:"); + +$selected{'LOGTYPE'}{$cgiparams{'LOGTYPE'}} = "selected='selected'"; + +print < + + + + + + + + + + + + + + +
$Lang::tr{'section'} + + $Lang::tr{'month'}: + $Lang::tr{'day'}: +
+ +END +; + +&Header::closebox(); + +&Header::openbox('100%', 'left', $Lang::tr{'log'}); + +$lines = @log; + +if ($start == -1) { $start = $lines - $Header::viewsize; } +if ($start >= $lines - $Header::viewsize) { $start = $lines - $Header::viewsize; }; +if ($start < 0) { $start = 0; } + +$prev = $start - $Header::viewsize; +$next = $start + $Header::viewsize; + +if ($prev < 0) { $prev = 0; } +if ($next >= $lines) { $next = -1 } +if ($start == 0) { $prev = -1; } + +if ($cgiparams{'LOGTYPE'} eq 'urlfilter') +{ + print "$Lang::tr{'urlfilter log summary'} $longmonthstr $daystr: $lines

\n"; +} + +@slice = splice(@log, $start, $Header::viewsize); + +if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @slice = reverse @slice; } + +if ($lines) +{ + + $lines = 0; + + print "\n"; + unless ($cgiparams{'LOGTYPE'} eq 'squidGuard') + { + print "\n"; + print "\n"; + print "\n"; + print "\n"; + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "\n"; } + print "\n"; + print "\n"; + } + + foreach (@slice) + { + undef $attr1; undef $attr2; + $lines++; + ($date,$time,$pid,@loginfo) = split(/ /); + @ip = split(/\//,$loginfo[2]); + @category = split(/\//,$loginfo[0]); + $dsturl = $loginfo[1]; + $loginfo[3] =~ s/\%5c/\\/; + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') { + if (@loginfo[0] =~ /squidGuard/) { $attr1 .= ""; $attr2 .= ""; } + if (@loginfo[1] =~ /ready/) { $attr1 .= ""; $attr2 .= ""; } + if (@loginfo[2] =~ /emergency/) { $attr1 .= ""; $attr2 .= ""; } + print "\n"; + } else { + if ($lines % 2) { print "\n"; } else { print "\n"; } + } + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') { + print "\n"; + } else { + print "\n"; + print "\n"; + print "\n"; + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') + { + print "\n"; + $site = substr($dsturl,0,55); + if (length($dsturl) > 55) { $site .= "..."; } + } else { + $site = substr($dsturl,0,69); + if (length($dsturl) > 69) { $site .= "..."; } + } + #print "\n"; + print "\n"; + } + print "\n"; + } + + print "
$Lang::tr{'urlfilter time'}$Lang::tr{'urlfilter category'}$Lang::tr{'urlfilter client'}$Lang::tr{'urlfilter username'}$Lang::tr{'urlfilter dst'}
$time   $pid   $attr1@loginfo$attr2$time$category[1]$ip[0]$loginfo[3]$site$site

\n"; + +} + +&oldernewer(); + +&Header::closebox(); + +&Header::closebigbox(); + +&Header::closepage(); + +# ------------------------------------------------------------------- + +sub processevent +{ + my $filestr=''; + + undef @log; + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') + { + $filestr = "$logdir/squidGuard.log"; + foreach $logarch (<$filestr.*.gz>) + { + open (LOG,"gzip -dc $logarch |"); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } + open (LOG,$filestr); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } else { + foreach $logarch (<$logdir/*.gz>) + { + if ($logarch !~ /squidGuard\.log/) { + open (LOG,"gzip -dc $logarch |"); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } + } + foreach $filestr (<$logdir/*.log>) + { + if ($filestr !~ /squidGuard\.log/) { + open (LOG,$filestr); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } + } + @log = sort { substr($a,11,8) cmp substr($b,11,8) } @log; + + } +} + +# ------------------------------------------------------------------- + +sub oldernewer +{ + print ""; + print ""; + + print "\n"; + + print "\n"; + + print ""; + print "
"; + if ($prev != -1) { + print "$Lang::tr{'older'}"; } + else { + print "$Lang::tr{'older'}"; } + print ""; + if ($next != -1) { + print "$Lang::tr{'newer'}"; } + else { + print "$Lang::tr{'newer'}"; } + print "
"; +} + +# ------------------------------------------------------------------- +#!/usr/bin/perl +# +# SmoothWall CGIs +# +# This code is distributed under the terms of the GPL +# +# (c) The SmoothWall Team +# +# $Id: urlfilter.dat,v 1.4 2005/05/15 00:00:00 marco Exp $ +# + +use strict; + +# enable only the following on debugging purpose +#use warnings; +#use CGI::Carp 'fatalsToBrowser'; + +use POSIX(); + +require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl"; + +my $dbdir = "${General::swroot}/urlfilter/blacklists"; +my $logdir = "/var/log/squidGuard"; + +my %cgiparams=(); +my %logsettings=(); +my %filtersettings=(); +my %selected=(); + +my $errormessage=''; + +my @log=(); +my $logarch=''; +my $date=''; +my $time=''; +my $pid=''; +my @loginfo=(); +my @ip=(); +my @category=(); +my $dsturl=''; +my $site=''; +my $attr1=''; +my $attr2=''; + +my $start=0; +my $prev=0; +my $next=0; +my $lines=0; +my @slice=(); + +my @then=(); +my @temp=(); +my @temp_then=(); +my @temp_now=(); +my $lastleap=''; + +my $day=''; +my $daystr=''; +my $month=''; +my $monthstr=''; +my $longmonthstr=''; +my $year=''; + +my $logday=''; +my $logmonth=''; +my $logyear=''; + +my @shortmonths = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', + 'Sep', 'Oct', 'Nov', 'Dec' ); +my @longmonths = ( $Lang::tr{'january'}, $Lang::tr{'february'}, $Lang::tr{'march'}, + $Lang::tr{'april'}, $Lang::tr{'may'}, $Lang::tr{'june'}, $Lang::tr{'july'}, $Lang::tr{'august'}, + $Lang::tr{'september'}, $Lang::tr{'october'}, $Lang::tr{'november'}, + $Lang::tr{'december'} ); + +my @now = localtime(time); +my $doy = $now[7]; +my $tdoy = $now[7]; +my $year = $now[5]+1900; + +$cgiparams{'DAY'} = $now[3]; +$cgiparams{'MONTH'} = $now[4]; +$cgiparams{'LOGTYPE'} = 'urlfilter'; + +&Header::getcgihash(\%cgiparams); +$logsettings{'LOGVIEW_REVERSE'} = 'off'; +&General::readhash("${General::swroot}/logging/settings", \%logsettings); +if (-e "${General::swroot}/urlfilter/settings") +{ + &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); +} + +$now[4] = $cgiparams{'MONTH'}+1; +if($now[4] < 10) { + $now[4] = "0$now[4]"; } + +$start = -1; + +if ($ENV{'QUERY_STRING'} && $cgiparams{'ACTION'} ne $Lang::tr{'update'}) +{ + @temp = split(',',$ ENV{'QUERY_STRING'}); + $start = $temp[0]; + $cgiparams{'MONTH'} = $temp[1]; + $cgiparams{'DAY'} = $temp[2]; + $cgiparams{'LOGTYPE'} = $temp[3]; +} + +if (!($cgiparams{'MONTH'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11)$/) || + !($cgiparams{'DAY'} =~ /^(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)$/)) +{ + $cgiparams{'DAY'} = $now[3]; + $cgiparams{'MONTH'} = $now[4]; +} +elsif($cgiparams{'ACTION'} eq '>>') +{ + @temp_now = localtime(time); + $temp_now[4] = $cgiparams{'MONTH'}; + $temp_now[3] = $cgiparams{'DAY'}; + @temp_then = localtime(POSIX::mktime(@temp_now) + 86400); + ## Retrieve the same time on the next day - + ## 86400 seconds in a day + $cgiparams{'MONTH'} = $temp_then[4]; + $cgiparams{'DAY'} = $temp_then[3]; +} +elsif($cgiparams{'ACTION'} eq '<<') +{ + @temp_now = localtime(time); + $temp_now[4] = $cgiparams{'MONTH'}; + $temp_now[3] = $cgiparams{'DAY'}; + @temp_then = localtime(POSIX::mktime(@temp_now) - 86400); + ## Retrieve the same time on the previous day - + ## 86400 seconds in a day + $cgiparams{'MONTH'} = $temp_then[4]; + $cgiparams{'DAY'} = $temp_then[3]; +} + +$monthstr = $shortmonths[$cgiparams{'MONTH'}]; +$longmonthstr = $longmonths[$cgiparams{'MONTH'}]; + +if (($cgiparams{'DAY'} ne $now[3]) || ($cgiparams{'MONTH'} ne $now[4])) +{ + @then = (); + if ( ( $cgiparams{'MONTH'} eq $now[4]) && ($cgiparams{'DAY'} > $now[3]) || + ( $cgiparams{'MONTH'} > $now[4] ) ) { + @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1901 )); + } else { + @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1900 )); + } + $tdoy = $then[7]; + $lastleap=($year-1)%4; + if ($tdoy>$doy) { + if ($lastleap == 0 && $tdoy < 60) { + $doy=$tdoy+366; + } else { + $doy=$doy+365; + } + } +} + +$day = $cgiparams{'DAY'}; +if ($day <= 9) { + $daystr = " $day"; +} else { + $daystr = $day; +} +if ($day < 10) { + $day = "0$day"; +} + +&processevent; + +if ($cgiparams{'ACTION'} eq $Lang::tr{'export'}) +{ + print "Content-type: text/plain\n\n"; + print "IPCop URL filter log\r\n"; + print "Section: $cgiparams{'LOGTYPE'}\r\n"; + print "Date: $daystr $longmonthstr\r\n"; + print "\r\n"; + + if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse @log; } + + foreach (@log) + { + ($date,$time,$pid,@loginfo) = split(/ /); + @ip = split(/\//,$loginfo[2]); + @category = split(/\//,$loginfo[0]); + $dsturl = $loginfo[1]; + $loginfo[3] =~ s/\%5c/\\/; + print "$date "; + print "$time "; + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') + { + print "$pid "; + print "@loginfo"; + } else { + print "$category[1] "; + print "$ip[0] "; + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "$loginfo[3] "; } + print "$dsturl"; + print "\n"; + } + } + + exit; +} + +&Header::showhttpheaders(); + +&Header::openpage($Lang::tr{'urlfilter log viewer'}, 1, ''); + +&Header::openbigbox('100%', 'left', '', $errormessage); + +if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print "$errormessage \n"; + &Header::closebox(); +} + +&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:"); + +$selected{'LOGTYPE'}{$cgiparams{'LOGTYPE'}} = "selected='selected'"; + +print < + + + + + + + + + + + + + + +
$Lang::tr{'section'} + + $Lang::tr{'month'}: + $Lang::tr{'day'}: +
+ +END +; + +&Header::closebox(); + +&Header::openbox('100%', 'left', $Lang::tr{'log'}); + +$lines = @log; + +if ($start == -1) { $start = $lines - $Header::viewsize; } +if ($start >= $lines - $Header::viewsize) { $start = $lines - $Header::viewsize; }; +if ($start < 0) { $start = 0; } + +$prev = $start - $Header::viewsize; +$next = $start + $Header::viewsize; + +if ($prev < 0) { $prev = 0; } +if ($next >= $lines) { $next = -1 } +if ($start == 0) { $prev = -1; } + +if ($cgiparams{'LOGTYPE'} eq 'urlfilter') +{ + print "$Lang::tr{'urlfilter log summary'} $longmonthstr $daystr: $lines

\n"; +} + +@slice = splice(@log, $start, $Header::viewsize); + +if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @slice = reverse @slice; } + +if ($lines) +{ + + $lines = 0; + + print "\n"; + unless ($cgiparams{'LOGTYPE'} eq 'squidGuard') + { + print "\n"; + print "\n"; + print "\n"; + print "\n"; + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "\n"; } + print "\n"; + print "\n"; + } + + foreach (@slice) + { + undef $attr1; undef $attr2; + $lines++; + ($date,$time,$pid,@loginfo) = split(/ /); + @ip = split(/\//,$loginfo[2]); + @category = split(/\//,$loginfo[0]); + $dsturl = $loginfo[1]; + $loginfo[3] =~ s/\%5c/\\/; + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') { + if (@loginfo[0] =~ /squidGuard/) { $attr1 .= ""; $attr2 .= ""; } + if (@loginfo[1] =~ /ready/) { $attr1 .= ""; $attr2 .= ""; } + if (@loginfo[2] =~ /emergency/) { $attr1 .= ""; $attr2 .= ""; } + print "\n"; + } else { + if ($lines % 2) { print "\n"; } else { print "\n"; } + } + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') { + print "\n"; + } else { + print "\n"; + print "\n"; + print "\n"; + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') + { + print "\n"; + $site = substr($dsturl,0,55); + if (length($dsturl) > 55) { $site .= "..."; } + } else { + $site = substr($dsturl,0,69); + if (length($dsturl) > 69) { $site .= "..."; } + } + #print "\n"; + print "\n"; + } + print "\n"; + } + + print "
$Lang::tr{'urlfilter time'}$Lang::tr{'urlfilter category'}$Lang::tr{'urlfilter client'}$Lang::tr{'urlfilter username'}$Lang::tr{'urlfilter dst'}
$time   $pid   $attr1@loginfo$attr2$time$category[1]$ip[0]$loginfo[3]$site$site

\n"; + +} + +&oldernewer(); + +&Header::closebox(); + +&Header::closebigbox(); + +&Header::closepage(); + +# ------------------------------------------------------------------- + +sub processevent +{ + my $filestr=''; + + undef @log; + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') + { + $filestr = "$logdir/squidGuard.log"; + foreach $logarch (<$filestr.*.gz>) + { + open (LOG,"gzip -dc $logarch |"); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } + open (LOG,$filestr); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } else { + foreach $logarch (<$logdir/*.gz>) + { + if ($logarch !~ /squidGuard\.log/) { + open (LOG,"gzip -dc $logarch |"); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } + } + foreach $filestr (<$logdir/*.log>) + { + if ($filestr !~ /squidGuard\.log/) { + open (LOG,$filestr); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } + } + @log = sort { substr($a,11,8) cmp substr($b,11,8) } @log; + + } +} + +# ------------------------------------------------------------------- + +sub oldernewer +{ + print ""; + print ""; + + print "\n"; + + print "\n"; + + print ""; + print "
"; + if ($prev != -1) { + print "$Lang::tr{'older'}"; } + else { + print "$Lang::tr{'older'}"; } + print ""; + if ($next != -1) { + print "$Lang::tr{'newer'}"; } + else { + print "$Lang::tr{'newer'}"; } + print "
"; +} + +# ------------------------------------------------------------------- +#!/usr/bin/perl +# +# SmoothWall CGIs +# +# This code is distributed under the terms of the GPL +# +# (c) The SmoothWall Team +# +# $Id: urlfilter.dat,v 1.4 2005/05/15 00:00:00 marco Exp $ +# + +use strict; + +# enable only the following on debugging purpose +#use warnings; +#use CGI::Carp 'fatalsToBrowser'; + +use POSIX(); + +require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl"; + +my $dbdir = "${General::swroot}/urlfilter/blacklists"; +my $logdir = "/var/log/squidGuard"; + +my %cgiparams=(); +my %logsettings=(); +my %filtersettings=(); +my %selected=(); + +my $errormessage=''; + +my @log=(); +my $logarch=''; +my $date=''; +my $time=''; +my $pid=''; +my @loginfo=(); +my @ip=(); +my @category=(); +my $dsturl=''; +my $site=''; +my $attr1=''; +my $attr2=''; + +my $start=0; +my $prev=0; +my $next=0; +my $lines=0; +my @slice=(); + +my @then=(); +my @temp=(); +my @temp_then=(); +my @temp_now=(); +my $lastleap=''; + +my $day=''; +my $daystr=''; +my $month=''; +my $monthstr=''; +my $longmonthstr=''; +my $year=''; + +my $logday=''; +my $logmonth=''; +my $logyear=''; + +my @shortmonths = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', + 'Sep', 'Oct', 'Nov', 'Dec' ); +my @longmonths = ( $Lang::tr{'january'}, $Lang::tr{'february'}, $Lang::tr{'march'}, + $Lang::tr{'april'}, $Lang::tr{'may'}, $Lang::tr{'june'}, $Lang::tr{'july'}, $Lang::tr{'august'}, + $Lang::tr{'september'}, $Lang::tr{'october'}, $Lang::tr{'november'}, + $Lang::tr{'december'} ); + +my @now = localtime(time); +my $doy = $now[7]; +my $tdoy = $now[7]; +my $year = $now[5]+1900; + +$cgiparams{'DAY'} = $now[3]; +$cgiparams{'MONTH'} = $now[4]; +$cgiparams{'LOGTYPE'} = 'urlfilter'; + +&Header::getcgihash(\%cgiparams); +$logsettings{'LOGVIEW_REVERSE'} = 'off'; +&General::readhash("${General::swroot}/logging/settings", \%logsettings); +if (-e "${General::swroot}/urlfilter/settings") +{ + &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); +} + +$now[4] = $cgiparams{'MONTH'}+1; +if($now[4] < 10) { + $now[4] = "0$now[4]"; } + +$start = -1; + +if ($ENV{'QUERY_STRING'} && $cgiparams{'ACTION'} ne $Lang::tr{'update'}) +{ + @temp = split(',',$ ENV{'QUERY_STRING'}); + $start = $temp[0]; + $cgiparams{'MONTH'} = $temp[1]; + $cgiparams{'DAY'} = $temp[2]; + $cgiparams{'LOGTYPE'} = $temp[3]; +} + +if (!($cgiparams{'MONTH'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11)$/) || + !($cgiparams{'DAY'} =~ /^(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)$/)) +{ + $cgiparams{'DAY'} = $now[3]; + $cgiparams{'MONTH'} = $now[4]; +} +elsif($cgiparams{'ACTION'} eq '>>') +{ + @temp_now = localtime(time); + $temp_now[4] = $cgiparams{'MONTH'}; + $temp_now[3] = $cgiparams{'DAY'}; + @temp_then = localtime(POSIX::mktime(@temp_now) + 86400); + ## Retrieve the same time on the next day - + ## 86400 seconds in a day + $cgiparams{'MONTH'} = $temp_then[4]; + $cgiparams{'DAY'} = $temp_then[3]; +} +elsif($cgiparams{'ACTION'} eq '<<') +{ + @temp_now = localtime(time); + $temp_now[4] = $cgiparams{'MONTH'}; + $temp_now[3] = $cgiparams{'DAY'}; + @temp_then = localtime(POSIX::mktime(@temp_now) - 86400); + ## Retrieve the same time on the previous day - + ## 86400 seconds in a day + $cgiparams{'MONTH'} = $temp_then[4]; + $cgiparams{'DAY'} = $temp_then[3]; +} + +$monthstr = $shortmonths[$cgiparams{'MONTH'}]; +$longmonthstr = $longmonths[$cgiparams{'MONTH'}]; + +if (($cgiparams{'DAY'} ne $now[3]) || ($cgiparams{'MONTH'} ne $now[4])) +{ + @then = (); + if ( ( $cgiparams{'MONTH'} eq $now[4]) && ($cgiparams{'DAY'} > $now[3]) || + ( $cgiparams{'MONTH'} > $now[4] ) ) { + @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1901 )); + } else { + @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1900 )); + } + $tdoy = $then[7]; + $lastleap=($year-1)%4; + if ($tdoy>$doy) { + if ($lastleap == 0 && $tdoy < 60) { + $doy=$tdoy+366; + } else { + $doy=$doy+365; + } + } +} + +$day = $cgiparams{'DAY'}; +if ($day <= 9) { + $daystr = " $day"; +} else { + $daystr = $day; +} +if ($day < 10) { + $day = "0$day"; +} + +&processevent; + +if ($cgiparams{'ACTION'} eq $Lang::tr{'export'}) +{ + print "Content-type: text/plain\n\n"; + print "IPCop URL filter log\r\n"; + print "Section: $cgiparams{'LOGTYPE'}\r\n"; + print "Date: $daystr $longmonthstr\r\n"; + print "\r\n"; + + if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse @log; } + + foreach (@log) + { + ($date,$time,$pid,@loginfo) = split(/ /); + @ip = split(/\//,$loginfo[2]); + @category = split(/\//,$loginfo[0]); + $dsturl = $loginfo[1]; + $loginfo[3] =~ s/\%5c/\\/; + print "$date "; + print "$time "; + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') + { + print "$pid "; + print "@loginfo"; + } else { + print "$category[1] "; + print "$ip[0] "; + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "$loginfo[3] "; } + print "$dsturl"; + print "\n"; + } + } + + exit; +} + +&Header::showhttpheaders(); + +&Header::openpage($Lang::tr{'urlfilter log viewer'}, 1, ''); + +&Header::openbigbox('100%', 'left', '', $errormessage); + +if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print "$errormessage \n"; + &Header::closebox(); +} + +&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:"); + +$selected{'LOGTYPE'}{$cgiparams{'LOGTYPE'}} = "selected='selected'"; + +print < + + + + + + + + + + + + + + +
$Lang::tr{'section'} + + $Lang::tr{'month'}: + $Lang::tr{'day'}: +
+ +END +; + +&Header::closebox(); + +&Header::openbox('100%', 'left', $Lang::tr{'log'}); + +$lines = @log; + +if ($start == -1) { $start = $lines - $Header::viewsize; } +if ($start >= $lines - $Header::viewsize) { $start = $lines - $Header::viewsize; }; +if ($start < 0) { $start = 0; } + +$prev = $start - $Header::viewsize; +$next = $start + $Header::viewsize; + +if ($prev < 0) { $prev = 0; } +if ($next >= $lines) { $next = -1 } +if ($start == 0) { $prev = -1; } + +if ($cgiparams{'LOGTYPE'} eq 'urlfilter') +{ + print "$Lang::tr{'urlfilter log summary'} $longmonthstr $daystr: $lines

\n"; +} + +@slice = splice(@log, $start, $Header::viewsize); + +if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @slice = reverse @slice; } + +if ($lines) +{ + + $lines = 0; + + print "\n"; + unless ($cgiparams{'LOGTYPE'} eq 'squidGuard') + { + print "\n"; + print "\n"; + print "\n"; + print "\n"; + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { print "\n"; } + print "\n"; + print "\n"; + } + + foreach (@slice) + { + undef $attr1; undef $attr2; + $lines++; + ($date,$time,$pid,@loginfo) = split(/ /); + @ip = split(/\//,$loginfo[2]); + @category = split(/\//,$loginfo[0]); + $dsturl = $loginfo[1]; + $loginfo[3] =~ s/\%5c/\\/; + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') { + if (@loginfo[0] =~ /squidGuard/) { $attr1 .= ""; $attr2 .= ""; } + if (@loginfo[1] =~ /ready/) { $attr1 .= ""; $attr2 .= ""; } + if (@loginfo[2] =~ /emergency/) { $attr1 .= ""; $attr2 .= ""; } + print "\n"; + } else { + if ($lines % 2) { print "\n"; } else { print "\n"; } + } + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') { + print "\n"; + } else { + print "\n"; + print "\n"; + print "\n"; + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') + { + print "\n"; + $site = substr($dsturl,0,55); + if (length($dsturl) > 55) { $site .= "..."; } + } else { + $site = substr($dsturl,0,69); + if (length($dsturl) > 69) { $site .= "..."; } + } + #print "\n"; + print "\n"; + } + print "\n"; + } + + print "
$Lang::tr{'urlfilter time'}$Lang::tr{'urlfilter category'}$Lang::tr{'urlfilter client'}$Lang::tr{'urlfilter username'}$Lang::tr{'urlfilter dst'}
$time   $pid   $attr1@loginfo$attr2$time$category[1]$ip[0]$loginfo[3]$site$site

\n"; + +} + +&oldernewer(); + +&Header::closebox(); + +&Header::closebigbox(); + +&Header::closepage(); + +# ------------------------------------------------------------------- + +sub processevent +{ + my $filestr=''; + + undef @log; + if ($cgiparams{'LOGTYPE'} eq 'squidGuard') + { + $filestr = "$logdir/squidGuard.log"; + foreach $logarch (<$filestr.*.gz>) + { + open (LOG,"gzip -dc $logarch |"); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } + open (LOG,$filestr); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } else { + foreach $logarch (<$logdir/*.gz>) + { + if ($logarch !~ /squidGuard\.log/) { + open (LOG,"gzip -dc $logarch |"); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } + } + foreach $filestr (<$logdir/*.log>) + { + if ($filestr !~ /squidGuard\.log/) { + open (LOG,$filestr); + foreach () { + ($date,$time,$pid,@loginfo) = split(/ /); + ($logyear,$logmonth,$logday) = split(/-/,$date); + if (($logyear == $year) && ($logmonth == $cgiparams{'MONTH'}+1) && ($logday == $day)) { push(@log,$_) } + } + close(LOG); + } + } + @log = sort { substr($a,11,8) cmp substr($b,11,8) } @log; + + } +} + +# ------------------------------------------------------------------- + +sub oldernewer +{ + print ""; + print ""; + + print "\n"; + + print "\n"; + + print ""; + print "
"; + if ($prev != -1) { + print "$Lang::tr{'older'}"; } + else { + print "$Lang::tr{'older'}"; } + print ""; + if ($next != -1) { + print "$Lang::tr{'newer'}"; } + else { + print "$Lang::tr{'newer'}"; } + print "
"; +} + +# ------------------------------------------------------------------- diff --git a/html/cgi-bin/proxy.cgi b/html/cgi-bin/proxy.cgi index c921ef59fc..192c9829f5 100644 --- a/html/cgi-bin/proxy.cgi +++ b/html/cgi-bin/proxy.cgi @@ -130,6 +130,12 @@ open FILE, $browserdb; @useragentlist = sort { reverse(substr(reverse(substr($a,index($a,',')+1)),index(reverse(substr($a,index($a,','))),',')+1)) cmp reverse(substr(reverse(substr($b,index($b,',')+1)),index(reverse(substr($b,index($b,','))),',')+1))} grep !/(^$)|(^\s*#)/,; close(FILE); +my %filtersettings=(); +$filtersettings{'CHILDREN'} = '5'; +if (-e "${General::swroot}/urlfilter/settings") { + &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); +} + &General::readhash("${General::swroot}/ethernet/settings", \%netsettings); &General::readhash("${General::swroot}/main/settings", \%mainsettings); @@ -152,6 +158,7 @@ if ($updacclrtr_addon) { &Header::showhttpheaders(); +$proxysettings{'ENABLE_FILTER'} = 'off'; $proxysettings{'ACTION'} = ''; $proxysettings{'VALID'} = ''; @@ -338,6 +345,15 @@ if (($proxysettings{'ACTION'} eq $Lang::tr{'save'}) || ($proxysettings{'ACTION'} $errormessage = $Lang::tr{'invalid maximum outgoing size'}; goto ERROR; } + if ($proxysettings{'ENABLE_FILTER'} eq 'on') + { + print FILE < + +


$Lang::tr{'urlfilter url filter'} + + + $Lang::tr{'urlfilter enabled'} + +   +
@@ -3414,7 +3442,7 @@ END if ($proxysettings{'ENABLE_FILTER'} eq 'on') { print FILE < + + + + + +END +; + +if (($filtersettings{'ENABLE_JPEG'} eq 'on') && (-e "/home/httpd/html/images/urlfilter/background.jpg")) +{ +print < +END +; +} else { +print < +END +; +} + +print < + +
+ + + + + + + + + +
+ + $category + +
+ + + + + + + + + +
+ + $msgtext1 + +
+ + $msgtext2 + + +END +; + +if (!($url eq "")) +{ +print <URL: $url +END +; +} + +if (!($ip eq "")) +{ +print <Client IP address: $ip +END +; +} + +print <

$msgtext3 + +

+ +
+ Web Filtering by + + + IPCop and + + SquidGuard + +
+ + + + + + +END +; + +sub readhash +{ + my $filename = $_[0]; + my $hash = $_[1]; + my ($var, $val); + + if (-e $filename) + { + open(FILE, $filename) or die "Unable to read file $filename"; + while () + { + chop; + ($var, $val) = split /=/, $_, 2; + if ($var) + { + $val =~ s/^\'//g; + $val =~ s/\'$//g; + + # Untaint variables read from hash + $var =~ /([A-Za-z0-9_-]*)/; $var = $1; + $val =~ /([\w\W]*)/; $val = $1; + $hash->{$var} = $val; + } + } + close FILE; + } +} +#!/usr/bin/perl + +# +# $Id: redirect.cgi,v 0.1 2004/09/26 00:00:00 marco Exp $ +# + +use CGI qw(param); + +$swroot="/var/ipfire"; + +my %netsettings; +my %filtersettings; + +&readhash("$swroot/ethernet/settings", \%netsettings); +&readhash("$swroot/urlfilter/settings", \%filtersettings); + +$category=param("category"); +$url=param("url"); +$ip=param("ip"); + +if ($filtersettings{'MSG_TEXT_1'} eq '') { + $msgtext1 = "A C C E S S    D E N I E D"; +} else { $msgtext1 = $filtersettings{'MSG_TEXT_1'}; } +if ($filtersettings{'MSG_TEXT_2'} eq '') { + $msgtext2 = "Access to the requested page has been denied"; +} else { $msgtext2 = $filtersettings{'MSG_TEXT_2'}; } +if ($filtersettings{'MSG_TEXT_3'} eq '') { + $msgtext3 = "Please contact the Network Administrator if you think there has been an error"; +} else { $msgtext3 = $filtersettings{'MSG_TEXT_3'}; } + +if ($category eq '') { $category = ' '; } else { $category = '['.$category.']'; } + +print "Pragma: no-cache\n"; +print "Cache-control: no-cache\n"; +print "Connection: close\n"; +print "Content-type: text/html\n\n"; + +print < + + + + + +END +; + +if (($filtersettings{'ENABLE_JPEG'} eq 'on') && (-e "/home/httpd/html/images/urlfilter/background.jpg")) +{ +print < +END +; +} else { +print < +END +; +} + +print < + + + + + + + + + + + +
+ + $category + +
+ + + + + + + + + +
+ + $msgtext1 + +
+ + $msgtext2 + + +END +; + +if (!($url eq "")) +{ +print <URL: $url +END +; +} + +if (!($ip eq "")) +{ +print <Client IP address: $ip +END +; +} + +print <

$msgtext3 + +

+ +
+ Web Filtering by + + + IPCop and + + SquidGuard + +
+ + + + + + +END +; + +sub readhash +{ + my $filename = $_[0]; + my $hash = $_[1]; + my ($var, $val); + + if (-e $filename) + { + open(FILE, $filename) or die "Unable to read file $filename"; + while () + { + chop; + ($var, $val) = split /=/, $_, 2; + if ($var) + { + $val =~ s/^\'//g; + $val =~ s/\'$//g; + + # Untaint variables read from hash + $var =~ /([A-Za-z0-9_-]*)/; $var = $1; + $val =~ /([\w\W]*)/; $val = $1; + $hash->{$var} = $val; + } + } + close FILE; + } +} +#!/usr/bin/perl + +# +# $Id: redirect.cgi,v 0.1 2004/09/26 00:00:00 marco Exp $ +# + +use CGI qw(param); + +$swroot="/var/ipfire"; + +my %netsettings; +my %filtersettings; + +&readhash("$swroot/ethernet/settings", \%netsettings); +&readhash("$swroot/urlfilter/settings", \%filtersettings); + +$category=param("category"); +$url=param("url"); +$ip=param("ip"); + +if ($filtersettings{'MSG_TEXT_1'} eq '') { + $msgtext1 = "A C C E S S    D E N I E D"; +} else { $msgtext1 = $filtersettings{'MSG_TEXT_1'}; } +if ($filtersettings{'MSG_TEXT_2'} eq '') { + $msgtext2 = "Access to the requested page has been denied"; +} else { $msgtext2 = $filtersettings{'MSG_TEXT_2'}; } +if ($filtersettings{'MSG_TEXT_3'} eq '') { + $msgtext3 = "Please contact the Network Administrator if you think there has been an error"; +} else { $msgtext3 = $filtersettings{'MSG_TEXT_3'}; } + +if ($category eq '') { $category = ' '; } else { $category = '['.$category.']'; } + +print "Pragma: no-cache\n"; +print "Cache-control: no-cache\n"; +print "Connection: close\n"; +print "Content-type: text/html\n\n"; + +print < + + + + + +END +; + +if (($filtersettings{'ENABLE_JPEG'} eq 'on') && (-e "/home/httpd/html/images/urlfilter/background.jpg")) +{ +print < +END +; +} else { +print < +END +; +} + +print < + + + + + + + + + + + +
+ + $category + +
+ + + + + + + + + +
+ + $msgtext1 + +
+ + $msgtext2 + + +END +; + +if (!($url eq "")) +{ +print <URL: $url +END +; +} + +if (!($ip eq "")) +{ +print <Client IP address: $ip +END +; +} + +print <

$msgtext3 + +

+ +
+ Web Filtering by + + + IPCop and + + SquidGuard + +
+ + + + + + +END +; + +sub readhash +{ + my $filename = $_[0]; + my $hash = $_[1]; + my ($var, $val); + + if (-e $filename) + { + open(FILE, $filename) or die "Unable to read file $filename"; + while () + { + chop; + ($var, $val) = split /=/, $_, 2; + if ($var) + { + $val =~ s/^\'//g; + $val =~ s/\'$//g; + + # Untaint variables read from hash + $var =~ /([A-Za-z0-9_-]*)/; $var = $1; + $val =~ /([\w\W]*)/; $val = $1; + $hash->{$var} = $val; + } + } + close FILE; + } +} diff --git a/html/cgi-bin/urlfilter.cgi b/html/cgi-bin/urlfilter.cgi new file mode 100644 index 0000000000..4da98f974f --- /dev/null +++ b/html/cgi-bin/urlfilter.cgi @@ -0,0 +1,9012 @@ +#!/usr/bin/perl +# +# SmoothWall CGIs +# +# This code is distributed under the terms of the GPL +# +# (c) written from scratch +# +# $Id: urlfilter.cgi,v 1.7 2006/05/08 00:00:00 marco Exp $ +# + +use strict; + +# enable only the following on debugging purpose +#use warnings; +#use CGI::Carp 'fatalsToBrowser'; + +use File::Copy; +use IO::Socket; + +require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl"; + +my %netsettings=(); +my %mainsettings=(); +my %proxysettings=(); +my %filtersettings=(); +my %tcsettings=(); +my %uqsettings=(); +my %besettings=(); +my %updatesettings=(); +my %checked=(); +my %selected=(); +my $id=0; +my $line=''; +my $i=0; +my $n=0; +my $time=''; +my $filesize; +my $category=''; +my $section=''; +my $blacklist=''; +my $blistbackup=''; + +my $changed = 'no'; +my $tcfile = "${General::swroot}/urlfilter/timeconst"; +my $uqfile = "${General::swroot}/urlfilter/userquota"; +my $dbdir = "${General::swroot}/urlfilter/blacklists"; +my $editdir = "${General::swroot}/urlfilter/editor"; +my $repository = "/home/httpd/html/repository"; +my $hintcolour = '#FFFFCC'; + +my $sourceurlfile = "${General::swroot}/urlfilter/autoupdate/autoupdate.urls"; +my $updconffile = "${General::swroot}/urlfilter/autoupdate/autoupdate.conf"; +my $updflagfile = "${General::swroot}/urlfilter/blacklists/.autoupdate.last"; +my $upd_cron_dly = "${General::swroot}/urlfilter/autoupdate/cron.daily"; +my $upd_cron_wly = "${General::swroot}/urlfilter/autoupdate/cron.weekly"; +my $upd_cron_mly = "${General::swroot}/urlfilter/autoupdate/cron.monthly"; + +my $errormessage=''; +my $updatemessage=''; +my $restoremessage=''; +my $buttontext=''; +my $source_name=''; +my $source_url=''; +my $blacklistage=0; + +my @repositorylist=(); +my @repositoryfiles=(); +my @categories=(); +my @selectedcategories=(); +my @filtergroups=(); +my @tclist=(); +my @uqlist=(); +my @source_urllist=(); +my @temp=(); + +my $lastslashpos=0; + +my $toggle=''; +my $gif=''; +my $led=''; +my $ldesc=''; +my $gdesc=''; + +if (! -d $dbdir) { mkdir("$dbdir"); } +if (! -e $tcfile) { system("touch $tcfile"); } +if (! -e $uqfile) { system("touch $uqfile"); } +if (! -e $sourceurlfile) { system("touch $sourceurlfile"); } + +&General::readhash("${General::swroot}/ethernet/settings", \%netsettings); +&General::readhash("${General::swroot}/main/settings", \%mainsettings); +&General::readhash("${General::swroot}/proxy/settings", \%proxysettings); + +&readblockcategories; + +open(FILE, $tcfile); +@tclist = ; +close(FILE); +open(FILE, $uqfile); +@uqlist = ; +close(FILE); +open(FILE, $sourceurlfile); +@source_urllist = ; +close(FILE); + +$filtersettings{'ENABLE_CUSTOM_BLACKLIST'} = 'off'; +$filtersettings{'ENABLE_CUSTOM_WHITELIST'} = 'off'; +$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} = 'off'; +$filtersettings{'BLOCK_EXECUTABLES'} = 'off'; +$filtersettings{'BLOCK_AUDIO-VIDEO'} = 'off'; +$filtersettings{'BLOCK_ARCHIVES'} = 'off'; +$filtersettings{'ENABLE_REWRITE'} = 'off'; +$filtersettings{'UNFILTERED_CLIENTS'} = ''; +$filtersettings{'BANNED_CLIENTS'} = ''; +$filtersettings{'SHOW_CATEGORY'} = 'off'; +$filtersettings{'SHOW_URL'} = 'off'; +$filtersettings{'SHOW_IP'} = 'off'; +$filtersettings{'ENABLE_DNSERROR'} = 'off'; +$filtersettings{'ENABLE_JPEG'} = 'off'; +$filtersettings{'REDIRECT_PAGE'} = ''; +$filtersettings{'MSG_TEXT_1'} = ''; +$filtersettings{'MSG_TEXT_2'} = ''; +$filtersettings{'MSG_TEXT_3'} = ''; +$filtersettings{'ENABLE_EXPR_LISTS'} = 'off'; +$filtersettings{'BLOCK_IP_ADDR'} = 'off'; +$filtersettings{'BLOCK_ALL'} = 'off'; +$filtersettings{'ENABLE_EMPTY_ADS'} = 'off'; +$filtersettings{'ENABLE_GLOBAL_WHITELIST'} = 'off'; +$filtersettings{'ENABLE_SAFESEARCH'} = 'off'; +$filtersettings{'ENABLE_LOG'} = 'off'; +$filtersettings{'ENABLE_USERNAME_LOG'} = 'off'; +$filtersettings{'ENABLE_CATEGORY_LOG'} = 'off'; +$filtersettings{'CHILDREN'} = '5'; +$filtersettings{'ENABLE_AUTOUPDATE'} = 'off'; + +$filtersettings{'ACTION'} = ''; +$filtersettings{'VALID'} = ''; + +&Header::getcgihash(\%filtersettings); +&Header::getcgihash(\%tcsettings); +&Header::getcgihash(\%uqsettings); +&Header::getcgihash(\%besettings); + +if (($filtersettings{'ACTION'} eq $Lang::tr{'save'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'})) +{ + if (!($filtersettings{'CHILDREN'} =~ /^\d+$/) || ($filtersettings{'CHILDREN'} < 1)) + { + $errormessage = $Lang::tr{'urlfilter invalid num of children'}; + goto ERROR; + } + + if ((!($filtersettings{'REDIRECT_PAGE'} eq '')) && (!($filtersettings{'REDIRECT_PAGE'} =~ /^https?:\/\//))) + { + $filtersettings{'REDIRECT_PAGE'} = "http://".$filtersettings{'REDIRECT_PAGE'}; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) + { + if (-e "$repository/$filtersettings{'ID'}") { unlink("$repository/$filtersettings{'ID'}"); } + $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'}; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPLOADFILE'}); + + $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'}; + $_ = $filtersettings{'UPLOADFILE'}; + tr/\\/\//; + $_ = substr($_,rindex($_,"/")+1); + if ($_) { + if (copy($filtersettings{'UPLOADFILE'}, "$repository/$_") != 1) + { + $errormessage = $!; + goto ERROR; + } + } + + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'BACKGROUND'}); + + if (copy($filtersettings{'BACKGROUND'}, "/home/httpd/html/images/urlfilter/background.jpg") != 1) + { + $errormessage = $!; + goto ERROR; + } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'}); + + if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + goto ERROR; + } + + if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/blacklists.tar.gz") != 1) + { + $errormessage = $!; + goto ERROR; + } + + if (!(-d "${General::swroot}/urlfilter/update")) { mkdir("${General::swroot}/urlfilter/update"); } + + my $exitcode = system("/bin/tar --no-same-owner -xzf ${General::swroot}/urlfilter/blacklists.tar.gz -C ${General::swroot}/urlfilter/update"); + + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + + if (-d "${General::swroot}/urlfilter/update/category") + { + system("mv ${General::swroot}/urlfilter/update/category ${General::swroot}/urlfilter/update/blacklists"); + } + + if (!(-d "${General::swroot}/urlfilter/update/blacklists")) + { + $errormessage = $Lang::tr{'urlfilter invalid content'}; + } else { + system("cp -r ${General::swroot}/urlfilter/update/blacklists/* $dbdir"); + + &readblockcategories; + &readcustomlists; + + &writeconfigfile; + + $updatemessage = $Lang::tr{'urlfilter upload success'}; + system("${General::swroot}/urlfilter/bin/prebuild.pl &"); + system("logger -t installpackage[urlfilter] \"URL filter blacklist - Blacklist update from local source completed\""); + } + } + if (-d "${General::swroot}/urlfilter/update") { system("rm -rf ${General::swroot}/urlfilter/update"); } + if (-e "${General::swroot}/urlfilter/blacklists.tar.gz") { unlink("${General::swroot}/urlfilter/blacklists.tar.gz"); } + if ($errormessage) { goto ERROR; } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) + { + $blistbackup = ($filtersettings{'ENABLE_FULLBACKUP'} eq 'on') ? "blacklists" : "blacklists/custom"; + if (system("/bin/tar -C ${General::swroot}/urlfilter -czf ${General::swroot}/urlfilter/backup.tar.gz settings timeconst userquota autoupdate $blistbackup")) + { + $errormessage = $Lang::tr{'urlfilter backup error'}; + goto ERROR; + } + else + { + print "Content-type: application/gzip\n"; + print "Content-length: "; + print (-s "${General::swroot}/urlfilter/backup.tar.gz"); + print "\n"; + print "Content-disposition: attachment; filename=urlfilter-backup.tar.gz\n\n"; + + open (FILE, "${General::swroot}/urlfilter/backup.tar.gz"); + while () { print; } + close (FILE); + + if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); } + exit; + } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'}); + + if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + goto ERROR; + } + + if (!(-d "${General::swroot}/urlfilter/restore")) { mkdir("${General::swroot}/urlfilter/restore"); } + + if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/backup.tar.gz") != 1) + { + $errormessage = $!; + } + + my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf ${General::swroot}/urlfilter/backup.tar.gz -C ${General::swroot}/urlfilter/restore"); + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + if (!(-e "${General::swroot}/urlfilter/restore/settings")) + { + $errormessage = $Lang::tr{'urlfilter invalid restore file'}; + } else { + system("cp -rp ${General::swroot}/urlfilter/restore/* ${General::swroot}/urlfilter/"); + &readblockcategories; + &readcustomlists; + &writeconfigfile; + + $restoremessage = $Lang::tr{'urlfilter restore success'}; + } + } + + if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); } + if (-d "${General::swroot}/urlfilter/restore") { system("rm -rf ${General::swroot}/urlfilter/restore"); } + if ($errormessage) { goto ERROR; } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'save'}) + { + $filtersettings{'VALID'} = 'yes'; + &savesettings; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) + { + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + goto ERROR; + } + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + goto ERROR; + } + + $filtersettings{'VALID'} = 'yes'; + &savesettings; + + system("chown -R nobody.nobody $dbdir"); + + if (-e "$dbdir/custom/allowed/domains.db") { unlink("$dbdir/custom/allowed/domains.db"); } + if (-e "$dbdir/custom/allowed/urls.db") { unlink("$dbdir/custom/allowed/urls.db"); } + if (-e "$dbdir/custom/blocked/domains.db") { unlink("$dbdir/custom/blocked/domains.db"); } + if (-e "$dbdir/custom/blocked/urls.db") { unlink("$dbdir/custom/blocked/urls.db"); } + + foreach (<$dbdir/*>) + { + if (-d $_){ system("chmod 644 $_/*"); } + if (-d $_){ system("chmod 666 $_/*.db"); } + } + if (-d "$dbdir/custom/allowed") + { + system("chmod 755 $dbdir/custom/allowed"); + system("chmod 644 $dbdir/custom/allowed/*"); + } + if (-d "$dbdir/custom/blocked") + { + system("chmod 755 $dbdir/custom/blocked"); + system("chmod 644 $dbdir/custom/blocked/*"); + } + + system('/usr/local/bin/restartsquid'); + } + +ERROR: + + if ($errormessage) { $filtersettings{'VALID'} = 'no'; } + +} + +if ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter set time constraints'}) { $tcsettings{'TCMODE'} = 'on'} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'add'})) +{ + $tcsettings{'TCMODE'}='on'; + + if (!$tcsettings{'DST'}) + { + $errormessage=$Lang::tr{'urlfilter dst error'}; + } + + if (!$tcsettings{'SRC'}) + { + $errormessage=$Lang::tr{'urlfilter src error'}; + } + + if (!($tcsettings{'TO_HOUR'}.$tcsettings{'TO_MINUTE'} gt $tcsettings{'FROM_HOUR'}.$tcsettings{'FROM_MINUTE'})) + { + $errormessage=$Lang::tr{'urlfilter timespace error'}; + } + + if (!(($tcsettings{'MON'} eq 'on') || ($tcsettings{'TUE'} eq 'on') || ($tcsettings{'WED'} eq 'on') || ($tcsettings{'THU'} eq 'on') || ($tcsettings{'FRI'} eq 'on') || ($tcsettings{'SAT'} eq 'on') || ($tcsettings{'SUN'} eq 'on'))) + { + $errormessage=$Lang::tr{'urlfilter weekday error'}; + } + + if (!$errormessage) + { + if ($tcsettings{'DST'} =~ /^any/) { $tcsettings{'DST'} = 'any'; } + if ($tcsettings{'ENABLERULE'} eq 'on') { $tcsettings{'ACTIVE'} = $tcsettings{'ENABLERULE'}; } else { $tcsettings{'ACTIVE'} = 'off'} + + $tcsettings{'ENABLERULE'} = 'on'; + if($tcsettings{'EDITING'} eq 'no') { + open(FILE,">>$tcfile"); + flock FILE, 2; + print FILE "$tcsettings{'DEFINITION'},$tcsettings{'MON'},$tcsettings{'TUE'},$tcsettings{'WED'},$tcsettings{'THU'},$tcsettings{'FRI'},$tcsettings{'SAT'},$tcsettings{'SUN'},$tcsettings{'FROM_HOUR'},$tcsettings{'FROM_MINUTE'},$tcsettings{'TO_HOUR'},$tcsettings{'TO_MINUTE'},$tcsettings{'SRC'},$tcsettings{'DST'},$tcsettings{'ACCESS'},$tcsettings{'ACTIVE'},$tcsettings{'COMMENT'}\n"; + } else { + open(FILE, ">$tcfile"); + flock FILE, 2; + $id = 0; + foreach $line (@tclist) + { + $id++; + if ($tcsettings{'EDITING'} eq $id) { + print FILE "$tcsettings{'DEFINITION'},$tcsettings{'MON'},$tcsettings{'TUE'},$tcsettings{'WED'},$tcsettings{'THU'},$tcsettings{'FRI'},$tcsettings{'SAT'},$tcsettings{'SUN'},$tcsettings{'FROM_HOUR'},$tcsettings{'FROM_MINUTE'},$tcsettings{'TO_HOUR'},$tcsettings{'TO_MINUTE'},$tcsettings{'SRC'},$tcsettings{'DST'},$tcsettings{'ACCESS'},$tcsettings{'ACTIVE'},$tcsettings{'COMMENT'}\n"; + } else { print FILE "$line"; } + } + } + close(FILE); + undef %tcsettings; + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; + $changed = 'yes'; + } else { + if ($tcsettings{'EDITING'} ne 'no') + { + $tcsettings{'ACTION'} = $Lang::tr{'edit'}; + $tcsettings{'ID'} = $tcsettings{'EDITING'}; + } + } +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'remove'})) +{ + $id = 0; + open(FILE, ">$tcfile"); + flock FILE, 2; + foreach $line (@tclist) + { + $id++; + unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; } + } + close(FILE); + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'})) +{ + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + } + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + } + + if (!$errormessage) { system('/usr/local/bin/restartsquid'); } + $tcsettings{'TCMODE'}='on'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})) +{ + open(FILE, ">$tcfile"); + flock FILE, 2; + $id = 0; + foreach $line (@tclist) + { + $id++; + unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; } + else + { + chomp($line); + @temp = split(/\,/,$line); + if ($temp[15] eq 'on') { $temp[15] = 'off'; } else { $temp[15] = 'on' } + print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4],$temp[5],$temp[6],$temp[7],$temp[8],$temp[9],$temp[10],$temp[11],$temp[12],$temp[13],$temp[14],$temp[15],$temp[16]\n"; + } + } + close(FILE); + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; +} + +if (!$errormessage) { + $tcsettings{'ENABLERULE'}='on'; + $tcsettings{'TO_HOUR'}='24'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage)) +{ + $id = 0; + foreach $line (@tclist) + { + $id++; + if ($tcsettings{'ID'} eq $id) + { + chomp($line); + @temp = split(/\,/,$line); + $tcsettings{'DEFINITION'} = $temp[0]; + $tcsettings{'MON'} = $temp[1]; + $tcsettings{'TUE'} = $temp[2]; + $tcsettings{'WED'} = $temp[3]; + $tcsettings{'THU'} = $temp[4]; + $tcsettings{'FRI'} = $temp[5]; + $tcsettings{'SAT'} = $temp[6]; + $tcsettings{'SUN'} = $temp[7]; + $tcsettings{'FROM_HOUR'} = $temp[8]; + $tcsettings{'FROM_MINUTE'} = $temp[9]; + $tcsettings{'TO_HOUR'} = $temp[10]; + $tcsettings{'TO_MINUTE'} = $temp[11]; + $tcsettings{'SRC'} = $temp[12]; + $tcsettings{'DST'} = $temp[13]; + $tcsettings{'ACCESS'} = $temp[14]; + $tcsettings{'ENABLERULE'} = $temp[15]; + $tcsettings{'COMMENT'} = $temp[16]; + } + } + $tcsettings{'TCMODE'}='on'; +} + +if ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter set user quota'}) { $uqsettings{'UQMODE'} = 'on'} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'add'})) +{ + $uqsettings{'UQMODE'}='on'; + + if ((!($uqsettings{'TIME_QUOTA'} =~ /^\d+/)) || ($uqsettings{'TIME_QUOTA'} < '1')) + { + $errormessage=$Lang::tr{'urlfilter quota time error'}; + } + + @temp = split(/\n/,$uqsettings{'QUOTA_USERS'}); + undef $uqsettings{'QUOTA_USERS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $uqsettings{'QUOTA_USERS'} .= $_."\n"; } + } + + if ($uqsettings{'QUOTA_USERS'} eq '') + { + $errormessage=$Lang::tr{'urlfilter quota user error'}; + } + + $_ = $uqsettings{'QUOTA_USERS'}; + chomp; s/\n/|/g; + my $quota_users = $_; + + if ($uqsettings{'QUOTA_USERS'} =~ /\\/) + { + $errormessage=$Lang::tr{'urlfilter invalid user error'}; + } + + if (!$errormessage) { + if ($uqsettings{'ENABLEQUOTA'} eq 'on') { $uqsettings{'ACTIVE'} = $uqsettings{'ENABLEQUOTA'}; } else { $uqsettings{'ACTIVE'} = 'off'} + + $uqsettings{'ENABLERULE'} = 'on'; + if($uqsettings{'EDITING'} eq 'no') { + open(FILE,">>$uqfile"); + flock FILE, 2; + print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n"; + } else { + open(FILE, ">$uqfile"); + flock FILE, 2; + $id = 0; + foreach $line (@uqlist) + { + $id++; + if ($uqsettings{'EDITING'} eq $id) { + print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n"; + } else { print FILE "$line"; } + } + } + close(FILE); + undef %uqsettings; + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'MODE'}='USERQUOTA'; + $uqsettings{'UQMODE'}='on'; + $changed = 'yes'; + } else { + if ($uqsettings{'EDITING'} ne 'no') + { + $uqsettings{'ACTION'} = $Lang::tr{'edit'}; + $uqsettings{'ID'} = $uqsettings{'EDITING'}; + } + } +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'remove'})) +{ + $id = 0; + open(FILE, ">$uqfile"); + flock FILE, 2; + foreach $line (@uqlist) + { + $id++; + unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; } + } + close(FILE); + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'UQMODE'}='on'; +} + +if (!$errormessage) { + $uqsettings{'ENABLEQUOTA'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage)) +{ + $id = 0; + foreach $line (@uqlist) + { + $id++; + if ($uqsettings{'ID'} eq $id) + { + chomp($line); + @temp = split(/\,/,$line); + $uqsettings{'TIME_QUOTA'} = $temp[0]; + $uqsettings{'SPORADIC'} = $temp[1]; + $uqsettings{'RENEWAL'} = $temp[2]; + $uqsettings{'QUOTA_USERS'} = $temp[3]; + $uqsettings{'ENABLEQUOTA'} = $temp[4]; + } + } + $uqsettings{'UQMODE'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})) +{ + open(FILE, ">$uqfile"); + flock FILE, 2; + $id = 0; + foreach $line (@uqlist) + { + $id++; + unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; } + else + { + chomp($line); + @temp = split(/\,/,$line); + if ($temp[4] eq 'on') { $temp[4] = 'off'; } else { $temp[4] = 'on' } + print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4]\n"; + } + } + close(FILE); + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'UQMODE'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'})) +{ + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + } + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + } + + if (!$errormessage) { system('/usr/local/bin/restartsquid'); } + $uqsettings{'UQMODE'}='on'; +} + +if ($besettings{'ACTION'} eq $Lang::tr{'urlfilter blacklist editor'}) { $besettings{'BEMODE'} = 'on'; } + +if ($besettings{'MODE'} eq 'BLACKLIST_EDITOR') +{ + @temp = split(/\n/,$besettings{'BE_DOMAINS'}); + undef $besettings{'BE_DOMAINS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_DOMAINS'} .= $_."\n"; } + } + chomp($besettings{'BE_DOMAINS'}); + @temp = split(/\n/,$besettings{'BE_URLS'}); + undef $besettings{'BE_URLS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_URLS'} .= $_."\n"; } + } + chomp($besettings{'BE_URLS'}); + @temp = split(/\n/,$besettings{'BE_EXPRESSIONS'}); + undef $besettings{'BE_EXPRESSIONS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_EXPRESSIONS'} .= $_."\n"; } + } + chomp($besettings{'BE_EXPRESSIONS'}); +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter load blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + $besettings{'BE_NAME'} = $besettings{'BE_BLACKLIST'}; + + delete $besettings{'BE_DOMAINS'}; + delete $besettings{'BE_URLS'}; + delete $besettings{'BE_EXPRESSIONS'}; + + if (-e "$dbdir/$besettings{'BE_NAME'}/domains") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/domains"); + while () { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_DOMAINS'}); + } + if (-e "$dbdir/$besettings{'BE_NAME'}/urls") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/urls"); + while () { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_URLS'}); + } + if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/expressions"); + while () { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_EXPRESSIONS'}); + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter import blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + &Header::getcgihash(\%besettings, {'wantfile' => 1, 'filevar' => 'IMPORTFILE'}); + + if (!($besettings{'IMPORTFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + } else { + if (!-d "$editdir") { mkdir("$editdir"); } + + if (copy($besettings{'IMPORTFILE'}, "$editdir/blacklist.tar.gz") != 1) + { + $errormessage = $!; + } else { + + my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf $editdir/blacklist.tar.gz -C $editdir"); + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + $i = 0; + foreach (<$editdir/blacklists/*>) + { + if (-d) + { + $i++; + $besettings{'BE_NAME'} = substr($_, rindex($_,"/")+1); + } + } + + if (!($i == 1)) + { + $errormessage = $Lang::tr{'urlfilter invalid import file'}; + } else { + delete $besettings{'BE_DOMAINS'}; + delete $besettings{'BE_URLS'}; + delete $besettings{'BE_EXPRESSIONS'}; + + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/domains") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/domains"); + while () { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_DOMAINS'}); + } + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/urls") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/urls"); + while () { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_URLS'}); + } + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/expressions") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/expressions"); + while () { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_EXPRESSIONS'}); + } + } + } + + if (-d $editdir) { system("rm -rf $editdir"); } + + } + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter export blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + if ($besettings{'BE_NAME'} eq '') + { + $errormessage = $Lang::tr{'urlfilter category name error'}; + } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) { + + $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_; + + if (!(-d "$editdir")) { mkdir("$editdir"); } + if (!(-d "$editdir/blacklists")) { mkdir("$editdir/blacklists"); } + if (!(-d "$editdir/blacklists/$besettings{'BE_NAME'}")) { mkdir("$editdir/blacklists/$besettings{'BE_NAME'}"); } + + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/domains"); + flock FILE, 2; + print FILE "$besettings{'BE_DOMAINS'}\n"; + close FILE; + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/urls"); + flock FILE, 2; + print FILE "$besettings{'BE_URLS'}\n"; + close FILE; + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/expressions"); + flock FILE, 2; + print FILE "$besettings{'BE_EXPRESSIONS'}\n"; + close FILE; + + if (system("/bin/tar -C $editdir -czf $editdir/$besettings{'BE_NAME'}.tar.gz blacklists")) + { + $errormessage = $Lang::tr{'urlfilter export error'}; + } + else + { + print "Content-type: application/gzip\n"; + print "Content-length: "; + print (-s "$editdir/$besettings{'BE_NAME'}.tar.gz"); + print "\n"; + print "Content-disposition: attachment; filename=$besettings{'BE_NAME'}.tar.gz\n\n"; + + open (FILE, "$editdir/$besettings{'BE_NAME'}.tar.gz"); + while () { print; } + close (FILE); + + if (-d $editdir) { system("rm -rf $editdir"); } + exit; + } + } else { + $errormessage = $Lang::tr{'urlfilter category data error'}; + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter install blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + if ($besettings{'BE_NAME'} eq '') + { + $errormessage = $Lang::tr{'urlfilter category name error'}; + } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) { + + $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_; + + if (!-d "$editdir") { mkdir("$editdir"); } + + if (!-d "$dbdir/$besettings{'BE_NAME'}") { mkdir("$dbdir/$besettings{'BE_NAME'}"); } + + if (-e "$dbdir/$besettings{'BE_NAME'}/domains") { unlink("$dbdir/$besettings{'BE_NAME'}/domains"); } + if ($besettings{'BE_DOMAINS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/domains"); + flock FILE, 2; + print FILE "$besettings{'BE_DOMAINS'}\n"; + close FILE; + } + if (-e "$dbdir/$besettings{'BE_NAME'}/urls") { unlink("$dbdir/$besettings{'BE_NAME'}/urls"); } + if ($besettings{'BE_URLS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/urls"); + flock FILE, 2; + print FILE "$besettings{'BE_URLS'}\n"; + close FILE; + } + if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") { unlink("$dbdir/$besettings{'BE_NAME'}/expressions"); } + if ($besettings{'BE_EXPRESSIONS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/expressions"); + flock FILE, 2; + print FILE "$besettings{'BE_EXPRESSIONS'}\n"; + close FILE; + } + + open(FILE, ">$editdir/install.conf"); + flock FILE, 2; + print FILE "logdir /var/log/squidGuard\n"; + print FILE "dbhome $dbdir/$besettings{'BE_NAME'}\n\n"; + print FILE "dest $besettings{'BE_NAME'} {\n"; + if ($besettings{'BE_DOMAINS'}) { print FILE " domainlist domains\n"; } + if ($besettings{'BE_URLS'}) { print FILE " urllist urls\n"; } + if ($besettings{'BE_EXPRESSIONS'}) { print FILE " expressions expressions\n"; } + print FILE "}\n\n"; + print FILE "acl {\n"; + print FILE " default {\n"; + print FILE " pass none\n"; + print FILE " }\n"; + print FILE "}\n"; + close FILE; + + system("rm -f $dbdir/$besettings{'BE_NAME'}/*.db"); + system("/usr/sbin/squidGuard -c $editdir/install.conf -C all"); + system("chmod a+w $dbdir/$besettings{'BE_NAME'}/*.db"); + + &readblockcategories; + &readcustomlists; + + &writeconfigfile; + + system('/usr/local/bin/restartsquid') unless ($besettings{'NORESTART'} eq 'on'); + + if (-d $editdir) { system("rm -rf $editdir"); } + } else { + $errormessage = $Lang::tr{'urlfilter category data error'}; + } +} + +if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save schedule'}) +{ + if (($filtersettings{'UPDATE_SOURCE'} eq 'custom') && ($filtersettings{'CUSTOM_UPDATE_URL'} eq '')) + { + $errormessage = $Lang::tr{'urlfilter custom url required'}; + } else { + open (FILE, ">$updconffile"); + print FILE "ENABLE_AUTOUPDATE=$filtersettings{'ENABLE_AUTOUPDATE'}\n"; + print FILE "UPDATE_SCHEDULE=$filtersettings{'UPDATE_SCHEDULE'}\n"; + print FILE "UPDATE_SOURCE=$filtersettings{'UPDATE_SOURCE'}\n"; + print FILE "CUSTOM_UPDATE_URL=$filtersettings{'CUSTOM_UPDATE_URL'}\n"; + close FILE; + + if (-e $upd_cron_dly) { unlink($upd_cron_dly); } + if (-e $upd_cron_wly) { unlink($upd_cron_wly); } + if (-e $upd_cron_mly) { unlink($upd_cron_mly); } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'daily')) + { + symlink("../bin/autoupdate.pl",$upd_cron_dly) + } else { + symlink("/bin/false",$upd_cron_dly) + } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'weekly')) + { + symlink("../bin/autoupdate.pl",$upd_cron_wly) + } else { + symlink("/bin/false",$upd_cron_wly) + } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'monthly')) + { + symlink("../bin/autoupdate.pl",$upd_cron_mly) + } else { + symlink("/bin/false",$upd_cron_mly) + } + } +} + +if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter update now'}) +{ + if ($filtersettings{'UPDATE_SOURCE'} eq 'custom') + { + if ($filtersettings{'CUSTOM_UPDATE_URL'} eq '') + { + $errormessage = $Lang::tr{'urlfilter custom url required'}; + } else { + system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'CUSTOM_UPDATE_URL'} &"); + } + } else { + system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'UPDATE_SOURCE'} &"); + } +} + + +if (-e "${General::swroot}/urlfilter/settings") { &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); } + +&readcustomlists; + +$checked{'ENABLE_CUSTOM_BLACKLIST'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_BLACKLIST'}{$filtersettings{'ENABLE_CUSTOM_BLACKLIST'}} = "checked='checked'"; +$checked{'ENABLE_CUSTOM_WHITELIST'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_WHITELIST'}{$filtersettings{'ENABLE_CUSTOM_WHITELIST'}} = "checked='checked'"; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'}} = "checked='checked'"; +$checked{'BLOCK_EXECUTABLES'}{'off'} = ''; +$checked{'BLOCK_EXECUTABLES'}{'on'} = ''; +$checked{'BLOCK_EXECUTABLES'}{$filtersettings{'BLOCK_EXECUTABLES'}} = "checked='checked'"; +$checked{'BLOCK_AUDIO-VIDEO'}{'off'} = ''; +$checked{'BLOCK_AUDIO-VIDEO'}{'on'} = ''; +$checked{'BLOCK_AUDIO-VIDEO'}{$filtersettings{'BLOCK_AUDIO-VIDEO'}} = "checked='checked'"; +$checked{'BLOCK_ARCHIVES'}{'off'} = ''; +$checked{'BLOCK_ARCHIVES'}{'on'} = ''; +$checked{'BLOCK_ARCHIVES'}{$filtersettings{'BLOCK_ARCHIVES'}} = "checked='checked'"; +$checked{'ENABLE_REWRITE'}{'off'} = ''; +$checked{'ENABLE_REWRITE'}{'on'} = ''; +$checked{'ENABLE_REWRITE'}{$filtersettings{'ENABLE_REWRITE'}} = "checked='checked'"; +$checked{'SHOW_CATEGORY'}{'off'} = ''; +$checked{'SHOW_CATEGORY'}{'on'} = ''; +$checked{'SHOW_CATEGORY'}{$filtersettings{'SHOW_CATEGORY'}} = "checked='checked'"; +$checked{'SHOW_URL'}{'off'} = ''; +$checked{'SHOW_URL'}{'on'} = ''; +$checked{'SHOW_URL'}{$filtersettings{'SHOW_URL'}} = "checked='checked'"; +$checked{'SHOW_IP'}{'off'} = ''; +$checked{'SHOW_IP'}{'on'} = ''; +$checked{'SHOW_IP'}{$filtersettings{'SHOW_IP'}} = "checked='checked'"; +$checked{'ENABLE_DNSERROR'}{'off'} = ''; +$checked{'ENABLE_DNSERROR'}{'on'} = ''; +$checked{'ENABLE_DNSERROR'}{$filtersettings{'ENABLE_DNSERROR'}} = "checked='checked'"; +$checked{'ENABLE_JPEG'}{'off'} = ''; +$checked{'ENABLE_JPEG'}{'on'} = ''; +$checked{'ENABLE_JPEG'}{$filtersettings{'ENABLE_JPEG'}} = "checked='checked'"; +$checked{'ENABLE_EXPR_LISTS'}{'off'} = ''; +$checked{'ENABLE_EXPR_LISTS'}{'on'} = ''; +$checked{'ENABLE_EXPR_LISTS'}{$filtersettings{'ENABLE_EXPR_LISTS'}} = "checked='checked'"; +$checked{'BLOCK_IP_ADDR'}{'off'} = ''; +$checked{'BLOCK_IP_ADDR'}{'on'} = ''; +$checked{'BLOCK_IP_ADDR'}{$filtersettings{'BLOCK_IP_ADDR'}} = "checked='checked'"; +$checked{'BLOCK_ALL'}{'off'} = ''; +$checked{'BLOCK_ALL'}{'on'} = ''; +$checked{'BLOCK_ALL'}{$filtersettings{'BLOCK_ALL'}} = "checked='checked'"; +$checked{'ENABLE_EMPTY_ADS'}{'off'} = ''; +$checked{'ENABLE_EMPTY_ADS'}{'on'} = ''; +$checked{'ENABLE_EMPTY_ADS'}{$filtersettings{'ENABLE_EMPTY_ADS'}} = "checked='checked'"; +$checked{'ENABLE_GLOBAL_WHITELIST'}{'off'} = ''; +$checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} = ''; +$checked{'ENABLE_GLOBAL_WHITELIST'}{$filtersettings{'ENABLE_GLOBAL_WHITELIST'}} = "checked='checked'"; +$checked{'ENABLE_SAFESEARCH'}{'off'} = ''; +$checked{'ENABLE_SAFESEARCH'}{'on'} = ''; +$checked{'ENABLE_SAFESEARCH'}{$filtersettings{'ENABLE_SAFESEARCH'}} = "checked='checked'"; +$checked{'ENABLE_LOG'}{'off'} = ''; +$checked{'ENABLE_LOG'}{'on'} = ''; +$checked{'ENABLE_LOG'}{$filtersettings{'ENABLE_LOG'}} = "checked='checked'"; +$checked{'ENABLE_USERNAME_LOG'}{'off'} = ''; +$checked{'ENABLE_USERNAME_LOG'}{'on'} = ''; +$checked{'ENABLE_USERNAME_LOG'}{$filtersettings{'ENABLE_USERNAME_LOG'}} = "checked='checked'"; +$checked{'ENABLE_CATEGORY_LOG'}{'off'} = ''; +$checked{'ENABLE_CATEGORY_LOG'}{'on'} = ''; +$checked{'ENABLE_CATEGORY_LOG'}{$filtersettings{'ENABLE_CATEGORY_LOG'}} = "checked='checked'"; + +foreach $category (@filtergroups) { + $checked{$category}{'off'} = ''; + $checked{$category}{'on'} = ''; + $checked{$category}{$filtersettings{$category}} = "checked='checked'"; +} + +$selected{'DEFINITION'}{$tcsettings{'DEFINITION'}} = "selected='selected'"; +$selected{'FROM_HOUR'}{$tcsettings{'FROM_HOUR'}} = "selected='selected'"; +$selected{'FROM_MINUTE'}{$tcsettings{'FROM_MINUTE'}} = "selected='selected'"; +$selected{'TO_HOUR'}{$tcsettings{'TO_HOUR'}} = "selected='selected'"; +$selected{'TO_MINUTE'}{$tcsettings{'TO_MINUTE'}} = "selected='selected'"; + +@selectedcategories = split(/\|/,$tcsettings{'DST'}); +foreach (@selectedcategories) +{ + $selected{'DST'}{$_} = "selected='selected'"; +} + +$selected{'ACCESS'}{$tcsettings{'ACCESS'}} = "selected='selected'"; + +$checked{'ENABLERULE'}{'off'} = ''; +$checked{'ENABLERULE'}{'on'} = ''; +$checked{'ENABLERULE'}{$tcsettings{'ENABLERULE'}} = "checked='checked'"; +$checked{'MON'}{'off'} = ''; +$checked{'MON'}{'on'} = ''; +$checked{'MON'}{$tcsettings{'MON'}} = "checked='checked'"; +$checked{'TUE'}{'off'} = ''; +$checked{'TUE'}{'on'} = ''; +$checked{'TUE'}{$tcsettings{'TUE'}} = "checked='checked'"; +$checked{'WED'}{'off'} = ''; +$checked{'WED'}{'on'} = ''; +$checked{'WED'}{$tcsettings{'WED'}} = "checked='checked'"; +$checked{'THU'}{'off'} = ''; +$checked{'THU'}{'on'} = ''; +$checked{'THU'}{$tcsettings{'THU'}} = "checked='checked'"; +$checked{'FRI'}{'off'} = ''; +$checked{'FRI'}{'on'} = ''; +$checked{'FRI'}{$tcsettings{'FRI'}} = "checked='checked'"; +$checked{'SAT'}{'off'} = ''; +$checked{'SAT'}{'on'} = ''; +$checked{'SAT'}{$tcsettings{'SAT'}} = "checked='checked'"; +$checked{'SUN'}{'off'} = ''; +$checked{'SUN'}{'on'} = ''; +$checked{'SUN'}{$tcsettings{'SUN'}} = "checked='checked'"; + +$selected{'SPORADIC'}{$uqsettings{'SPORADIC'}} = "selected='selected'"; +$selected{'RENEWAL'} {$uqsettings{'RENEWAL'}} = "selected='selected'"; + +$checked{'ENABLEQUOTA'}{'off'} = ''; +$checked{'ENABLEQUOTA'}{'on'} = ''; +$checked{'ENABLEQUOTA'}{$uqsettings{'ENABLEQUOTA'}} = "checked='checked'"; + +$selected{'BE_BLACKLIST'}{$besettings{'BE_BLACKLIST'}} = "selected='selected'"; + + +&Header::showhttpheaders(); + +&Header::openpage($Lang::tr{'urlfilter configuration'}, 1, ''); + +&Header::openbigbox('100%', 'left', '', $errormessage); + +if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print "$errormessage \n"; + &Header::closebox(); +} elsif (($tcsettings{'CHANGED'} eq 'yes') || ($uqsettings{'CHANGED'} eq 'yes') ) { + &writeconfigfile; + print "
\n"; + &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restart notification'}:"); + print "$Lang::tr{'urlfilter restart message'}\n"; + if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "

$Lang::tr{'urlfilter quota restart message'}\n"; } + print "\n"; + print "

"; + if ($tcsettings{'MODE'} eq 'TIMECONSTRAINT') { print ""; } + if ($uqsettings{'MODE'} eq 'USERQUOTA') { print ""; } + &Header::closebox(); + print "

\n"; +} + +if ($restoremessage) { + &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restore results'}:"); + print "$restoremessage\n"; + print " \n"; + &Header::closebox(); +} + +if ((!$tcsettings{'TCMODE'}) && (!$uqsettings{'UQMODE'}) && (!$besettings{'BEMODE'})) { + +if (!($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter manage repository'})) { + +#========================================================== +# +# Section: Main Configuration +# +#========================================================== + +print "
\n"; + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter filter settings'}:"); +print < + + $Lang::tr{'urlfilter block categories'} + +END +; + +if (@categories == 0) { +print < + $Lang::tr{'urlfilter no categories'} +   +   +   + + +END +; +} + +for ($n=0; $n<=@categories; $n = $n + $i) { + for ($i=0; $i<=3; $i++) { + if ($i eq 0) { print "\n"; } + if (($n+$i) < @categories) { + print "@categories[$n+$i]:<\/td>\n"; + print "\n"; + } + if ($i eq 3) { print "<\/tr>\n"; } + } +} + +print < +
+ + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter custom blacklist'}   
$Lang::tr{'urlfilter blocked domains'} *$Lang::tr{'urlfilter blocked urls'} *
+ + + + + + + +
$Lang::tr{'urlfilter enable custom blacklist'}:  
+
+ + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter custom whitelist'}   
$Lang::tr{'urlfilter allowed domains'} *$Lang::tr{'urlfilter allowed urls'} *
+ + + + + + + +
$Lang::tr{'urlfilter enable custom whitelist'}:  
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter custom expression list'}
$Lang::tr{'urlfilter blocked expressions'} *
$Lang::tr{'urlfilter enable custom expression list'}:  
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter file ext block'}
$Lang::tr{'urlfilter block executables'}:$Lang::tr{'urlfilter block audio-video'}:
$Lang::tr{'urlfilter block archives'}:  
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter local file redirection'}
$Lang::tr{'urlfilter enable rewrite rules'}:  
   
+
+ + + + + + + + + + + + +
$Lang::tr{'urlfilter network access control'}  
$Lang::tr{'urlfilter unfiltered clients'}: *$Lang::tr{'urlfilter banned clients'}: *
+
+ + + + + + + + + + +
$Lang::tr{'urlfilter timebased access control'}
  
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter block settings'}
$Lang::tr{'urlfilter show category'}:$Lang::tr{'urlfilter redirectpage'}: *
$Lang::tr{'urlfilter show url'}:$Lang::tr{'urlfilter msg text 1'}: *
$Lang::tr{'urlfilter show ip'}:$Lang::tr{'urlfilter msg text 2'}: *
$Lang::tr{'urlfilter show dnserror'}:$Lang::tr{'urlfilter msg text 3'}: *
$Lang::tr{'urlfilter enable jpeg'}:  
+ + + + + + + + + + +
$Lang::tr{'urlfilter background image'}

$Lang::tr{'urlfilter background text'}:
 
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter advanced settings'}
$Lang::tr{'urlfilter enable expression lists'}:$Lang::tr{'urlfilter enable log'}:
$Lang::tr{'urlfilter safesearch'}:$Lang::tr{'urlfilter username log'}:
$Lang::tr{'urlfilter empty ads'}:$Lang::tr{'urlfilter category log'}:
$Lang::tr{'urlfilter block ip'}:$Lang::tr{'urlfilter children'}:
$Lang::tr{'urlfilter block all'}:$Lang::tr{'urlfilter whitelist always allowed'}:
+
+ + + + + +
+ *  + $Lang::tr{'this field may be blank'} + +URL filter +
+ + + + + + + +
  
+END +; + +&Header::closebox(); + +print "\n"; + +print "
\n"; + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter maintenance'}:"); + +print < + +$Lang::tr{'urlfilter blacklist update'} + + +$Lang::tr{'urlfilter upload information'}

$Lang::tr{'urlfilter upload text'}: + + +   + + + +


+ + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter automatic blacklist update'} +END +; +if (-e "$updflagfile") +{ +$blacklistage = int(-M "$updflagfile"); +print "  [ $Lang::tr{'urlfilter blacklist age 1'} $blacklistage $Lang::tr{'urlfilter blacklist age 2'} ]"; +} + +$updatesettings{'UPDATE_SCHEDULE'} = 'monthly'; +$updatesettings{'CUSTOM_UPDATE_URL'} = ''; + +if (-e "$updconffile") { &General::readhash("$updconffile", \%updatesettings); } + +$checked{'ENABLE_AUTOUPDATE'}{'off'} = ''; +$checked{'ENABLE_AUTOUPDATE'}{'on'} = ''; +$checked{'ENABLE_AUTOUPDATE'}{$updatesettings{'ENABLE_AUTOUPDATE'}} = "checked='checked'"; + +$selected{'UPDATE_SCHEDULE'}{$updatesettings{'UPDATE_SCHEDULE'}} = "selected='selected'"; + +$selected{'UPDATE_SOURCE'}{$updatesettings{'UPDATE_SOURCE'}} = "selected='selected'"; + +print < +
$Lang::tr{'urlfilter enable automatic blacklist update'}:
$Lang::tr{'urlfilter automatic update schedule'}: + +
$Lang::tr{'urlfilter select source'}: + +
$Lang::tr{'urlfilter custom url'}:
+ + + + +
   
+ +
+ + + + + + + + + + + +
$Lang::tr{'urlfilter blacklist editor'}
$Lang::tr{'urlfilter blacklist editor info'}
+ +
+ + + + + + + + + + + + + + +
$Lang::tr{'urlfilter backup settings'}
$Lang::tr{'urlfilter enable full backup'}:  
+ +
+ + + + + + + + + + + +
$Lang::tr{'urlfilter restore settings'}
$Lang::tr{'urlfilter restore text'}:
 
+ +END +; + +&Header::closebox(); + +} else { + +#========================================================== +# +# Section: Manage Repository +# +#========================================================== + +print "
\n"; + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter manage local file repository'}:"); +print < + + $Lang::tr{'urlfilter repository information'}

+ + + $Lang::tr{'urlfilter upload file text'}: + + +   + + +
$Lang::tr{'urlfilter upload file information 1'}: $Lang::tr{'urlfilter upload file information 2'} + + +
+ + + + +
+ +END +; + +&Header::closebox(); + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter current files'}:
[$repository]"); + +@repositorylist = <$repository/*>; + +undef @repositoryfiles; +foreach (@repositorylist) +{ + if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); } +} + +if (@repositoryfiles) +{ + print < + + $Lang::tr{'urlfilter filename'} + $Lang::tr{'urlfilter filesize'} + + +END +; + $id = 0; + foreach $line (@repositoryfiles) + { + $id++; + if ($id % 2) { + print "\n"; } + else { + print "\n"; } + $filesize = (-s "$repository/$line"); + 1 while $filesize =~ s/^(-?\d+)(\d{3})/$1.$2/; + +print <   $line + $filesize    + + +
+ + + +
+ + + +END +; + } + +print < + + + +
+ + + + + + +
  $Lang::tr{'legend'}:    $Lang::tr{$Lang::tr{'remove'}
+END +; +} else { + + print "$Lang::tr{'urlfilter empty repository'}\n"; +} + +&Header::closebox(); + +} + +} elsif ($tcsettings{'TCMODE'}) { + +#========================================================== +# +# Section: Set Time Constraints +# +#========================================================== + +print "
\n"; + +$buttontext = $Lang::tr{'urlfilter add rule'}; +if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit time constraint rule'}.':'); +$buttontext = $Lang::tr{'urlfilter update rule'}; +} else { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new time constraint rule'}.':'); +} +print < + + $Lang::tr{'urlfilter constraint definition'} +    + $Lang::tr{'urlfilter monday'} + $Lang::tr{'urlfilter tuesday'} + $Lang::tr{'urlfilter wednesday'} + $Lang::tr{'urlfilter thursday'} + $Lang::tr{'urlfilter friday'} + $Lang::tr{'urlfilter saturday'} + $Lang::tr{'urlfilter sunday'} +    + $Lang::tr{'urlfilter from'} +   + $Lang::tr{'urlfilter to'} +   + + + + + +   + + + + + + + +   + + +END +; +for ($i=0;$i<=45;$i+=15) { +$_ = sprintf("%02s",$i); +print "\n"; +} +print < + - + + + +END +; +for ($i=0;$i<=45;$i+=15) { +$_ = sprintf("%02s",$i); +print "\n"; +} +print < + +   + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter source'}  $Lang::tr{'urlfilter dst'} **  $Lang::tr{'urlfilter access'} 
  + +   + +  
$Lang::tr{'remark'} *    
    
+ + + + + +
$Lang::tr{'urlfilter enabled'}
+ +

+ + + + + + + + + + +
 
+

+ + + + + + + + + +
* $Lang::tr{'this field may be blank'}
** $Lang::tr{'urlfilter select multi'}
+END +; + +if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) { + print "\n"; +} else { + print "\n"; +} + +&Header::closebox(); +print "

\n"; + +&Header::openbox('100%', 'left', $Lang::tr{'current rules'}); +print < + + $Lang::tr{'urlfilter constraint definition'} + $Lang::tr{'urlfilter time space'} + $Lang::tr{'urlfilter src'} + $Lang::tr{'urlfilter dst'} +   + +END +; + +if ($tcsettings{'ACTION'} ne '' or $changed ne 'no') +{ + open(FILE, $tcfile); + @tclist = ; + close(FILE); +} + +$id = 0; +foreach $line (@tclist) +{ + $id++; + chomp($line); + @temp = split(/\,/,$line); + if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) { + print "\n"; } + elsif ($id % 2) { + print "\n"; } + else { + print "\n"; } + if ($temp[0] eq 'within') { $temp[0]=$Lang::tr{'urlfilter constraint within'}; } else { $temp[0]=$Lang::tr{'urlfilter constraint outside'}; } + if ($temp[13] eq 'any') { $temp[13]=$Lang::tr{'urlfilter category all'}; } + if ($temp[15] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};} + else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; } + if ($temp[14] eq 'block') { $led='led-red.gif'; $ldesc=$Lang::tr{'urlfilter block access'};} + else { $led='led-green.gif'; $ldesc=$Lang::tr{'urlfilter allow access'}; } + + undef $time; + if ($temp[1] eq 'on') { $time.=$Lang::tr{'urlfilter mon'}; } else { $time.='='; } + if ($temp[2] eq 'on') { $time.=$Lang::tr{'urlfilter tue'}; } else { $time.='='; } + if ($temp[3] eq 'on') { $time.=$Lang::tr{'urlfilter wed'}; } else { $time.='='; } + if ($temp[4] eq 'on') { $time.=$Lang::tr{'urlfilter thu'}; } else { $time.='='; } + if ($temp[5] eq 'on') { $time.=$Lang::tr{'urlfilter fri'}; } else { $time.='='; } + if ($temp[6] eq 'on') { $time.=$Lang::tr{'urlfilter sat'}; } else { $time.='='; } + if ($temp[7] eq 'on') { $time.=$Lang::tr{'urlfilter sun'}; } else { $time.='='; } + $time=$time.'   '.$temp[8].':'.$temp[9].' to '.$temp[10].':'.$temp[11]; + +print <$temp[0] + $time + $temp[12] + $temp[13] + $ldesc + + +
+ + + + + +
+ + + +
+ + + + +
+ + + +
+ + + + +
+ + + +END +; + if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) { + print "\n"; } + elsif ($id % 2) { + print "\n"; } + else { + print "\n"; } +print <$temp[16] + + + + +END +; +} + +print "\n"; + +# If the time constraint file contains entries, print entries and action icons +if (! -z "$tcfile") { +print < + +   $Lang::tr{'legend'}: +     $Lang::tr{ + $Lang::tr{'urlfilter allow'} +     $Lang::tr{ + $Lang::tr{'urlfilter block'} +   $Lang::tr{ + $Lang::tr{'click to disable'} +     $Lang::tr{ + $Lang::tr{'click to enable'} +     $Lang::tr{ + $Lang::tr{'edit'} +     $Lang::tr{ + $Lang::tr{'remove'} + + +END +; +} + +&Header::closebox(); + +} elsif ($uqsettings{'UQMODE'}) { + +#========================================================== +# +# Section: Set User Quota +# +#========================================================== + +print "
\n"; + +$buttontext = $Lang::tr{'urlfilter add rule'}; +if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit user quota rule'}.':'); +$buttontext = $Lang::tr{'urlfilter update rule'}; +} else { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new user quota rule'}.':'); +} +print < + + + + + $Lang::tr{'urlfilter user time quota'}: + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter assigned quota users'}:
+ + + + $Lang::tr{'urlfilter activity detection'}: + + + + $Lang::tr{'urlfilter renewal period'}: + + + +   + + + $Lang::tr{'urlfilter enabled'} + + + + +

+ + + + + + + + + + +
 
+ +

+END +; + +if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) { + print "\n"; +} else { + print "\n"; +} + +&Header::closebox(); +print "

\n"; + +&Header::openbox('100%', 'left', $Lang::tr{'current rules'}); +print < + + $Lang::tr{'urlfilter time quota'} + $Lang::tr{'urlfilter activity detection'} + $Lang::tr{'urlfilter renewal'} + $Lang::tr{'urlfilter assigned users'} +   + +END +; + +if ($uqsettings{'ACTION'} ne '' or $changed ne 'no') +{ + open(FILE, $uqfile); + @uqlist = ; + close(FILE); +} + +$id = 0; +foreach $line (@uqlist) +{ + $id++; + chomp($line); + @temp = split(/\,/,$line); + if($uqsettings{'ACTION'} eq $Lang::tr{'edit'} && $uqsettings{'ID'} eq $id) { + print "\n"; } + elsif ($id % 2) { + print "\n"; } + else { + print "\n"; } + if ($temp[4] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};} + else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; } + + $temp[5] = $temp[1]; + if ($temp[1] eq '0') { $temp[5] = $Lang::tr{'urlfilter disabled'} } else { $temp[5] = ($temp[5]/60).' '.$Lang::tr{'urlfilter minutes'} } + $_ = $temp[3]; s/\|/, /g; $temp[6] = $_; + +print <$temp[0] $Lang::tr{'urlfilter minutes'} + $temp[5] + $Lang::tr{'urlfilter '.$temp[2]} + $temp[6] + + +
+ + + + + +
+ + + +
+ + + + +
+ + + +
+ + + + +
+ + + +END +; +} + +print "\n"; + +# If the user quota file contains entries, print entries and action icons +if (! -z "$uqfile") { +print < + +   $Lang::tr{'legend'}: +   $Lang::tr{ + $Lang::tr{'click to disable'} +     $Lang::tr{ + $Lang::tr{'click to enable'} +     $Lang::tr{ + $Lang::tr{'edit'} +     $Lang::tr{ + $Lang::tr{'remove'} + + +END +; +} + +&Header::closebox(); + +} else { + +#========================================================== +# +# Section: Blacklist editor +# +#========================================================== + +print "
\n"; + +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter urlfilter blacklist editor'}.':'); + +print < + + + + + $Lang::tr{'urlfilter blacklist name'} + + + $Lang::tr{'urlfilter blacklist category name'}: + + + +
+ + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter edit domains urls expressions'}
$Lang::tr{'urlfilter domains'}$Lang::tr{'urlfilter urls'}
$Lang::tr{'urlfilter expressions'}
+
+ + + + + + + + + + + + + +
$Lang::tr{'urlfilter load blacklist'}
$Lang::tr{'urlfilter select blacklist'}: +   
+
+ + + + + + + + + + + +
$Lang::tr{'urlfilter import blacklist'}
$Lang::tr{'urlfilter import text'}:
 
+
+ + + + + + + +
$Lang::tr{'urlfilter export blacklist'}
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter install blacklist'}
$Lang::tr{'urlfilter dont restart urlfilter'}:  

$Lang::tr{'urlfilter install information'}
+
+ + + + + + +
 
+ +END +; + +&Header::closebox(); +print "\n"; + +} + +&Header::closebigbox(); + +&Header::closepage(); + +# ------------------------------------------------------------------- + +sub savesettings +{ + &writeconfigfile; + + delete $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + delete $filtersettings{'CUSTOM_BLACK_URLS'}; + delete $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + delete $filtersettings{'CUSTOM_WHITE_URLS'}; + delete $filtersettings{'CUSTOM_EXPRESSIONS'}; + delete $filtersettings{'BACKGROUND'}; + delete $filtersettings{'UPDATEFILE'}; + + &General::writehash("${General::swroot}/urlfilter/settings", \%filtersettings); +} + +# ------------------------------------------------------------------- + +sub readblockcategories +{ + undef(@categories); + foreach $blacklist (<$dbdir/*>) { + if (-d $blacklist) { + $lastslashpos = rindex($blacklist,"/"); + if ($lastslashpos > -1) { + $section = substr($blacklist,$lastslashpos+1); + } else { + $section = $blacklist; + } + if (!($section eq 'custom')) { push(@categories,$section) }; + } + } + + @filtergroups = @categories; + foreach (@filtergroups) { + tr/a-z/A-Z/; + $_ = "FILTER_".$_; + } +} + +# ------------------------------------------------------------------- + +sub readcustomlists +{ + if (-e "$dbdir/custom/blocked/domains") { + open(FILE,"$dbdir/custom/blocked/domains"); + delete $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + while () { $filtersettings{'CUSTOM_BLACK_DOMAINS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/blocked/urls") { + open(FILE,"$dbdir/custom/blocked/urls"); + delete $filtersettings{'CUSTOM_BLACK_URLS'}; + while () { $filtersettings{'CUSTOM_BLACK_URLS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/blocked/expressions") { + open(FILE,"$dbdir/custom/blocked/expressions"); + delete $filtersettings{'CUSTOM_EXPRESSIONS'}; + while () { $filtersettings{'CUSTOM_EXPRESSIONS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/allowed/domains") { + open(FILE,"$dbdir/custom/allowed/domains"); + delete $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + while () { $filtersettings{'CUSTOM_WHITE_DOMAINS'} .= $_ }; + close(FILE); + } + if (-e "$dbdir/custom/allowed/urls") { + open(FILE,"$dbdir/custom/allowed/urls"); + delete $filtersettings{'CUSTOM_WHITE_URLS'}; + while () { $filtersettings{'CUSTOM_WHITE_URLS'} .= $_ }; + close(FILE); + } +} + +# ------------------------------------------------------------------- + +sub aggregatedconstraints +{ + my $aggregated; + my @old; + my @new; + my @tmp1; + my @tmp2; + my $x; + + if (-e $tcfile) + { + open(TC, $tcfile); + @old = ; + close(TC); + + while (@old > 0) + { + $aggregated = 0; + $x = shift(@old); + chomp($x); + @tmp1 = split(/\,/,$x); + $tmp1[16] = ''; + foreach (@new) + { + @tmp2 = split(/\,/); + if ($tmp2[15] eq 'on') + { + if (($tmp1[0] eq $tmp2[0]) && ($tmp1[12] eq $tmp2[12]) && ($tmp1[13] eq $tmp2[13]) && ($tmp1[14] eq $tmp2[14])) + { + $aggregated = 1; + $tmp2[16] .= " weekly "; + if ($tmp1[1] eq 'on') { $tmp2[16] .= "m"; } + if ($tmp1[2] eq 'on') { $tmp2[16] .= "t"; } + if ($tmp1[3] eq 'on') { $tmp2[16] .= "w"; } + if ($tmp1[4] eq 'on') { $tmp2[16] .= "h"; } + if ($tmp1[5] eq 'on') { $tmp2[16] .= "f"; } + if ($tmp1[6] eq 'on') { $tmp2[16] .= "a"; } + if ($tmp1[7] eq 'on') { $tmp2[16] .= "s"; } + $tmp2[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n"; + $_ = join(",",@tmp2); + } + + } + } + if (!$aggregated) + { + $tmp1[16] .= " weekly "; + if ($tmp1[1] eq 'on') { $tmp1[16] .= "m"; } + if ($tmp1[2] eq 'on') { $tmp1[16] .= "t"; } + if ($tmp1[3] eq 'on') { $tmp1[16] .= "w"; } + if ($tmp1[4] eq 'on') { $tmp1[16] .= "h"; } + if ($tmp1[5] eq 'on') { $tmp1[16] .= "f"; } + if ($tmp1[6] eq 'on') { $tmp1[16] .= "a"; } + if ($tmp1[7] eq 'on') { $tmp1[16] .= "s"; } + $tmp1[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n"; + $x = join(",",@tmp1); + push(@new,$x); + } + } + } + + return @new; + +} + +# ------------------------------------------------------------------- + +sub writeconfigfile +{ + my $executables = "\\.\(ade|adp|asx|bas|bat|chm|com|cmd|cpl|crt|dll|eml|exe|hiv|hlp|hta|inc|inf|ins|isp|jse|jtd|lnk|msc|msh|msi|msp|mst|nws|ocx|oft|ops|pcd|pif|plx|reg|scr|sct|sha|shb|shm|shs|sys|tlb|tsp|url|vbe|vbs|vxd|wsc|wsf|wsh\)\$"; + my $audiovideo = "\\.\(aiff|asf|avi|dif|divx|mov|movie|mp3|mpe?g?|mpv2|ogg|ra?m|snd|qt|wav|wmf|wmv\)\$"; + my $archives = "\\.\(bin|bz2|cab|cdr|dmg|gz|hqx|rar|smi|sit|sea|tar|tgz|zip\)\$"; + + my $ident = " anonymous"; + + my $defaultrule=''; + my $tcrule=''; + my $redirect=''; + my $qredirect=''; + + my $idx; + + my @ec=(); + my @tc=(); + my @uq=(); + + if (!(-d "$dbdir/custom")) { mkdir("$dbdir/custom") } + if (!(-d "$dbdir/custom/blocked")) { mkdir("$dbdir/custom/blocked") } + if (!(-d "$dbdir/custom/allowed")) { mkdir("$dbdir/custom/allowed") } + + open(FILE, ">/$dbdir/custom/blocked/domains"); + print FILE $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/urls"); + print FILE $filtersettings{'CUSTOM_BLACK_URLS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/expressions"); + print FILE $filtersettings{'CUSTOM_EXPRESSIONS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/files"); + if ($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') { print FILE "$executables\n"; } + if ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') { print FILE "$audiovideo\n"; } + if ($filtersettings{'BLOCK_ARCHIVES'} eq 'on') { print FILE "$archives\n"; } + close(FILE); + open(FILE, ">/$dbdir/custom/allowed/domains"); + print FILE $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/allowed/urls"); + print FILE $filtersettings{'CUSTOM_WHITE_URLS'}; + close(FILE); + + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { $ident = ""; } + + if ($filtersettings{'REDIRECT_PAGE'} eq '') + { + if (($filtersettings{'SHOW_CATEGORY'} eq 'on') || ($filtersettings{'SHOW_URL'} eq 'on') || ($filtersettings{'SHOW_IP'} eq 'on')) { + if ($filtersettings{'SHOW_CATEGORY'} eq 'on') { $redirect .= "&category=%t"; } + if ($filtersettings{'SHOW_URL'} eq 'on') { $redirect .= "&url=%u"; } + if ($filtersettings{'SHOW_IP'} eq 'on') { $redirect .= "&ip=%a"; } + $redirect =~ s/^&/?/; + $redirect = "http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi".$redirect; + } else { + $redirect="http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi"; + } + } else { $redirect=$filtersettings{'REDIRECT_PAGE'}; } + + if ($filtersettings{'ENABLE_DNSERROR'} eq 'on') { $redirect = "302:http://0.0.0.0"; } + + undef $defaultrule; + + if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') + { + $defaultrule .= "custom-allowed "; + } + if ($filtersettings{'BLOCK_ALL'} eq 'on') + { + $defaultrule .= "none"; + } + else + { + if ($filtersettings{'BLOCK_IP_ADDR'} eq 'on') + { + $defaultrule .= "!in-addr "; + } + for ($i=0; $i<=@filtergroups; $i++) { + if ($filtersettings{@filtergroups[$i]} eq 'on') + { + $defaultrule .= "!@categories[$i] "; + } + } + if ($filtersettings{'ENABLE_CUSTOM_BLACKLIST'} eq 'on') + { + $defaultrule .= "!custom-blocked "; + } + if ($filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} eq 'on') + { + $defaultrule .= "!custom-expressions "; + } + if (($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') || + ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') || + ($filtersettings{'BLOCK_ARCHIVES'} eq 'on')) + { + $defaultrule .= "!files "; + } + $defaultrule .= "any"; + } + + open(FILE, ">${General::swroot}/urlfilter/squidGuard.conf") or die "Unable to write squidGuard.conf file"; + flock(FILE, 2); + + print FILE "logdir /var/log/squidGuard\n"; + print FILE "dbhome $dbdir\n\n"; + + undef @repositoryfiles; + if ($filtersettings{'ENABLE_REWRITE'} eq 'on') + { + @repositorylist = <$repository/*>; + foreach (@repositorylist) + { + if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); } + } + } + + if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) + { + print FILE "rewrite rew-rule-0 {\n"; + + if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) + { + print FILE " # rewrite localfiles\n"; + foreach (@repositoryfiles) + { + print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n"; + } + } + + if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on') + { + print FILE " # rewrite safesearch\n"; + print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)(\\bsafe=\\w+)(.*)\@\\1\\3safe=strict\\5\@i\n"; + print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)\@\\1safe=strict\\\&\\3\@i\n"; + print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W)(.*)(\\bvm=\\w+)(.*)\@\\1\\2vm=r\\4\@i\n"; + print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W.*)\@\\1\\\&vm=r\@i\n"; + print FILE " s@(.*\\Walltheweb\\.com/customize\\?)(.*)(\\bcopt_offensive=\\w+)(.*)\@\\1\\2copt_offensive=on\\4\@i\n"; + } + + print FILE "}\n\n"; + + if ((!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) && ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) { + print FILE "rewrite rew-rule-1 {\n"; + if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) + { + print FILE " # rewrite localfiles\n"; + foreach (@repositoryfiles) + { + print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n"; + } + } else { + print FILE " # rewrite nothing\n"; + } + print FILE "}\n\n"; + } + } + + if (-e $uqfile) + { + open(UQ, $uqfile); + @uqlist = ; + close(UQ); + + if (@uqlist > 0) + { + $idx=0; + foreach (@uqlist) + { + chomp; + @uq = split(/\,/); + if ($uq[4] eq 'on') + { + $idx++; + $uq[0] = $uq[0] * 60; + if ($uq[1] eq '0') { + if ($uq[2] eq 'hourly') { $uq[1] = 3600 } + if ($uq[2] eq 'daily') { $uq[1] = 86400 } + if ($uq[2] eq 'weekly') { $uq[1] = 604800 } + } + $uq[3] =~ s/\|/ /g; + print FILE "src quota-$idx {\n"; + print FILE " user $uq[3]\n"; + print FILE " userquota $uq[0] $uq[1] $uq[2]\n"; + print FILE "}\n\n"; + } + } + + } + } + + @tclist = &aggregatedconstraints; + + if (@tclist > 0) + { + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + if ($tc[15] eq 'on') + { + $idx++; + print FILE "src network-$idx {\n"; + print FILE " ip $tc[12]\n"; + print FILE "}\n\n"; + } + } + + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + if ($tc[15] eq 'on') + { + $idx++; + print FILE "time constraint-$idx {\n"; + print FILE "$tc[16]\n"; + print FILE "}\n\n"; + } + } + } + + if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) { + print FILE "src unfiltered {\n"; + print FILE " ip $filtersettings{'UNFILTERED_CLIENTS'}\n"; + print FILE "}\n\n"; + } + if (!($filtersettings{'BANNED_CLIENTS'} eq '')) { + print FILE "src banned {\n"; + print FILE " ip $filtersettings{'BANNED_CLIENTS'}\n"; + print FILE "}\n\n"; + } + + foreach $category (@categories) { + print FILE "dest $category {\n"; + if (-e "$dbdir/$category/domains") { + print FILE " domainlist $category\/domains\n"; + } + if (-e "$dbdir/$category/urls") { + print FILE " urllist $category\/urls\n"; + } + if ((-e "$dbdir/$category/expressions") && ($filtersettings{'ENABLE_EXPR_LISTS'} eq 'on')) { + print FILE " expressionlist $category\/expressions\n"; + } + if (($category eq 'ads') && ($filtersettings{'ENABLE_EMPTY_ADS'} eq 'on')) + { + print FILE " redirect http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/images/urlfilter/1x1.gif\n"; + } + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident $category.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + } + + print FILE "dest files {\n"; + print FILE " expressionlist custom\/blocked\/files\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident files.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "dest custom-allowed {\n"; + print FILE " domainlist custom\/allowed\/domains\n"; + print FILE " urllist custom\/allowed\/urls\n"; + print FILE "}\n\n"; + + print FILE "dest custom-blocked {\n"; + print FILE " domainlist custom\/blocked\/domains\n"; + print FILE " urllist custom\/blocked\/urls\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident custom.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "dest custom-expressions {\n"; + print FILE " expressionlist custom\/blocked\/expressions\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident custom.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "acl {\n"; + if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) { + print FILE " unfiltered {\n"; + print FILE " pass all\n"; + if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on') + { + print FILE " rewrite rew-rule-1\n"; + } + print FILE " }\n\n"; + } + if (!($filtersettings{'BANNED_CLIENTS'} eq '')) { + print FILE " banned {\n"; + print FILE " pass "; + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none\n"; + print FILE " }\n\n"; + } + + if (-s $uqfile) + { + open(UQ, $uqfile); + @uqlist = ; + close(UQ); + + $idx=0; + foreach (@uqlist) + { + chomp; + @uq = split(/\,/); + if ($uq[4] eq 'on') + { + $idx++; + $qredirect = $redirect; + $qredirect =~ s/\%t/\%q\%20-\%20\%i/; + print FILE " quota-$idx {\n"; + print FILE " pass "; + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none\n"; + unless ($redirect eq $qredirect) { print FILE " redirect $qredirect\n"; } + print FILE " }\n\n"; + } + } + } + + if (@tclist > 0) + { + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + @ec = split(/\|/,$tc[13]); + if ($tc[15] eq 'on') + { + $idx++; + print FILE " network-$idx $tc[0] constraint-$idx {\n"; + print FILE " pass "; + + if ($filtersettings{'BLOCK_ALL'} eq 'on') + { + if ($tc[14] eq 'block') + { + if ((@ec == 1) && ($ec[0] eq 'any')) { + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none"; + } else { + print FILE $defaultrule; + } + } else { + foreach (@ec) + { + print FILE "$_ "; + } + print FILE $defaultrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } + } else { + if ($tc[14] eq 'block') + { + $tcrule = $defaultrule; + if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') { + $tcrule =~ s/custom-allowed //; + print FILE "custom-allowed " unless ((@ec == 1) && ($ec[0] eq 'any') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'off')); + } + if ((@ec == 1) && ($ec[0] eq 'any')) { + print FILE "none"; + } else { + foreach (@ec) + { + print FILE "!$_ " unless (index($defaultrule,"!".$_." ") ge 0); + } + } + print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } else { + $tcrule = $defaultrule; + foreach (@ec) + { + $tcrule =~ s/!$_ //; + print FILE "$_ " if ($_ eq 'any'); + } + print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } + } + + print FILE "\n"; + + print FILE " }\n\n"; + } + } + } + + print FILE " default {\n"; + print FILE " pass $defaultrule\n"; + if (($filtersettings{'ENABLE_LOG'} eq 'on') && ($filtersettings{'BLOCK_ALL'} eq 'on')) + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile".$ident." default.log\n"; + } else { + print FILE " logfile".$ident." urlfilter.log\n"; + } + } + if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) + { + print FILE " rewrite rew-rule-0\n"; + } + print FILE " redirect $redirect\n"; + print FILE " }\n"; + print FILE "}\n"; + + close FILE; +} + +# ------------------------------------------------------------------- +#!/usr/bin/perl +# +# SmoothWall CGIs +# +# This code is distributed under the terms of the GPL +# +# (c) written from scratch +# +# $Id: urlfilter.cgi,v 1.7 2006/05/08 00:00:00 marco Exp $ +# + +use strict; + +# enable only the following on debugging purpose +#use warnings; +#use CGI::Carp 'fatalsToBrowser'; + +use File::Copy; +use IO::Socket; + +require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl"; + +my %netsettings=(); +my %mainsettings=(); +my %proxysettings=(); +my %filtersettings=(); +my %tcsettings=(); +my %uqsettings=(); +my %besettings=(); +my %updatesettings=(); +my %checked=(); +my %selected=(); +my $id=0; +my $line=''; +my $i=0; +my $n=0; +my $time=''; +my $filesize; +my $category=''; +my $section=''; +my $blacklist=''; +my $blistbackup=''; + +my $changed = 'no'; +my $tcfile = "${General::swroot}/urlfilter/timeconst"; +my $uqfile = "${General::swroot}/urlfilter/userquota"; +my $dbdir = "${General::swroot}/urlfilter/blacklists"; +my $editdir = "${General::swroot}/urlfilter/editor"; +my $repository = "/home/httpd/html/repository"; +my $hintcolour = '#FFFFCC'; + +my $sourceurlfile = "${General::swroot}/urlfilter/autoupdate/autoupdate.urls"; +my $updconffile = "${General::swroot}/urlfilter/autoupdate/autoupdate.conf"; +my $updflagfile = "${General::swroot}/urlfilter/blacklists/.autoupdate.last"; +my $upd_cron_dly = "${General::swroot}/urlfilter/autoupdate/cron.daily"; +my $upd_cron_wly = "${General::swroot}/urlfilter/autoupdate/cron.weekly"; +my $upd_cron_mly = "${General::swroot}/urlfilter/autoupdate/cron.monthly"; + +my $errormessage=''; +my $updatemessage=''; +my $restoremessage=''; +my $buttontext=''; +my $source_name=''; +my $source_url=''; +my $blacklistage=0; + +my @repositorylist=(); +my @repositoryfiles=(); +my @categories=(); +my @selectedcategories=(); +my @filtergroups=(); +my @tclist=(); +my @uqlist=(); +my @source_urllist=(); +my @temp=(); + +my $lastslashpos=0; + +my $toggle=''; +my $gif=''; +my $led=''; +my $ldesc=''; +my $gdesc=''; + +if (! -d $dbdir) { mkdir("$dbdir"); } +if (! -e $tcfile) { system("touch $tcfile"); } +if (! -e $uqfile) { system("touch $uqfile"); } +if (! -e $sourceurlfile) { system("touch $sourceurlfile"); } + +&General::readhash("${General::swroot}/ethernet/settings", \%netsettings); +&General::readhash("${General::swroot}/main/settings", \%mainsettings); +&General::readhash("${General::swroot}/proxy/settings", \%proxysettings); + +&readblockcategories; + +open(FILE, $tcfile); +@tclist = ; +close(FILE); +open(FILE, $uqfile); +@uqlist = ; +close(FILE); +open(FILE, $sourceurlfile); +@source_urllist = ; +close(FILE); + +$filtersettings{'ENABLE_CUSTOM_BLACKLIST'} = 'off'; +$filtersettings{'ENABLE_CUSTOM_WHITELIST'} = 'off'; +$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} = 'off'; +$filtersettings{'BLOCK_EXECUTABLES'} = 'off'; +$filtersettings{'BLOCK_AUDIO-VIDEO'} = 'off'; +$filtersettings{'BLOCK_ARCHIVES'} = 'off'; +$filtersettings{'ENABLE_REWRITE'} = 'off'; +$filtersettings{'UNFILTERED_CLIENTS'} = ''; +$filtersettings{'BANNED_CLIENTS'} = ''; +$filtersettings{'SHOW_CATEGORY'} = 'off'; +$filtersettings{'SHOW_URL'} = 'off'; +$filtersettings{'SHOW_IP'} = 'off'; +$filtersettings{'ENABLE_DNSERROR'} = 'off'; +$filtersettings{'ENABLE_JPEG'} = 'off'; +$filtersettings{'REDIRECT_PAGE'} = ''; +$filtersettings{'MSG_TEXT_1'} = ''; +$filtersettings{'MSG_TEXT_2'} = ''; +$filtersettings{'MSG_TEXT_3'} = ''; +$filtersettings{'ENABLE_EXPR_LISTS'} = 'off'; +$filtersettings{'BLOCK_IP_ADDR'} = 'off'; +$filtersettings{'BLOCK_ALL'} = 'off'; +$filtersettings{'ENABLE_EMPTY_ADS'} = 'off'; +$filtersettings{'ENABLE_GLOBAL_WHITELIST'} = 'off'; +$filtersettings{'ENABLE_SAFESEARCH'} = 'off'; +$filtersettings{'ENABLE_LOG'} = 'off'; +$filtersettings{'ENABLE_USERNAME_LOG'} = 'off'; +$filtersettings{'ENABLE_CATEGORY_LOG'} = 'off'; +$filtersettings{'CHILDREN'} = '5'; +$filtersettings{'ENABLE_AUTOUPDATE'} = 'off'; + +$filtersettings{'ACTION'} = ''; +$filtersettings{'VALID'} = ''; + +&Header::getcgihash(\%filtersettings); +&Header::getcgihash(\%tcsettings); +&Header::getcgihash(\%uqsettings); +&Header::getcgihash(\%besettings); + +if (($filtersettings{'ACTION'} eq $Lang::tr{'save'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'})) +{ + if (!($filtersettings{'CHILDREN'} =~ /^\d+$/) || ($filtersettings{'CHILDREN'} < 1)) + { + $errormessage = $Lang::tr{'urlfilter invalid num of children'}; + goto ERROR; + } + + if ((!($filtersettings{'REDIRECT_PAGE'} eq '')) && (!($filtersettings{'REDIRECT_PAGE'} =~ /^https?:\/\//))) + { + $filtersettings{'REDIRECT_PAGE'} = "http://".$filtersettings{'REDIRECT_PAGE'}; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) + { + if (-e "$repository/$filtersettings{'ID'}") { unlink("$repository/$filtersettings{'ID'}"); } + $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'}; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPLOADFILE'}); + + $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'}; + $_ = $filtersettings{'UPLOADFILE'}; + tr/\\/\//; + $_ = substr($_,rindex($_,"/")+1); + if ($_) { + if (copy($filtersettings{'UPLOADFILE'}, "$repository/$_") != 1) + { + $errormessage = $!; + goto ERROR; + } + } + + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'BACKGROUND'}); + + if (copy($filtersettings{'BACKGROUND'}, "/home/httpd/html/images/urlfilter/background.jpg") != 1) + { + $errormessage = $!; + goto ERROR; + } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'}); + + if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + goto ERROR; + } + + if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/blacklists.tar.gz") != 1) + { + $errormessage = $!; + goto ERROR; + } + + if (!(-d "${General::swroot}/urlfilter/update")) { mkdir("${General::swroot}/urlfilter/update"); } + + my $exitcode = system("/bin/tar --no-same-owner -xzf ${General::swroot}/urlfilter/blacklists.tar.gz -C ${General::swroot}/urlfilter/update"); + + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + + if (-d "${General::swroot}/urlfilter/update/category") + { + system("mv ${General::swroot}/urlfilter/update/category ${General::swroot}/urlfilter/update/blacklists"); + } + + if (!(-d "${General::swroot}/urlfilter/update/blacklists")) + { + $errormessage = $Lang::tr{'urlfilter invalid content'}; + } else { + system("cp -r ${General::swroot}/urlfilter/update/blacklists/* $dbdir"); + + &readblockcategories; + &readcustomlists; + + &writeconfigfile; + + $updatemessage = $Lang::tr{'urlfilter upload success'}; + system("${General::swroot}/urlfilter/bin/prebuild.pl &"); + system("logger -t installpackage[urlfilter] \"URL filter blacklist - Blacklist update from local source completed\""); + } + } + if (-d "${General::swroot}/urlfilter/update") { system("rm -rf ${General::swroot}/urlfilter/update"); } + if (-e "${General::swroot}/urlfilter/blacklists.tar.gz") { unlink("${General::swroot}/urlfilter/blacklists.tar.gz"); } + if ($errormessage) { goto ERROR; } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) + { + $blistbackup = ($filtersettings{'ENABLE_FULLBACKUP'} eq 'on') ? "blacklists" : "blacklists/custom"; + if (system("/bin/tar -C ${General::swroot}/urlfilter -czf ${General::swroot}/urlfilter/backup.tar.gz settings timeconst userquota autoupdate $blistbackup")) + { + $errormessage = $Lang::tr{'urlfilter backup error'}; + goto ERROR; + } + else + { + print "Content-type: application/gzip\n"; + print "Content-length: "; + print (-s "${General::swroot}/urlfilter/backup.tar.gz"); + print "\n"; + print "Content-disposition: attachment; filename=urlfilter-backup.tar.gz\n\n"; + + open (FILE, "${General::swroot}/urlfilter/backup.tar.gz"); + while () { print; } + close (FILE); + + if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); } + exit; + } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'}); + + if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + goto ERROR; + } + + if (!(-d "${General::swroot}/urlfilter/restore")) { mkdir("${General::swroot}/urlfilter/restore"); } + + if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/backup.tar.gz") != 1) + { + $errormessage = $!; + } + + my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf ${General::swroot}/urlfilter/backup.tar.gz -C ${General::swroot}/urlfilter/restore"); + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + if (!(-e "${General::swroot}/urlfilter/restore/settings")) + { + $errormessage = $Lang::tr{'urlfilter invalid restore file'}; + } else { + system("cp -rp ${General::swroot}/urlfilter/restore/* ${General::swroot}/urlfilter/"); + &readblockcategories; + &readcustomlists; + &writeconfigfile; + + $restoremessage = $Lang::tr{'urlfilter restore success'}; + } + } + + if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); } + if (-d "${General::swroot}/urlfilter/restore") { system("rm -rf ${General::swroot}/urlfilter/restore"); } + if ($errormessage) { goto ERROR; } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'save'}) + { + $filtersettings{'VALID'} = 'yes'; + &savesettings; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) + { + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + goto ERROR; + } + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + goto ERROR; + } + + $filtersettings{'VALID'} = 'yes'; + &savesettings; + + system("chown -R nobody.nobody $dbdir"); + + if (-e "$dbdir/custom/allowed/domains.db") { unlink("$dbdir/custom/allowed/domains.db"); } + if (-e "$dbdir/custom/allowed/urls.db") { unlink("$dbdir/custom/allowed/urls.db"); } + if (-e "$dbdir/custom/blocked/domains.db") { unlink("$dbdir/custom/blocked/domains.db"); } + if (-e "$dbdir/custom/blocked/urls.db") { unlink("$dbdir/custom/blocked/urls.db"); } + + foreach (<$dbdir/*>) + { + if (-d $_){ system("chmod 644 $_/*"); } + if (-d $_){ system("chmod 666 $_/*.db"); } + } + if (-d "$dbdir/custom/allowed") + { + system("chmod 755 $dbdir/custom/allowed"); + system("chmod 644 $dbdir/custom/allowed/*"); + } + if (-d "$dbdir/custom/blocked") + { + system("chmod 755 $dbdir/custom/blocked"); + system("chmod 644 $dbdir/custom/blocked/*"); + } + + system('/usr/local/bin/restartsquid'); + } + +ERROR: + + if ($errormessage) { $filtersettings{'VALID'} = 'no'; } + +} + +if ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter set time constraints'}) { $tcsettings{'TCMODE'} = 'on'} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'add'})) +{ + $tcsettings{'TCMODE'}='on'; + + if (!$tcsettings{'DST'}) + { + $errormessage=$Lang::tr{'urlfilter dst error'}; + } + + if (!$tcsettings{'SRC'}) + { + $errormessage=$Lang::tr{'urlfilter src error'}; + } + + if (!($tcsettings{'TO_HOUR'}.$tcsettings{'TO_MINUTE'} gt $tcsettings{'FROM_HOUR'}.$tcsettings{'FROM_MINUTE'})) + { + $errormessage=$Lang::tr{'urlfilter timespace error'}; + } + + if (!(($tcsettings{'MON'} eq 'on') || ($tcsettings{'TUE'} eq 'on') || ($tcsettings{'WED'} eq 'on') || ($tcsettings{'THU'} eq 'on') || ($tcsettings{'FRI'} eq 'on') || ($tcsettings{'SAT'} eq 'on') || ($tcsettings{'SUN'} eq 'on'))) + { + $errormessage=$Lang::tr{'urlfilter weekday error'}; + } + + if (!$errormessage) + { + if ($tcsettings{'DST'} =~ /^any/) { $tcsettings{'DST'} = 'any'; } + if ($tcsettings{'ENABLERULE'} eq 'on') { $tcsettings{'ACTIVE'} = $tcsettings{'ENABLERULE'}; } else { $tcsettings{'ACTIVE'} = 'off'} + + $tcsettings{'ENABLERULE'} = 'on'; + if($tcsettings{'EDITING'} eq 'no') { + open(FILE,">>$tcfile"); + flock FILE, 2; + print FILE "$tcsettings{'DEFINITION'},$tcsettings{'MON'},$tcsettings{'TUE'},$tcsettings{'WED'},$tcsettings{'THU'},$tcsettings{'FRI'},$tcsettings{'SAT'},$tcsettings{'SUN'},$tcsettings{'FROM_HOUR'},$tcsettings{'FROM_MINUTE'},$tcsettings{'TO_HOUR'},$tcsettings{'TO_MINUTE'},$tcsettings{'SRC'},$tcsettings{'DST'},$tcsettings{'ACCESS'},$tcsettings{'ACTIVE'},$tcsettings{'COMMENT'}\n"; + } else { + open(FILE, ">$tcfile"); + flock FILE, 2; + $id = 0; + foreach $line (@tclist) + { + $id++; + if ($tcsettings{'EDITING'} eq $id) { + print FILE "$tcsettings{'DEFINITION'},$tcsettings{'MON'},$tcsettings{'TUE'},$tcsettings{'WED'},$tcsettings{'THU'},$tcsettings{'FRI'},$tcsettings{'SAT'},$tcsettings{'SUN'},$tcsettings{'FROM_HOUR'},$tcsettings{'FROM_MINUTE'},$tcsettings{'TO_HOUR'},$tcsettings{'TO_MINUTE'},$tcsettings{'SRC'},$tcsettings{'DST'},$tcsettings{'ACCESS'},$tcsettings{'ACTIVE'},$tcsettings{'COMMENT'}\n"; + } else { print FILE "$line"; } + } + } + close(FILE); + undef %tcsettings; + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; + $changed = 'yes'; + } else { + if ($tcsettings{'EDITING'} ne 'no') + { + $tcsettings{'ACTION'} = $Lang::tr{'edit'}; + $tcsettings{'ID'} = $tcsettings{'EDITING'}; + } + } +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'remove'})) +{ + $id = 0; + open(FILE, ">$tcfile"); + flock FILE, 2; + foreach $line (@tclist) + { + $id++; + unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; } + } + close(FILE); + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'})) +{ + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + } + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + } + + if (!$errormessage) { system('/usr/local/bin/restartsquid'); } + $tcsettings{'TCMODE'}='on'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})) +{ + open(FILE, ">$tcfile"); + flock FILE, 2; + $id = 0; + foreach $line (@tclist) + { + $id++; + unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; } + else + { + chomp($line); + @temp = split(/\,/,$line); + if ($temp[15] eq 'on') { $temp[15] = 'off'; } else { $temp[15] = 'on' } + print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4],$temp[5],$temp[6],$temp[7],$temp[8],$temp[9],$temp[10],$temp[11],$temp[12],$temp[13],$temp[14],$temp[15],$temp[16]\n"; + } + } + close(FILE); + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; +} + +if (!$errormessage) { + $tcsettings{'ENABLERULE'}='on'; + $tcsettings{'TO_HOUR'}='24'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage)) +{ + $id = 0; + foreach $line (@tclist) + { + $id++; + if ($tcsettings{'ID'} eq $id) + { + chomp($line); + @temp = split(/\,/,$line); + $tcsettings{'DEFINITION'} = $temp[0]; + $tcsettings{'MON'} = $temp[1]; + $tcsettings{'TUE'} = $temp[2]; + $tcsettings{'WED'} = $temp[3]; + $tcsettings{'THU'} = $temp[4]; + $tcsettings{'FRI'} = $temp[5]; + $tcsettings{'SAT'} = $temp[6]; + $tcsettings{'SUN'} = $temp[7]; + $tcsettings{'FROM_HOUR'} = $temp[8]; + $tcsettings{'FROM_MINUTE'} = $temp[9]; + $tcsettings{'TO_HOUR'} = $temp[10]; + $tcsettings{'TO_MINUTE'} = $temp[11]; + $tcsettings{'SRC'} = $temp[12]; + $tcsettings{'DST'} = $temp[13]; + $tcsettings{'ACCESS'} = $temp[14]; + $tcsettings{'ENABLERULE'} = $temp[15]; + $tcsettings{'COMMENT'} = $temp[16]; + } + } + $tcsettings{'TCMODE'}='on'; +} + +if ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter set user quota'}) { $uqsettings{'UQMODE'} = 'on'} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'add'})) +{ + $uqsettings{'UQMODE'}='on'; + + if ((!($uqsettings{'TIME_QUOTA'} =~ /^\d+/)) || ($uqsettings{'TIME_QUOTA'} < '1')) + { + $errormessage=$Lang::tr{'urlfilter quota time error'}; + } + + @temp = split(/\n/,$uqsettings{'QUOTA_USERS'}); + undef $uqsettings{'QUOTA_USERS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $uqsettings{'QUOTA_USERS'} .= $_."\n"; } + } + + if ($uqsettings{'QUOTA_USERS'} eq '') + { + $errormessage=$Lang::tr{'urlfilter quota user error'}; + } + + $_ = $uqsettings{'QUOTA_USERS'}; + chomp; s/\n/|/g; + my $quota_users = $_; + + if ($uqsettings{'QUOTA_USERS'} =~ /\\/) + { + $errormessage=$Lang::tr{'urlfilter invalid user error'}; + } + + if (!$errormessage) { + if ($uqsettings{'ENABLEQUOTA'} eq 'on') { $uqsettings{'ACTIVE'} = $uqsettings{'ENABLEQUOTA'}; } else { $uqsettings{'ACTIVE'} = 'off'} + + $uqsettings{'ENABLERULE'} = 'on'; + if($uqsettings{'EDITING'} eq 'no') { + open(FILE,">>$uqfile"); + flock FILE, 2; + print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n"; + } else { + open(FILE, ">$uqfile"); + flock FILE, 2; + $id = 0; + foreach $line (@uqlist) + { + $id++; + if ($uqsettings{'EDITING'} eq $id) { + print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n"; + } else { print FILE "$line"; } + } + } + close(FILE); + undef %uqsettings; + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'MODE'}='USERQUOTA'; + $uqsettings{'UQMODE'}='on'; + $changed = 'yes'; + } else { + if ($uqsettings{'EDITING'} ne 'no') + { + $uqsettings{'ACTION'} = $Lang::tr{'edit'}; + $uqsettings{'ID'} = $uqsettings{'EDITING'}; + } + } +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'remove'})) +{ + $id = 0; + open(FILE, ">$uqfile"); + flock FILE, 2; + foreach $line (@uqlist) + { + $id++; + unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; } + } + close(FILE); + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'UQMODE'}='on'; +} + +if (!$errormessage) { + $uqsettings{'ENABLEQUOTA'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage)) +{ + $id = 0; + foreach $line (@uqlist) + { + $id++; + if ($uqsettings{'ID'} eq $id) + { + chomp($line); + @temp = split(/\,/,$line); + $uqsettings{'TIME_QUOTA'} = $temp[0]; + $uqsettings{'SPORADIC'} = $temp[1]; + $uqsettings{'RENEWAL'} = $temp[2]; + $uqsettings{'QUOTA_USERS'} = $temp[3]; + $uqsettings{'ENABLEQUOTA'} = $temp[4]; + } + } + $uqsettings{'UQMODE'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})) +{ + open(FILE, ">$uqfile"); + flock FILE, 2; + $id = 0; + foreach $line (@uqlist) + { + $id++; + unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; } + else + { + chomp($line); + @temp = split(/\,/,$line); + if ($temp[4] eq 'on') { $temp[4] = 'off'; } else { $temp[4] = 'on' } + print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4]\n"; + } + } + close(FILE); + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'UQMODE'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'})) +{ + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + } + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + } + + if (!$errormessage) { system('/usr/local/bin/restartsquid'); } + $uqsettings{'UQMODE'}='on'; +} + +if ($besettings{'ACTION'} eq $Lang::tr{'urlfilter blacklist editor'}) { $besettings{'BEMODE'} = 'on'; } + +if ($besettings{'MODE'} eq 'BLACKLIST_EDITOR') +{ + @temp = split(/\n/,$besettings{'BE_DOMAINS'}); + undef $besettings{'BE_DOMAINS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_DOMAINS'} .= $_."\n"; } + } + chomp($besettings{'BE_DOMAINS'}); + @temp = split(/\n/,$besettings{'BE_URLS'}); + undef $besettings{'BE_URLS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_URLS'} .= $_."\n"; } + } + chomp($besettings{'BE_URLS'}); + @temp = split(/\n/,$besettings{'BE_EXPRESSIONS'}); + undef $besettings{'BE_EXPRESSIONS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_EXPRESSIONS'} .= $_."\n"; } + } + chomp($besettings{'BE_EXPRESSIONS'}); +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter load blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + $besettings{'BE_NAME'} = $besettings{'BE_BLACKLIST'}; + + delete $besettings{'BE_DOMAINS'}; + delete $besettings{'BE_URLS'}; + delete $besettings{'BE_EXPRESSIONS'}; + + if (-e "$dbdir/$besettings{'BE_NAME'}/domains") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/domains"); + while () { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_DOMAINS'}); + } + if (-e "$dbdir/$besettings{'BE_NAME'}/urls") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/urls"); + while () { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_URLS'}); + } + if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/expressions"); + while () { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_EXPRESSIONS'}); + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter import blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + &Header::getcgihash(\%besettings, {'wantfile' => 1, 'filevar' => 'IMPORTFILE'}); + + if (!($besettings{'IMPORTFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + } else { + if (!-d "$editdir") { mkdir("$editdir"); } + + if (copy($besettings{'IMPORTFILE'}, "$editdir/blacklist.tar.gz") != 1) + { + $errormessage = $!; + } else { + + my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf $editdir/blacklist.tar.gz -C $editdir"); + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + $i = 0; + foreach (<$editdir/blacklists/*>) + { + if (-d) + { + $i++; + $besettings{'BE_NAME'} = substr($_, rindex($_,"/")+1); + } + } + + if (!($i == 1)) + { + $errormessage = $Lang::tr{'urlfilter invalid import file'}; + } else { + delete $besettings{'BE_DOMAINS'}; + delete $besettings{'BE_URLS'}; + delete $besettings{'BE_EXPRESSIONS'}; + + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/domains") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/domains"); + while () { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_DOMAINS'}); + } + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/urls") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/urls"); + while () { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_URLS'}); + } + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/expressions") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/expressions"); + while () { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_EXPRESSIONS'}); + } + } + } + + if (-d $editdir) { system("rm -rf $editdir"); } + + } + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter export blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + if ($besettings{'BE_NAME'} eq '') + { + $errormessage = $Lang::tr{'urlfilter category name error'}; + } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) { + + $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_; + + if (!(-d "$editdir")) { mkdir("$editdir"); } + if (!(-d "$editdir/blacklists")) { mkdir("$editdir/blacklists"); } + if (!(-d "$editdir/blacklists/$besettings{'BE_NAME'}")) { mkdir("$editdir/blacklists/$besettings{'BE_NAME'}"); } + + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/domains"); + flock FILE, 2; + print FILE "$besettings{'BE_DOMAINS'}\n"; + close FILE; + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/urls"); + flock FILE, 2; + print FILE "$besettings{'BE_URLS'}\n"; + close FILE; + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/expressions"); + flock FILE, 2; + print FILE "$besettings{'BE_EXPRESSIONS'}\n"; + close FILE; + + if (system("/bin/tar -C $editdir -czf $editdir/$besettings{'BE_NAME'}.tar.gz blacklists")) + { + $errormessage = $Lang::tr{'urlfilter export error'}; + } + else + { + print "Content-type: application/gzip\n"; + print "Content-length: "; + print (-s "$editdir/$besettings{'BE_NAME'}.tar.gz"); + print "\n"; + print "Content-disposition: attachment; filename=$besettings{'BE_NAME'}.tar.gz\n\n"; + + open (FILE, "$editdir/$besettings{'BE_NAME'}.tar.gz"); + while () { print; } + close (FILE); + + if (-d $editdir) { system("rm -rf $editdir"); } + exit; + } + } else { + $errormessage = $Lang::tr{'urlfilter category data error'}; + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter install blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + if ($besettings{'BE_NAME'} eq '') + { + $errormessage = $Lang::tr{'urlfilter category name error'}; + } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) { + + $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_; + + if (!-d "$editdir") { mkdir("$editdir"); } + + if (!-d "$dbdir/$besettings{'BE_NAME'}") { mkdir("$dbdir/$besettings{'BE_NAME'}"); } + + if (-e "$dbdir/$besettings{'BE_NAME'}/domains") { unlink("$dbdir/$besettings{'BE_NAME'}/domains"); } + if ($besettings{'BE_DOMAINS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/domains"); + flock FILE, 2; + print FILE "$besettings{'BE_DOMAINS'}\n"; + close FILE; + } + if (-e "$dbdir/$besettings{'BE_NAME'}/urls") { unlink("$dbdir/$besettings{'BE_NAME'}/urls"); } + if ($besettings{'BE_URLS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/urls"); + flock FILE, 2; + print FILE "$besettings{'BE_URLS'}\n"; + close FILE; + } + if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") { unlink("$dbdir/$besettings{'BE_NAME'}/expressions"); } + if ($besettings{'BE_EXPRESSIONS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/expressions"); + flock FILE, 2; + print FILE "$besettings{'BE_EXPRESSIONS'}\n"; + close FILE; + } + + open(FILE, ">$editdir/install.conf"); + flock FILE, 2; + print FILE "logdir /var/log/squidGuard\n"; + print FILE "dbhome $dbdir/$besettings{'BE_NAME'}\n\n"; + print FILE "dest $besettings{'BE_NAME'} {\n"; + if ($besettings{'BE_DOMAINS'}) { print FILE " domainlist domains\n"; } + if ($besettings{'BE_URLS'}) { print FILE " urllist urls\n"; } + if ($besettings{'BE_EXPRESSIONS'}) { print FILE " expressions expressions\n"; } + print FILE "}\n\n"; + print FILE "acl {\n"; + print FILE " default {\n"; + print FILE " pass none\n"; + print FILE " }\n"; + print FILE "}\n"; + close FILE; + + system("rm -f $dbdir/$besettings{'BE_NAME'}/*.db"); + system("/usr/sbin/squidGuard -c $editdir/install.conf -C all"); + system("chmod a+w $dbdir/$besettings{'BE_NAME'}/*.db"); + + &readblockcategories; + &readcustomlists; + + &writeconfigfile; + + system('/usr/local/bin/restartsquid') unless ($besettings{'NORESTART'} eq 'on'); + + if (-d $editdir) { system("rm -rf $editdir"); } + } else { + $errormessage = $Lang::tr{'urlfilter category data error'}; + } +} + +if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save schedule'}) +{ + if (($filtersettings{'UPDATE_SOURCE'} eq 'custom') && ($filtersettings{'CUSTOM_UPDATE_URL'} eq '')) + { + $errormessage = $Lang::tr{'urlfilter custom url required'}; + } else { + open (FILE, ">$updconffile"); + print FILE "ENABLE_AUTOUPDATE=$filtersettings{'ENABLE_AUTOUPDATE'}\n"; + print FILE "UPDATE_SCHEDULE=$filtersettings{'UPDATE_SCHEDULE'}\n"; + print FILE "UPDATE_SOURCE=$filtersettings{'UPDATE_SOURCE'}\n"; + print FILE "CUSTOM_UPDATE_URL=$filtersettings{'CUSTOM_UPDATE_URL'}\n"; + close FILE; + + if (-e $upd_cron_dly) { unlink($upd_cron_dly); } + if (-e $upd_cron_wly) { unlink($upd_cron_wly); } + if (-e $upd_cron_mly) { unlink($upd_cron_mly); } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'daily')) + { + symlink("../bin/autoupdate.pl",$upd_cron_dly) + } else { + symlink("/bin/false",$upd_cron_dly) + } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'weekly')) + { + symlink("../bin/autoupdate.pl",$upd_cron_wly) + } else { + symlink("/bin/false",$upd_cron_wly) + } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'monthly')) + { + symlink("../bin/autoupdate.pl",$upd_cron_mly) + } else { + symlink("/bin/false",$upd_cron_mly) + } + } +} + +if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter update now'}) +{ + if ($filtersettings{'UPDATE_SOURCE'} eq 'custom') + { + if ($filtersettings{'CUSTOM_UPDATE_URL'} eq '') + { + $errormessage = $Lang::tr{'urlfilter custom url required'}; + } else { + system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'CUSTOM_UPDATE_URL'} &"); + } + } else { + system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'UPDATE_SOURCE'} &"); + } +} + + +if (-e "${General::swroot}/urlfilter/settings") { &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); } + +&readcustomlists; + +$checked{'ENABLE_CUSTOM_BLACKLIST'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_BLACKLIST'}{$filtersettings{'ENABLE_CUSTOM_BLACKLIST'}} = "checked='checked'"; +$checked{'ENABLE_CUSTOM_WHITELIST'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_WHITELIST'}{$filtersettings{'ENABLE_CUSTOM_WHITELIST'}} = "checked='checked'"; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'}} = "checked='checked'"; +$checked{'BLOCK_EXECUTABLES'}{'off'} = ''; +$checked{'BLOCK_EXECUTABLES'}{'on'} = ''; +$checked{'BLOCK_EXECUTABLES'}{$filtersettings{'BLOCK_EXECUTABLES'}} = "checked='checked'"; +$checked{'BLOCK_AUDIO-VIDEO'}{'off'} = ''; +$checked{'BLOCK_AUDIO-VIDEO'}{'on'} = ''; +$checked{'BLOCK_AUDIO-VIDEO'}{$filtersettings{'BLOCK_AUDIO-VIDEO'}} = "checked='checked'"; +$checked{'BLOCK_ARCHIVES'}{'off'} = ''; +$checked{'BLOCK_ARCHIVES'}{'on'} = ''; +$checked{'BLOCK_ARCHIVES'}{$filtersettings{'BLOCK_ARCHIVES'}} = "checked='checked'"; +$checked{'ENABLE_REWRITE'}{'off'} = ''; +$checked{'ENABLE_REWRITE'}{'on'} = ''; +$checked{'ENABLE_REWRITE'}{$filtersettings{'ENABLE_REWRITE'}} = "checked='checked'"; +$checked{'SHOW_CATEGORY'}{'off'} = ''; +$checked{'SHOW_CATEGORY'}{'on'} = ''; +$checked{'SHOW_CATEGORY'}{$filtersettings{'SHOW_CATEGORY'}} = "checked='checked'"; +$checked{'SHOW_URL'}{'off'} = ''; +$checked{'SHOW_URL'}{'on'} = ''; +$checked{'SHOW_URL'}{$filtersettings{'SHOW_URL'}} = "checked='checked'"; +$checked{'SHOW_IP'}{'off'} = ''; +$checked{'SHOW_IP'}{'on'} = ''; +$checked{'SHOW_IP'}{$filtersettings{'SHOW_IP'}} = "checked='checked'"; +$checked{'ENABLE_DNSERROR'}{'off'} = ''; +$checked{'ENABLE_DNSERROR'}{'on'} = ''; +$checked{'ENABLE_DNSERROR'}{$filtersettings{'ENABLE_DNSERROR'}} = "checked='checked'"; +$checked{'ENABLE_JPEG'}{'off'} = ''; +$checked{'ENABLE_JPEG'}{'on'} = ''; +$checked{'ENABLE_JPEG'}{$filtersettings{'ENABLE_JPEG'}} = "checked='checked'"; +$checked{'ENABLE_EXPR_LISTS'}{'off'} = ''; +$checked{'ENABLE_EXPR_LISTS'}{'on'} = ''; +$checked{'ENABLE_EXPR_LISTS'}{$filtersettings{'ENABLE_EXPR_LISTS'}} = "checked='checked'"; +$checked{'BLOCK_IP_ADDR'}{'off'} = ''; +$checked{'BLOCK_IP_ADDR'}{'on'} = ''; +$checked{'BLOCK_IP_ADDR'}{$filtersettings{'BLOCK_IP_ADDR'}} = "checked='checked'"; +$checked{'BLOCK_ALL'}{'off'} = ''; +$checked{'BLOCK_ALL'}{'on'} = ''; +$checked{'BLOCK_ALL'}{$filtersettings{'BLOCK_ALL'}} = "checked='checked'"; +$checked{'ENABLE_EMPTY_ADS'}{'off'} = ''; +$checked{'ENABLE_EMPTY_ADS'}{'on'} = ''; +$checked{'ENABLE_EMPTY_ADS'}{$filtersettings{'ENABLE_EMPTY_ADS'}} = "checked='checked'"; +$checked{'ENABLE_GLOBAL_WHITELIST'}{'off'} = ''; +$checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} = ''; +$checked{'ENABLE_GLOBAL_WHITELIST'}{$filtersettings{'ENABLE_GLOBAL_WHITELIST'}} = "checked='checked'"; +$checked{'ENABLE_SAFESEARCH'}{'off'} = ''; +$checked{'ENABLE_SAFESEARCH'}{'on'} = ''; +$checked{'ENABLE_SAFESEARCH'}{$filtersettings{'ENABLE_SAFESEARCH'}} = "checked='checked'"; +$checked{'ENABLE_LOG'}{'off'} = ''; +$checked{'ENABLE_LOG'}{'on'} = ''; +$checked{'ENABLE_LOG'}{$filtersettings{'ENABLE_LOG'}} = "checked='checked'"; +$checked{'ENABLE_USERNAME_LOG'}{'off'} = ''; +$checked{'ENABLE_USERNAME_LOG'}{'on'} = ''; +$checked{'ENABLE_USERNAME_LOG'}{$filtersettings{'ENABLE_USERNAME_LOG'}} = "checked='checked'"; +$checked{'ENABLE_CATEGORY_LOG'}{'off'} = ''; +$checked{'ENABLE_CATEGORY_LOG'}{'on'} = ''; +$checked{'ENABLE_CATEGORY_LOG'}{$filtersettings{'ENABLE_CATEGORY_LOG'}} = "checked='checked'"; + +foreach $category (@filtergroups) { + $checked{$category}{'off'} = ''; + $checked{$category}{'on'} = ''; + $checked{$category}{$filtersettings{$category}} = "checked='checked'"; +} + +$selected{'DEFINITION'}{$tcsettings{'DEFINITION'}} = "selected='selected'"; +$selected{'FROM_HOUR'}{$tcsettings{'FROM_HOUR'}} = "selected='selected'"; +$selected{'FROM_MINUTE'}{$tcsettings{'FROM_MINUTE'}} = "selected='selected'"; +$selected{'TO_HOUR'}{$tcsettings{'TO_HOUR'}} = "selected='selected'"; +$selected{'TO_MINUTE'}{$tcsettings{'TO_MINUTE'}} = "selected='selected'"; + +@selectedcategories = split(/\|/,$tcsettings{'DST'}); +foreach (@selectedcategories) +{ + $selected{'DST'}{$_} = "selected='selected'"; +} + +$selected{'ACCESS'}{$tcsettings{'ACCESS'}} = "selected='selected'"; + +$checked{'ENABLERULE'}{'off'} = ''; +$checked{'ENABLERULE'}{'on'} = ''; +$checked{'ENABLERULE'}{$tcsettings{'ENABLERULE'}} = "checked='checked'"; +$checked{'MON'}{'off'} = ''; +$checked{'MON'}{'on'} = ''; +$checked{'MON'}{$tcsettings{'MON'}} = "checked='checked'"; +$checked{'TUE'}{'off'} = ''; +$checked{'TUE'}{'on'} = ''; +$checked{'TUE'}{$tcsettings{'TUE'}} = "checked='checked'"; +$checked{'WED'}{'off'} = ''; +$checked{'WED'}{'on'} = ''; +$checked{'WED'}{$tcsettings{'WED'}} = "checked='checked'"; +$checked{'THU'}{'off'} = ''; +$checked{'THU'}{'on'} = ''; +$checked{'THU'}{$tcsettings{'THU'}} = "checked='checked'"; +$checked{'FRI'}{'off'} = ''; +$checked{'FRI'}{'on'} = ''; +$checked{'FRI'}{$tcsettings{'FRI'}} = "checked='checked'"; +$checked{'SAT'}{'off'} = ''; +$checked{'SAT'}{'on'} = ''; +$checked{'SAT'}{$tcsettings{'SAT'}} = "checked='checked'"; +$checked{'SUN'}{'off'} = ''; +$checked{'SUN'}{'on'} = ''; +$checked{'SUN'}{$tcsettings{'SUN'}} = "checked='checked'"; + +$selected{'SPORADIC'}{$uqsettings{'SPORADIC'}} = "selected='selected'"; +$selected{'RENEWAL'} {$uqsettings{'RENEWAL'}} = "selected='selected'"; + +$checked{'ENABLEQUOTA'}{'off'} = ''; +$checked{'ENABLEQUOTA'}{'on'} = ''; +$checked{'ENABLEQUOTA'}{$uqsettings{'ENABLEQUOTA'}} = "checked='checked'"; + +$selected{'BE_BLACKLIST'}{$besettings{'BE_BLACKLIST'}} = "selected='selected'"; + + +&Header::showhttpheaders(); + +&Header::openpage($Lang::tr{'urlfilter configuration'}, 1, ''); + +&Header::openbigbox('100%', 'left', '', $errormessage); + +if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print "$errormessage \n"; + &Header::closebox(); +} elsif (($tcsettings{'CHANGED'} eq 'yes') || ($uqsettings{'CHANGED'} eq 'yes') ) { + &writeconfigfile; + print "
\n"; + &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restart notification'}:"); + print "$Lang::tr{'urlfilter restart message'}\n"; + if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "

$Lang::tr{'urlfilter quota restart message'}\n"; } + print "\n"; + print "

"; + if ($tcsettings{'MODE'} eq 'TIMECONSTRAINT') { print ""; } + if ($uqsettings{'MODE'} eq 'USERQUOTA') { print ""; } + &Header::closebox(); + print "

\n"; +} + +if ($restoremessage) { + &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restore results'}:"); + print "$restoremessage\n"; + print " \n"; + &Header::closebox(); +} + +if ((!$tcsettings{'TCMODE'}) && (!$uqsettings{'UQMODE'}) && (!$besettings{'BEMODE'})) { + +if (!($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter manage repository'})) { + +#========================================================== +# +# Section: Main Configuration +# +#========================================================== + +print "
\n"; + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter filter settings'}:"); +print < + + $Lang::tr{'urlfilter block categories'} + +END +; + +if (@categories == 0) { +print < + $Lang::tr{'urlfilter no categories'} +   +   +   + + +END +; +} + +for ($n=0; $n<=@categories; $n = $n + $i) { + for ($i=0; $i<=3; $i++) { + if ($i eq 0) { print "\n"; } + if (($n+$i) < @categories) { + print "@categories[$n+$i]:<\/td>\n"; + print "\n"; + } + if ($i eq 3) { print "<\/tr>\n"; } + } +} + +print < +
+ + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter custom blacklist'}   
$Lang::tr{'urlfilter blocked domains'} *$Lang::tr{'urlfilter blocked urls'} *
+ + + + + + + +
$Lang::tr{'urlfilter enable custom blacklist'}:  
+
+ + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter custom whitelist'}   
$Lang::tr{'urlfilter allowed domains'} *$Lang::tr{'urlfilter allowed urls'} *
+ + + + + + + +
$Lang::tr{'urlfilter enable custom whitelist'}:  
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter custom expression list'}
$Lang::tr{'urlfilter blocked expressions'} *
$Lang::tr{'urlfilter enable custom expression list'}:  
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter file ext block'}
$Lang::tr{'urlfilter block executables'}:$Lang::tr{'urlfilter block audio-video'}:
$Lang::tr{'urlfilter block archives'}:  
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter local file redirection'}
$Lang::tr{'urlfilter enable rewrite rules'}:  
   
+
+ + + + + + + + + + + + +
$Lang::tr{'urlfilter network access control'}  
$Lang::tr{'urlfilter unfiltered clients'}: *$Lang::tr{'urlfilter banned clients'}: *
+
+ + + + + + + + + + +
$Lang::tr{'urlfilter timebased access control'}
  
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter block settings'}
$Lang::tr{'urlfilter show category'}:$Lang::tr{'urlfilter redirectpage'}: *
$Lang::tr{'urlfilter show url'}:$Lang::tr{'urlfilter msg text 1'}: *
$Lang::tr{'urlfilter show ip'}:$Lang::tr{'urlfilter msg text 2'}: *
$Lang::tr{'urlfilter show dnserror'}:$Lang::tr{'urlfilter msg text 3'}: *
$Lang::tr{'urlfilter enable jpeg'}:  
+ + + + + + + + + + +
$Lang::tr{'urlfilter background image'}

$Lang::tr{'urlfilter background text'}:
 
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter advanced settings'}
$Lang::tr{'urlfilter enable expression lists'}:$Lang::tr{'urlfilter enable log'}:
$Lang::tr{'urlfilter safesearch'}:$Lang::tr{'urlfilter username log'}:
$Lang::tr{'urlfilter empty ads'}:$Lang::tr{'urlfilter category log'}:
$Lang::tr{'urlfilter block ip'}:$Lang::tr{'urlfilter children'}:
$Lang::tr{'urlfilter block all'}:$Lang::tr{'urlfilter whitelist always allowed'}:
+
+ + + + + +
+ *  + $Lang::tr{'this field may be blank'} + +URL filter +
+ + + + + + + +
  
+END +; + +&Header::closebox(); + +print "\n"; + +print "
\n"; + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter maintenance'}:"); + +print < + +$Lang::tr{'urlfilter blacklist update'} + + +$Lang::tr{'urlfilter upload information'}

$Lang::tr{'urlfilter upload text'}: + + +   + + + +


+ + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter automatic blacklist update'} +END +; +if (-e "$updflagfile") +{ +$blacklistage = int(-M "$updflagfile"); +print "  [ $Lang::tr{'urlfilter blacklist age 1'} $blacklistage $Lang::tr{'urlfilter blacklist age 2'} ]"; +} + +$updatesettings{'UPDATE_SCHEDULE'} = 'monthly'; +$updatesettings{'CUSTOM_UPDATE_URL'} = ''; + +if (-e "$updconffile") { &General::readhash("$updconffile", \%updatesettings); } + +$checked{'ENABLE_AUTOUPDATE'}{'off'} = ''; +$checked{'ENABLE_AUTOUPDATE'}{'on'} = ''; +$checked{'ENABLE_AUTOUPDATE'}{$updatesettings{'ENABLE_AUTOUPDATE'}} = "checked='checked'"; + +$selected{'UPDATE_SCHEDULE'}{$updatesettings{'UPDATE_SCHEDULE'}} = "selected='selected'"; + +$selected{'UPDATE_SOURCE'}{$updatesettings{'UPDATE_SOURCE'}} = "selected='selected'"; + +print < +
$Lang::tr{'urlfilter enable automatic blacklist update'}:
$Lang::tr{'urlfilter automatic update schedule'}: + +
$Lang::tr{'urlfilter select source'}: + +
$Lang::tr{'urlfilter custom url'}:
+ + + + +
   
+ +
+ + + + + + + + + + + +
$Lang::tr{'urlfilter blacklist editor'}
$Lang::tr{'urlfilter blacklist editor info'}
+ +
+ + + + + + + + + + + + + + +
$Lang::tr{'urlfilter backup settings'}
$Lang::tr{'urlfilter enable full backup'}:  
+ +
+ + + + + + + + + + + +
$Lang::tr{'urlfilter restore settings'}
$Lang::tr{'urlfilter restore text'}:
 
+ +END +; + +&Header::closebox(); + +} else { + +#========================================================== +# +# Section: Manage Repository +# +#========================================================== + +print "
\n"; + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter manage local file repository'}:"); +print < + + $Lang::tr{'urlfilter repository information'}

+ + + $Lang::tr{'urlfilter upload file text'}: + + +   + + +
$Lang::tr{'urlfilter upload file information 1'}: $Lang::tr{'urlfilter upload file information 2'} + + +
+ + + + +
+ +END +; + +&Header::closebox(); + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter current files'}:
[$repository]"); + +@repositorylist = <$repository/*>; + +undef @repositoryfiles; +foreach (@repositorylist) +{ + if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); } +} + +if (@repositoryfiles) +{ + print < + + $Lang::tr{'urlfilter filename'} + $Lang::tr{'urlfilter filesize'} + + +END +; + $id = 0; + foreach $line (@repositoryfiles) + { + $id++; + if ($id % 2) { + print "\n"; } + else { + print "\n"; } + $filesize = (-s "$repository/$line"); + 1 while $filesize =~ s/^(-?\d+)(\d{3})/$1.$2/; + +print <   $line + $filesize    + + +
+ + + +
+ + + +END +; + } + +print < + + + +
+ + + + + + +
  $Lang::tr{'legend'}:    $Lang::tr{$Lang::tr{'remove'}
+END +; +} else { + + print "$Lang::tr{'urlfilter empty repository'}\n"; +} + +&Header::closebox(); + +} + +} elsif ($tcsettings{'TCMODE'}) { + +#========================================================== +# +# Section: Set Time Constraints +# +#========================================================== + +print "
\n"; + +$buttontext = $Lang::tr{'urlfilter add rule'}; +if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit time constraint rule'}.':'); +$buttontext = $Lang::tr{'urlfilter update rule'}; +} else { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new time constraint rule'}.':'); +} +print < + + $Lang::tr{'urlfilter constraint definition'} +    + $Lang::tr{'urlfilter monday'} + $Lang::tr{'urlfilter tuesday'} + $Lang::tr{'urlfilter wednesday'} + $Lang::tr{'urlfilter thursday'} + $Lang::tr{'urlfilter friday'} + $Lang::tr{'urlfilter saturday'} + $Lang::tr{'urlfilter sunday'} +    + $Lang::tr{'urlfilter from'} +   + $Lang::tr{'urlfilter to'} +   + + + + + +   + + + + + + + +   + + +END +; +for ($i=0;$i<=45;$i+=15) { +$_ = sprintf("%02s",$i); +print "\n"; +} +print < + - + + + +END +; +for ($i=0;$i<=45;$i+=15) { +$_ = sprintf("%02s",$i); +print "\n"; +} +print < + +   + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter source'}  $Lang::tr{'urlfilter dst'} **  $Lang::tr{'urlfilter access'} 
  + +   + +  
$Lang::tr{'remark'} *    
    
+ + + + + +
$Lang::tr{'urlfilter enabled'}
+ +

+ + + + + + + + + + +
 
+

+ + + + + + + + + +
* $Lang::tr{'this field may be blank'}
** $Lang::tr{'urlfilter select multi'}
+END +; + +if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) { + print "\n"; +} else { + print "\n"; +} + +&Header::closebox(); +print "

\n"; + +&Header::openbox('100%', 'left', $Lang::tr{'current rules'}); +print < + + $Lang::tr{'urlfilter constraint definition'} + $Lang::tr{'urlfilter time space'} + $Lang::tr{'urlfilter src'} + $Lang::tr{'urlfilter dst'} +   + +END +; + +if ($tcsettings{'ACTION'} ne '' or $changed ne 'no') +{ + open(FILE, $tcfile); + @tclist = ; + close(FILE); +} + +$id = 0; +foreach $line (@tclist) +{ + $id++; + chomp($line); + @temp = split(/\,/,$line); + if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) { + print "\n"; } + elsif ($id % 2) { + print "\n"; } + else { + print "\n"; } + if ($temp[0] eq 'within') { $temp[0]=$Lang::tr{'urlfilter constraint within'}; } else { $temp[0]=$Lang::tr{'urlfilter constraint outside'}; } + if ($temp[13] eq 'any') { $temp[13]=$Lang::tr{'urlfilter category all'}; } + if ($temp[15] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};} + else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; } + if ($temp[14] eq 'block') { $led='led-red.gif'; $ldesc=$Lang::tr{'urlfilter block access'};} + else { $led='led-green.gif'; $ldesc=$Lang::tr{'urlfilter allow access'}; } + + undef $time; + if ($temp[1] eq 'on') { $time.=$Lang::tr{'urlfilter mon'}; } else { $time.='='; } + if ($temp[2] eq 'on') { $time.=$Lang::tr{'urlfilter tue'}; } else { $time.='='; } + if ($temp[3] eq 'on') { $time.=$Lang::tr{'urlfilter wed'}; } else { $time.='='; } + if ($temp[4] eq 'on') { $time.=$Lang::tr{'urlfilter thu'}; } else { $time.='='; } + if ($temp[5] eq 'on') { $time.=$Lang::tr{'urlfilter fri'}; } else { $time.='='; } + if ($temp[6] eq 'on') { $time.=$Lang::tr{'urlfilter sat'}; } else { $time.='='; } + if ($temp[7] eq 'on') { $time.=$Lang::tr{'urlfilter sun'}; } else { $time.='='; } + $time=$time.'   '.$temp[8].':'.$temp[9].' to '.$temp[10].':'.$temp[11]; + +print <$temp[0] + $time + $temp[12] + $temp[13] + $ldesc + + +
+ + + + + +
+ + + +
+ + + + +
+ + + +
+ + + + +
+ + + +END +; + if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) { + print "\n"; } + elsif ($id % 2) { + print "\n"; } + else { + print "\n"; } +print <$temp[16] + + + + +END +; +} + +print "\n"; + +# If the time constraint file contains entries, print entries and action icons +if (! -z "$tcfile") { +print < + +   $Lang::tr{'legend'}: +     $Lang::tr{ + $Lang::tr{'urlfilter allow'} +     $Lang::tr{ + $Lang::tr{'urlfilter block'} +   $Lang::tr{ + $Lang::tr{'click to disable'} +     $Lang::tr{ + $Lang::tr{'click to enable'} +     $Lang::tr{ + $Lang::tr{'edit'} +     $Lang::tr{ + $Lang::tr{'remove'} + + +END +; +} + +&Header::closebox(); + +} elsif ($uqsettings{'UQMODE'}) { + +#========================================================== +# +# Section: Set User Quota +# +#========================================================== + +print "
\n"; + +$buttontext = $Lang::tr{'urlfilter add rule'}; +if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit user quota rule'}.':'); +$buttontext = $Lang::tr{'urlfilter update rule'}; +} else { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new user quota rule'}.':'); +} +print < + + + + + $Lang::tr{'urlfilter user time quota'}: + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter assigned quota users'}:
+ + + + $Lang::tr{'urlfilter activity detection'}: + + + + $Lang::tr{'urlfilter renewal period'}: + + + +   + + + $Lang::tr{'urlfilter enabled'} + + + + +

+ + + + + + + + + + +
 
+ +

+END +; + +if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) { + print "\n"; +} else { + print "\n"; +} + +&Header::closebox(); +print "

\n"; + +&Header::openbox('100%', 'left', $Lang::tr{'current rules'}); +print < + + $Lang::tr{'urlfilter time quota'} + $Lang::tr{'urlfilter activity detection'} + $Lang::tr{'urlfilter renewal'} + $Lang::tr{'urlfilter assigned users'} +   + +END +; + +if ($uqsettings{'ACTION'} ne '' or $changed ne 'no') +{ + open(FILE, $uqfile); + @uqlist = ; + close(FILE); +} + +$id = 0; +foreach $line (@uqlist) +{ + $id++; + chomp($line); + @temp = split(/\,/,$line); + if($uqsettings{'ACTION'} eq $Lang::tr{'edit'} && $uqsettings{'ID'} eq $id) { + print "\n"; } + elsif ($id % 2) { + print "\n"; } + else { + print "\n"; } + if ($temp[4] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};} + else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; } + + $temp[5] = $temp[1]; + if ($temp[1] eq '0') { $temp[5] = $Lang::tr{'urlfilter disabled'} } else { $temp[5] = ($temp[5]/60).' '.$Lang::tr{'urlfilter minutes'} } + $_ = $temp[3]; s/\|/, /g; $temp[6] = $_; + +print <$temp[0] $Lang::tr{'urlfilter minutes'} + $temp[5] + $Lang::tr{'urlfilter '.$temp[2]} + $temp[6] + + +
+ + + + + +
+ + + +
+ + + + +
+ + + +
+ + + + +
+ + + +END +; +} + +print "\n"; + +# If the user quota file contains entries, print entries and action icons +if (! -z "$uqfile") { +print < + +   $Lang::tr{'legend'}: +   $Lang::tr{ + $Lang::tr{'click to disable'} +     $Lang::tr{ + $Lang::tr{'click to enable'} +     $Lang::tr{ + $Lang::tr{'edit'} +     $Lang::tr{ + $Lang::tr{'remove'} + + +END +; +} + +&Header::closebox(); + +} else { + +#========================================================== +# +# Section: Blacklist editor +# +#========================================================== + +print "
\n"; + +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter urlfilter blacklist editor'}.':'); + +print < + + + + + $Lang::tr{'urlfilter blacklist name'} + + + $Lang::tr{'urlfilter blacklist category name'}: + + + +
+ + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter edit domains urls expressions'}
$Lang::tr{'urlfilter domains'}$Lang::tr{'urlfilter urls'}
$Lang::tr{'urlfilter expressions'}
+
+ + + + + + + + + + + + + +
$Lang::tr{'urlfilter load blacklist'}
$Lang::tr{'urlfilter select blacklist'}: +   
+
+ + + + + + + + + + + +
$Lang::tr{'urlfilter import blacklist'}
$Lang::tr{'urlfilter import text'}:
 
+
+ + + + + + + +
$Lang::tr{'urlfilter export blacklist'}
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter install blacklist'}
$Lang::tr{'urlfilter dont restart urlfilter'}:  

$Lang::tr{'urlfilter install information'}
+
+ + + + + + +
 
+ +END +; + +&Header::closebox(); +print "\n"; + +} + +&Header::closebigbox(); + +&Header::closepage(); + +# ------------------------------------------------------------------- + +sub savesettings +{ + &writeconfigfile; + + delete $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + delete $filtersettings{'CUSTOM_BLACK_URLS'}; + delete $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + delete $filtersettings{'CUSTOM_WHITE_URLS'}; + delete $filtersettings{'CUSTOM_EXPRESSIONS'}; + delete $filtersettings{'BACKGROUND'}; + delete $filtersettings{'UPDATEFILE'}; + + &General::writehash("${General::swroot}/urlfilter/settings", \%filtersettings); +} + +# ------------------------------------------------------------------- + +sub readblockcategories +{ + undef(@categories); + foreach $blacklist (<$dbdir/*>) { + if (-d $blacklist) { + $lastslashpos = rindex($blacklist,"/"); + if ($lastslashpos > -1) { + $section = substr($blacklist,$lastslashpos+1); + } else { + $section = $blacklist; + } + if (!($section eq 'custom')) { push(@categories,$section) }; + } + } + + @filtergroups = @categories; + foreach (@filtergroups) { + tr/a-z/A-Z/; + $_ = "FILTER_".$_; + } +} + +# ------------------------------------------------------------------- + +sub readcustomlists +{ + if (-e "$dbdir/custom/blocked/domains") { + open(FILE,"$dbdir/custom/blocked/domains"); + delete $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + while () { $filtersettings{'CUSTOM_BLACK_DOMAINS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/blocked/urls") { + open(FILE,"$dbdir/custom/blocked/urls"); + delete $filtersettings{'CUSTOM_BLACK_URLS'}; + while () { $filtersettings{'CUSTOM_BLACK_URLS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/blocked/expressions") { + open(FILE,"$dbdir/custom/blocked/expressions"); + delete $filtersettings{'CUSTOM_EXPRESSIONS'}; + while () { $filtersettings{'CUSTOM_EXPRESSIONS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/allowed/domains") { + open(FILE,"$dbdir/custom/allowed/domains"); + delete $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + while () { $filtersettings{'CUSTOM_WHITE_DOMAINS'} .= $_ }; + close(FILE); + } + if (-e "$dbdir/custom/allowed/urls") { + open(FILE,"$dbdir/custom/allowed/urls"); + delete $filtersettings{'CUSTOM_WHITE_URLS'}; + while () { $filtersettings{'CUSTOM_WHITE_URLS'} .= $_ }; + close(FILE); + } +} + +# ------------------------------------------------------------------- + +sub aggregatedconstraints +{ + my $aggregated; + my @old; + my @new; + my @tmp1; + my @tmp2; + my $x; + + if (-e $tcfile) + { + open(TC, $tcfile); + @old = ; + close(TC); + + while (@old > 0) + { + $aggregated = 0; + $x = shift(@old); + chomp($x); + @tmp1 = split(/\,/,$x); + $tmp1[16] = ''; + foreach (@new) + { + @tmp2 = split(/\,/); + if ($tmp2[15] eq 'on') + { + if (($tmp1[0] eq $tmp2[0]) && ($tmp1[12] eq $tmp2[12]) && ($tmp1[13] eq $tmp2[13]) && ($tmp1[14] eq $tmp2[14])) + { + $aggregated = 1; + $tmp2[16] .= " weekly "; + if ($tmp1[1] eq 'on') { $tmp2[16] .= "m"; } + if ($tmp1[2] eq 'on') { $tmp2[16] .= "t"; } + if ($tmp1[3] eq 'on') { $tmp2[16] .= "w"; } + if ($tmp1[4] eq 'on') { $tmp2[16] .= "h"; } + if ($tmp1[5] eq 'on') { $tmp2[16] .= "f"; } + if ($tmp1[6] eq 'on') { $tmp2[16] .= "a"; } + if ($tmp1[7] eq 'on') { $tmp2[16] .= "s"; } + $tmp2[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n"; + $_ = join(",",@tmp2); + } + + } + } + if (!$aggregated) + { + $tmp1[16] .= " weekly "; + if ($tmp1[1] eq 'on') { $tmp1[16] .= "m"; } + if ($tmp1[2] eq 'on') { $tmp1[16] .= "t"; } + if ($tmp1[3] eq 'on') { $tmp1[16] .= "w"; } + if ($tmp1[4] eq 'on') { $tmp1[16] .= "h"; } + if ($tmp1[5] eq 'on') { $tmp1[16] .= "f"; } + if ($tmp1[6] eq 'on') { $tmp1[16] .= "a"; } + if ($tmp1[7] eq 'on') { $tmp1[16] .= "s"; } + $tmp1[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n"; + $x = join(",",@tmp1); + push(@new,$x); + } + } + } + + return @new; + +} + +# ------------------------------------------------------------------- + +sub writeconfigfile +{ + my $executables = "\\.\(ade|adp|asx|bas|bat|chm|com|cmd|cpl|crt|dll|eml|exe|hiv|hlp|hta|inc|inf|ins|isp|jse|jtd|lnk|msc|msh|msi|msp|mst|nws|ocx|oft|ops|pcd|pif|plx|reg|scr|sct|sha|shb|shm|shs|sys|tlb|tsp|url|vbe|vbs|vxd|wsc|wsf|wsh\)\$"; + my $audiovideo = "\\.\(aiff|asf|avi|dif|divx|mov|movie|mp3|mpe?g?|mpv2|ogg|ra?m|snd|qt|wav|wmf|wmv\)\$"; + my $archives = "\\.\(bin|bz2|cab|cdr|dmg|gz|hqx|rar|smi|sit|sea|tar|tgz|zip\)\$"; + + my $ident = " anonymous"; + + my $defaultrule=''; + my $tcrule=''; + my $redirect=''; + my $qredirect=''; + + my $idx; + + my @ec=(); + my @tc=(); + my @uq=(); + + if (!(-d "$dbdir/custom")) { mkdir("$dbdir/custom") } + if (!(-d "$dbdir/custom/blocked")) { mkdir("$dbdir/custom/blocked") } + if (!(-d "$dbdir/custom/allowed")) { mkdir("$dbdir/custom/allowed") } + + open(FILE, ">/$dbdir/custom/blocked/domains"); + print FILE $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/urls"); + print FILE $filtersettings{'CUSTOM_BLACK_URLS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/expressions"); + print FILE $filtersettings{'CUSTOM_EXPRESSIONS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/files"); + if ($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') { print FILE "$executables\n"; } + if ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') { print FILE "$audiovideo\n"; } + if ($filtersettings{'BLOCK_ARCHIVES'} eq 'on') { print FILE "$archives\n"; } + close(FILE); + open(FILE, ">/$dbdir/custom/allowed/domains"); + print FILE $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/allowed/urls"); + print FILE $filtersettings{'CUSTOM_WHITE_URLS'}; + close(FILE); + + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { $ident = ""; } + + if ($filtersettings{'REDIRECT_PAGE'} eq '') + { + if (($filtersettings{'SHOW_CATEGORY'} eq 'on') || ($filtersettings{'SHOW_URL'} eq 'on') || ($filtersettings{'SHOW_IP'} eq 'on')) { + if ($filtersettings{'SHOW_CATEGORY'} eq 'on') { $redirect .= "&category=%t"; } + if ($filtersettings{'SHOW_URL'} eq 'on') { $redirect .= "&url=%u"; } + if ($filtersettings{'SHOW_IP'} eq 'on') { $redirect .= "&ip=%a"; } + $redirect =~ s/^&/?/; + $redirect = "http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi".$redirect; + } else { + $redirect="http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi"; + } + } else { $redirect=$filtersettings{'REDIRECT_PAGE'}; } + + if ($filtersettings{'ENABLE_DNSERROR'} eq 'on') { $redirect = "302:http://0.0.0.0"; } + + undef $defaultrule; + + if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') + { + $defaultrule .= "custom-allowed "; + } + if ($filtersettings{'BLOCK_ALL'} eq 'on') + { + $defaultrule .= "none"; + } + else + { + if ($filtersettings{'BLOCK_IP_ADDR'} eq 'on') + { + $defaultrule .= "!in-addr "; + } + for ($i=0; $i<=@filtergroups; $i++) { + if ($filtersettings{@filtergroups[$i]} eq 'on') + { + $defaultrule .= "!@categories[$i] "; + } + } + if ($filtersettings{'ENABLE_CUSTOM_BLACKLIST'} eq 'on') + { + $defaultrule .= "!custom-blocked "; + } + if ($filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} eq 'on') + { + $defaultrule .= "!custom-expressions "; + } + if (($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') || + ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') || + ($filtersettings{'BLOCK_ARCHIVES'} eq 'on')) + { + $defaultrule .= "!files "; + } + $defaultrule .= "any"; + } + + open(FILE, ">${General::swroot}/urlfilter/squidGuard.conf") or die "Unable to write squidGuard.conf file"; + flock(FILE, 2); + + print FILE "logdir /var/log/squidGuard\n"; + print FILE "dbhome $dbdir\n\n"; + + undef @repositoryfiles; + if ($filtersettings{'ENABLE_REWRITE'} eq 'on') + { + @repositorylist = <$repository/*>; + foreach (@repositorylist) + { + if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); } + } + } + + if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) + { + print FILE "rewrite rew-rule-0 {\n"; + + if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) + { + print FILE " # rewrite localfiles\n"; + foreach (@repositoryfiles) + { + print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n"; + } + } + + if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on') + { + print FILE " # rewrite safesearch\n"; + print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)(\\bsafe=\\w+)(.*)\@\\1\\3safe=strict\\5\@i\n"; + print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)\@\\1safe=strict\\\&\\3\@i\n"; + print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W)(.*)(\\bvm=\\w+)(.*)\@\\1\\2vm=r\\4\@i\n"; + print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W.*)\@\\1\\\&vm=r\@i\n"; + print FILE " s@(.*\\Walltheweb\\.com/customize\\?)(.*)(\\bcopt_offensive=\\w+)(.*)\@\\1\\2copt_offensive=on\\4\@i\n"; + } + + print FILE "}\n\n"; + + if ((!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) && ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) { + print FILE "rewrite rew-rule-1 {\n"; + if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) + { + print FILE " # rewrite localfiles\n"; + foreach (@repositoryfiles) + { + print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n"; + } + } else { + print FILE " # rewrite nothing\n"; + } + print FILE "}\n\n"; + } + } + + if (-e $uqfile) + { + open(UQ, $uqfile); + @uqlist = ; + close(UQ); + + if (@uqlist > 0) + { + $idx=0; + foreach (@uqlist) + { + chomp; + @uq = split(/\,/); + if ($uq[4] eq 'on') + { + $idx++; + $uq[0] = $uq[0] * 60; + if ($uq[1] eq '0') { + if ($uq[2] eq 'hourly') { $uq[1] = 3600 } + if ($uq[2] eq 'daily') { $uq[1] = 86400 } + if ($uq[2] eq 'weekly') { $uq[1] = 604800 } + } + $uq[3] =~ s/\|/ /g; + print FILE "src quota-$idx {\n"; + print FILE " user $uq[3]\n"; + print FILE " userquota $uq[0] $uq[1] $uq[2]\n"; + print FILE "}\n\n"; + } + } + + } + } + + @tclist = &aggregatedconstraints; + + if (@tclist > 0) + { + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + if ($tc[15] eq 'on') + { + $idx++; + print FILE "src network-$idx {\n"; + print FILE " ip $tc[12]\n"; + print FILE "}\n\n"; + } + } + + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + if ($tc[15] eq 'on') + { + $idx++; + print FILE "time constraint-$idx {\n"; + print FILE "$tc[16]\n"; + print FILE "}\n\n"; + } + } + } + + if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) { + print FILE "src unfiltered {\n"; + print FILE " ip $filtersettings{'UNFILTERED_CLIENTS'}\n"; + print FILE "}\n\n"; + } + if (!($filtersettings{'BANNED_CLIENTS'} eq '')) { + print FILE "src banned {\n"; + print FILE " ip $filtersettings{'BANNED_CLIENTS'}\n"; + print FILE "}\n\n"; + } + + foreach $category (@categories) { + print FILE "dest $category {\n"; + if (-e "$dbdir/$category/domains") { + print FILE " domainlist $category\/domains\n"; + } + if (-e "$dbdir/$category/urls") { + print FILE " urllist $category\/urls\n"; + } + if ((-e "$dbdir/$category/expressions") && ($filtersettings{'ENABLE_EXPR_LISTS'} eq 'on')) { + print FILE " expressionlist $category\/expressions\n"; + } + if (($category eq 'ads') && ($filtersettings{'ENABLE_EMPTY_ADS'} eq 'on')) + { + print FILE " redirect http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/images/urlfilter/1x1.gif\n"; + } + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident $category.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + } + + print FILE "dest files {\n"; + print FILE " expressionlist custom\/blocked\/files\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident files.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "dest custom-allowed {\n"; + print FILE " domainlist custom\/allowed\/domains\n"; + print FILE " urllist custom\/allowed\/urls\n"; + print FILE "}\n\n"; + + print FILE "dest custom-blocked {\n"; + print FILE " domainlist custom\/blocked\/domains\n"; + print FILE " urllist custom\/blocked\/urls\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident custom.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "dest custom-expressions {\n"; + print FILE " expressionlist custom\/blocked\/expressions\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident custom.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "acl {\n"; + if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) { + print FILE " unfiltered {\n"; + print FILE " pass all\n"; + if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on') + { + print FILE " rewrite rew-rule-1\n"; + } + print FILE " }\n\n"; + } + if (!($filtersettings{'BANNED_CLIENTS'} eq '')) { + print FILE " banned {\n"; + print FILE " pass "; + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none\n"; + print FILE " }\n\n"; + } + + if (-s $uqfile) + { + open(UQ, $uqfile); + @uqlist = ; + close(UQ); + + $idx=0; + foreach (@uqlist) + { + chomp; + @uq = split(/\,/); + if ($uq[4] eq 'on') + { + $idx++; + $qredirect = $redirect; + $qredirect =~ s/\%t/\%q\%20-\%20\%i/; + print FILE " quota-$idx {\n"; + print FILE " pass "; + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none\n"; + unless ($redirect eq $qredirect) { print FILE " redirect $qredirect\n"; } + print FILE " }\n\n"; + } + } + } + + if (@tclist > 0) + { + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + @ec = split(/\|/,$tc[13]); + if ($tc[15] eq 'on') + { + $idx++; + print FILE " network-$idx $tc[0] constraint-$idx {\n"; + print FILE " pass "; + + if ($filtersettings{'BLOCK_ALL'} eq 'on') + { + if ($tc[14] eq 'block') + { + if ((@ec == 1) && ($ec[0] eq 'any')) { + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none"; + } else { + print FILE $defaultrule; + } + } else { + foreach (@ec) + { + print FILE "$_ "; + } + print FILE $defaultrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } + } else { + if ($tc[14] eq 'block') + { + $tcrule = $defaultrule; + if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') { + $tcrule =~ s/custom-allowed //; + print FILE "custom-allowed " unless ((@ec == 1) && ($ec[0] eq 'any') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'off')); + } + if ((@ec == 1) && ($ec[0] eq 'any')) { + print FILE "none"; + } else { + foreach (@ec) + { + print FILE "!$_ " unless (index($defaultrule,"!".$_." ") ge 0); + } + } + print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } else { + $tcrule = $defaultrule; + foreach (@ec) + { + $tcrule =~ s/!$_ //; + print FILE "$_ " if ($_ eq 'any'); + } + print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } + } + + print FILE "\n"; + + print FILE " }\n\n"; + } + } + } + + print FILE " default {\n"; + print FILE " pass $defaultrule\n"; + if (($filtersettings{'ENABLE_LOG'} eq 'on') && ($filtersettings{'BLOCK_ALL'} eq 'on')) + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile".$ident." default.log\n"; + } else { + print FILE " logfile".$ident." urlfilter.log\n"; + } + } + if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) + { + print FILE " rewrite rew-rule-0\n"; + } + print FILE " redirect $redirect\n"; + print FILE " }\n"; + print FILE "}\n"; + + close FILE; +} + +# ------------------------------------------------------------------- +#!/usr/bin/perl +# +# SmoothWall CGIs +# +# This code is distributed under the terms of the GPL +# +# (c) written from scratch +# +# $Id: urlfilter.cgi,v 1.7 2006/05/08 00:00:00 marco Exp $ +# + +use strict; + +# enable only the following on debugging purpose +#use warnings; +#use CGI::Carp 'fatalsToBrowser'; + +use File::Copy; +use IO::Socket; + +require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl"; + +my %netsettings=(); +my %mainsettings=(); +my %proxysettings=(); +my %filtersettings=(); +my %tcsettings=(); +my %uqsettings=(); +my %besettings=(); +my %updatesettings=(); +my %checked=(); +my %selected=(); +my $id=0; +my $line=''; +my $i=0; +my $n=0; +my $time=''; +my $filesize; +my $category=''; +my $section=''; +my $blacklist=''; +my $blistbackup=''; + +my $changed = 'no'; +my $tcfile = "${General::swroot}/urlfilter/timeconst"; +my $uqfile = "${General::swroot}/urlfilter/userquota"; +my $dbdir = "${General::swroot}/urlfilter/blacklists"; +my $editdir = "${General::swroot}/urlfilter/editor"; +my $repository = "/home/httpd/html/repository"; +my $hintcolour = '#FFFFCC'; + +my $sourceurlfile = "${General::swroot}/urlfilter/autoupdate/autoupdate.urls"; +my $updconffile = "${General::swroot}/urlfilter/autoupdate/autoupdate.conf"; +my $updflagfile = "${General::swroot}/urlfilter/blacklists/.autoupdate.last"; +my $upd_cron_dly = "${General::swroot}/urlfilter/autoupdate/cron.daily"; +my $upd_cron_wly = "${General::swroot}/urlfilter/autoupdate/cron.weekly"; +my $upd_cron_mly = "${General::swroot}/urlfilter/autoupdate/cron.monthly"; + +my $errormessage=''; +my $updatemessage=''; +my $restoremessage=''; +my $buttontext=''; +my $source_name=''; +my $source_url=''; +my $blacklistage=0; + +my @repositorylist=(); +my @repositoryfiles=(); +my @categories=(); +my @selectedcategories=(); +my @filtergroups=(); +my @tclist=(); +my @uqlist=(); +my @source_urllist=(); +my @temp=(); + +my $lastslashpos=0; + +my $toggle=''; +my $gif=''; +my $led=''; +my $ldesc=''; +my $gdesc=''; + +if (! -d $dbdir) { mkdir("$dbdir"); } +if (! -e $tcfile) { system("touch $tcfile"); } +if (! -e $uqfile) { system("touch $uqfile"); } +if (! -e $sourceurlfile) { system("touch $sourceurlfile"); } + +&General::readhash("${General::swroot}/ethernet/settings", \%netsettings); +&General::readhash("${General::swroot}/main/settings", \%mainsettings); +&General::readhash("${General::swroot}/proxy/settings", \%proxysettings); + +&readblockcategories; + +open(FILE, $tcfile); +@tclist = ; +close(FILE); +open(FILE, $uqfile); +@uqlist = ; +close(FILE); +open(FILE, $sourceurlfile); +@source_urllist = ; +close(FILE); + +$filtersettings{'ENABLE_CUSTOM_BLACKLIST'} = 'off'; +$filtersettings{'ENABLE_CUSTOM_WHITELIST'} = 'off'; +$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} = 'off'; +$filtersettings{'BLOCK_EXECUTABLES'} = 'off'; +$filtersettings{'BLOCK_AUDIO-VIDEO'} = 'off'; +$filtersettings{'BLOCK_ARCHIVES'} = 'off'; +$filtersettings{'ENABLE_REWRITE'} = 'off'; +$filtersettings{'UNFILTERED_CLIENTS'} = ''; +$filtersettings{'BANNED_CLIENTS'} = ''; +$filtersettings{'SHOW_CATEGORY'} = 'off'; +$filtersettings{'SHOW_URL'} = 'off'; +$filtersettings{'SHOW_IP'} = 'off'; +$filtersettings{'ENABLE_DNSERROR'} = 'off'; +$filtersettings{'ENABLE_JPEG'} = 'off'; +$filtersettings{'REDIRECT_PAGE'} = ''; +$filtersettings{'MSG_TEXT_1'} = ''; +$filtersettings{'MSG_TEXT_2'} = ''; +$filtersettings{'MSG_TEXT_3'} = ''; +$filtersettings{'ENABLE_EXPR_LISTS'} = 'off'; +$filtersettings{'BLOCK_IP_ADDR'} = 'off'; +$filtersettings{'BLOCK_ALL'} = 'off'; +$filtersettings{'ENABLE_EMPTY_ADS'} = 'off'; +$filtersettings{'ENABLE_GLOBAL_WHITELIST'} = 'off'; +$filtersettings{'ENABLE_SAFESEARCH'} = 'off'; +$filtersettings{'ENABLE_LOG'} = 'off'; +$filtersettings{'ENABLE_USERNAME_LOG'} = 'off'; +$filtersettings{'ENABLE_CATEGORY_LOG'} = 'off'; +$filtersettings{'CHILDREN'} = '5'; +$filtersettings{'ENABLE_AUTOUPDATE'} = 'off'; + +$filtersettings{'ACTION'} = ''; +$filtersettings{'VALID'} = ''; + +&Header::getcgihash(\%filtersettings); +&Header::getcgihash(\%tcsettings); +&Header::getcgihash(\%uqsettings); +&Header::getcgihash(\%besettings); + +if (($filtersettings{'ACTION'} eq $Lang::tr{'save'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'})) +{ + if (!($filtersettings{'CHILDREN'} =~ /^\d+$/) || ($filtersettings{'CHILDREN'} < 1)) + { + $errormessage = $Lang::tr{'urlfilter invalid num of children'}; + goto ERROR; + } + + if ((!($filtersettings{'REDIRECT_PAGE'} eq '')) && (!($filtersettings{'REDIRECT_PAGE'} =~ /^https?:\/\//))) + { + $filtersettings{'REDIRECT_PAGE'} = "http://".$filtersettings{'REDIRECT_PAGE'}; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) + { + if (-e "$repository/$filtersettings{'ID'}") { unlink("$repository/$filtersettings{'ID'}"); } + $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'}; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPLOADFILE'}); + + $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'}; + $_ = $filtersettings{'UPLOADFILE'}; + tr/\\/\//; + $_ = substr($_,rindex($_,"/")+1); + if ($_) { + if (copy($filtersettings{'UPLOADFILE'}, "$repository/$_") != 1) + { + $errormessage = $!; + goto ERROR; + } + } + + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'BACKGROUND'}); + + if (copy($filtersettings{'BACKGROUND'}, "/home/httpd/html/images/urlfilter/background.jpg") != 1) + { + $errormessage = $!; + goto ERROR; + } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'}); + + if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + goto ERROR; + } + + if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/blacklists.tar.gz") != 1) + { + $errormessage = $!; + goto ERROR; + } + + if (!(-d "${General::swroot}/urlfilter/update")) { mkdir("${General::swroot}/urlfilter/update"); } + + my $exitcode = system("/bin/tar --no-same-owner -xzf ${General::swroot}/urlfilter/blacklists.tar.gz -C ${General::swroot}/urlfilter/update"); + + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + + if (-d "${General::swroot}/urlfilter/update/category") + { + system("mv ${General::swroot}/urlfilter/update/category ${General::swroot}/urlfilter/update/blacklists"); + } + + if (!(-d "${General::swroot}/urlfilter/update/blacklists")) + { + $errormessage = $Lang::tr{'urlfilter invalid content'}; + } else { + system("cp -r ${General::swroot}/urlfilter/update/blacklists/* $dbdir"); + + &readblockcategories; + &readcustomlists; + + &writeconfigfile; + + $updatemessage = $Lang::tr{'urlfilter upload success'}; + system("${General::swroot}/urlfilter/bin/prebuild.pl &"); + system("logger -t installpackage[urlfilter] \"URL filter blacklist - Blacklist update from local source completed\""); + } + } + if (-d "${General::swroot}/urlfilter/update") { system("rm -rf ${General::swroot}/urlfilter/update"); } + if (-e "${General::swroot}/urlfilter/blacklists.tar.gz") { unlink("${General::swroot}/urlfilter/blacklists.tar.gz"); } + if ($errormessage) { goto ERROR; } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) + { + $blistbackup = ($filtersettings{'ENABLE_FULLBACKUP'} eq 'on') ? "blacklists" : "blacklists/custom"; + if (system("/bin/tar -C ${General::swroot}/urlfilter -czf ${General::swroot}/urlfilter/backup.tar.gz settings timeconst userquota autoupdate $blistbackup")) + { + $errormessage = $Lang::tr{'urlfilter backup error'}; + goto ERROR; + } + else + { + print "Content-type: application/gzip\n"; + print "Content-length: "; + print (-s "${General::swroot}/urlfilter/backup.tar.gz"); + print "\n"; + print "Content-disposition: attachment; filename=urlfilter-backup.tar.gz\n\n"; + + open (FILE, "${General::swroot}/urlfilter/backup.tar.gz"); + while () { print; } + close (FILE); + + if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); } + exit; + } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'}); + + if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + goto ERROR; + } + + if (!(-d "${General::swroot}/urlfilter/restore")) { mkdir("${General::swroot}/urlfilter/restore"); } + + if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/backup.tar.gz") != 1) + { + $errormessage = $!; + } + + my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf ${General::swroot}/urlfilter/backup.tar.gz -C ${General::swroot}/urlfilter/restore"); + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + if (!(-e "${General::swroot}/urlfilter/restore/settings")) + { + $errormessage = $Lang::tr{'urlfilter invalid restore file'}; + } else { + system("cp -rp ${General::swroot}/urlfilter/restore/* ${General::swroot}/urlfilter/"); + &readblockcategories; + &readcustomlists; + &writeconfigfile; + + $restoremessage = $Lang::tr{'urlfilter restore success'}; + } + } + + if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); } + if (-d "${General::swroot}/urlfilter/restore") { system("rm -rf ${General::swroot}/urlfilter/restore"); } + if ($errormessage) { goto ERROR; } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'save'}) + { + $filtersettings{'VALID'} = 'yes'; + &savesettings; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) + { + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + goto ERROR; + } + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + goto ERROR; + } + + $filtersettings{'VALID'} = 'yes'; + &savesettings; + + system("chown -R nobody.nobody $dbdir"); + + if (-e "$dbdir/custom/allowed/domains.db") { unlink("$dbdir/custom/allowed/domains.db"); } + if (-e "$dbdir/custom/allowed/urls.db") { unlink("$dbdir/custom/allowed/urls.db"); } + if (-e "$dbdir/custom/blocked/domains.db") { unlink("$dbdir/custom/blocked/domains.db"); } + if (-e "$dbdir/custom/blocked/urls.db") { unlink("$dbdir/custom/blocked/urls.db"); } + + foreach (<$dbdir/*>) + { + if (-d $_){ system("chmod 644 $_/*"); } + if (-d $_){ system("chmod 666 $_/*.db"); } + } + if (-d "$dbdir/custom/allowed") + { + system("chmod 755 $dbdir/custom/allowed"); + system("chmod 644 $dbdir/custom/allowed/*"); + } + if (-d "$dbdir/custom/blocked") + { + system("chmod 755 $dbdir/custom/blocked"); + system("chmod 644 $dbdir/custom/blocked/*"); + } + + system('/usr/local/bin/restartsquid'); + } + +ERROR: + + if ($errormessage) { $filtersettings{'VALID'} = 'no'; } + +} + +if ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter set time constraints'}) { $tcsettings{'TCMODE'} = 'on'} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'add'})) +{ + $tcsettings{'TCMODE'}='on'; + + if (!$tcsettings{'DST'}) + { + $errormessage=$Lang::tr{'urlfilter dst error'}; + } + + if (!$tcsettings{'SRC'}) + { + $errormessage=$Lang::tr{'urlfilter src error'}; + } + + if (!($tcsettings{'TO_HOUR'}.$tcsettings{'TO_MINUTE'} gt $tcsettings{'FROM_HOUR'}.$tcsettings{'FROM_MINUTE'})) + { + $errormessage=$Lang::tr{'urlfilter timespace error'}; + } + + if (!(($tcsettings{'MON'} eq 'on') || ($tcsettings{'TUE'} eq 'on') || ($tcsettings{'WED'} eq 'on') || ($tcsettings{'THU'} eq 'on') || ($tcsettings{'FRI'} eq 'on') || ($tcsettings{'SAT'} eq 'on') || ($tcsettings{'SUN'} eq 'on'))) + { + $errormessage=$Lang::tr{'urlfilter weekday error'}; + } + + if (!$errormessage) + { + if ($tcsettings{'DST'} =~ /^any/) { $tcsettings{'DST'} = 'any'; } + if ($tcsettings{'ENABLERULE'} eq 'on') { $tcsettings{'ACTIVE'} = $tcsettings{'ENABLERULE'}; } else { $tcsettings{'ACTIVE'} = 'off'} + + $tcsettings{'ENABLERULE'} = 'on'; + if($tcsettings{'EDITING'} eq 'no') { + open(FILE,">>$tcfile"); + flock FILE, 2; + print FILE "$tcsettings{'DEFINITION'},$tcsettings{'MON'},$tcsettings{'TUE'},$tcsettings{'WED'},$tcsettings{'THU'},$tcsettings{'FRI'},$tcsettings{'SAT'},$tcsettings{'SUN'},$tcsettings{'FROM_HOUR'},$tcsettings{'FROM_MINUTE'},$tcsettings{'TO_HOUR'},$tcsettings{'TO_MINUTE'},$tcsettings{'SRC'},$tcsettings{'DST'},$tcsettings{'ACCESS'},$tcsettings{'ACTIVE'},$tcsettings{'COMMENT'}\n"; + } else { + open(FILE, ">$tcfile"); + flock FILE, 2; + $id = 0; + foreach $line (@tclist) + { + $id++; + if ($tcsettings{'EDITING'} eq $id) { + print FILE "$tcsettings{'DEFINITION'},$tcsettings{'MON'},$tcsettings{'TUE'},$tcsettings{'WED'},$tcsettings{'THU'},$tcsettings{'FRI'},$tcsettings{'SAT'},$tcsettings{'SUN'},$tcsettings{'FROM_HOUR'},$tcsettings{'FROM_MINUTE'},$tcsettings{'TO_HOUR'},$tcsettings{'TO_MINUTE'},$tcsettings{'SRC'},$tcsettings{'DST'},$tcsettings{'ACCESS'},$tcsettings{'ACTIVE'},$tcsettings{'COMMENT'}\n"; + } else { print FILE "$line"; } + } + } + close(FILE); + undef %tcsettings; + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; + $changed = 'yes'; + } else { + if ($tcsettings{'EDITING'} ne 'no') + { + $tcsettings{'ACTION'} = $Lang::tr{'edit'}; + $tcsettings{'ID'} = $tcsettings{'EDITING'}; + } + } +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'remove'})) +{ + $id = 0; + open(FILE, ">$tcfile"); + flock FILE, 2; + foreach $line (@tclist) + { + $id++; + unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; } + } + close(FILE); + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'})) +{ + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + } + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + } + + if (!$errormessage) { system('/usr/local/bin/restartsquid'); } + $tcsettings{'TCMODE'}='on'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})) +{ + open(FILE, ">$tcfile"); + flock FILE, 2; + $id = 0; + foreach $line (@tclist) + { + $id++; + unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; } + else + { + chomp($line); + @temp = split(/\,/,$line); + if ($temp[15] eq 'on') { $temp[15] = 'off'; } else { $temp[15] = 'on' } + print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4],$temp[5],$temp[6],$temp[7],$temp[8],$temp[9],$temp[10],$temp[11],$temp[12],$temp[13],$temp[14],$temp[15],$temp[16]\n"; + } + } + close(FILE); + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; +} + +if (!$errormessage) { + $tcsettings{'ENABLERULE'}='on'; + $tcsettings{'TO_HOUR'}='24'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage)) +{ + $id = 0; + foreach $line (@tclist) + { + $id++; + if ($tcsettings{'ID'} eq $id) + { + chomp($line); + @temp = split(/\,/,$line); + $tcsettings{'DEFINITION'} = $temp[0]; + $tcsettings{'MON'} = $temp[1]; + $tcsettings{'TUE'} = $temp[2]; + $tcsettings{'WED'} = $temp[3]; + $tcsettings{'THU'} = $temp[4]; + $tcsettings{'FRI'} = $temp[5]; + $tcsettings{'SAT'} = $temp[6]; + $tcsettings{'SUN'} = $temp[7]; + $tcsettings{'FROM_HOUR'} = $temp[8]; + $tcsettings{'FROM_MINUTE'} = $temp[9]; + $tcsettings{'TO_HOUR'} = $temp[10]; + $tcsettings{'TO_MINUTE'} = $temp[11]; + $tcsettings{'SRC'} = $temp[12]; + $tcsettings{'DST'} = $temp[13]; + $tcsettings{'ACCESS'} = $temp[14]; + $tcsettings{'ENABLERULE'} = $temp[15]; + $tcsettings{'COMMENT'} = $temp[16]; + } + } + $tcsettings{'TCMODE'}='on'; +} + +if ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter set user quota'}) { $uqsettings{'UQMODE'} = 'on'} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'add'})) +{ + $uqsettings{'UQMODE'}='on'; + + if ((!($uqsettings{'TIME_QUOTA'} =~ /^\d+/)) || ($uqsettings{'TIME_QUOTA'} < '1')) + { + $errormessage=$Lang::tr{'urlfilter quota time error'}; + } + + @temp = split(/\n/,$uqsettings{'QUOTA_USERS'}); + undef $uqsettings{'QUOTA_USERS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $uqsettings{'QUOTA_USERS'} .= $_."\n"; } + } + + if ($uqsettings{'QUOTA_USERS'} eq '') + { + $errormessage=$Lang::tr{'urlfilter quota user error'}; + } + + $_ = $uqsettings{'QUOTA_USERS'}; + chomp; s/\n/|/g; + my $quota_users = $_; + + if ($uqsettings{'QUOTA_USERS'} =~ /\\/) + { + $errormessage=$Lang::tr{'urlfilter invalid user error'}; + } + + if (!$errormessage) { + if ($uqsettings{'ENABLEQUOTA'} eq 'on') { $uqsettings{'ACTIVE'} = $uqsettings{'ENABLEQUOTA'}; } else { $uqsettings{'ACTIVE'} = 'off'} + + $uqsettings{'ENABLERULE'} = 'on'; + if($uqsettings{'EDITING'} eq 'no') { + open(FILE,">>$uqfile"); + flock FILE, 2; + print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n"; + } else { + open(FILE, ">$uqfile"); + flock FILE, 2; + $id = 0; + foreach $line (@uqlist) + { + $id++; + if ($uqsettings{'EDITING'} eq $id) { + print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n"; + } else { print FILE "$line"; } + } + } + close(FILE); + undef %uqsettings; + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'MODE'}='USERQUOTA'; + $uqsettings{'UQMODE'}='on'; + $changed = 'yes'; + } else { + if ($uqsettings{'EDITING'} ne 'no') + { + $uqsettings{'ACTION'} = $Lang::tr{'edit'}; + $uqsettings{'ID'} = $uqsettings{'EDITING'}; + } + } +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'remove'})) +{ + $id = 0; + open(FILE, ">$uqfile"); + flock FILE, 2; + foreach $line (@uqlist) + { + $id++; + unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; } + } + close(FILE); + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'UQMODE'}='on'; +} + +if (!$errormessage) { + $uqsettings{'ENABLEQUOTA'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage)) +{ + $id = 0; + foreach $line (@uqlist) + { + $id++; + if ($uqsettings{'ID'} eq $id) + { + chomp($line); + @temp = split(/\,/,$line); + $uqsettings{'TIME_QUOTA'} = $temp[0]; + $uqsettings{'SPORADIC'} = $temp[1]; + $uqsettings{'RENEWAL'} = $temp[2]; + $uqsettings{'QUOTA_USERS'} = $temp[3]; + $uqsettings{'ENABLEQUOTA'} = $temp[4]; + } + } + $uqsettings{'UQMODE'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})) +{ + open(FILE, ">$uqfile"); + flock FILE, 2; + $id = 0; + foreach $line (@uqlist) + { + $id++; + unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; } + else + { + chomp($line); + @temp = split(/\,/,$line); + if ($temp[4] eq 'on') { $temp[4] = 'off'; } else { $temp[4] = 'on' } + print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4]\n"; + } + } + close(FILE); + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'UQMODE'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'})) +{ + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + } + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + } + + if (!$errormessage) { system('/usr/local/bin/restartsquid'); } + $uqsettings{'UQMODE'}='on'; +} + +if ($besettings{'ACTION'} eq $Lang::tr{'urlfilter blacklist editor'}) { $besettings{'BEMODE'} = 'on'; } + +if ($besettings{'MODE'} eq 'BLACKLIST_EDITOR') +{ + @temp = split(/\n/,$besettings{'BE_DOMAINS'}); + undef $besettings{'BE_DOMAINS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_DOMAINS'} .= $_."\n"; } + } + chomp($besettings{'BE_DOMAINS'}); + @temp = split(/\n/,$besettings{'BE_URLS'}); + undef $besettings{'BE_URLS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_URLS'} .= $_."\n"; } + } + chomp($besettings{'BE_URLS'}); + @temp = split(/\n/,$besettings{'BE_EXPRESSIONS'}); + undef $besettings{'BE_EXPRESSIONS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_EXPRESSIONS'} .= $_."\n"; } + } + chomp($besettings{'BE_EXPRESSIONS'}); +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter load blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + $besettings{'BE_NAME'} = $besettings{'BE_BLACKLIST'}; + + delete $besettings{'BE_DOMAINS'}; + delete $besettings{'BE_URLS'}; + delete $besettings{'BE_EXPRESSIONS'}; + + if (-e "$dbdir/$besettings{'BE_NAME'}/domains") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/domains"); + while () { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_DOMAINS'}); + } + if (-e "$dbdir/$besettings{'BE_NAME'}/urls") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/urls"); + while () { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_URLS'}); + } + if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/expressions"); + while () { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_EXPRESSIONS'}); + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter import blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + &Header::getcgihash(\%besettings, {'wantfile' => 1, 'filevar' => 'IMPORTFILE'}); + + if (!($besettings{'IMPORTFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + } else { + if (!-d "$editdir") { mkdir("$editdir"); } + + if (copy($besettings{'IMPORTFILE'}, "$editdir/blacklist.tar.gz") != 1) + { + $errormessage = $!; + } else { + + my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf $editdir/blacklist.tar.gz -C $editdir"); + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + $i = 0; + foreach (<$editdir/blacklists/*>) + { + if (-d) + { + $i++; + $besettings{'BE_NAME'} = substr($_, rindex($_,"/")+1); + } + } + + if (!($i == 1)) + { + $errormessage = $Lang::tr{'urlfilter invalid import file'}; + } else { + delete $besettings{'BE_DOMAINS'}; + delete $besettings{'BE_URLS'}; + delete $besettings{'BE_EXPRESSIONS'}; + + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/domains") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/domains"); + while () { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_DOMAINS'}); + } + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/urls") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/urls"); + while () { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_URLS'}); + } + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/expressions") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/expressions"); + while () { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_EXPRESSIONS'}); + } + } + } + + if (-d $editdir) { system("rm -rf $editdir"); } + + } + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter export blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + if ($besettings{'BE_NAME'} eq '') + { + $errormessage = $Lang::tr{'urlfilter category name error'}; + } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) { + + $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_; + + if (!(-d "$editdir")) { mkdir("$editdir"); } + if (!(-d "$editdir/blacklists")) { mkdir("$editdir/blacklists"); } + if (!(-d "$editdir/blacklists/$besettings{'BE_NAME'}")) { mkdir("$editdir/blacklists/$besettings{'BE_NAME'}"); } + + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/domains"); + flock FILE, 2; + print FILE "$besettings{'BE_DOMAINS'}\n"; + close FILE; + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/urls"); + flock FILE, 2; + print FILE "$besettings{'BE_URLS'}\n"; + close FILE; + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/expressions"); + flock FILE, 2; + print FILE "$besettings{'BE_EXPRESSIONS'}\n"; + close FILE; + + if (system("/bin/tar -C $editdir -czf $editdir/$besettings{'BE_NAME'}.tar.gz blacklists")) + { + $errormessage = $Lang::tr{'urlfilter export error'}; + } + else + { + print "Content-type: application/gzip\n"; + print "Content-length: "; + print (-s "$editdir/$besettings{'BE_NAME'}.tar.gz"); + print "\n"; + print "Content-disposition: attachment; filename=$besettings{'BE_NAME'}.tar.gz\n\n"; + + open (FILE, "$editdir/$besettings{'BE_NAME'}.tar.gz"); + while () { print; } + close (FILE); + + if (-d $editdir) { system("rm -rf $editdir"); } + exit; + } + } else { + $errormessage = $Lang::tr{'urlfilter category data error'}; + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter install blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + if ($besettings{'BE_NAME'} eq '') + { + $errormessage = $Lang::tr{'urlfilter category name error'}; + } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) { + + $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_; + + if (!-d "$editdir") { mkdir("$editdir"); } + + if (!-d "$dbdir/$besettings{'BE_NAME'}") { mkdir("$dbdir/$besettings{'BE_NAME'}"); } + + if (-e "$dbdir/$besettings{'BE_NAME'}/domains") { unlink("$dbdir/$besettings{'BE_NAME'}/domains"); } + if ($besettings{'BE_DOMAINS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/domains"); + flock FILE, 2; + print FILE "$besettings{'BE_DOMAINS'}\n"; + close FILE; + } + if (-e "$dbdir/$besettings{'BE_NAME'}/urls") { unlink("$dbdir/$besettings{'BE_NAME'}/urls"); } + if ($besettings{'BE_URLS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/urls"); + flock FILE, 2; + print FILE "$besettings{'BE_URLS'}\n"; + close FILE; + } + if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") { unlink("$dbdir/$besettings{'BE_NAME'}/expressions"); } + if ($besettings{'BE_EXPRESSIONS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/expressions"); + flock FILE, 2; + print FILE "$besettings{'BE_EXPRESSIONS'}\n"; + close FILE; + } + + open(FILE, ">$editdir/install.conf"); + flock FILE, 2; + print FILE "logdir /var/log/squidGuard\n"; + print FILE "dbhome $dbdir/$besettings{'BE_NAME'}\n\n"; + print FILE "dest $besettings{'BE_NAME'} {\n"; + if ($besettings{'BE_DOMAINS'}) { print FILE " domainlist domains\n"; } + if ($besettings{'BE_URLS'}) { print FILE " urllist urls\n"; } + if ($besettings{'BE_EXPRESSIONS'}) { print FILE " expressions expressions\n"; } + print FILE "}\n\n"; + print FILE "acl {\n"; + print FILE " default {\n"; + print FILE " pass none\n"; + print FILE " }\n"; + print FILE "}\n"; + close FILE; + + system("rm -f $dbdir/$besettings{'BE_NAME'}/*.db"); + system("/usr/sbin/squidGuard -c $editdir/install.conf -C all"); + system("chmod a+w $dbdir/$besettings{'BE_NAME'}/*.db"); + + &readblockcategories; + &readcustomlists; + + &writeconfigfile; + + system('/usr/local/bin/restartsquid') unless ($besettings{'NORESTART'} eq 'on'); + + if (-d $editdir) { system("rm -rf $editdir"); } + } else { + $errormessage = $Lang::tr{'urlfilter category data error'}; + } +} + +if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save schedule'}) +{ + if (($filtersettings{'UPDATE_SOURCE'} eq 'custom') && ($filtersettings{'CUSTOM_UPDATE_URL'} eq '')) + { + $errormessage = $Lang::tr{'urlfilter custom url required'}; + } else { + open (FILE, ">$updconffile"); + print FILE "ENABLE_AUTOUPDATE=$filtersettings{'ENABLE_AUTOUPDATE'}\n"; + print FILE "UPDATE_SCHEDULE=$filtersettings{'UPDATE_SCHEDULE'}\n"; + print FILE "UPDATE_SOURCE=$filtersettings{'UPDATE_SOURCE'}\n"; + print FILE "CUSTOM_UPDATE_URL=$filtersettings{'CUSTOM_UPDATE_URL'}\n"; + close FILE; + + if (-e $upd_cron_dly) { unlink($upd_cron_dly); } + if (-e $upd_cron_wly) { unlink($upd_cron_wly); } + if (-e $upd_cron_mly) { unlink($upd_cron_mly); } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'daily')) + { + symlink("../bin/autoupdate.pl",$upd_cron_dly) + } else { + symlink("/bin/false",$upd_cron_dly) + } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'weekly')) + { + symlink("../bin/autoupdate.pl",$upd_cron_wly) + } else { + symlink("/bin/false",$upd_cron_wly) + } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'monthly')) + { + symlink("../bin/autoupdate.pl",$upd_cron_mly) + } else { + symlink("/bin/false",$upd_cron_mly) + } + } +} + +if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter update now'}) +{ + if ($filtersettings{'UPDATE_SOURCE'} eq 'custom') + { + if ($filtersettings{'CUSTOM_UPDATE_URL'} eq '') + { + $errormessage = $Lang::tr{'urlfilter custom url required'}; + } else { + system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'CUSTOM_UPDATE_URL'} &"); + } + } else { + system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'UPDATE_SOURCE'} &"); + } +} + + +if (-e "${General::swroot}/urlfilter/settings") { &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); } + +&readcustomlists; + +$checked{'ENABLE_CUSTOM_BLACKLIST'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_BLACKLIST'}{$filtersettings{'ENABLE_CUSTOM_BLACKLIST'}} = "checked='checked'"; +$checked{'ENABLE_CUSTOM_WHITELIST'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_WHITELIST'}{$filtersettings{'ENABLE_CUSTOM_WHITELIST'}} = "checked='checked'"; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'}} = "checked='checked'"; +$checked{'BLOCK_EXECUTABLES'}{'off'} = ''; +$checked{'BLOCK_EXECUTABLES'}{'on'} = ''; +$checked{'BLOCK_EXECUTABLES'}{$filtersettings{'BLOCK_EXECUTABLES'}} = "checked='checked'"; +$checked{'BLOCK_AUDIO-VIDEO'}{'off'} = ''; +$checked{'BLOCK_AUDIO-VIDEO'}{'on'} = ''; +$checked{'BLOCK_AUDIO-VIDEO'}{$filtersettings{'BLOCK_AUDIO-VIDEO'}} = "checked='checked'"; +$checked{'BLOCK_ARCHIVES'}{'off'} = ''; +$checked{'BLOCK_ARCHIVES'}{'on'} = ''; +$checked{'BLOCK_ARCHIVES'}{$filtersettings{'BLOCK_ARCHIVES'}} = "checked='checked'"; +$checked{'ENABLE_REWRITE'}{'off'} = ''; +$checked{'ENABLE_REWRITE'}{'on'} = ''; +$checked{'ENABLE_REWRITE'}{$filtersettings{'ENABLE_REWRITE'}} = "checked='checked'"; +$checked{'SHOW_CATEGORY'}{'off'} = ''; +$checked{'SHOW_CATEGORY'}{'on'} = ''; +$checked{'SHOW_CATEGORY'}{$filtersettings{'SHOW_CATEGORY'}} = "checked='checked'"; +$checked{'SHOW_URL'}{'off'} = ''; +$checked{'SHOW_URL'}{'on'} = ''; +$checked{'SHOW_URL'}{$filtersettings{'SHOW_URL'}} = "checked='checked'"; +$checked{'SHOW_IP'}{'off'} = ''; +$checked{'SHOW_IP'}{'on'} = ''; +$checked{'SHOW_IP'}{$filtersettings{'SHOW_IP'}} = "checked='checked'"; +$checked{'ENABLE_DNSERROR'}{'off'} = ''; +$checked{'ENABLE_DNSERROR'}{'on'} = ''; +$checked{'ENABLE_DNSERROR'}{$filtersettings{'ENABLE_DNSERROR'}} = "checked='checked'"; +$checked{'ENABLE_JPEG'}{'off'} = ''; +$checked{'ENABLE_JPEG'}{'on'} = ''; +$checked{'ENABLE_JPEG'}{$filtersettings{'ENABLE_JPEG'}} = "checked='checked'"; +$checked{'ENABLE_EXPR_LISTS'}{'off'} = ''; +$checked{'ENABLE_EXPR_LISTS'}{'on'} = ''; +$checked{'ENABLE_EXPR_LISTS'}{$filtersettings{'ENABLE_EXPR_LISTS'}} = "checked='checked'"; +$checked{'BLOCK_IP_ADDR'}{'off'} = ''; +$checked{'BLOCK_IP_ADDR'}{'on'} = ''; +$checked{'BLOCK_IP_ADDR'}{$filtersettings{'BLOCK_IP_ADDR'}} = "checked='checked'"; +$checked{'BLOCK_ALL'}{'off'} = ''; +$checked{'BLOCK_ALL'}{'on'} = ''; +$checked{'BLOCK_ALL'}{$filtersettings{'BLOCK_ALL'}} = "checked='checked'"; +$checked{'ENABLE_EMPTY_ADS'}{'off'} = ''; +$checked{'ENABLE_EMPTY_ADS'}{'on'} = ''; +$checked{'ENABLE_EMPTY_ADS'}{$filtersettings{'ENABLE_EMPTY_ADS'}} = "checked='checked'"; +$checked{'ENABLE_GLOBAL_WHITELIST'}{'off'} = ''; +$checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} = ''; +$checked{'ENABLE_GLOBAL_WHITELIST'}{$filtersettings{'ENABLE_GLOBAL_WHITELIST'}} = "checked='checked'"; +$checked{'ENABLE_SAFESEARCH'}{'off'} = ''; +$checked{'ENABLE_SAFESEARCH'}{'on'} = ''; +$checked{'ENABLE_SAFESEARCH'}{$filtersettings{'ENABLE_SAFESEARCH'}} = "checked='checked'"; +$checked{'ENABLE_LOG'}{'off'} = ''; +$checked{'ENABLE_LOG'}{'on'} = ''; +$checked{'ENABLE_LOG'}{$filtersettings{'ENABLE_LOG'}} = "checked='checked'"; +$checked{'ENABLE_USERNAME_LOG'}{'off'} = ''; +$checked{'ENABLE_USERNAME_LOG'}{'on'} = ''; +$checked{'ENABLE_USERNAME_LOG'}{$filtersettings{'ENABLE_USERNAME_LOG'}} = "checked='checked'"; +$checked{'ENABLE_CATEGORY_LOG'}{'off'} = ''; +$checked{'ENABLE_CATEGORY_LOG'}{'on'} = ''; +$checked{'ENABLE_CATEGORY_LOG'}{$filtersettings{'ENABLE_CATEGORY_LOG'}} = "checked='checked'"; + +foreach $category (@filtergroups) { + $checked{$category}{'off'} = ''; + $checked{$category}{'on'} = ''; + $checked{$category}{$filtersettings{$category}} = "checked='checked'"; +} + +$selected{'DEFINITION'}{$tcsettings{'DEFINITION'}} = "selected='selected'"; +$selected{'FROM_HOUR'}{$tcsettings{'FROM_HOUR'}} = "selected='selected'"; +$selected{'FROM_MINUTE'}{$tcsettings{'FROM_MINUTE'}} = "selected='selected'"; +$selected{'TO_HOUR'}{$tcsettings{'TO_HOUR'}} = "selected='selected'"; +$selected{'TO_MINUTE'}{$tcsettings{'TO_MINUTE'}} = "selected='selected'"; + +@selectedcategories = split(/\|/,$tcsettings{'DST'}); +foreach (@selectedcategories) +{ + $selected{'DST'}{$_} = "selected='selected'"; +} + +$selected{'ACCESS'}{$tcsettings{'ACCESS'}} = "selected='selected'"; + +$checked{'ENABLERULE'}{'off'} = ''; +$checked{'ENABLERULE'}{'on'} = ''; +$checked{'ENABLERULE'}{$tcsettings{'ENABLERULE'}} = "checked='checked'"; +$checked{'MON'}{'off'} = ''; +$checked{'MON'}{'on'} = ''; +$checked{'MON'}{$tcsettings{'MON'}} = "checked='checked'"; +$checked{'TUE'}{'off'} = ''; +$checked{'TUE'}{'on'} = ''; +$checked{'TUE'}{$tcsettings{'TUE'}} = "checked='checked'"; +$checked{'WED'}{'off'} = ''; +$checked{'WED'}{'on'} = ''; +$checked{'WED'}{$tcsettings{'WED'}} = "checked='checked'"; +$checked{'THU'}{'off'} = ''; +$checked{'THU'}{'on'} = ''; +$checked{'THU'}{$tcsettings{'THU'}} = "checked='checked'"; +$checked{'FRI'}{'off'} = ''; +$checked{'FRI'}{'on'} = ''; +$checked{'FRI'}{$tcsettings{'FRI'}} = "checked='checked'"; +$checked{'SAT'}{'off'} = ''; +$checked{'SAT'}{'on'} = ''; +$checked{'SAT'}{$tcsettings{'SAT'}} = "checked='checked'"; +$checked{'SUN'}{'off'} = ''; +$checked{'SUN'}{'on'} = ''; +$checked{'SUN'}{$tcsettings{'SUN'}} = "checked='checked'"; + +$selected{'SPORADIC'}{$uqsettings{'SPORADIC'}} = "selected='selected'"; +$selected{'RENEWAL'} {$uqsettings{'RENEWAL'}} = "selected='selected'"; + +$checked{'ENABLEQUOTA'}{'off'} = ''; +$checked{'ENABLEQUOTA'}{'on'} = ''; +$checked{'ENABLEQUOTA'}{$uqsettings{'ENABLEQUOTA'}} = "checked='checked'"; + +$selected{'BE_BLACKLIST'}{$besettings{'BE_BLACKLIST'}} = "selected='selected'"; + + +&Header::showhttpheaders(); + +&Header::openpage($Lang::tr{'urlfilter configuration'}, 1, ''); + +&Header::openbigbox('100%', 'left', '', $errormessage); + +if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print "$errormessage \n"; + &Header::closebox(); +} elsif (($tcsettings{'CHANGED'} eq 'yes') || ($uqsettings{'CHANGED'} eq 'yes') ) { + &writeconfigfile; + print "
\n"; + &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restart notification'}:"); + print "$Lang::tr{'urlfilter restart message'}\n"; + if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "

$Lang::tr{'urlfilter quota restart message'}\n"; } + print "\n"; + print "

"; + if ($tcsettings{'MODE'} eq 'TIMECONSTRAINT') { print ""; } + if ($uqsettings{'MODE'} eq 'USERQUOTA') { print ""; } + &Header::closebox(); + print "

\n"; +} + +if ($restoremessage) { + &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restore results'}:"); + print "$restoremessage\n"; + print " \n"; + &Header::closebox(); +} + +if ((!$tcsettings{'TCMODE'}) && (!$uqsettings{'UQMODE'}) && (!$besettings{'BEMODE'})) { + +if (!($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter manage repository'})) { + +#========================================================== +# +# Section: Main Configuration +# +#========================================================== + +print "
\n"; + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter filter settings'}:"); +print < + + $Lang::tr{'urlfilter block categories'} + +END +; + +if (@categories == 0) { +print < + $Lang::tr{'urlfilter no categories'} +   +   +   + + +END +; +} + +for ($n=0; $n<=@categories; $n = $n + $i) { + for ($i=0; $i<=3; $i++) { + if ($i eq 0) { print "\n"; } + if (($n+$i) < @categories) { + print "@categories[$n+$i]:<\/td>\n"; + print "\n"; + } + if ($i eq 3) { print "<\/tr>\n"; } + } +} + +print < +
+ + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter custom blacklist'}   
$Lang::tr{'urlfilter blocked domains'} *$Lang::tr{'urlfilter blocked urls'} *
+ + + + + + + +
$Lang::tr{'urlfilter enable custom blacklist'}:  
+
+ + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter custom whitelist'}   
$Lang::tr{'urlfilter allowed domains'} *$Lang::tr{'urlfilter allowed urls'} *
+ + + + + + + +
$Lang::tr{'urlfilter enable custom whitelist'}:  
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter custom expression list'}
$Lang::tr{'urlfilter blocked expressions'} *
$Lang::tr{'urlfilter enable custom expression list'}:  
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter file ext block'}
$Lang::tr{'urlfilter block executables'}:$Lang::tr{'urlfilter block audio-video'}:
$Lang::tr{'urlfilter block archives'}:  
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter local file redirection'}
$Lang::tr{'urlfilter enable rewrite rules'}:  
   
+
+ + + + + + + + + + + + +
$Lang::tr{'urlfilter network access control'}  
$Lang::tr{'urlfilter unfiltered clients'}: *$Lang::tr{'urlfilter banned clients'}: *
+
+ + + + + + + + + + +
$Lang::tr{'urlfilter timebased access control'}
  
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter block settings'}
$Lang::tr{'urlfilter show category'}:$Lang::tr{'urlfilter redirectpage'}: *
$Lang::tr{'urlfilter show url'}:$Lang::tr{'urlfilter msg text 1'}: *
$Lang::tr{'urlfilter show ip'}:$Lang::tr{'urlfilter msg text 2'}: *
$Lang::tr{'urlfilter show dnserror'}:$Lang::tr{'urlfilter msg text 3'}: *
$Lang::tr{'urlfilter enable jpeg'}:  
+ + + + + + + + + + +
$Lang::tr{'urlfilter background image'}

$Lang::tr{'urlfilter background text'}:
 
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter advanced settings'}
$Lang::tr{'urlfilter enable expression lists'}:$Lang::tr{'urlfilter enable log'}:
$Lang::tr{'urlfilter safesearch'}:$Lang::tr{'urlfilter username log'}:
$Lang::tr{'urlfilter empty ads'}:$Lang::tr{'urlfilter category log'}:
$Lang::tr{'urlfilter block ip'}:$Lang::tr{'urlfilter children'}:
$Lang::tr{'urlfilter block all'}:$Lang::tr{'urlfilter whitelist always allowed'}:
+
+ + + + + +
+ *  + $Lang::tr{'this field may be blank'} + +URL filter +
+ + + + + + + +
  
+END +; + +&Header::closebox(); + +print "\n"; + +print "
\n"; + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter maintenance'}:"); + +print < + +$Lang::tr{'urlfilter blacklist update'} + + +$Lang::tr{'urlfilter upload information'}

$Lang::tr{'urlfilter upload text'}: + + +   + + + +


+ + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter automatic blacklist update'} +END +; +if (-e "$updflagfile") +{ +$blacklistage = int(-M "$updflagfile"); +print "  [ $Lang::tr{'urlfilter blacklist age 1'} $blacklistage $Lang::tr{'urlfilter blacklist age 2'} ]"; +} + +$updatesettings{'UPDATE_SCHEDULE'} = 'monthly'; +$updatesettings{'CUSTOM_UPDATE_URL'} = ''; + +if (-e "$updconffile") { &General::readhash("$updconffile", \%updatesettings); } + +$checked{'ENABLE_AUTOUPDATE'}{'off'} = ''; +$checked{'ENABLE_AUTOUPDATE'}{'on'} = ''; +$checked{'ENABLE_AUTOUPDATE'}{$updatesettings{'ENABLE_AUTOUPDATE'}} = "checked='checked'"; + +$selected{'UPDATE_SCHEDULE'}{$updatesettings{'UPDATE_SCHEDULE'}} = "selected='selected'"; + +$selected{'UPDATE_SOURCE'}{$updatesettings{'UPDATE_SOURCE'}} = "selected='selected'"; + +print < +
$Lang::tr{'urlfilter enable automatic blacklist update'}:
$Lang::tr{'urlfilter automatic update schedule'}: + +
$Lang::tr{'urlfilter select source'}: + +
$Lang::tr{'urlfilter custom url'}:
+ + + + +
   
+ +
+ + + + + + + + + + + +
$Lang::tr{'urlfilter blacklist editor'}
$Lang::tr{'urlfilter blacklist editor info'}
+ +
+ + + + + + + + + + + + + + +
$Lang::tr{'urlfilter backup settings'}
$Lang::tr{'urlfilter enable full backup'}:  
+ +
+ + + + + + + + + + + +
$Lang::tr{'urlfilter restore settings'}
$Lang::tr{'urlfilter restore text'}:
 
+ +END +; + +&Header::closebox(); + +} else { + +#========================================================== +# +# Section: Manage Repository +# +#========================================================== + +print "
\n"; + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter manage local file repository'}:"); +print < + + $Lang::tr{'urlfilter repository information'}

+ + + $Lang::tr{'urlfilter upload file text'}: + + +   + + +
$Lang::tr{'urlfilter upload file information 1'}: $Lang::tr{'urlfilter upload file information 2'} + + +
+ + + + +
+ +END +; + +&Header::closebox(); + +&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter current files'}: [$repository]"); + +@repositorylist = <$repository/*>; + +undef @repositoryfiles; +foreach (@repositorylist) +{ + if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); } +} + +if (@repositoryfiles) +{ + print < + + $Lang::tr{'urlfilter filename'} + $Lang::tr{'urlfilter filesize'} + + +END +; + $id = 0; + foreach $line (@repositoryfiles) + { + $id++; + if ($id % 2) { + print "\n"; } + else { + print "\n"; } + $filesize = (-s "$repository/$line"); + 1 while $filesize =~ s/^(-?\d+)(\d{3})/$1.$2/; + +print <   $line + $filesize    + + +
+ + + +
+ + + +END +; + } + +print < + + + +
+ + + + + + +
  $Lang::tr{'legend'}:    $Lang::tr{$Lang::tr{'remove'}
+END +; +} else { + + print "$Lang::tr{'urlfilter empty repository'}\n"; +} + +&Header::closebox(); + +} + +} elsif ($tcsettings{'TCMODE'}) { + +#========================================================== +# +# Section: Set Time Constraints +# +#========================================================== + +print "
\n"; + +$buttontext = $Lang::tr{'urlfilter add rule'}; +if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit time constraint rule'}.':'); +$buttontext = $Lang::tr{'urlfilter update rule'}; +} else { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new time constraint rule'}.':'); +} +print < + + $Lang::tr{'urlfilter constraint definition'} +    + $Lang::tr{'urlfilter monday'} + $Lang::tr{'urlfilter tuesday'} + $Lang::tr{'urlfilter wednesday'} + $Lang::tr{'urlfilter thursday'} + $Lang::tr{'urlfilter friday'} + $Lang::tr{'urlfilter saturday'} + $Lang::tr{'urlfilter sunday'} +    + $Lang::tr{'urlfilter from'} +   + $Lang::tr{'urlfilter to'} +   + + + + + +   + + + + + + + +   + + +END +; +for ($i=0;$i<=45;$i+=15) { +$_ = sprintf("%02s",$i); +print "\n"; +} +print < + - + + + +END +; +for ($i=0;$i<=45;$i+=15) { +$_ = sprintf("%02s",$i); +print "\n"; +} +print < + +   + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter source'}  $Lang::tr{'urlfilter dst'} **  $Lang::tr{'urlfilter access'} 
  + +   + +  
$Lang::tr{'remark'} *    
    
+ + + + + +
$Lang::tr{'urlfilter enabled'}
+ +

+ + + + + + + + + + +
 
+

+ + + + + + + + + +
* $Lang::tr{'this field may be blank'}
** $Lang::tr{'urlfilter select multi'}
+END +; + +if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) { + print "\n"; +} else { + print "\n"; +} + +&Header::closebox(); +print "

\n"; + +&Header::openbox('100%', 'left', $Lang::tr{'current rules'}); +print < + + $Lang::tr{'urlfilter constraint definition'} + $Lang::tr{'urlfilter time space'} + $Lang::tr{'urlfilter src'} + $Lang::tr{'urlfilter dst'} +   + +END +; + +if ($tcsettings{'ACTION'} ne '' or $changed ne 'no') +{ + open(FILE, $tcfile); + @tclist = ; + close(FILE); +} + +$id = 0; +foreach $line (@tclist) +{ + $id++; + chomp($line); + @temp = split(/\,/,$line); + if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) { + print "\n"; } + elsif ($id % 2) { + print "\n"; } + else { + print "\n"; } + if ($temp[0] eq 'within') { $temp[0]=$Lang::tr{'urlfilter constraint within'}; } else { $temp[0]=$Lang::tr{'urlfilter constraint outside'}; } + if ($temp[13] eq 'any') { $temp[13]=$Lang::tr{'urlfilter category all'}; } + if ($temp[15] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};} + else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; } + if ($temp[14] eq 'block') { $led='led-red.gif'; $ldesc=$Lang::tr{'urlfilter block access'};} + else { $led='led-green.gif'; $ldesc=$Lang::tr{'urlfilter allow access'}; } + + undef $time; + if ($temp[1] eq 'on') { $time.=$Lang::tr{'urlfilter mon'}; } else { $time.='='; } + if ($temp[2] eq 'on') { $time.=$Lang::tr{'urlfilter tue'}; } else { $time.='='; } + if ($temp[3] eq 'on') { $time.=$Lang::tr{'urlfilter wed'}; } else { $time.='='; } + if ($temp[4] eq 'on') { $time.=$Lang::tr{'urlfilter thu'}; } else { $time.='='; } + if ($temp[5] eq 'on') { $time.=$Lang::tr{'urlfilter fri'}; } else { $time.='='; } + if ($temp[6] eq 'on') { $time.=$Lang::tr{'urlfilter sat'}; } else { $time.='='; } + if ($temp[7] eq 'on') { $time.=$Lang::tr{'urlfilter sun'}; } else { $time.='='; } + $time=$time.'   '.$temp[8].':'.$temp[9].' to '.$temp[10].':'.$temp[11]; + +print <$temp[0] + $time + $temp[12] + $temp[13] + $ldesc + + +
+ + + + + +
+ + + +
+ + + + +
+ + + +
+ + + + +
+ + + +END +; + if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) { + print "\n"; } + elsif ($id % 2) { + print "\n"; } + else { + print "\n"; } +print <$temp[16] + + + + +END +; +} + +print "\n"; + +# If the time constraint file contains entries, print entries and action icons +if (! -z "$tcfile") { +print < + +   $Lang::tr{'legend'}: +     $Lang::tr{ + $Lang::tr{'urlfilter allow'} +     $Lang::tr{ + $Lang::tr{'urlfilter block'} +   $Lang::tr{ + $Lang::tr{'click to disable'} +     $Lang::tr{ + $Lang::tr{'click to enable'} +     $Lang::tr{ + $Lang::tr{'edit'} +     $Lang::tr{ + $Lang::tr{'remove'} + + +END +; +} + +&Header::closebox(); + +} elsif ($uqsettings{'UQMODE'}) { + +#========================================================== +# +# Section: Set User Quota +# +#========================================================== + +print "
\n"; + +$buttontext = $Lang::tr{'urlfilter add rule'}; +if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit user quota rule'}.':'); +$buttontext = $Lang::tr{'urlfilter update rule'}; +} else { +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new user quota rule'}.':'); +} +print < + + + + + $Lang::tr{'urlfilter user time quota'}: + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter assigned quota users'}:
+ + + + $Lang::tr{'urlfilter activity detection'}: + + + + $Lang::tr{'urlfilter renewal period'}: + + + +   + + + $Lang::tr{'urlfilter enabled'} + + + + +

+ + + + + + + + + + +
 
+ +

+END +; + +if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) { + print "\n"; +} else { + print "\n"; +} + +&Header::closebox(); +print "

\n"; + +&Header::openbox('100%', 'left', $Lang::tr{'current rules'}); +print < + + $Lang::tr{'urlfilter time quota'} + $Lang::tr{'urlfilter activity detection'} + $Lang::tr{'urlfilter renewal'} + $Lang::tr{'urlfilter assigned users'} +   + +END +; + +if ($uqsettings{'ACTION'} ne '' or $changed ne 'no') +{ + open(FILE, $uqfile); + @uqlist = ; + close(FILE); +} + +$id = 0; +foreach $line (@uqlist) +{ + $id++; + chomp($line); + @temp = split(/\,/,$line); + if($uqsettings{'ACTION'} eq $Lang::tr{'edit'} && $uqsettings{'ID'} eq $id) { + print "\n"; } + elsif ($id % 2) { + print "\n"; } + else { + print "\n"; } + if ($temp[4] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};} + else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; } + + $temp[5] = $temp[1]; + if ($temp[1] eq '0') { $temp[5] = $Lang::tr{'urlfilter disabled'} } else { $temp[5] = ($temp[5]/60).' '.$Lang::tr{'urlfilter minutes'} } + $_ = $temp[3]; s/\|/, /g; $temp[6] = $_; + +print <$temp[0] $Lang::tr{'urlfilter minutes'} + $temp[5] + $Lang::tr{'urlfilter '.$temp[2]} + $temp[6] + + +
+ + + + + +
+ + + +
+ + + + +
+ + + +
+ + + + +
+ + + +END +; +} + +print "\n"; + +# If the user quota file contains entries, print entries and action icons +if (! -z "$uqfile") { +print < + +   $Lang::tr{'legend'}: +   $Lang::tr{ + $Lang::tr{'click to disable'} +     $Lang::tr{ + $Lang::tr{'click to enable'} +     $Lang::tr{ + $Lang::tr{'edit'} +     $Lang::tr{ + $Lang::tr{'remove'} + + +END +; +} + +&Header::closebox(); + +} else { + +#========================================================== +# +# Section: Blacklist editor +# +#========================================================== + +print "
\n"; + +&Header::openbox('100%', 'left', $Lang::tr{'urlfilter urlfilter blacklist editor'}.':'); + +print < + + + + + $Lang::tr{'urlfilter blacklist name'} + + + $Lang::tr{'urlfilter blacklist category name'}: + + + +
+ + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter edit domains urls expressions'}
$Lang::tr{'urlfilter domains'}$Lang::tr{'urlfilter urls'}
$Lang::tr{'urlfilter expressions'}
+
+ + + + + + + + + + + + + +
$Lang::tr{'urlfilter load blacklist'}
$Lang::tr{'urlfilter select blacklist'}: +   
+
+ + + + + + + + + + + +
$Lang::tr{'urlfilter import blacklist'}
$Lang::tr{'urlfilter import text'}:
 
+
+ + + + + + + +
$Lang::tr{'urlfilter export blacklist'}
+
+ + + + + + + + + + + + + + + + +
$Lang::tr{'urlfilter install blacklist'}
$Lang::tr{'urlfilter dont restart urlfilter'}:  

$Lang::tr{'urlfilter install information'}
+
+ + + + + + +
 
+ +END +; + +&Header::closebox(); +print "\n"; + +} + +&Header::closebigbox(); + +&Header::closepage(); + +# ------------------------------------------------------------------- + +sub savesettings +{ + &writeconfigfile; + + delete $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + delete $filtersettings{'CUSTOM_BLACK_URLS'}; + delete $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + delete $filtersettings{'CUSTOM_WHITE_URLS'}; + delete $filtersettings{'CUSTOM_EXPRESSIONS'}; + delete $filtersettings{'BACKGROUND'}; + delete $filtersettings{'UPDATEFILE'}; + + &General::writehash("${General::swroot}/urlfilter/settings", \%filtersettings); +} + +# ------------------------------------------------------------------- + +sub readblockcategories +{ + undef(@categories); + foreach $blacklist (<$dbdir/*>) { + if (-d $blacklist) { + $lastslashpos = rindex($blacklist,"/"); + if ($lastslashpos > -1) { + $section = substr($blacklist,$lastslashpos+1); + } else { + $section = $blacklist; + } + if (!($section eq 'custom')) { push(@categories,$section) }; + } + } + + @filtergroups = @categories; + foreach (@filtergroups) { + tr/a-z/A-Z/; + $_ = "FILTER_".$_; + } +} + +# ------------------------------------------------------------------- + +sub readcustomlists +{ + if (-e "$dbdir/custom/blocked/domains") { + open(FILE,"$dbdir/custom/blocked/domains"); + delete $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + while () { $filtersettings{'CUSTOM_BLACK_DOMAINS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/blocked/urls") { + open(FILE,"$dbdir/custom/blocked/urls"); + delete $filtersettings{'CUSTOM_BLACK_URLS'}; + while () { $filtersettings{'CUSTOM_BLACK_URLS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/blocked/expressions") { + open(FILE,"$dbdir/custom/blocked/expressions"); + delete $filtersettings{'CUSTOM_EXPRESSIONS'}; + while () { $filtersettings{'CUSTOM_EXPRESSIONS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/allowed/domains") { + open(FILE,"$dbdir/custom/allowed/domains"); + delete $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + while () { $filtersettings{'CUSTOM_WHITE_DOMAINS'} .= $_ }; + close(FILE); + } + if (-e "$dbdir/custom/allowed/urls") { + open(FILE,"$dbdir/custom/allowed/urls"); + delete $filtersettings{'CUSTOM_WHITE_URLS'}; + while () { $filtersettings{'CUSTOM_WHITE_URLS'} .= $_ }; + close(FILE); + } +} + +# ------------------------------------------------------------------- + +sub aggregatedconstraints +{ + my $aggregated; + my @old; + my @new; + my @tmp1; + my @tmp2; + my $x; + + if (-e $tcfile) + { + open(TC, $tcfile); + @old = ; + close(TC); + + while (@old > 0) + { + $aggregated = 0; + $x = shift(@old); + chomp($x); + @tmp1 = split(/\,/,$x); + $tmp1[16] = ''; + foreach (@new) + { + @tmp2 = split(/\,/); + if ($tmp2[15] eq 'on') + { + if (($tmp1[0] eq $tmp2[0]) && ($tmp1[12] eq $tmp2[12]) && ($tmp1[13] eq $tmp2[13]) && ($tmp1[14] eq $tmp2[14])) + { + $aggregated = 1; + $tmp2[16] .= " weekly "; + if ($tmp1[1] eq 'on') { $tmp2[16] .= "m"; } + if ($tmp1[2] eq 'on') { $tmp2[16] .= "t"; } + if ($tmp1[3] eq 'on') { $tmp2[16] .= "w"; } + if ($tmp1[4] eq 'on') { $tmp2[16] .= "h"; } + if ($tmp1[5] eq 'on') { $tmp2[16] .= "f"; } + if ($tmp1[6] eq 'on') { $tmp2[16] .= "a"; } + if ($tmp1[7] eq 'on') { $tmp2[16] .= "s"; } + $tmp2[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n"; + $_ = join(",",@tmp2); + } + + } + } + if (!$aggregated) + { + $tmp1[16] .= " weekly "; + if ($tmp1[1] eq 'on') { $tmp1[16] .= "m"; } + if ($tmp1[2] eq 'on') { $tmp1[16] .= "t"; } + if ($tmp1[3] eq 'on') { $tmp1[16] .= "w"; } + if ($tmp1[4] eq 'on') { $tmp1[16] .= "h"; } + if ($tmp1[5] eq 'on') { $tmp1[16] .= "f"; } + if ($tmp1[6] eq 'on') { $tmp1[16] .= "a"; } + if ($tmp1[7] eq 'on') { $tmp1[16] .= "s"; } + $tmp1[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n"; + $x = join(",",@tmp1); + push(@new,$x); + } + } + } + + return @new; + +} + +# ------------------------------------------------------------------- + +sub writeconfigfile +{ + my $executables = "\\.\(ade|adp|asx|bas|bat|chm|com|cmd|cpl|crt|dll|eml|exe|hiv|hlp|hta|inc|inf|ins|isp|jse|jtd|lnk|msc|msh|msi|msp|mst|nws|ocx|oft|ops|pcd|pif|plx|reg|scr|sct|sha|shb|shm|shs|sys|tlb|tsp|url|vbe|vbs|vxd|wsc|wsf|wsh\)\$"; + my $audiovideo = "\\.\(aiff|asf|avi|dif|divx|mov|movie|mp3|mpe?g?|mpv2|ogg|ra?m|snd|qt|wav|wmf|wmv\)\$"; + my $archives = "\\.\(bin|bz2|cab|cdr|dmg|gz|hqx|rar|smi|sit|sea|tar|tgz|zip\)\$"; + + my $ident = " anonymous"; + + my $defaultrule=''; + my $tcrule=''; + my $redirect=''; + my $qredirect=''; + + my $idx; + + my @ec=(); + my @tc=(); + my @uq=(); + + if (!(-d "$dbdir/custom")) { mkdir("$dbdir/custom") } + if (!(-d "$dbdir/custom/blocked")) { mkdir("$dbdir/custom/blocked") } + if (!(-d "$dbdir/custom/allowed")) { mkdir("$dbdir/custom/allowed") } + + open(FILE, ">/$dbdir/custom/blocked/domains"); + print FILE $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/urls"); + print FILE $filtersettings{'CUSTOM_BLACK_URLS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/expressions"); + print FILE $filtersettings{'CUSTOM_EXPRESSIONS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/files"); + if ($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') { print FILE "$executables\n"; } + if ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') { print FILE "$audiovideo\n"; } + if ($filtersettings{'BLOCK_ARCHIVES'} eq 'on') { print FILE "$archives\n"; } + close(FILE); + open(FILE, ">/$dbdir/custom/allowed/domains"); + print FILE $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/allowed/urls"); + print FILE $filtersettings{'CUSTOM_WHITE_URLS'}; + close(FILE); + + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { $ident = ""; } + + if ($filtersettings{'REDIRECT_PAGE'} eq '') + { + if (($filtersettings{'SHOW_CATEGORY'} eq 'on') || ($filtersettings{'SHOW_URL'} eq 'on') || ($filtersettings{'SHOW_IP'} eq 'on')) { + if ($filtersettings{'SHOW_CATEGORY'} eq 'on') { $redirect .= "&category=%t"; } + if ($filtersettings{'SHOW_URL'} eq 'on') { $redirect .= "&url=%u"; } + if ($filtersettings{'SHOW_IP'} eq 'on') { $redirect .= "&ip=%a"; } + $redirect =~ s/^&/?/; + $redirect = "http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi".$redirect; + } else { + $redirect="http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi"; + } + } else { $redirect=$filtersettings{'REDIRECT_PAGE'}; } + + if ($filtersettings{'ENABLE_DNSERROR'} eq 'on') { $redirect = "302:http://0.0.0.0"; } + + undef $defaultrule; + + if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') + { + $defaultrule .= "custom-allowed "; + } + if ($filtersettings{'BLOCK_ALL'} eq 'on') + { + $defaultrule .= "none"; + } + else + { + if ($filtersettings{'BLOCK_IP_ADDR'} eq 'on') + { + $defaultrule .= "!in-addr "; + } + for ($i=0; $i<=@filtergroups; $i++) { + if ($filtersettings{@filtergroups[$i]} eq 'on') + { + $defaultrule .= "!@categories[$i] "; + } + } + if ($filtersettings{'ENABLE_CUSTOM_BLACKLIST'} eq 'on') + { + $defaultrule .= "!custom-blocked "; + } + if ($filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} eq 'on') + { + $defaultrule .= "!custom-expressions "; + } + if (($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') || + ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') || + ($filtersettings{'BLOCK_ARCHIVES'} eq 'on')) + { + $defaultrule .= "!files "; + } + $defaultrule .= "any"; + } + + open(FILE, ">${General::swroot}/urlfilter/squidGuard.conf") or die "Unable to write squidGuard.conf file"; + flock(FILE, 2); + + print FILE "logdir /var/log/squidGuard\n"; + print FILE "dbhome $dbdir\n\n"; + + undef @repositoryfiles; + if ($filtersettings{'ENABLE_REWRITE'} eq 'on') + { + @repositorylist = <$repository/*>; + foreach (@repositorylist) + { + if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); } + } + } + + if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) + { + print FILE "rewrite rew-rule-0 {\n"; + + if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) + { + print FILE " # rewrite localfiles\n"; + foreach (@repositoryfiles) + { + print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n"; + } + } + + if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on') + { + print FILE " # rewrite safesearch\n"; + print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)(\\bsafe=\\w+)(.*)\@\\1\\3safe=strict\\5\@i\n"; + print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)\@\\1safe=strict\\\&\\3\@i\n"; + print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W)(.*)(\\bvm=\\w+)(.*)\@\\1\\2vm=r\\4\@i\n"; + print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W.*)\@\\1\\\&vm=r\@i\n"; + print FILE " s@(.*\\Walltheweb\\.com/customize\\?)(.*)(\\bcopt_offensive=\\w+)(.*)\@\\1\\2copt_offensive=on\\4\@i\n"; + } + + print FILE "}\n\n"; + + if ((!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) && ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) { + print FILE "rewrite rew-rule-1 {\n"; + if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) + { + print FILE " # rewrite localfiles\n"; + foreach (@repositoryfiles) + { + print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n"; + } + } else { + print FILE " # rewrite nothing\n"; + } + print FILE "}\n\n"; + } + } + + if (-e $uqfile) + { + open(UQ, $uqfile); + @uqlist = ; + close(UQ); + + if (@uqlist > 0) + { + $idx=0; + foreach (@uqlist) + { + chomp; + @uq = split(/\,/); + if ($uq[4] eq 'on') + { + $idx++; + $uq[0] = $uq[0] * 60; + if ($uq[1] eq '0') { + if ($uq[2] eq 'hourly') { $uq[1] = 3600 } + if ($uq[2] eq 'daily') { $uq[1] = 86400 } + if ($uq[2] eq 'weekly') { $uq[1] = 604800 } + } + $uq[3] =~ s/\|/ /g; + print FILE "src quota-$idx {\n"; + print FILE " user $uq[3]\n"; + print FILE " userquota $uq[0] $uq[1] $uq[2]\n"; + print FILE "}\n\n"; + } + } + + } + } + + @tclist = &aggregatedconstraints; + + if (@tclist > 0) + { + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + if ($tc[15] eq 'on') + { + $idx++; + print FILE "src network-$idx {\n"; + print FILE " ip $tc[12]\n"; + print FILE "}\n\n"; + } + } + + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + if ($tc[15] eq 'on') + { + $idx++; + print FILE "time constraint-$idx {\n"; + print FILE "$tc[16]\n"; + print FILE "}\n\n"; + } + } + } + + if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) { + print FILE "src unfiltered {\n"; + print FILE " ip $filtersettings{'UNFILTERED_CLIENTS'}\n"; + print FILE "}\n\n"; + } + if (!($filtersettings{'BANNED_CLIENTS'} eq '')) { + print FILE "src banned {\n"; + print FILE " ip $filtersettings{'BANNED_CLIENTS'}\n"; + print FILE "}\n\n"; + } + + foreach $category (@categories) { + print FILE "dest $category {\n"; + if (-e "$dbdir/$category/domains") { + print FILE " domainlist $category\/domains\n"; + } + if (-e "$dbdir/$category/urls") { + print FILE " urllist $category\/urls\n"; + } + if ((-e "$dbdir/$category/expressions") && ($filtersettings{'ENABLE_EXPR_LISTS'} eq 'on')) { + print FILE " expressionlist $category\/expressions\n"; + } + if (($category eq 'ads') && ($filtersettings{'ENABLE_EMPTY_ADS'} eq 'on')) + { + print FILE " redirect http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/images/urlfilter/1x1.gif\n"; + } + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident $category.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + } + + print FILE "dest files {\n"; + print FILE " expressionlist custom\/blocked\/files\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident files.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "dest custom-allowed {\n"; + print FILE " domainlist custom\/allowed\/domains\n"; + print FILE " urllist custom\/allowed\/urls\n"; + print FILE "}\n\n"; + + print FILE "dest custom-blocked {\n"; + print FILE " domainlist custom\/blocked\/domains\n"; + print FILE " urllist custom\/blocked\/urls\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident custom.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "dest custom-expressions {\n"; + print FILE " expressionlist custom\/blocked\/expressions\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident custom.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "acl {\n"; + if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) { + print FILE " unfiltered {\n"; + print FILE " pass all\n"; + if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on') + { + print FILE " rewrite rew-rule-1\n"; + } + print FILE " }\n\n"; + } + if (!($filtersettings{'BANNED_CLIENTS'} eq '')) { + print FILE " banned {\n"; + print FILE " pass "; + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none\n"; + print FILE " }\n\n"; + } + + if (-s $uqfile) + { + open(UQ, $uqfile); + @uqlist = ; + close(UQ); + + $idx=0; + foreach (@uqlist) + { + chomp; + @uq = split(/\,/); + if ($uq[4] eq 'on') + { + $idx++; + $qredirect = $redirect; + $qredirect =~ s/\%t/\%q\%20-\%20\%i/; + print FILE " quota-$idx {\n"; + print FILE " pass "; + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none\n"; + unless ($redirect eq $qredirect) { print FILE " redirect $qredirect\n"; } + print FILE " }\n\n"; + } + } + } + + if (@tclist > 0) + { + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + @ec = split(/\|/,$tc[13]); + if ($tc[15] eq 'on') + { + $idx++; + print FILE " network-$idx $tc[0] constraint-$idx {\n"; + print FILE " pass "; + + if ($filtersettings{'BLOCK_ALL'} eq 'on') + { + if ($tc[14] eq 'block') + { + if ((@ec == 1) && ($ec[0] eq 'any')) { + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none"; + } else { + print FILE $defaultrule; + } + } else { + foreach (@ec) + { + print FILE "$_ "; + } + print FILE $defaultrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } + } else { + if ($tc[14] eq 'block') + { + $tcrule = $defaultrule; + if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') { + $tcrule =~ s/custom-allowed //; + print FILE "custom-allowed " unless ((@ec == 1) && ($ec[0] eq 'any') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'off')); + } + if ((@ec == 1) && ($ec[0] eq 'any')) { + print FILE "none"; + } else { + foreach (@ec) + { + print FILE "!$_ " unless (index($defaultrule,"!".$_." ") ge 0); + } + } + print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } else { + $tcrule = $defaultrule; + foreach (@ec) + { + $tcrule =~ s/!$_ //; + print FILE "$_ " if ($_ eq 'any'); + } + print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } + } + + print FILE "\n"; + + print FILE " }\n\n"; + } + } + } + + print FILE " default {\n"; + print FILE " pass $defaultrule\n"; + if (($filtersettings{'ENABLE_LOG'} eq 'on') && ($filtersettings{'BLOCK_ALL'} eq 'on')) + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile".$ident." default.log\n"; + } else { + print FILE " logfile".$ident." urlfilter.log\n"; + } + } + if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) + { + print FILE " rewrite rew-rule-0\n"; + } + print FILE " redirect $redirect\n"; + print FILE " }\n"; + print FILE "}\n"; + + close FILE; +} + +# ------------------------------------------------------------------- diff --git a/html/html/images/urlfilter/1x1.gif b/html/html/images/urlfilter/1x1.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9104214b04064665feb230c8cafa40db433f1fc GIT binary patch literal 49 uc-nLKbhEHbWMp7uXk=sng8%>jGk}5OPZpp6BZCfz1Cn=OV)9{Rum%9&;s-^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-1h8TtzW=16jCP7AKLB{__7^E2(8JHQE85t0OnT3^+iH!p&sUyI^ z#KgqN#KOkN3YBDJVrCIEWEE0$3``UjQ8FsrXlzn6anePgYB5HTuTcOK$O=h8Mn*I# zMnNG%rvJAXcz_l&2{H>Z*facEf~u8Se3f5m>i%}iqn_$Z)p{qpT`)3OtX*J~s(JGC z$@dp?7OdO4S6ltxnS1Wb*m$?3g|b`jT(K@{-k0)&=QoKRGdp>T_x159meL7K4j|Kx zypF%R{!RS0+!=FI&1Z^CyPx!T)4p1=`7CM9Ebr+Ly8D^+;!Et$Oe|+#UZX8K-Q>v* z@0OGkCJroM@AY0)+n01)ewSgu{bk?IPTJ?AeR5Ih%H!2f?Ibq@9PZ`jyKdnY+*7?> zb)VPW+nY2sj(&T)H{VnDW&VxreV;Zidi^6{lXm-^J*-#n%5;57TJY@pRo>U9|A|<% zg`iP>onWS;=6lKzO^fhVhD+~ zTk>=EpDo2aQj1kpo^Rc6`fN)Sv#UqKA;^ay5{XzvM3}~SK G|4jgB-UJ)~ literal 0 Hc-jL100001 diff --git a/html/html/images/urlfilter/led-green.gif b/html/html/images/urlfilter/led-green.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b8ec07bfee5f97208b7d9f540a8d772bc3051e GIT binary patch literal 898 zc-lRaQAkr!9LB%9-E@TEIC=Fx4B4VgF;GL8tAXn!SCeT8F;HlV7DZ%OaQBd3(nBns-iMic$i(5b>G$64^@Ahal!a*$2Rr%|ls zpi9i>Rld$z^u03d`+*)VRS1>8fuG=6RR@#xuu?z%`(srOrP11OD9zh-sk!8W-p;sKN@-?`ndfGjz~&ie?Iw5Jux2Mxq7A4%fe9 zU52WIa1Z0JAWll<6qkW=LV@VbNN!A$!Y0$UpsFBTAD%~x6FcVlXpdthk1*Fq{rMX! zbRf(|-MxkG5g~sCWCXaLP7P!VY_DPw2<5w>O{A9o7UUj_Y!t0d3H(sa@p`GkCQDsh z_I4wYhe3F7scsbVmIu$SD1cq!W4wp|69LCXR61P2)#s-s*==?9V&cP0MU`tY_$Hcv zAU8MM*4lmDx;M}L$USt0&d+LVN3_SSgF{vLHFWk#!-4zlo4qUHdrh95!|~&d Vm^)f22RF#@=ND}+GgS_p{0FNR?LYtk literal 0 Hc-jL100001 diff --git a/html/html/images/urlfilter/led-red.gif b/html/html/images/urlfilter/led-red.gif new file mode 100644 index 0000000000000000000000000000000000000000..4bce21f24140beaa1993963192a87ddafc063138 GIT binary patch literal 898 zc-l>qUr19?9LK-+k11kooHp=bgzJwf4%E<0+QW?~t&M2~F>ufnEfUGFaC^v7Svbnj zw<0X^rm!AN3+idzyG?~fJ~)WzMTlrVkCI|FI-PUxv<}?M_x$efe15;*mvh@rpE}yw zZG#Ozfruza#v=u>Kq)PVa^X+G4g#PF0*sa5uR6dFWPs2FZtcT)Q^#f12??;UjLWVn zXfTfA!axEGB8ZLYr7#f}%(%#qMJUHTc?;16Pwe**~NyF0&4CB)D8pgk)nJ_&^%XQjH=m*eHSWt94CiuvxL(l2Ze(Gzc7^W+( z7}WxlWGJh)ID%OVj+|s?{T=G-Uy|np=f_;poTd|_2e)?v2$=KEsj4nX#KLpJsM6V3 z3hylzPUJL^81oh_;7bfbNN)E}g#n5#iY%`?I)a2;OqBo2nhat&3Bq;13MKYX~4%y-M#^DpOCr&(g$3P z#{yaoWP5_0fk$KbokNEiA4G$-c$+pB5fG7S<7TN|ZlcA=sqg|tL!Eh4#SQU&ePn489X4+o{Q}-(Cs&A$ndse6Rv=Hn1*)Pfa4$ryC^s9sE v2Mygl75LV3=27+TyRP-ldEcE{=jMUv;TlXGDz&x0Bfalu8=q+vWjOX12?F61 literal 0 Hc-jL100001 diff --git a/langs/de/cgi-bin/de.pl b/langs/de/cgi-bin/de.pl index e6e05694c6..41fef851cf 100644 --- a/langs/de/cgi-bin/de.pl +++ b/langs/de/cgi-bin/de.pl @@ -1282,6 +1282,198 @@ 'iptable rules' => 'IPTable-Regeln', 'iptmangles' => 'IPTable Mangles', 'iptnats' => 'IPTable Network Address Translation', +'urlfilter url filter' => 'URL-Filter', +'urlfilter filter settings' => 'URL-Filter Einstellungen', +'urlfilter configuration' => 'URL-Filter Konfiguration', +'urlfilter enabled' => 'Aktiviert:', +'urlfilter block categories' => 'Sperrkategorien', +'urlfilter no categories' => 'Keine Kategorien verfügbar', +'urlfilter custom blacklist' => 'Angepasste Blacklist', +'urlfilter blocked domains' => 'Gesperrte Domains (eine pro Zeile)', +'urlfilter blocked urls' => 'Gesperrte URLs (eine pro Zeile)', +'urlfilter enable custom blacklist' => 'Angepasste Blacklist aktivieren', +'urlfilter custom whitelist' => 'Angepasste Whitelist', +'urlfilter allowed domains' => 'Erlaubte Domains (eine pro Zeile)', +'urlfilter allowed urls' => 'Erlaubte URLs (eine pro Zeile)', +'urlfilter enable custom whitelist' => 'Angepasste Whitelist aktivieren', +'urlfilter custom expression list' => 'Angepasste Ausdrucksliste', +'urlfilter blocked expressions' => 'Gesperrte Ausdrücke (als reguläre Ausdrücke)', +'urlfilter enable custom expression list' => 'Angepasste Ausdrucksliste aktivieren', +'urlfilter network access control' => 'Netzwerkbasierte Zugriffskontrolle', +'urlfilter timebased access control' => 'Zeitbasierte Zugriffskontrolle', +'urlfilter set time constraints' => 'Zeitbeschränkungen setzen', +'urlfilter set user quota' => 'Benutzerzeitkontingente setzen', +'urlfilter local file redirection' => 'Lokale Dateiumleitung', +'urlfilter enable rewrite rules' => 'Aktiviere lokale Dateiumleitung', +'urlfilter manage repository' => 'Ablage verwalten', +'urlfilter file ext block' => 'Sperrung von Dateierweiterungen', +'urlfilter block executables' => 'Sperre ausführbare Dateien', +'urlfilter block audio-video' => 'Sperre Audio/Video-Dateien', +'urlfilter block archives' => 'Sperre komprimierte Archivdateien', +'urlfilter unfiltered clients' => 'Ungefilterte IP-Adressen', +'urlfilter banned clients' => 'Gesperrte IP-Adressen', +'urlfilter block settings' => 'Sperrseiteneinstellungen', +'urlfilter show category' => 'Zeige Kategorie auf der Sperrseite', +'urlfilter show url' => 'Zeige URL auf der Sperrseite', +'urlfilter show ip' => 'Zeige IP auf der Sperrseite', +'urlfilter show dnserror' => 'Verwende "DNS Error" zum Sperren von URLs', +'urlfilter enable jpeg' => 'Aktiviere Hintergrundbild', +'urlfilter upload background' => 'Bild hochladen', +'urlfilter background text' => 'Um ein angepasstes Hintergrundbild für die Sperrseite zu verwenden kann hier eine .jpg-Datei hochgeladen werden', +'urlfilter redirectpage' => 'Leite zu dieser URL um', +'urlfilter msg text 1' => 'Nachricht Zeile 1', +'urlfilter msg text 2' => 'Nachricht Zeile 2', +'urlfilter msg text 3' => 'Nachricht Zeile 3', +'urlfilter advanced settings' => ' Erweiterte Einstellungen', +'urlfilter block ip' => 'Sperre Seiten auf die über die IP-Adresse zugegriffen wird', +'urlfilter enable expression lists' => ' Aktiviere Ausdruckslisten', +'urlfilter enable log' => 'Aktiviere Protokoll', +'urlfilter username log' => 'Protokolliere Benutzername', +'urlfilter category log' => 'Protokoll in Kategorien aufteilen', +'urlfilter block all' => 'Sperre alle URLs die nicht ausdrücklich erlaubt sind', +'urlfilter empty ads' => 'Sperre "ads" mit leerem Fenster', +'urlfilter children' => 'Anzahl der Filterprozesse', +'urlfilter safesearch' => 'Aktiviere SafeSearch', +'urlfilter whitelist always allowed' => 'Erlaube angepasste Whitelist für gesperrte Clients', +'urlfilter save and restart' => 'Speichern und Neustart', +'urlfilter maintenance' => 'URL-Filter Wartung', +'urlfilter blacklist update' => 'Aktualisierung der Blacklist', +'urlfilter upload information' => 'Die neue Blacklist wird automatisch in vorgefertigte Datenbanken übersetzt. Abhängig von der Größe der Blacklist kann dies einige Minuten dauern. Der URL-Filter sollte erst nach Abschluss der Konvertierung neu gestartet werden.', +'urlfilter upload text' => 'Um eine aktualisierte Blacklist zu installieren kann hier die .tar.gz-Datei hochgeladen werden', +'urlfilter upload blacklist' => 'Blacklist hochladen', +'urlfilter automatic blacklist update' => 'Automatisches Blacklist-Update', +'urlfilter enable automatic blacklist update' => 'Automatisches Update aktivieren', +'urlfilter automatic update schedule' => 'Zeitplan für Automatische Updates', +'urlfilter select source' => 'Downloadquelle auswählen', +'urlfilter custom url' => 'Angepasste Quellen-URL', +'urlfilter blacklist age 1' => 'Letztes erfolgreiches Blacklist-Update war vor', +'urlfilter blacklist age 2' => 'Tagen', +'urlfilter save schedule' => 'Updateeinstellungen speichern', +'urlfilter update now' => 'Jetzt updaten', +'urlfilter custom url required' => 'Angepasste Quellen-URL erforderlich', +'urlfilter backup settings' => 'Sicherung der URL-Filter Einstellungen', +'urlfilter enable full backup' => 'Komplette Blacklist einbeziehen', +'urlfilter backup' => 'Sicherungsdatei erstellen', +'urlfilter restore settings' => 'Wiederherstellung der URL-Filter Einstellungen', +'urlfilter restore text' => 'Um eine vorher gesicherte Konfiguration wieder herzustellen kann hier eine .tar.gz-Sicherungsdatei hochgeladen werden', +'urlfilter restore' => 'Sicherungsdatei importieren', +'urlfilter update results' => 'Blacklist Aktualisierungsergebnisse', +'urlfilter upload success' => 'Blacklist erfolgreich hochgeladen.', +'urlfilter restore results' => 'Ergebnisse der Wiederherstellung', +'urlfilter restore success' => 'Die URL-Filter Konfiguration wurde wieder hergestellt. Um die neuen Einstellungen zu aktivieren muss der URL-Filter neu gestartet werden.', +'urlfilter web proxy service required' => 'Um der URL-Filter zu verwenden muss der Web-Proxy-Dienst aktiviert sein', +'urlfilter not enabled' => 'Der URL-Filter ist auf der Web-Proxy Seite nicht aktiviert', +'urlfilter invalid num of children' => 'Ungültige Anzahl Filterprozesse', +'urlfilter wrong filetype' => 'Die Datei hat nicht die Erweiterung .tar.gz', +'urlfilter tar error' => 'Konnte die Dateien nicht aus dem Archiv extrahieren', +'urlfilter invalid content' => 'Datei ist keine squidGuard-kompatible Blacklist', +'urlfilter invalid restore file' => 'Datei ist keine gültige URL-Filter Sicherungsdatei', +'urlfilter backup error' => 'Sicherungsdatei kann nicht erstellt werden', +'urlfilter manage local file repository' => 'Lokale Dateiablage verwalten', +'urlfilter repository information' => 'Downloadanforderungen für diese Dateien werden von der ursprünglichen Quelle auf die lokale Dateiablage umgeleitet.', +'urlfilter upload file text' => 'Um eine Datei der lokalen Dateiablage hinzuzufügen kann die Datei hier hochgeladen werden', +'urlfilter upload file' => 'Datei hochladen', +'urlfilter upload file information 1' => 'Hinweis', +'urlfilter upload file information 2' => 'Der URL-Filter muss neu gestartet werden, damit die geänderte Dateiablage wirksam wird.', +'urlfilter current files' => 'Aktuelle Dateien in der lokalen Dateiablage', +'urlfilter empty repository' => 'Die lokale Dateiablage ist leer', +'urlfilter filename' => 'Name', +'urlfilter filesize' => 'Größe', +'urlfilter remove file' => 'Datei aus der Ablage entfernen', +'urlfilter restart notification' => 'Geänderte Regeln aktivieren', +'urlfilter restart message' => 'Um die geänderten Regeln zu aktivieren muss der URL-Filter neu gestartet werden', +'urlfilter restart' => 'URL-Filter neu starten', +'urlfilter edit time constraint rule' => 'Bestehende Zeitbeschränkungsregel ändern', +'urlfilter add new time constraint rule' => 'Neue Zeitbeschränkungsregel hinzufügen', +'urlfilter add rule' => 'Hinzufügen', +'urlfilter update rule' => 'Aktualisieren', +'urlfilter reset' => 'Zurücksetzen', +'urlfilter constraint definition' => 'Definition', +'urlfilter time space' => 'Zeitraum', +'urlfilter from' => 'Von', +'urlfilter to' => 'Bis', +'urlfilter source' => 'Quellhost(s) oder -netzwerk(e)', +'urlfilter src' => 'Quelle', +'urlfilter dst' => 'Ziel', +'urlfilter access' => 'Zugriff', +'urlfilter allow access' => 'Zugriff erlauben', +'urlfilter block access' => 'Zugriff sperren', +'urlfilter allow' => 'Erlauben', +'urlfilter block' => 'Sperren', +'urlfilter constraint within' => 'innerhalb', +'urlfilter constraint outside' => 'ausserhalb', +'urlfilter mode allow' => 'erlauben', +'urlfilter mode block' => 'sperren', +'urlfilter category all' => 'alle', +'urlfilter select multi' => 'Mehrfachauswahl von Kategorien mit der Strg-Taste', +'urlfilter monday' => 'Mon', +'urlfilter tuesday' => 'Die', +'urlfilter wednesday' => 'Mit', +'urlfilter thursday' => 'Don', +'urlfilter friday' => 'Fre', +'urlfilter saturday' => 'Sam', +'urlfilter sunday' => 'Son', +'urlfilter mon' => 'M', +'urlfilter tue' => 'D', +'urlfilter wed' => 'M', +'urlfilter thu' => 'D', +'urlfilter fri' => 'F', +'urlfilter sat' => 'S', +'urlfilter sun' => 'S', +'urlfilter back to main page' => 'Zurück zur Hauptseite', +'urlfilter timespace error' => 'Fehler bei der Angabe des Zeitraumes', +'urlfilter weekday error' => 'Es muss mindestens ein Tag ausgewählt werden', +'urlfilter src error' => 'Quelle darf nicht leer sein', +'urlfilter dst error' => 'Es muss mindestens eine Kategorie ausgewählt werden', +'urlfilter logs' => 'URL-Filter-Logdateien', +'urlfilter log viewer' => 'Ansicht URL-Filter-Log', +'urlfilter log summary' => 'Gesamtanzahl der URL-Filter-Treffer für', +'urlfilter time' => 'Zeit', +'urlfilter category' => 'Kategorie', +'urlfilter client' => 'Client', +'urlfilter username' => 'Benutzername', +'urlfilter edit user quota rule' => 'Bestehende Zeitkontingentsregel für Benutzer ändern', +'urlfilter add new user quota rule' => 'Neue Zeitkontingentsregel für Benutzer hinzufügen', +'urlfilter user time quota' => 'Zeitkontingent (in Minuten)', +'urlfilter disabled' => 'deaktiviert', +'urlfilter minutes' => 'Minuten', +'urlfilter hourly' => 'stündlich', +'urlfilter daily' => 'täglich', +'urlfilter weekly' => 'wöchentlich', +'urlfilter monthly' => 'monatlich', +'urlfilter assigned quota users' => 'Zugewiesene Benutzer (einer pro Zeile)', +'urlfilter activity detection' => 'Aktivitätserkennung', +'urlfilter renewal period' => 'Erneuerungsperiode', +'urlfilter renewal' => 'Erneuerung', +'urlfilter time quota' => 'Zeitkontingent', +'urlfilter assigned users' => 'Zugewiesene Benutzer', +'urlfilter quota time error' => 'Ungültiger Wert für Zeitkontingent', +'urlfilter quota user error' => 'Mindestens ein Benutzername erforderlich', +'urlfilter invalid user error' => 'Ungültiger Benutzername', +'urlfilter quota restart message' => 'Hinweis: Beim Neustart des URL-Filters werden die Zähler für alle Benutzer zurückgesetzt', +'urlfilter blacklist editor' => 'Blacklist-Editor', +'urlfilter urlfilter blacklist editor' => 'URL-Filter Blacklist-Editor', +'urlfilter blacklist editor info' => 'Erstellen und editieren von eigenen Blacklistdateien', +'urlfilter blacklist name' => 'Name der Blacklist', +'urlfilter blacklist category name' => 'Blacklist Kategoriename', +'urlfilter edit domains urls expressions' => 'Editieren von Domains, URLs und Ausdrücken', +'urlfilter domains' => 'Domains (eine pro Zeile)', +'urlfilter urls' => 'URLs (eine pro Zeile)', +'urlfilter expressions' => 'Ausdrücke (einen pro Zeile)', +'urlfilter import blacklist' => 'Blacklist importieren', +'urlfilter import text' => 'Um eine vorher gespeicherte Blacklist-Editor Datei zu installieren kann hier die .tar.gz-Datei hochgeladen werden', +'urlfilter export blacklist' => 'Blacklist exportieren', +'urlfilter select blacklist' => 'Vorhandene Blacklist auswählen', +'urlfilter load blacklist' => 'Blacklist laden', +'urlfilter install blacklist' => 'Blacklist installieren', +'urlfilter install information' => 'Die neue Blacklist wird automatisch in vorgefertigte Datenbanken übersetzt. Abhängig von der Größe der Blacklist kann dies einige Minuten dauern.', +'urlfilter dont restart urlfilter' => 'URL-Filter nicht neu starten', +'urlfilter category name error' => 'Blacklist Kategoriename erforderlich', +'urlfilter category data error' => 'Blacklist ist leer', +'urlfilter invalid import file' => 'Datei ist keine gültige URL-Filter Blacklist-Editor Datei', +'urlfilter export error' => 'Kann Exportdatei nicht erstellen', +'urlfilter update notification' => 'Update-Benachrichtigung!', +'urlfilter update information' => 'Eine aktualisierte Version steht zum Download bereit. Besuchen Sie http://www.urlfilter.net für weitere Informationen.', ); diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl index 1c52301d42..64f1566abe 100644 --- a/langs/en/cgi-bin/en.pl +++ b/langs/en/cgi-bin/en.pl @@ -1315,5 +1315,197 @@ 'iptable rules' => 'IPTable rules', 'iptmangles' => 'IPTable Mangles', 'iptnats' => 'IPTable Network Address Translation', +'urlfilter url filter' => 'URL filter', +'urlfilter filter settings' => 'URL filter settings', +'urlfilter configuration' => 'URL filter configuration', +'urlfilter enabled' => 'Enabled:', +'urlfilter block categories' => 'Block categories', +'urlfilter no categories' => 'No categories available', +'urlfilter custom blacklist' => 'Custom blacklist', +'urlfilter blocked domains' => 'Blocked domains (one per line)', +'urlfilter blocked urls' => 'Blocked URLs (one per line)', +'urlfilter enable custom blacklist' => 'Enable custom blacklist', +'urlfilter custom whitelist' => 'Custom whitelist', +'urlfilter allowed domains' => 'Allowed domains (one per line)', +'urlfilter allowed urls' => 'Allowed URLs (one per line)', +'urlfilter enable custom whitelist' => 'Enable custom whitelist', +'urlfilter custom expression list' => 'Custom expression list', +'urlfilter blocked expressions' => 'Blocked expressions (as regular expressions)', +'urlfilter enable custom expression list' => 'Enable custom expression list', +'urlfilter network access control' => 'Network based access control', +'urlfilter timebased access control' => 'Time based access control', +'urlfilter set time constraints' => 'Set time constraints', +'urlfilter set user quota' => 'Set user quota', +'urlfilter local file redirection' => 'Local file redirection', +'urlfilter enable rewrite rules' => 'Enable local file redirection', +'urlfilter manage repository' => 'Manage repository', +'urlfilter file ext block' => 'File extension blocking', +'urlfilter block executables' => 'Block executable files', +'urlfilter block audio-video' => 'Block audio/video files', +'urlfilter block archives' => 'Block compressed archive files', +'urlfilter unfiltered clients' => 'Unfiltered IP addresses', +'urlfilter banned clients' => 'Banned IP addresses', +'urlfilter block settings' => 'Block page settings', +'urlfilter show category' => 'Show category on block page', +'urlfilter show url' => 'Show URL on block page', +'urlfilter show ip' => 'Show IP on block page', +'urlfilter show dnserror' => 'Use "DNS Error" to block URLs', +'urlfilter enable jpeg' => 'Enable background image', +'urlfilter upload background' => 'Upload image', +'urlfilter background text' => 'To use a custom background image for the block page upload the .jpg file below', +'urlfilter redirectpage' => 'Redirect to this URL', +'urlfilter msg text 1' => 'Message line 1', +'urlfilter msg text 2' => 'Message line 2', +'urlfilter msg text 3' => 'Message line 3', +'urlfilter advanced settings' => 'Advanced settings', +'urlfilter block ip' => 'Block sites accessed by it\'s IP address', +'urlfilter enable expression lists' => 'Enable expression lists', +'urlfilter enable log' => 'Enable log', +'urlfilter username log' => 'Log username', +'urlfilter category log' => 'Split log by categories', +'urlfilter block all' => 'Block all URLs not explicitly allowed', +'urlfilter empty ads' => 'Block "ads" with empty window', +'urlfilter children' => 'Number of filter processes', +'urlfilter safesearch' => 'Enable SafeSearch', +'urlfilter whitelist always allowed' => 'Allow custom whitelist for banned clients', +'urlfilter save and restart' => 'Save and restart', +'urlfilter maintenance' => 'URL filter maintenance', +'urlfilter blacklist update' => 'Blacklist update', +'urlfilter upload information' => 'The new blacklist will be automatically compiled to prebuilt databases. Depending on the size of the blacklist, this may take several minutes. Please wait for this task to be finished before restarting the URL filter.', +'urlfilter upload text' => 'To install an updated blacklist upload the .tar.gz file below', +'urlfilter upload blacklist' => 'Upload blacklist', +'urlfilter automatic blacklist update' => 'Automatic blacklist update', +'urlfilter enable automatic blacklist update' => 'Enable automatic update', +'urlfilter automatic update schedule' => 'Automatic update schedule', +'urlfilter select source' => 'Select download source', +'urlfilter custom url' => 'Custom source URL', +'urlfilter blacklist age 1' => 'Last successful blacklist update was', +'urlfilter blacklist age 2' => 'days ago', +'urlfilter save schedule' => 'Save update settings', +'urlfilter update now' => 'Update now', +'urlfilter custom url required' => 'Custom source URL required', +'urlfilter backup settings' => 'Backup URL filter settings', +'urlfilter enable full backup' => 'Include complete blacklist', +'urlfilter backup' => 'Create backup file', +'urlfilter restore settings' => 'Restore URL filter settings', +'urlfilter restore text' => 'To restore a previously saved configuration upload the .tar.gz backup file below', +'urlfilter restore' => 'Import backup file', +'urlfilter update results' => 'Blacklist update results', +'urlfilter upload success' => 'Blacklist upload successfully completed.', +'urlfilter restore results' => 'Restore results', +'urlfilter restore success' => 'URL filter configuration has been restored. The URL filter must be restarted to activate the new settings.', +'urlfilter web proxy service required' => 'Web proxy service must be enabled to use URL filter', +'urlfilter not enabled' => 'URL filter is not enabled on the Web proxy page', +'urlfilter invalid num of children' => 'Invalid number of filter processes', +'urlfilter wrong filetype' => 'File has not the extension .tar.gz', +'urlfilter tar error' => 'Could not extract files from tar archive', +'urlfilter invalid content' => 'File is not a squidGuard compatible blacklist', +'urlfilter invalid restore file' => 'File is not a valid URL filter backup file', +'urlfilter backup error' => 'Unable to create backup file', +'urlfilter manage local file repository' => 'Manage local file repository', +'urlfilter repository information' => 'Download requests for these files will be redirected from the original source to the local file repository.', +'urlfilter upload file text' => 'To add a file to the local repository upload the file below', +'urlfilter upload file' => 'Upload file', +'urlfilter upload file information 1' => 'Note', +'urlfilter upload file information 2' => 'The URL filter needs to be restarted to activate changes to the repository.', +'urlfilter current files' => 'Current files in local repository', +'urlfilter empty repository' => 'Local file repository is empty', +'urlfilter filename' => 'Name', +'urlfilter filesize' => 'Size', +'urlfilter remove file' => 'Remove file from repository', +'urlfilter restart notification' => 'Activate changed rules', +'urlfilter restart message' => 'The URL filter must be restarted to activate the changed rules', +'urlfilter restart' => 'Restart URL filter', +'urlfilter edit time constraint rule' => 'Edit an existing time constraint rule', +'urlfilter add new time constraint rule' => 'Add new time constraint rule', +'urlfilter add rule' => 'Add', +'urlfilter update rule' => 'Update', +'urlfilter reset' => 'Reset', +'urlfilter constraint definition' => 'Definition', +'urlfilter time space' => 'Time space', +'urlfilter from' => 'From', +'urlfilter to' => 'To', +'urlfilter source' => 'Source host(s) or network(s)', +'urlfilter src' => 'Source', +'urlfilter dst' => 'Destination', +'urlfilter access' => 'Access', +'urlfilter allow access' => 'Allow access', +'urlfilter block access' => 'Block access', +'urlfilter allow' => 'Allow', +'urlfilter block' => 'Block', +'urlfilter constraint within' => 'within', +'urlfilter constraint outside' => 'outside', +'urlfilter mode allow' => 'allow', +'urlfilter mode block' => 'block', +'urlfilter category all' => 'any', +'urlfilter select multi' => 'Press Ctrl key to select multiple categories', +'urlfilter monday' => 'Mon', +'urlfilter tuesday' => 'Tue', +'urlfilter wednesday' => 'Wed', +'urlfilter thursday' => 'Thu', +'urlfilter friday' => 'Fri', +'urlfilter saturday' => 'Sat', +'urlfilter sunday' => 'Sun', +'urlfilter mon' => 'M', +'urlfilter tue' => 'T', +'urlfilter wed' => 'W', +'urlfilter thu' => 'T', +'urlfilter fri' => 'F', +'urlfilter sat' => 'S', +'urlfilter sun' => 'S', +'urlfilter back to main page' => 'Back to main page', +'urlfilter timespace error' => 'Error in time space declaration', +'urlfilter weekday error' => 'There must be at least one day selected', +'urlfilter src error' => 'Source cannot be empty', +'urlfilter dst error' => 'There must be at least one category selected', +'urlfilter logs' => 'URL filter logs', +'urlfilter log viewer' => 'URL filter log viewer', +'urlfilter log summary' => 'Total number of URL filter hits for', +'urlfilter time' => 'Time', +'urlfilter category' => 'Category', +'urlfilter client' => 'Client', +'urlfilter username' => 'Username', +'urlfilter edit user quota rule' => 'Edit an existing user quota rule', +'urlfilter add new user quota rule' => 'Add new user quota rule', +'urlfilter user time quota' => 'Time quota (in minutes)', +'urlfilter disabled' => 'disabled', +'urlfilter minutes' => 'minutes', +'urlfilter hourly' => 'hourly', +'urlfilter daily' => 'daily', +'urlfilter weekly' => 'weekly', +'urlfilter monthly' => 'monthly', +'urlfilter assigned quota users' => 'Assigned users (one per line)', +'urlfilter activity detection' => 'Activity detection', +'urlfilter renewal period' => 'Renewal period', +'urlfilter renewal' => 'Renewal', +'urlfilter time quota' => 'Time quota', +'urlfilter assigned users' => 'Assigned users', +'urlfilter quota time error' => 'Invalid value for time quota', +'urlfilter quota user error' => 'At least one username is required', +'urlfilter invalid user error' => 'Invalid username', +'urlfilter quota restart message' => 'Note: The counters will be reset for all users when restarting the URL filter', +'urlfilter blacklist editor' => 'Blacklist editor', +'urlfilter urlfilter blacklist editor' => 'URL filter blacklist editor', +'urlfilter blacklist editor info' => 'Create and edit your own blacklist files', +'urlfilter blacklist name' => 'Blacklist name', +'urlfilter blacklist category name' => 'Blacklist category name', +'urlfilter edit domains urls expressions' => 'Edit domains, URLs and expressions', +'urlfilter domains' => 'Domains (one per line)', +'urlfilter urls' => 'URLs (one per line)', +'urlfilter expressions' => 'Expressions (one per line)', +'urlfilter import blacklist' => 'Import blacklist', +'urlfilter import text' => 'To import a previously saved blacklist editor file upload the .tar.gz file below', +'urlfilter export blacklist' => 'Export blacklist', +'urlfilter select blacklist' => 'Select existing blacklist', +'urlfilter load blacklist' => 'Load blacklist', +'urlfilter install blacklist' => 'Install blacklist', +'urlfilter install information' => 'The new blacklist will be automatically compiled to prebuilt databases. Depending on the size of the blacklist, this may take several minutes.', +'urlfilter dont restart urlfilter' => 'Do not restart URL filter', +'urlfilter category name error' => 'Blacklist category name required', +'urlfilter category data error' => 'Blacklist is empty', +'urlfilter invalid import file' => 'File is not a valid URL filter blacklist editor file', +'urlfilter export error' => 'Unable to create export file', +'urlfilter update notification' => 'Update notification!', +'urlfilter update information' => 'There is an updated version available for download. Visit http://www.urlfilter.net for more information.', ); diff --git a/lfs/configroot b/lfs/configroot index 978ccc3669..48c4ff2092 100644 --- a/lfs/configroot +++ b/lfs/configroot @@ -52,7 +52,7 @@ $(TARGET) : # Create all directories for i in addon-lang alcatelusb auth backup backup/sets ca certs cnx_pci crls ddns dhcp dhcpc dmzholes \ eagle-usb eciadsl ethernet isdn key langs logging main modem net-traffic nfs optionsfw patches pakfire portfw \ - ppp private proxy/advanced qos red remote snort time uplinks vpn wireless xtaccess ; do \ + ppp private proxy/advanced qos red remote snort time urlfilter/autoupdate urlfilter/bin vpn wireless xtaccess ; do \ mkdir -p $(CONFIG_ROOT)/$$i; \ done diff --git a/lfs/linux b/lfs/linux index 32c794cad2..c9144b30ab 100644 --- a/lfs/linux +++ b/lfs/linux @@ -157,7 +157,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ip_conntrack_standalone-patch-for-ipfire.patch # give kernel the name ipfire - cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/linux-2.4.31-ipfire.patch + # cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/linux-2.4.31-ipfire.patch ifeq "$(SMP)" "" # Only do this once on the non-SMP pass diff --git a/lfs/squid b/lfs/squid index cbae8e0390..82f7e6cbb3 100644 --- a/lfs/squid +++ b/lfs/squid @@ -103,5 +103,26 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) touch /var/log/squid/access.log chown -R squid:squid /var/log/squid /var/log/cache + # URL-Filter + -mkdir /etc/squidGuard /home/httpd/html/repository + cp -f $(DIR_CONF)/urlfilter/autoupdate.urls /var/ipfire/urlfilter/autoupdate/autoupdate.urls + ln -fs /bin/false /var/ipfire/urlfilter/autoupdate/cron.daily + ln -fs /bin/false /var/ipfire/urlfilter/autoupdate/cron.weekly + ln -fs /bin/false /var/ipfire/urlfilter/autoupdate/cron.monthly + cp -f $(DIR_CONF)/urlfilter/squidGuard.conf /var/ipfire/urlfilter/squidGuard.conf + ln -fs /var/ipfire/urlfilter/squidGuard.conf /etc/squidGuard/squidGuard.conf + cp -f $(DIR_CONF)/urlfilter/prebuild.pl /var/ipfire/urlfilter/bin/prebuild.pl + chmod 755 /var/ipfire/urlfilter/bin/prebuild.pl + cp -f $(DIR_CONF)/urlfilter/autoupdate.pl /var/ipfire/urlfilter/bin/autoupdate.pl + chmod 755 /var/ipfire/urlfilter/bin/autoupdate.pl + echo "1.7.1" > /var/ipfire/urlfilter/version + + /bin/tar --no-same-owner -xzf $(DIR_CONF)/urlfilter/blacklists.tar.gz -C /var/ipfire/urlfilter + /usr/bin/perl $(DIR_CONF)/urlfilter/makeconf.pl + chown -R nobody:nobody /var/ipfire/urlfilter + chown -R nobody:nobody /home/httpd/html/images/urlfilter + chown -R nobody:nobody /home/httpd/html/repository + chown -R squid:squid /var/log/squidGuard + @rm -rf $(DIR_APP) @$(POSTBUILD) diff --git a/lfs/squidguard b/lfs/squidguard index a6c94b7bc7..e54623bed1 100644 --- a/lfs/squidguard +++ b/lfs/squidguard @@ -75,7 +75,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/squidGuard-$(VER)-ipfire.patch cd $(DIR_APP) && ./configure --prefix=/usr --datadir=/usr/share \ --sysconfdir=/etc --localstatedir=/var --infodir=/usr/info --mandir=/usr/man \ - --with-sg-config=/var/ipfire/proxy/squidguard.conf \ + --with-sg-config=/var/ipfire/urlfilter/squidGuard.conf \ --with-sg-logdir=/var/log/squidguard --with-sg-dbhome=/var/lib/squidguard \ --with-db=/usr --with-db-inc=/usr/include --with-db-lib=/usr/lib cd $(DIR_APP) && make -- 2.39.2