From: ms Date: Fri, 30 Jun 2006 14:25:35 +0000 (+0000) Subject: Hinzugefügt: X-Git-Tag: v2.3-beta1~1069 X-Git-Url: http://git.ipfire.org/?p=people%2Fpmueller%2Fipfire-2.x.git;a=commitdiff_plain;h=10e4f2395ed42d50545ef9c3d73994b542e09dac Hinzugefügt: * URL-Filter git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@185 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- 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 0000000000..dc21990be9 Binary files /dev/null and b/config/urlfilter/blacklists.tar.gz differ diff --git a/config/urlfilter/makeconf.pl b/config/urlfilter/makeconf.pl new file mode 100644 index 0000000000..8a2e5428d5 --- /dev/null +++ b/config/urlfilter/makeconf.pl @@ -0,0 +1,159 @@ +#!/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 +#!/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 0000000000..e9104214b0 Binary files /dev/null and b/html/html/images/urlfilter/1x1.gif differ diff --git a/html/html/images/urlfilter/background.jpg b/html/html/images/urlfilter/background.jpg new file mode 100644 index 0000000000..9520c38b3a Binary files /dev/null and b/html/html/images/urlfilter/background.jpg differ diff --git a/html/html/images/urlfilter/led-green.gif b/html/html/images/urlfilter/led-green.gif new file mode 100644 index 0000000000..f8b8ec07bf Binary files /dev/null and b/html/html/images/urlfilter/led-green.gif differ diff --git a/html/html/images/urlfilter/led-red.gif b/html/html/images/urlfilter/led-red.gif new file mode 100644 index 0000000000..4bce21f241 Binary files /dev/null and b/html/html/images/urlfilter/led-red.gif differ 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