From 10e4f2395ed42d50545ef9c3d73994b542e09dac Mon Sep 17 00:00:00 2001 From: ms Date: Fri, 30 Jun 2006 14:25:35 +0000 Subject: [PATCH] =?UTF-8?q?Hinzugef=C3=BCgt:=20=20=20*=20URL-Filter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@185 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- config/cron/crontab | 7 +- config/etc/logrotate.conf | 9 + config/httpd/httpd.conf | 5 +- config/urlfilter/autoupdate.pl | 522 ++ config/urlfilter/autoupdate.urls | 9 + config/urlfilter/blacklists.tar.gz | Bin 0 -> 329408 bytes config/urlfilter/makeconf.pl | 159 + config/urlfilter/prebuild.pl | 96 + config/urlfilter/squidGuard.conf | 24 + html/cgi-bin/logs.cgi/urlfilter.dat | 1353 ++++ html/cgi-bin/proxy.cgi | 30 +- html/cgi-bin/redirect.cgi | 498 ++ html/cgi-bin/urlfilter.cgi | 9012 +++++++++++++++++++++ html/html/images/urlfilter/1x1.gif | Bin 0 -> 49 bytes html/html/images/urlfilter/background.jpg | Bin 0 -> 775 bytes html/html/images/urlfilter/led-green.gif | Bin 0 -> 898 bytes html/html/images/urlfilter/led-red.gif | Bin 0 -> 898 bytes langs/de/cgi-bin/de.pl | 192 + langs/en/cgi-bin/en.pl | 192 + lfs/configroot | 2 +- lfs/linux | 2 +- lfs/squid | 21 + lfs/squidguard | 2 +- 23 files changed, 12128 insertions(+), 7 deletions(-) create mode 100644 config/urlfilter/autoupdate.pl create mode 100644 config/urlfilter/autoupdate.urls create mode 100644 config/urlfilter/blacklists.tar.gz create mode 100644 config/urlfilter/makeconf.pl create mode 100644 config/urlfilter/prebuild.pl create mode 100644 config/urlfilter/squidGuard.conf create mode 100644 html/cgi-bin/logs.cgi/urlfilter.dat create mode 100644 html/cgi-bin/redirect.cgi create mode 100644 html/cgi-bin/urlfilter.cgi create mode 100644 html/html/images/urlfilter/1x1.gif create mode 100644 html/html/images/urlfilter/background.jpg create mode 100644 html/html/images/urlfilter/led-green.gif create mode 100644 html/html/images/urlfilter/led-red.gif diff --git a/config/cron/crontab b/config/cron/crontab index 9b08f06c4..2b7477815 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 d4209369d..3b2969507 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 b5ba5db59..9ce0e7177 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 000000000..9e61b44c4 --- /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 000000000..925465985 --- /dev/null +++ b/config/urlfilter/autoupdate.urls @@ -0,0 +1,9 @@ +squidGuard,http://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gz +MESD,http://squidguard.mesd.k12.or.us/blacklists.tgz +Univ. Toulouse,ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/blacklists.tar.gz +squidGuard,http://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gz +MESD,http://squidguard.mesd.k12.or.us/blacklists.tgz +Univ. Toulouse,ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/blacklists.tar.gz +squidGuard,http://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gz +MESD,http://squidguard.mesd.k12.or.us/blacklists.tgz +Univ. Toulouse,ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/blacklists.tar.gz diff --git a/config/urlfilter/blacklists.tar.gz b/config/urlfilter/blacklists.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..dc21990be9ff17fab3940dffb613ea3a0e0a4520 GIT binary patch literal 329408 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 E4`5*AC;$Ke literal 0 HcmV?d00001 diff --git a/config/urlfilter/makeconf.pl b/config/urlfilter/makeconf.pl new file mode 100644 index 000000000..8a2e5428d --- /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 000000000..87b9e721a --- /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 000000000..22454f55f --- /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 000000000..94d150c87 --- /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 c921ef59f..192c9829f 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 000000000..4da98f974 --- /dev/null +++ b/html/cgi-bin/urlfilter.cgi @@ -0,0 +1,9012 @@ +#!/usr/bin/perl +# +# SmoothWall CGIs +# +# This code is distributed under the terms of the GPL +# +# (c) written from scratch +# +# $Id: urlfilter.cgi,v 1.7 2006/05/08 00:00:00 marco Exp $ +# + +use strict; + +# enable only the following on debugging purpose +#use warnings; +#use CGI::Carp 'fatalsToBrowser'; + +use File::Copy; +use IO::Socket; + +require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl"; + +my %netsettings=(); +my %mainsettings=(); +my %proxysettings=(); +my %filtersettings=(); +my %tcsettings=(); +my %uqsettings=(); +my %besettings=(); +my %updatesettings=(); +my %checked=(); +my %selected=(); +my $id=0; +my $line=''; +my $i=0; +my $n=0; +my $time=''; +my $filesize; +my $category=''; +my $section=''; +my $blacklist=''; +my $blistbackup=''; + +my $changed = 'no'; +my $tcfile = "${General::swroot}/urlfilter/timeconst"; +my $uqfile = "${General::swroot}/urlfilter/userquota"; +my $dbdir = "${General::swroot}/urlfilter/blacklists"; +my $editdir = "${General::swroot}/urlfilter/editor"; +my $repository = "/home/httpd/html/repository"; +my $hintcolour = '#FFFFCC'; + +my $sourceurlfile = "${General::swroot}/urlfilter/autoupdate/autoupdate.urls"; +my $updconffile = "${General::swroot}/urlfilter/autoupdate/autoupdate.conf"; +my $updflagfile = "${General::swroot}/urlfilter/blacklists/.autoupdate.last"; +my $upd_cron_dly = "${General::swroot}/urlfilter/autoupdate/cron.daily"; +my $upd_cron_wly = "${General::swroot}/urlfilter/autoupdate/cron.weekly"; +my $upd_cron_mly = "${General::swroot}/urlfilter/autoupdate/cron.monthly"; + +my $errormessage=''; +my $updatemessage=''; +my $restoremessage=''; +my $buttontext=''; +my $source_name=''; +my $source_url=''; +my $blacklistage=0; + +my @repositorylist=(); +my @repositoryfiles=(); +my @categories=(); +my @selectedcategories=(); +my @filtergroups=(); +my @tclist=(); +my @uqlist=(); +my @source_urllist=(); +my @temp=(); + +my $lastslashpos=0; + +my $toggle=''; +my $gif=''; +my $led=''; +my $ldesc=''; +my $gdesc=''; + +if (! -d $dbdir) { mkdir("$dbdir"); } +if (! -e $tcfile) { system("touch $tcfile"); } +if (! -e $uqfile) { system("touch $uqfile"); } +if (! -e $sourceurlfile) { system("touch $sourceurlfile"); } + +&General::readhash("${General::swroot}/ethernet/settings", \%netsettings); +&General::readhash("${General::swroot}/main/settings", \%mainsettings); +&General::readhash("${General::swroot}/proxy/settings", \%proxysettings); + +&readblockcategories; + +open(FILE, $tcfile); +@tclist = ; +close(FILE); +open(FILE, $uqfile); +@uqlist = ; +close(FILE); +open(FILE, $sourceurlfile); +@source_urllist = ; +close(FILE); + +$filtersettings{'ENABLE_CUSTOM_BLACKLIST'} = 'off'; +$filtersettings{'ENABLE_CUSTOM_WHITELIST'} = 'off'; +$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} = 'off'; +$filtersettings{'BLOCK_EXECUTABLES'} = 'off'; +$filtersettings{'BLOCK_AUDIO-VIDEO'} = 'off'; +$filtersettings{'BLOCK_ARCHIVES'} = 'off'; +$filtersettings{'ENABLE_REWRITE'} = 'off'; +$filtersettings{'UNFILTERED_CLIENTS'} = ''; +$filtersettings{'BANNED_CLIENTS'} = ''; +$filtersettings{'SHOW_CATEGORY'} = 'off'; +$filtersettings{'SHOW_URL'} = 'off'; +$filtersettings{'SHOW_IP'} = 'off'; +$filtersettings{'ENABLE_DNSERROR'} = 'off'; +$filtersettings{'ENABLE_JPEG'} = 'off'; +$filtersettings{'REDIRECT_PAGE'} = ''; +$filtersettings{'MSG_TEXT_1'} = ''; +$filtersettings{'MSG_TEXT_2'} = ''; +$filtersettings{'MSG_TEXT_3'} = ''; +$filtersettings{'ENABLE_EXPR_LISTS'} = 'off'; +$filtersettings{'BLOCK_IP_ADDR'} = 'off'; +$filtersettings{'BLOCK_ALL'} = 'off'; +$filtersettings{'ENABLE_EMPTY_ADS'} = 'off'; +$filtersettings{'ENABLE_GLOBAL_WHITELIST'} = 'off'; +$filtersettings{'ENABLE_SAFESEARCH'} = 'off'; +$filtersettings{'ENABLE_LOG'} = 'off'; +$filtersettings{'ENABLE_USERNAME_LOG'} = 'off'; +$filtersettings{'ENABLE_CATEGORY_LOG'} = 'off'; +$filtersettings{'CHILDREN'} = '5'; +$filtersettings{'ENABLE_AUTOUPDATE'} = 'off'; + +$filtersettings{'ACTION'} = ''; +$filtersettings{'VALID'} = ''; + +&Header::getcgihash(\%filtersettings); +&Header::getcgihash(\%tcsettings); +&Header::getcgihash(\%uqsettings); +&Header::getcgihash(\%besettings); + +if (($filtersettings{'ACTION'} eq $Lang::tr{'save'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) || + ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'})) +{ + if (!($filtersettings{'CHILDREN'} =~ /^\d+$/) || ($filtersettings{'CHILDREN'} < 1)) + { + $errormessage = $Lang::tr{'urlfilter invalid num of children'}; + goto ERROR; + } + + if ((!($filtersettings{'REDIRECT_PAGE'} eq '')) && (!($filtersettings{'REDIRECT_PAGE'} =~ /^https?:\/\//))) + { + $filtersettings{'REDIRECT_PAGE'} = "http://".$filtersettings{'REDIRECT_PAGE'}; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) + { + if (-e "$repository/$filtersettings{'ID'}") { unlink("$repository/$filtersettings{'ID'}"); } + $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'}; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPLOADFILE'}); + + $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'}; + $_ = $filtersettings{'UPLOADFILE'}; + tr/\\/\//; + $_ = substr($_,rindex($_,"/")+1); + if ($_) { + if (copy($filtersettings{'UPLOADFILE'}, "$repository/$_") != 1) + { + $errormessage = $!; + goto ERROR; + } + } + + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'BACKGROUND'}); + + if (copy($filtersettings{'BACKGROUND'}, "/home/httpd/html/images/urlfilter/background.jpg") != 1) + { + $errormessage = $!; + goto ERROR; + } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'}); + + if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + goto ERROR; + } + + if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/blacklists.tar.gz") != 1) + { + $errormessage = $!; + goto ERROR; + } + + if (!(-d "${General::swroot}/urlfilter/update")) { mkdir("${General::swroot}/urlfilter/update"); } + + my $exitcode = system("/bin/tar --no-same-owner -xzf ${General::swroot}/urlfilter/blacklists.tar.gz -C ${General::swroot}/urlfilter/update"); + + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + + if (-d "${General::swroot}/urlfilter/update/category") + { + system("mv ${General::swroot}/urlfilter/update/category ${General::swroot}/urlfilter/update/blacklists"); + } + + if (!(-d "${General::swroot}/urlfilter/update/blacklists")) + { + $errormessage = $Lang::tr{'urlfilter invalid content'}; + } else { + system("cp -r ${General::swroot}/urlfilter/update/blacklists/* $dbdir"); + + &readblockcategories; + &readcustomlists; + + &writeconfigfile; + + $updatemessage = $Lang::tr{'urlfilter upload success'}; + system("${General::swroot}/urlfilter/bin/prebuild.pl &"); + system("logger -t installpackage[urlfilter] \"URL filter blacklist - Blacklist update from local source completed\""); + } + } + if (-d "${General::swroot}/urlfilter/update") { system("rm -rf ${General::swroot}/urlfilter/update"); } + if (-e "${General::swroot}/urlfilter/blacklists.tar.gz") { unlink("${General::swroot}/urlfilter/blacklists.tar.gz"); } + if ($errormessage) { goto ERROR; } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) + { + $blistbackup = ($filtersettings{'ENABLE_FULLBACKUP'} eq 'on') ? "blacklists" : "blacklists/custom"; + if (system("/bin/tar -C ${General::swroot}/urlfilter -czf ${General::swroot}/urlfilter/backup.tar.gz settings timeconst userquota autoupdate $blistbackup")) + { + $errormessage = $Lang::tr{'urlfilter backup error'}; + goto ERROR; + } + else + { + print "Content-type: application/gzip\n"; + print "Content-length: "; + print (-s "${General::swroot}/urlfilter/backup.tar.gz"); + print "\n"; + print "Content-disposition: attachment; filename=urlfilter-backup.tar.gz\n\n"; + + open (FILE, "${General::swroot}/urlfilter/backup.tar.gz"); + while () { print; } + close (FILE); + + if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); } + exit; + } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'}) + { + &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'}); + + if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + goto ERROR; + } + + if (!(-d "${General::swroot}/urlfilter/restore")) { mkdir("${General::swroot}/urlfilter/restore"); } + + if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/backup.tar.gz") != 1) + { + $errormessage = $!; + } + + my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf ${General::swroot}/urlfilter/backup.tar.gz -C ${General::swroot}/urlfilter/restore"); + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + if (!(-e "${General::swroot}/urlfilter/restore/settings")) + { + $errormessage = $Lang::tr{'urlfilter invalid restore file'}; + } else { + system("cp -rp ${General::swroot}/urlfilter/restore/* ${General::swroot}/urlfilter/"); + &readblockcategories; + &readcustomlists; + &writeconfigfile; + + $restoremessage = $Lang::tr{'urlfilter restore success'}; + } + } + + if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); } + if (-d "${General::swroot}/urlfilter/restore") { system("rm -rf ${General::swroot}/urlfilter/restore"); } + if ($errormessage) { goto ERROR; } + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'save'}) + { + $filtersettings{'VALID'} = 'yes'; + &savesettings; + } + + if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) + { + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + goto ERROR; + } + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + goto ERROR; + } + + $filtersettings{'VALID'} = 'yes'; + &savesettings; + + system("chown -R nobody.nobody $dbdir"); + + if (-e "$dbdir/custom/allowed/domains.db") { unlink("$dbdir/custom/allowed/domains.db"); } + if (-e "$dbdir/custom/allowed/urls.db") { unlink("$dbdir/custom/allowed/urls.db"); } + if (-e "$dbdir/custom/blocked/domains.db") { unlink("$dbdir/custom/blocked/domains.db"); } + if (-e "$dbdir/custom/blocked/urls.db") { unlink("$dbdir/custom/blocked/urls.db"); } + + foreach (<$dbdir/*>) + { + if (-d $_){ system("chmod 644 $_/*"); } + if (-d $_){ system("chmod 666 $_/*.db"); } + } + if (-d "$dbdir/custom/allowed") + { + system("chmod 755 $dbdir/custom/allowed"); + system("chmod 644 $dbdir/custom/allowed/*"); + } + if (-d "$dbdir/custom/blocked") + { + system("chmod 755 $dbdir/custom/blocked"); + system("chmod 644 $dbdir/custom/blocked/*"); + } + + system('/usr/local/bin/restartsquid'); + } + +ERROR: + + if ($errormessage) { $filtersettings{'VALID'} = 'no'; } + +} + +if ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter set time constraints'}) { $tcsettings{'TCMODE'} = 'on'} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'add'})) +{ + $tcsettings{'TCMODE'}='on'; + + if (!$tcsettings{'DST'}) + { + $errormessage=$Lang::tr{'urlfilter dst error'}; + } + + if (!$tcsettings{'SRC'}) + { + $errormessage=$Lang::tr{'urlfilter src error'}; + } + + if (!($tcsettings{'TO_HOUR'}.$tcsettings{'TO_MINUTE'} gt $tcsettings{'FROM_HOUR'}.$tcsettings{'FROM_MINUTE'})) + { + $errormessage=$Lang::tr{'urlfilter timespace error'}; + } + + if (!(($tcsettings{'MON'} eq 'on') || ($tcsettings{'TUE'} eq 'on') || ($tcsettings{'WED'} eq 'on') || ($tcsettings{'THU'} eq 'on') || ($tcsettings{'FRI'} eq 'on') || ($tcsettings{'SAT'} eq 'on') || ($tcsettings{'SUN'} eq 'on'))) + { + $errormessage=$Lang::tr{'urlfilter weekday error'}; + } + + if (!$errormessage) + { + if ($tcsettings{'DST'} =~ /^any/) { $tcsettings{'DST'} = 'any'; } + if ($tcsettings{'ENABLERULE'} eq 'on') { $tcsettings{'ACTIVE'} = $tcsettings{'ENABLERULE'}; } else { $tcsettings{'ACTIVE'} = 'off'} + + $tcsettings{'ENABLERULE'} = 'on'; + if($tcsettings{'EDITING'} eq 'no') { + open(FILE,">>$tcfile"); + flock FILE, 2; + print FILE "$tcsettings{'DEFINITION'},$tcsettings{'MON'},$tcsettings{'TUE'},$tcsettings{'WED'},$tcsettings{'THU'},$tcsettings{'FRI'},$tcsettings{'SAT'},$tcsettings{'SUN'},$tcsettings{'FROM_HOUR'},$tcsettings{'FROM_MINUTE'},$tcsettings{'TO_HOUR'},$tcsettings{'TO_MINUTE'},$tcsettings{'SRC'},$tcsettings{'DST'},$tcsettings{'ACCESS'},$tcsettings{'ACTIVE'},$tcsettings{'COMMENT'}\n"; + } else { + open(FILE, ">$tcfile"); + flock FILE, 2; + $id = 0; + foreach $line (@tclist) + { + $id++; + if ($tcsettings{'EDITING'} eq $id) { + print FILE "$tcsettings{'DEFINITION'},$tcsettings{'MON'},$tcsettings{'TUE'},$tcsettings{'WED'},$tcsettings{'THU'},$tcsettings{'FRI'},$tcsettings{'SAT'},$tcsettings{'SUN'},$tcsettings{'FROM_HOUR'},$tcsettings{'FROM_MINUTE'},$tcsettings{'TO_HOUR'},$tcsettings{'TO_MINUTE'},$tcsettings{'SRC'},$tcsettings{'DST'},$tcsettings{'ACCESS'},$tcsettings{'ACTIVE'},$tcsettings{'COMMENT'}\n"; + } else { print FILE "$line"; } + } + } + close(FILE); + undef %tcsettings; + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; + $changed = 'yes'; + } else { + if ($tcsettings{'EDITING'} ne 'no') + { + $tcsettings{'ACTION'} = $Lang::tr{'edit'}; + $tcsettings{'ID'} = $tcsettings{'EDITING'}; + } + } +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'remove'})) +{ + $id = 0; + open(FILE, ">$tcfile"); + flock FILE, 2; + foreach $line (@tclist) + { + $id++; + unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; } + } + close(FILE); + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'})) +{ + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + } + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + } + + if (!$errormessage) { system('/usr/local/bin/restartsquid'); } + $tcsettings{'TCMODE'}='on'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})) +{ + open(FILE, ">$tcfile"); + flock FILE, 2; + $id = 0; + foreach $line (@tclist) + { + $id++; + unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; } + else + { + chomp($line); + @temp = split(/\,/,$line); + if ($temp[15] eq 'on') { $temp[15] = 'off'; } else { $temp[15] = 'on' } + print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4],$temp[5],$temp[6],$temp[7],$temp[8],$temp[9],$temp[10],$temp[11],$temp[12],$temp[13],$temp[14],$temp[15],$temp[16]\n"; + } + } + close(FILE); + $tcsettings{'CHANGED'}='yes'; + $tcsettings{'TCMODE'}='on'; +} + +if (!$errormessage) { + $tcsettings{'ENABLERULE'}='on'; + $tcsettings{'TO_HOUR'}='24'; +} + +if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage)) +{ + $id = 0; + foreach $line (@tclist) + { + $id++; + if ($tcsettings{'ID'} eq $id) + { + chomp($line); + @temp = split(/\,/,$line); + $tcsettings{'DEFINITION'} = $temp[0]; + $tcsettings{'MON'} = $temp[1]; + $tcsettings{'TUE'} = $temp[2]; + $tcsettings{'WED'} = $temp[3]; + $tcsettings{'THU'} = $temp[4]; + $tcsettings{'FRI'} = $temp[5]; + $tcsettings{'SAT'} = $temp[6]; + $tcsettings{'SUN'} = $temp[7]; + $tcsettings{'FROM_HOUR'} = $temp[8]; + $tcsettings{'FROM_MINUTE'} = $temp[9]; + $tcsettings{'TO_HOUR'} = $temp[10]; + $tcsettings{'TO_MINUTE'} = $temp[11]; + $tcsettings{'SRC'} = $temp[12]; + $tcsettings{'DST'} = $temp[13]; + $tcsettings{'ACCESS'} = $temp[14]; + $tcsettings{'ENABLERULE'} = $temp[15]; + $tcsettings{'COMMENT'} = $temp[16]; + } + } + $tcsettings{'TCMODE'}='on'; +} + +if ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter set user quota'}) { $uqsettings{'UQMODE'} = 'on'} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'add'})) +{ + $uqsettings{'UQMODE'}='on'; + + if ((!($uqsettings{'TIME_QUOTA'} =~ /^\d+/)) || ($uqsettings{'TIME_QUOTA'} < '1')) + { + $errormessage=$Lang::tr{'urlfilter quota time error'}; + } + + @temp = split(/\n/,$uqsettings{'QUOTA_USERS'}); + undef $uqsettings{'QUOTA_USERS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $uqsettings{'QUOTA_USERS'} .= $_."\n"; } + } + + if ($uqsettings{'QUOTA_USERS'} eq '') + { + $errormessage=$Lang::tr{'urlfilter quota user error'}; + } + + $_ = $uqsettings{'QUOTA_USERS'}; + chomp; s/\n/|/g; + my $quota_users = $_; + + if ($uqsettings{'QUOTA_USERS'} =~ /\\/) + { + $errormessage=$Lang::tr{'urlfilter invalid user error'}; + } + + if (!$errormessage) { + if ($uqsettings{'ENABLEQUOTA'} eq 'on') { $uqsettings{'ACTIVE'} = $uqsettings{'ENABLEQUOTA'}; } else { $uqsettings{'ACTIVE'} = 'off'} + + $uqsettings{'ENABLERULE'} = 'on'; + if($uqsettings{'EDITING'} eq 'no') { + open(FILE,">>$uqfile"); + flock FILE, 2; + print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n"; + } else { + open(FILE, ">$uqfile"); + flock FILE, 2; + $id = 0; + foreach $line (@uqlist) + { + $id++; + if ($uqsettings{'EDITING'} eq $id) { + print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n"; + } else { print FILE "$line"; } + } + } + close(FILE); + undef %uqsettings; + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'MODE'}='USERQUOTA'; + $uqsettings{'UQMODE'}='on'; + $changed = 'yes'; + } else { + if ($uqsettings{'EDITING'} ne 'no') + { + $uqsettings{'ACTION'} = $Lang::tr{'edit'}; + $uqsettings{'ID'} = $uqsettings{'EDITING'}; + } + } +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'remove'})) +{ + $id = 0; + open(FILE, ">$uqfile"); + flock FILE, 2; + foreach $line (@uqlist) + { + $id++; + unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; } + } + close(FILE); + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'UQMODE'}='on'; +} + +if (!$errormessage) { + $uqsettings{'ENABLEQUOTA'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage)) +{ + $id = 0; + foreach $line (@uqlist) + { + $id++; + if ($uqsettings{'ID'} eq $id) + { + chomp($line); + @temp = split(/\,/,$line); + $uqsettings{'TIME_QUOTA'} = $temp[0]; + $uqsettings{'SPORADIC'} = $temp[1]; + $uqsettings{'RENEWAL'} = $temp[2]; + $uqsettings{'QUOTA_USERS'} = $temp[3]; + $uqsettings{'ENABLEQUOTA'} = $temp[4]; + } + } + $uqsettings{'UQMODE'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'})) +{ + open(FILE, ">$uqfile"); + flock FILE, 2; + $id = 0; + foreach $line (@uqlist) + { + $id++; + unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; } + else + { + chomp($line); + @temp = split(/\,/,$line); + if ($temp[4] eq 'on') { $temp[4] = 'off'; } else { $temp[4] = 'on' } + print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4]\n"; + } + } + close(FILE); + $uqsettings{'CHANGED'}='yes'; + $uqsettings{'UQMODE'}='on'; +} + +if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'})) +{ + if (!($proxysettings{'ENABLE_FILTER'} eq 'on')) + { + $errormessage = $Lang::tr{'urlfilter not enabled'}; + } + if (!(-e "${General::swroot}/proxy/enable")) + { + $errormessage = $Lang::tr{'urlfilter web proxy service required'}; + } + + if (!$errormessage) { system('/usr/local/bin/restartsquid'); } + $uqsettings{'UQMODE'}='on'; +} + +if ($besettings{'ACTION'} eq $Lang::tr{'urlfilter blacklist editor'}) { $besettings{'BEMODE'} = 'on'; } + +if ($besettings{'MODE'} eq 'BLACKLIST_EDITOR') +{ + @temp = split(/\n/,$besettings{'BE_DOMAINS'}); + undef $besettings{'BE_DOMAINS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_DOMAINS'} .= $_."\n"; } + } + chomp($besettings{'BE_DOMAINS'}); + @temp = split(/\n/,$besettings{'BE_URLS'}); + undef $besettings{'BE_URLS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_URLS'} .= $_."\n"; } + } + chomp($besettings{'BE_URLS'}); + @temp = split(/\n/,$besettings{'BE_EXPRESSIONS'}); + undef $besettings{'BE_EXPRESSIONS'}; + foreach (@temp) + { + s/^\s+//g; s/\s+$//g; + if ($_) { $besettings{'BE_EXPRESSIONS'} .= $_."\n"; } + } + chomp($besettings{'BE_EXPRESSIONS'}); +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter load blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + $besettings{'BE_NAME'} = $besettings{'BE_BLACKLIST'}; + + delete $besettings{'BE_DOMAINS'}; + delete $besettings{'BE_URLS'}; + delete $besettings{'BE_EXPRESSIONS'}; + + if (-e "$dbdir/$besettings{'BE_NAME'}/domains") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/domains"); + while () { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_DOMAINS'}); + } + if (-e "$dbdir/$besettings{'BE_NAME'}/urls") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/urls"); + while () { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_URLS'}); + } + if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") + { + open(FILE, "$dbdir/$besettings{'BE_NAME'}/expressions"); + while () { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_EXPRESSIONS'}); + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter import blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + &Header::getcgihash(\%besettings, {'wantfile' => 1, 'filevar' => 'IMPORTFILE'}); + + if (!($besettings{'IMPORTFILE'} =~ /.tar.gz$/)) + { + $errormessage = $Lang::tr{'urlfilter wrong filetype'}; + } else { + if (!-d "$editdir") { mkdir("$editdir"); } + + if (copy($besettings{'IMPORTFILE'}, "$editdir/blacklist.tar.gz") != 1) + { + $errormessage = $!; + } else { + + my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf $editdir/blacklist.tar.gz -C $editdir"); + if ($exitcode > 0) + { + $errormessage = $Lang::tr{'urlfilter tar error'}; + } else { + $i = 0; + foreach (<$editdir/blacklists/*>) + { + if (-d) + { + $i++; + $besettings{'BE_NAME'} = substr($_, rindex($_,"/")+1); + } + } + + if (!($i == 1)) + { + $errormessage = $Lang::tr{'urlfilter invalid import file'}; + } else { + delete $besettings{'BE_DOMAINS'}; + delete $besettings{'BE_URLS'}; + delete $besettings{'BE_EXPRESSIONS'}; + + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/domains") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/domains"); + while () { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_DOMAINS'}); + } + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/urls") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/urls"); + while () { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_URLS'}); + } + if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/expressions") + { + open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/expressions"); + while () { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } }; + close FILE; + chomp($besettings{'BE_EXPRESSIONS'}); + } + } + } + + if (-d $editdir) { system("rm -rf $editdir"); } + + } + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter export blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + if ($besettings{'BE_NAME'} eq '') + { + $errormessage = $Lang::tr{'urlfilter category name error'}; + } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) { + + $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_; + + if (!(-d "$editdir")) { mkdir("$editdir"); } + if (!(-d "$editdir/blacklists")) { mkdir("$editdir/blacklists"); } + if (!(-d "$editdir/blacklists/$besettings{'BE_NAME'}")) { mkdir("$editdir/blacklists/$besettings{'BE_NAME'}"); } + + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/domains"); + flock FILE, 2; + print FILE "$besettings{'BE_DOMAINS'}\n"; + close FILE; + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/urls"); + flock FILE, 2; + print FILE "$besettings{'BE_URLS'}\n"; + close FILE; + open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/expressions"); + flock FILE, 2; + print FILE "$besettings{'BE_EXPRESSIONS'}\n"; + close FILE; + + if (system("/bin/tar -C $editdir -czf $editdir/$besettings{'BE_NAME'}.tar.gz blacklists")) + { + $errormessage = $Lang::tr{'urlfilter export error'}; + } + else + { + print "Content-type: application/gzip\n"; + print "Content-length: "; + print (-s "$editdir/$besettings{'BE_NAME'}.tar.gz"); + print "\n"; + print "Content-disposition: attachment; filename=$besettings{'BE_NAME'}.tar.gz\n\n"; + + open (FILE, "$editdir/$besettings{'BE_NAME'}.tar.gz"); + while () { print; } + close (FILE); + + if (-d $editdir) { system("rm -rf $editdir"); } + exit; + } + } else { + $errormessage = $Lang::tr{'urlfilter category data error'}; + } +} + +if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter install blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR')) +{ + $besettings{'BEMODE'} = 'on'; + + if ($besettings{'BE_NAME'} eq '') + { + $errormessage = $Lang::tr{'urlfilter category name error'}; + } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) { + + $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_; + + if (!-d "$editdir") { mkdir("$editdir"); } + + if (!-d "$dbdir/$besettings{'BE_NAME'}") { mkdir("$dbdir/$besettings{'BE_NAME'}"); } + + if (-e "$dbdir/$besettings{'BE_NAME'}/domains") { unlink("$dbdir/$besettings{'BE_NAME'}/domains"); } + if ($besettings{'BE_DOMAINS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/domains"); + flock FILE, 2; + print FILE "$besettings{'BE_DOMAINS'}\n"; + close FILE; + } + if (-e "$dbdir/$besettings{'BE_NAME'}/urls") { unlink("$dbdir/$besettings{'BE_NAME'}/urls"); } + if ($besettings{'BE_URLS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/urls"); + flock FILE, 2; + print FILE "$besettings{'BE_URLS'}\n"; + close FILE; + } + if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") { unlink("$dbdir/$besettings{'BE_NAME'}/expressions"); } + if ($besettings{'BE_EXPRESSIONS'}) + { + open(FILE, ">$dbdir/$besettings{'BE_NAME'}/expressions"); + flock FILE, 2; + print FILE "$besettings{'BE_EXPRESSIONS'}\n"; + close FILE; + } + + open(FILE, ">$editdir/install.conf"); + flock FILE, 2; + print FILE "logdir /var/log/squidGuard\n"; + print FILE "dbhome $dbdir/$besettings{'BE_NAME'}\n\n"; + print FILE "dest $besettings{'BE_NAME'} {\n"; + if ($besettings{'BE_DOMAINS'}) { print FILE " domainlist domains\n"; } + if ($besettings{'BE_URLS'}) { print FILE " urllist urls\n"; } + if ($besettings{'BE_EXPRESSIONS'}) { print FILE " expressions expressions\n"; } + print FILE "}\n\n"; + print FILE "acl {\n"; + print FILE " default {\n"; + print FILE " pass none\n"; + print FILE " }\n"; + print FILE "}\n"; + close FILE; + + system("rm -f $dbdir/$besettings{'BE_NAME'}/*.db"); + system("/usr/sbin/squidGuard -c $editdir/install.conf -C all"); + system("chmod a+w $dbdir/$besettings{'BE_NAME'}/*.db"); + + &readblockcategories; + &readcustomlists; + + &writeconfigfile; + + system('/usr/local/bin/restartsquid') unless ($besettings{'NORESTART'} eq 'on'); + + if (-d $editdir) { system("rm -rf $editdir"); } + } else { + $errormessage = $Lang::tr{'urlfilter category data error'}; + } +} + +if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save schedule'}) +{ + if (($filtersettings{'UPDATE_SOURCE'} eq 'custom') && ($filtersettings{'CUSTOM_UPDATE_URL'} eq '')) + { + $errormessage = $Lang::tr{'urlfilter custom url required'}; + } else { + open (FILE, ">$updconffile"); + print FILE "ENABLE_AUTOUPDATE=$filtersettings{'ENABLE_AUTOUPDATE'}\n"; + print FILE "UPDATE_SCHEDULE=$filtersettings{'UPDATE_SCHEDULE'}\n"; + print FILE "UPDATE_SOURCE=$filtersettings{'UPDATE_SOURCE'}\n"; + print FILE "CUSTOM_UPDATE_URL=$filtersettings{'CUSTOM_UPDATE_URL'}\n"; + close FILE; + + if (-e $upd_cron_dly) { unlink($upd_cron_dly); } + if (-e $upd_cron_wly) { unlink($upd_cron_wly); } + if (-e $upd_cron_mly) { unlink($upd_cron_mly); } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'daily')) + { + symlink("../bin/autoupdate.pl",$upd_cron_dly) + } else { + symlink("/bin/false",$upd_cron_dly) + } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'weekly')) + { + symlink("../bin/autoupdate.pl",$upd_cron_wly) + } else { + symlink("/bin/false",$upd_cron_wly) + } + + if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'monthly')) + { + symlink("../bin/autoupdate.pl",$upd_cron_mly) + } else { + symlink("/bin/false",$upd_cron_mly) + } + } +} + +if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter update now'}) +{ + if ($filtersettings{'UPDATE_SOURCE'} eq 'custom') + { + if ($filtersettings{'CUSTOM_UPDATE_URL'} eq '') + { + $errormessage = $Lang::tr{'urlfilter custom url required'}; + } else { + system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'CUSTOM_UPDATE_URL'} &"); + } + } else { + system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'UPDATE_SOURCE'} &"); + } +} + + +if (-e "${General::swroot}/urlfilter/settings") { &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); } + +&readcustomlists; + +$checked{'ENABLE_CUSTOM_BLACKLIST'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_BLACKLIST'}{$filtersettings{'ENABLE_CUSTOM_BLACKLIST'}} = "checked='checked'"; +$checked{'ENABLE_CUSTOM_WHITELIST'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_WHITELIST'}{$filtersettings{'ENABLE_CUSTOM_WHITELIST'}} = "checked='checked'"; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'off'} = ''; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} = ''; +$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'}} = "checked='checked'"; +$checked{'BLOCK_EXECUTABLES'}{'off'} = ''; +$checked{'BLOCK_EXECUTABLES'}{'on'} = ''; +$checked{'BLOCK_EXECUTABLES'}{$filtersettings{'BLOCK_EXECUTABLES'}} = "checked='checked'"; +$checked{'BLOCK_AUDIO-VIDEO'}{'off'} = ''; +$checked{'BLOCK_AUDIO-VIDEO'}{'on'} = ''; +$checked{'BLOCK_AUDIO-VIDEO'}{$filtersettings{'BLOCK_AUDIO-VIDEO'}} = "checked='checked'"; +$checked{'BLOCK_ARCHIVES'}{'off'} = ''; +$checked{'BLOCK_ARCHIVES'}{'on'} = ''; +$checked{'BLOCK_ARCHIVES'}{$filtersettings{'BLOCK_ARCHIVES'}} = "checked='checked'"; +$checked{'ENABLE_REWRITE'}{'off'} = ''; +$checked{'ENABLE_REWRITE'}{'on'} = ''; +$checked{'ENABLE_REWRITE'}{$filtersettings{'ENABLE_REWRITE'}} = "checked='checked'"; +$checked{'SHOW_CATEGORY'}{'off'} = ''; +$checked{'SHOW_CATEGORY'}{'on'} = ''; +$checked{'SHOW_CATEGORY'}{$filtersettings{'SHOW_CATEGORY'}} = "checked='checked'"; +$checked{'SHOW_URL'}{'off'} = ''; +$checked{'SHOW_URL'}{'on'} = ''; +$checked{'SHOW_URL'}{$filtersettings{'SHOW_URL'}} = "checked='checked'"; +$checked{'SHOW_IP'}{'off'} = ''; +$checked{'SHOW_IP'}{'on'} = ''; +$checked{'SHOW_IP'}{$filtersettings{'SHOW_IP'}} = "checked='checked'"; +$checked{'ENABLE_DNSERROR'}{'off'} = ''; +$checked{'ENABLE_DNSERROR'}{'on'} = ''; +$checked{'ENABLE_DNSERROR'}{$filtersettings{'ENABLE_DNSERROR'}} = "checked='checked'"; +$checked{'ENABLE_JPEG'}{'off'} = ''; +$checked{'ENABLE_JPEG'}{'on'} = ''; +$checked{'ENABLE_JPEG'}{$filtersettings{'ENABLE_JPEG'}} = "checked='checked'"; +$checked{'ENABLE_EXPR_LISTS'}{'off'} = ''; +$checked{'ENABLE_EXPR_LISTS'}{'on'} = ''; +$checked{'ENABLE_EXPR_LISTS'}{$filtersettings{'ENABLE_EXPR_LISTS'}} = "checked='checked'"; +$checked{'BLOCK_IP_ADDR'}{'off'} = ''; +$checked{'BLOCK_IP_ADDR'}{'on'} = ''; +$checked{'BLOCK_IP_ADDR'}{$filtersettings{'BLOCK_IP_ADDR'}} = "checked='checked'"; +$checked{'BLOCK_ALL'}{'off'} = ''; +$checked{'BLOCK_ALL'}{'on'} = ''; +$checked{'BLOCK_ALL'}{$filtersettings{'BLOCK_ALL'}} = "checked='checked'"; +$checked{'ENABLE_EMPTY_ADS'}{'off'} = ''; +$checked{'ENABLE_EMPTY_ADS'}{'on'} = ''; +$checked{'ENABLE_EMPTY_ADS'}{$filtersettings{'ENABLE_EMPTY_ADS'}} = "checked='checked'"; +$checked{'ENABLE_GLOBAL_WHITELIST'}{'off'} = ''; +$checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} = ''; +$checked{'ENABLE_GLOBAL_WHITELIST'}{$filtersettings{'ENABLE_GLOBAL_WHITELIST'}} = "checked='checked'"; +$checked{'ENABLE_SAFESEARCH'}{'off'} = ''; +$checked{'ENABLE_SAFESEARCH'}{'on'} = ''; +$checked{'ENABLE_SAFESEARCH'}{$filtersettings{'ENABLE_SAFESEARCH'}} = "checked='checked'"; +$checked{'ENABLE_LOG'}{'off'} = ''; +$checked{'ENABLE_LOG'}{'on'} = ''; +$checked{'ENABLE_LOG'}{$filtersettings{'ENABLE_LOG'}} = "checked='checked'"; +$checked{'ENABLE_USERNAME_LOG'}{'off'} = ''; +$checked{'ENABLE_USERNAME_LOG'}{'on'} = ''; +$checked{'ENABLE_USERNAME_LOG'}{$filtersettings{'ENABLE_USERNAME_LOG'}} = "checked='checked'"; +$checked{'ENABLE_CATEGORY_LOG'}{'off'} = ''; +$checked{'ENABLE_CATEGORY_LOG'}{'on'} = ''; +$checked{'ENABLE_CATEGORY_LOG'}{$filtersettings{'ENABLE_CATEGORY_LOG'}} = "checked='checked'"; + +foreach $category (@filtergroups) { + $checked{$category}{'off'} = ''; + $checked{$category}{'on'} = ''; + $checked{$category}{$filtersettings{$category}} = "checked='checked'"; +} + +$selected{'DEFINITION'}{$tcsettings{'DEFINITION'}} = "selected='selected'"; +$selected{'FROM_HOUR'}{$tcsettings{'FROM_HOUR'}} = "selected='selected'"; +$selected{'FROM_MINUTE'}{$tcsettings{'FROM_MINUTE'}} = "selected='selected'"; +$selected{'TO_HOUR'}{$tcsettings{'TO_HOUR'}} = "selected='selected'"; +$selected{'TO_MINUTE'}{$tcsettings{'TO_MINUTE'}} = "selected='selected'"; + +@selectedcategories = split(/\|/,$tcsettings{'DST'}); +foreach (@selectedcategories) +{ + $selected{'DST'}{$_} = "selected='selected'"; +} + +$selected{'ACCESS'}{$tcsettings{'ACCESS'}} = "selected='selected'"; + +$checked{'ENABLERULE'}{'off'} = ''; +$checked{'ENABLERULE'}{'on'} = ''; +$checked{'ENABLERULE'}{$tcsettings{'ENABLERULE'}} = "checked='checked'"; +$checked{'MON'}{'off'} = ''; +$checked{'MON'}{'on'} = ''; +$checked{'MON'}{$tcsettings{'MON'}} = "checked='checked'"; +$checked{'TUE'}{'off'} = ''; +$checked{'TUE'}{'on'} = ''; +$checked{'TUE'}{$tcsettings{'TUE'}} = "checked='checked'"; +$checked{'WED'}{'off'} = ''; +$checked{'WED'}{'on'} = ''; +$checked{'WED'}{$tcsettings{'WED'}} = "checked='checked'"; +$checked{'THU'}{'off'} = ''; +$checked{'THU'}{'on'} = ''; +$checked{'THU'}{$tcsettings{'THU'}} = "checked='checked'"; +$checked{'FRI'}{'off'} = ''; +$checked{'FRI'}{'on'} = ''; +$checked{'FRI'}{$tcsettings{'FRI'}} = "checked='checked'"; +$checked{'SAT'}{'off'} = ''; +$checked{'SAT'}{'on'} = ''; +$checked{'SAT'}{$tcsettings{'SAT'}} = "checked='checked'"; +$checked{'SUN'}{'off'} = ''; +$checked{'SUN'}{'on'} = ''; +$checked{'SUN'}{$tcsettings{'SUN'}} = "checked='checked'"; + +$selected{'SPORADIC'}{$uqsettings{'SPORADIC'}} = "selected='selected'"; +$selected{'RENEWAL'} {$uqsettings{'RENEWAL'}} = "selected='selected'"; + +$checked{'ENABLEQUOTA'}{'off'} = ''; +$checked{'ENABLEQUOTA'}{'on'} = ''; +$checked{'ENABLEQUOTA'}{$uqsettings{'ENABLEQUOTA'}} = "checked='checked'"; + +$selected{'BE_BLACKLIST'}{$besettings{'BE_BLACKLIST'}} = "selected='selected'"; + + +&Header::showhttpheaders(); + +&Header::openpage($Lang::tr{'urlfilter configuration'}, 1, ''); + +&Header::openbigbox('100%', 'left', '', $errormessage); + +if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print "$errormessage \n"; + &Header::closebox(); +} elsif (($tcsettings{'CHANGED'} eq 'yes') || ($uqsettings{'CHANGED'} eq 'yes') ) { + &writeconfigfile; + print "
\n"; + &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restart notification'}:"); + print "$Lang::tr{'urlfilter restart message'}\n"; + if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

$Lang::tr{'urlfilter install information'}
+
+ + + + + + +
 
+ +END +; + +&Header::closebox(); +print "\n"; + +} + +&Header::closebigbox(); + +&Header::closepage(); + +# ------------------------------------------------------------------- + +sub savesettings +{ + &writeconfigfile; + + delete $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + delete $filtersettings{'CUSTOM_BLACK_URLS'}; + delete $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + delete $filtersettings{'CUSTOM_WHITE_URLS'}; + delete $filtersettings{'CUSTOM_EXPRESSIONS'}; + delete $filtersettings{'BACKGROUND'}; + delete $filtersettings{'UPDATEFILE'}; + + &General::writehash("${General::swroot}/urlfilter/settings", \%filtersettings); +} + +# ------------------------------------------------------------------- + +sub readblockcategories +{ + undef(@categories); + foreach $blacklist (<$dbdir/*>) { + if (-d $blacklist) { + $lastslashpos = rindex($blacklist,"/"); + if ($lastslashpos > -1) { + $section = substr($blacklist,$lastslashpos+1); + } else { + $section = $blacklist; + } + if (!($section eq 'custom')) { push(@categories,$section) }; + } + } + + @filtergroups = @categories; + foreach (@filtergroups) { + tr/a-z/A-Z/; + $_ = "FILTER_".$_; + } +} + +# ------------------------------------------------------------------- + +sub readcustomlists +{ + if (-e "$dbdir/custom/blocked/domains") { + open(FILE,"$dbdir/custom/blocked/domains"); + delete $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + while () { $filtersettings{'CUSTOM_BLACK_DOMAINS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/blocked/urls") { + open(FILE,"$dbdir/custom/blocked/urls"); + delete $filtersettings{'CUSTOM_BLACK_URLS'}; + while () { $filtersettings{'CUSTOM_BLACK_URLS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/blocked/expressions") { + open(FILE,"$dbdir/custom/blocked/expressions"); + delete $filtersettings{'CUSTOM_EXPRESSIONS'}; + while () { $filtersettings{'CUSTOM_EXPRESSIONS'} .= $_ }; + close(FILE); + } + + if (-e "$dbdir/custom/allowed/domains") { + open(FILE,"$dbdir/custom/allowed/domains"); + delete $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + while () { $filtersettings{'CUSTOM_WHITE_DOMAINS'} .= $_ }; + close(FILE); + } + if (-e "$dbdir/custom/allowed/urls") { + open(FILE,"$dbdir/custom/allowed/urls"); + delete $filtersettings{'CUSTOM_WHITE_URLS'}; + while () { $filtersettings{'CUSTOM_WHITE_URLS'} .= $_ }; + close(FILE); + } +} + +# ------------------------------------------------------------------- + +sub aggregatedconstraints +{ + my $aggregated; + my @old; + my @new; + my @tmp1; + my @tmp2; + my $x; + + if (-e $tcfile) + { + open(TC, $tcfile); + @old = ; + close(TC); + + while (@old > 0) + { + $aggregated = 0; + $x = shift(@old); + chomp($x); + @tmp1 = split(/\,/,$x); + $tmp1[16] = ''; + foreach (@new) + { + @tmp2 = split(/\,/); + if ($tmp2[15] eq 'on') + { + if (($tmp1[0] eq $tmp2[0]) && ($tmp1[12] eq $tmp2[12]) && ($tmp1[13] eq $tmp2[13]) && ($tmp1[14] eq $tmp2[14])) + { + $aggregated = 1; + $tmp2[16] .= " weekly "; + if ($tmp1[1] eq 'on') { $tmp2[16] .= "m"; } + if ($tmp1[2] eq 'on') { $tmp2[16] .= "t"; } + if ($tmp1[3] eq 'on') { $tmp2[16] .= "w"; } + if ($tmp1[4] eq 'on') { $tmp2[16] .= "h"; } + if ($tmp1[5] eq 'on') { $tmp2[16] .= "f"; } + if ($tmp1[6] eq 'on') { $tmp2[16] .= "a"; } + if ($tmp1[7] eq 'on') { $tmp2[16] .= "s"; } + $tmp2[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n"; + $_ = join(",",@tmp2); + } + + } + } + if (!$aggregated) + { + $tmp1[16] .= " weekly "; + if ($tmp1[1] eq 'on') { $tmp1[16] .= "m"; } + if ($tmp1[2] eq 'on') { $tmp1[16] .= "t"; } + if ($tmp1[3] eq 'on') { $tmp1[16] .= "w"; } + if ($tmp1[4] eq 'on') { $tmp1[16] .= "h"; } + if ($tmp1[5] eq 'on') { $tmp1[16] .= "f"; } + if ($tmp1[6] eq 'on') { $tmp1[16] .= "a"; } + if ($tmp1[7] eq 'on') { $tmp1[16] .= "s"; } + $tmp1[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n"; + $x = join(",",@tmp1); + push(@new,$x); + } + } + } + + return @new; + +} + +# ------------------------------------------------------------------- + +sub writeconfigfile +{ + my $executables = "\\.\(ade|adp|asx|bas|bat|chm|com|cmd|cpl|crt|dll|eml|exe|hiv|hlp|hta|inc|inf|ins|isp|jse|jtd|lnk|msc|msh|msi|msp|mst|nws|ocx|oft|ops|pcd|pif|plx|reg|scr|sct|sha|shb|shm|shs|sys|tlb|tsp|url|vbe|vbs|vxd|wsc|wsf|wsh\)\$"; + my $audiovideo = "\\.\(aiff|asf|avi|dif|divx|mov|movie|mp3|mpe?g?|mpv2|ogg|ra?m|snd|qt|wav|wmf|wmv\)\$"; + my $archives = "\\.\(bin|bz2|cab|cdr|dmg|gz|hqx|rar|smi|sit|sea|tar|tgz|zip\)\$"; + + my $ident = " anonymous"; + + my $defaultrule=''; + my $tcrule=''; + my $redirect=''; + my $qredirect=''; + + my $idx; + + my @ec=(); + my @tc=(); + my @uq=(); + + if (!(-d "$dbdir/custom")) { mkdir("$dbdir/custom") } + if (!(-d "$dbdir/custom/blocked")) { mkdir("$dbdir/custom/blocked") } + if (!(-d "$dbdir/custom/allowed")) { mkdir("$dbdir/custom/allowed") } + + open(FILE, ">/$dbdir/custom/blocked/domains"); + print FILE $filtersettings{'CUSTOM_BLACK_DOMAINS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/urls"); + print FILE $filtersettings{'CUSTOM_BLACK_URLS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/expressions"); + print FILE $filtersettings{'CUSTOM_EXPRESSIONS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/blocked/files"); + if ($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') { print FILE "$executables\n"; } + if ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') { print FILE "$audiovideo\n"; } + if ($filtersettings{'BLOCK_ARCHIVES'} eq 'on') { print FILE "$archives\n"; } + close(FILE); + open(FILE, ">/$dbdir/custom/allowed/domains"); + print FILE $filtersettings{'CUSTOM_WHITE_DOMAINS'}; + close(FILE); + open(FILE, ">/$dbdir/custom/allowed/urls"); + print FILE $filtersettings{'CUSTOM_WHITE_URLS'}; + close(FILE); + + if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { $ident = ""; } + + if ($filtersettings{'REDIRECT_PAGE'} eq '') + { + if (($filtersettings{'SHOW_CATEGORY'} eq 'on') || ($filtersettings{'SHOW_URL'} eq 'on') || ($filtersettings{'SHOW_IP'} eq 'on')) { + if ($filtersettings{'SHOW_CATEGORY'} eq 'on') { $redirect .= "&category=%t"; } + if ($filtersettings{'SHOW_URL'} eq 'on') { $redirect .= "&url=%u"; } + if ($filtersettings{'SHOW_IP'} eq 'on') { $redirect .= "&ip=%a"; } + $redirect =~ s/^&/?/; + $redirect = "http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi".$redirect; + } else { + $redirect="http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi"; + } + } else { $redirect=$filtersettings{'REDIRECT_PAGE'}; } + + if ($filtersettings{'ENABLE_DNSERROR'} eq 'on') { $redirect = "302:http://0.0.0.0"; } + + undef $defaultrule; + + if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') + { + $defaultrule .= "custom-allowed "; + } + if ($filtersettings{'BLOCK_ALL'} eq 'on') + { + $defaultrule .= "none"; + } + else + { + if ($filtersettings{'BLOCK_IP_ADDR'} eq 'on') + { + $defaultrule .= "!in-addr "; + } + for ($i=0; $i<=@filtergroups; $i++) { + if ($filtersettings{@filtergroups[$i]} eq 'on') + { + $defaultrule .= "!@categories[$i] "; + } + } + if ($filtersettings{'ENABLE_CUSTOM_BLACKLIST'} eq 'on') + { + $defaultrule .= "!custom-blocked "; + } + if ($filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} eq 'on') + { + $defaultrule .= "!custom-expressions "; + } + if (($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') || + ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') || + ($filtersettings{'BLOCK_ARCHIVES'} eq 'on')) + { + $defaultrule .= "!files "; + } + $defaultrule .= "any"; + } + + open(FILE, ">${General::swroot}/urlfilter/squidGuard.conf") or die "Unable to write squidGuard.conf file"; + flock(FILE, 2); + + print FILE "logdir /var/log/squidGuard\n"; + print FILE "dbhome $dbdir\n\n"; + + undef @repositoryfiles; + if ($filtersettings{'ENABLE_REWRITE'} eq 'on') + { + @repositorylist = <$repository/*>; + foreach (@repositorylist) + { + if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); } + } + } + + if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) + { + print FILE "rewrite rew-rule-0 {\n"; + + if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) + { + print FILE " # rewrite localfiles\n"; + foreach (@repositoryfiles) + { + print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n"; + } + } + + if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on') + { + print FILE " # rewrite safesearch\n"; + print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)(\\bsafe=\\w+)(.*)\@\\1\\3safe=strict\\5\@i\n"; + print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)\@\\1safe=strict\\\&\\3\@i\n"; + print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W)(.*)(\\bvm=\\w+)(.*)\@\\1\\2vm=r\\4\@i\n"; + print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W.*)\@\\1\\\&vm=r\@i\n"; + print FILE " s@(.*\\Walltheweb\\.com/customize\\?)(.*)(\\bcopt_offensive=\\w+)(.*)\@\\1\\2copt_offensive=on\\4\@i\n"; + } + + print FILE "}\n\n"; + + if ((!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) && ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) { + print FILE "rewrite rew-rule-1 {\n"; + if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) + { + print FILE " # rewrite localfiles\n"; + foreach (@repositoryfiles) + { + print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n"; + } + } else { + print FILE " # rewrite nothing\n"; + } + print FILE "}\n\n"; + } + } + + if (-e $uqfile) + { + open(UQ, $uqfile); + @uqlist = ; + close(UQ); + + if (@uqlist > 0) + { + $idx=0; + foreach (@uqlist) + { + chomp; + @uq = split(/\,/); + if ($uq[4] eq 'on') + { + $idx++; + $uq[0] = $uq[0] * 60; + if ($uq[1] eq '0') { + if ($uq[2] eq 'hourly') { $uq[1] = 3600 } + if ($uq[2] eq 'daily') { $uq[1] = 86400 } + if ($uq[2] eq 'weekly') { $uq[1] = 604800 } + } + $uq[3] =~ s/\|/ /g; + print FILE "src quota-$idx {\n"; + print FILE " user $uq[3]\n"; + print FILE " userquota $uq[0] $uq[1] $uq[2]\n"; + print FILE "}\n\n"; + } + } + + } + } + + @tclist = &aggregatedconstraints; + + if (@tclist > 0) + { + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + if ($tc[15] eq 'on') + { + $idx++; + print FILE "src network-$idx {\n"; + print FILE " ip $tc[12]\n"; + print FILE "}\n\n"; + } + } + + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + if ($tc[15] eq 'on') + { + $idx++; + print FILE "time constraint-$idx {\n"; + print FILE "$tc[16]\n"; + print FILE "}\n\n"; + } + } + } + + if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) { + print FILE "src unfiltered {\n"; + print FILE " ip $filtersettings{'UNFILTERED_CLIENTS'}\n"; + print FILE "}\n\n"; + } + if (!($filtersettings{'BANNED_CLIENTS'} eq '')) { + print FILE "src banned {\n"; + print FILE " ip $filtersettings{'BANNED_CLIENTS'}\n"; + print FILE "}\n\n"; + } + + foreach $category (@categories) { + print FILE "dest $category {\n"; + if (-e "$dbdir/$category/domains") { + print FILE " domainlist $category\/domains\n"; + } + if (-e "$dbdir/$category/urls") { + print FILE " urllist $category\/urls\n"; + } + if ((-e "$dbdir/$category/expressions") && ($filtersettings{'ENABLE_EXPR_LISTS'} eq 'on')) { + print FILE " expressionlist $category\/expressions\n"; + } + if (($category eq 'ads') && ($filtersettings{'ENABLE_EMPTY_ADS'} eq 'on')) + { + print FILE " redirect http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/images/urlfilter/1x1.gif\n"; + } + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident $category.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + } + + print FILE "dest files {\n"; + print FILE " expressionlist custom\/blocked\/files\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident files.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "dest custom-allowed {\n"; + print FILE " domainlist custom\/allowed\/domains\n"; + print FILE " urllist custom\/allowed\/urls\n"; + print FILE "}\n\n"; + + print FILE "dest custom-blocked {\n"; + print FILE " domainlist custom\/blocked\/domains\n"; + print FILE " urllist custom\/blocked\/urls\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident custom.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "dest custom-expressions {\n"; + print FILE " expressionlist custom\/blocked\/expressions\n"; + if ($filtersettings{'ENABLE_LOG'} eq 'on') + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile $ident custom.log\n"; + } else { + print FILE " logfile $ident urlfilter.log\n"; + } + } + print FILE "}\n\n"; + + print FILE "acl {\n"; + if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) { + print FILE " unfiltered {\n"; + print FILE " pass all\n"; + if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on') + { + print FILE " rewrite rew-rule-1\n"; + } + print FILE " }\n\n"; + } + if (!($filtersettings{'BANNED_CLIENTS'} eq '')) { + print FILE " banned {\n"; + print FILE " pass "; + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none\n"; + print FILE " }\n\n"; + } + + if (-s $uqfile) + { + open(UQ, $uqfile); + @uqlist = ; + close(UQ); + + $idx=0; + foreach (@uqlist) + { + chomp; + @uq = split(/\,/); + if ($uq[4] eq 'on') + { + $idx++; + $qredirect = $redirect; + $qredirect =~ s/\%t/\%q\%20-\%20\%i/; + print FILE " quota-$idx {\n"; + print FILE " pass "; + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none\n"; + unless ($redirect eq $qredirect) { print FILE " redirect $qredirect\n"; } + print FILE " }\n\n"; + } + } + } + + if (@tclist > 0) + { + $idx=0; + foreach (@tclist) + { + chomp; + @tc = split(/\,/); + @ec = split(/\|/,$tc[13]); + if ($tc[15] eq 'on') + { + $idx++; + print FILE " network-$idx $tc[0] constraint-$idx {\n"; + print FILE " pass "; + + if ($filtersettings{'BLOCK_ALL'} eq 'on') + { + if ($tc[14] eq 'block') + { + if ((@ec == 1) && ($ec[0] eq 'any')) { + if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on')) + { + print FILE "custom-allowed "; + } + print FILE "none"; + } else { + print FILE $defaultrule; + } + } else { + foreach (@ec) + { + print FILE "$_ "; + } + print FILE $defaultrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } + } else { + if ($tc[14] eq 'block') + { + $tcrule = $defaultrule; + if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') { + $tcrule =~ s/custom-allowed //; + print FILE "custom-allowed " unless ((@ec == 1) && ($ec[0] eq 'any') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'off')); + } + if ((@ec == 1) && ($ec[0] eq 'any')) { + print FILE "none"; + } else { + foreach (@ec) + { + print FILE "!$_ " unless (index($defaultrule,"!".$_." ") ge 0); + } + } + print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } else { + $tcrule = $defaultrule; + foreach (@ec) + { + $tcrule =~ s/!$_ //; + print FILE "$_ " if ($_ eq 'any'); + } + print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any')); + } + } + + print FILE "\n"; + + print FILE " }\n\n"; + } + } + } + + print FILE " default {\n"; + print FILE " pass $defaultrule\n"; + if (($filtersettings{'ENABLE_LOG'} eq 'on') && ($filtersettings{'BLOCK_ALL'} eq 'on')) + { + if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on') + { + print FILE " logfile".$ident." default.log\n"; + } else { + print FILE " logfile".$ident." urlfilter.log\n"; + } + } + if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) + { + print FILE " rewrite rew-rule-0\n"; + } + print FILE " redirect $redirect\n"; + print FILE " }\n"; + print FILE "}\n"; + + close FILE; +} + +# ------------------------------------------------------------------- diff --git a/html/html/images/urlfilter/1x1.gif b/html/html/images/urlfilter/1x1.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9104214b04064665feb230c8cafa40db433f1fc GIT binary patch literal 49 vcmZ?wbhEHbWMp7uXk=sng8%>jgD3_D#h)xd0Y(NL5C^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-1h8TtzW=16jCP7AKLB{__7^E2(8JHQE85t0OnT3^+iH!p&sUyI^ z#KgqN#KOkN3YBMMVrCIEWEE0$3``UjQ8FsrXlzn6anePgYB8Xvk<9_>U;u?E<4z z&6B53zQ35WVBOZe+Uoz#+;d;X#=9jgl-+XYigi)*zLXz4ze((v*~wG9ua8f$lulrB z02;<{5<0<<6L!YCcnB+Wn-zoA%X;RR!Jm-~Cztl9Bd5kAHzH8*@vNB4aoA zq}{%Bf0MB)r<<34bWP?|+r^hsP8l5Ecy`I|$Y)7&W_eG4(B03h7hht3W@0(}@)~W? z=_XHhc(?cRJ(-Iw_{w)cJ7xajqdfKA%%clNMey(`o8DQUs8>sNVS zpZ+Ie(H463cB;|#{V(&3FMYYCyzbBG!Z+K@^lsSh58hkq^;+-L=55+rU#iWY*0Evk z=Odd|Wd{XU73KFcm|E3-I&my`{@uMs2iZjB_4_5vx1X+i@+1J{TCLM;D~s>$J^9wI zEQ%o{)^5qq*?+ba^GGdLRe8R3zv;6rQOvF$35PgWoQg9j`1oDr@UcFVREd)(&G!ox Nn1BpG2KE1M0sv^<1RMYW literal 0 HcmV?d00001 diff --git a/html/html/images/urlfilter/led-green.gif b/html/html/images/urlfilter/led-green.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b8ec07bfee5f97208b7d9f540a8d772bc3051e GIT binary patch literal 898 zcmX|AQAkr!82-+7n!d zOG~nr!k)^6dRn{NGPqU``Vzhb5nZ20TncIIbk3%ohs)3Rf9L$)_wnD(GpF0V1J$U; zA3&OvrY5JPVu3L>RV+wFsZcBcXq#i$#~`x|7|;ZSflWZ2#+^gxE!Qa|+^_;woPXKw zLI>dGB`!!Aq%EM;yk0S=#ks*07DW&%i!VosxM;*hCRrBca*tj^g*7z!(u@o#uo<**w_n9 zxfQJ_5yE@54OG0!!rKar;KIy0CcdJTFn^v_X|$ctcc77|;L-4q;5}0veoBY;QhzJO z2win0s2ZeXld^70qnI<}&~a89=u%$(ki5sZe!>;cs~XW~aQn7^pt0|~qG*yt%seLw zhsM_OFc*nvDzAz}-?xl_hs6+t^q={uFi6ouk>h>GMv;;YR*?V8nhIeh4Z=4bkO3iO zRCmWAWy-=kVy16td?uWgSypyK%Eir`8%x(MGoD!lR0sybEKmoV4tE_${+n+Q=rO3f zJ?>(_Xp1~(T%bipkU6s3UXMZ!5q3y2Zh1-wW&FdKX+&Y0$3J4V23ih;&oKH7^0*CN zeUN#86XNrPt_IS>Hk+TvQy&CPgU&X5AB`4l>-uPkV<7`S&mVGUt}M`?pS8Mq4ZeOM za|xs$xSUJ`)x1&5rT#8FmcY+Ex{QT~&}1q9O '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 1c52301d4..64f1566ab 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 978ccc366..48c4ff209 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 32c794cad..c9144b30a 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 cbae8e039..82f7e6cbb 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 a6c94b7bc..e54623bed 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