]> git.ipfire.org Git - ipfire-2.x.git/blame - html/cgi-bin/urlfilter.cgi
URL Filter: Drop Safe Search feature
[ipfire-2.x.git] / html / cgi-bin / urlfilter.cgi
CommitLineData
10e4f239 1#!/usr/bin/perl
70df8302
MT
2###############################################################################
3# #
4# IPFire.org - A linux based firewall #
a4883c68 5# Copyright (C) 2005-2010 IPFire Team #
70df8302
MT
6# #
7# This program is free software: you can redistribute it and/or modify #
8# it under the terms of the GNU General Public License as published by #
9# the Free Software Foundation, either version 3 of the License, or #
10# (at your option) any later version. #
11# #
12# This program is distributed in the hope that it will be useful, #
13# but WITHOUT ANY WARRANTY; without even the implied warranty of #
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15# GNU General Public License for more details. #
16# #
17# You should have received a copy of the GNU General Public License #
18# along with this program. If not, see <http://www.gnu.org/licenses/>. #
19# #
20###############################################################################
10e4f239
MT
21
22use strict;
23
24# enable only the following on debugging purpose
cb5e9c6c
CS
25#use warnings;
26#use CGI::Carp 'fatalsToBrowser';
10e4f239
MT
27
28use File::Copy;
29use IO::Socket;
30
31require '/var/ipfire/general-functions.pl';
32require "${General::swroot}/lang.pl";
33require "${General::swroot}/header.pl";
34
1465b127 35my $http_port='81';
10e4f239
MT
36my %netsettings=();
37my %mainsettings=();
38my %proxysettings=();
39my %filtersettings=();
10e4f239
MT
40my %tcsettings=();
41my %uqsettings=();
42my %besettings=();
43my %updatesettings=();
44my %checked=();
45my %selected=();
46my $id=0;
47my $line='';
48my $i=0;
49my $n=0;
50my $time='';
51my $filesize;
52my $category='';
53my $section='';
54my $blacklist='';
55my $blistbackup='';
56
57my $changed = 'no';
58my $tcfile = "${General::swroot}/urlfilter/timeconst";
59my $uqfile = "${General::swroot}/urlfilter/userquota";
60my $dbdir = "${General::swroot}/urlfilter/blacklists";
61my $editdir = "${General::swroot}/urlfilter/editor";
87e33a42 62my $templatedir = "/srv/web/ipfire/html/redirect-templates";
e9007fef 63my $repository = "/var/urlrepo";
10e4f239
MT
64my $hintcolour = '#FFFFCC';
65
66my $sourceurlfile = "${General::swroot}/urlfilter/autoupdate/autoupdate.urls";
67my $updconffile = "${General::swroot}/urlfilter/autoupdate/autoupdate.conf";
68my $updflagfile = "${General::swroot}/urlfilter/blacklists/.autoupdate.last";
10e4f239
MT
69
70my $errormessage='';
71my $updatemessage='';
72my $restoremessage='';
73my $buttontext='';
74my $source_name='';
75my $source_url='';
76my $blacklistage=0;
77
78my @repositorylist=();
79my @repositoryfiles=();
80my @categories=();
81my @selectedcategories=();
82my @filtergroups=();
83my @tclist=();
84my @uqlist=();
85my @source_urllist=();
1465b127 86my @clients=();
10e4f239
MT
87my @temp=();
88
89my $lastslashpos=0;
90
91my $toggle='';
92my $gif='';
93my $led='';
94my $ldesc='';
95my $gdesc='';
96
97if (! -d $dbdir) { mkdir("$dbdir"); }
98if (! -e $tcfile) { system("touch $tcfile"); }
99if (! -e $uqfile) { system("touch $uqfile"); }
100if (! -e $sourceurlfile) { system("touch $sourceurlfile"); }
101
102&General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
103&General::readhash("${General::swroot}/main/settings", \%mainsettings);
104&General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
105
106&readblockcategories;
107
108open(FILE, $tcfile);
109@tclist = <FILE>;
110close(FILE);
111open(FILE, $uqfile);
112@uqlist = <FILE>;
113close(FILE);
114open(FILE, $sourceurlfile);
115@source_urllist = <FILE>;
116close(FILE);
117
118$filtersettings{'ENABLE_CUSTOM_BLACKLIST'} = 'off';
119$filtersettings{'ENABLE_CUSTOM_WHITELIST'} = 'off';
120$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} = 'off';
121$filtersettings{'BLOCK_EXECUTABLES'} = 'off';
122$filtersettings{'BLOCK_AUDIO-VIDEO'} = 'off';
123$filtersettings{'BLOCK_ARCHIVES'} = 'off';
124$filtersettings{'ENABLE_REWRITE'} = 'off';
125$filtersettings{'UNFILTERED_CLIENTS'} = '';
126$filtersettings{'BANNED_CLIENTS'} = '';
127$filtersettings{'SHOW_CATEGORY'} = 'off';
128$filtersettings{'SHOW_URL'} = 'off';
129$filtersettings{'SHOW_IP'} = 'off';
130$filtersettings{'ENABLE_DNSERROR'} = 'off';
131$filtersettings{'ENABLE_JPEG'} = 'off';
132$filtersettings{'REDIRECT_PAGE'} = '';
133$filtersettings{'MSG_TEXT_1'} = '';
134$filtersettings{'MSG_TEXT_2'} = '';
135$filtersettings{'MSG_TEXT_3'} = '';
136$filtersettings{'ENABLE_EXPR_LISTS'} = 'off';
137$filtersettings{'BLOCK_IP_ADDR'} = 'off';
138$filtersettings{'BLOCK_ALL'} = 'off';
139$filtersettings{'ENABLE_EMPTY_ADS'} = 'off';
140$filtersettings{'ENABLE_GLOBAL_WHITELIST'} = 'off';
10e4f239
MT
141$filtersettings{'ENABLE_LOG'} = 'off';
142$filtersettings{'ENABLE_USERNAME_LOG'} = 'off';
143$filtersettings{'ENABLE_CATEGORY_LOG'} = 'off';
10e4f239 144$filtersettings{'ENABLE_AUTOUPDATE'} = 'off';
87e33a42 145$filtersettings{'REDIRECT_TEMPLATE'} = 'legacy';
10e4f239
MT
146
147$filtersettings{'ACTION'} = '';
148$filtersettings{'VALID'} = '';
149
150&Header::getcgihash(\%filtersettings);
151&Header::getcgihash(\%tcsettings);
152&Header::getcgihash(\%uqsettings);
153&Header::getcgihash(\%besettings);
154
155if (($filtersettings{'ACTION'} eq $Lang::tr{'save'}) ||
156 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) ||
157 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) ||
158 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) ||
10e4f239
MT
159 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) ||
160 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) ||
161 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'}))
1465b127
MT
162{
163
164 @clients = split(/\n/,$filtersettings{'UNFILTERED_CLIENTS'});
165 foreach (@clients)
166 {
167 s/^\s+//g; s/\s+$//g; s/\s+-\s+/-/g; s/\s+/ /g; s/\n//g;
168 if (/.*-.*-.*/) { $errormessage = $Lang::tr{'urlfilter invalid ip or mask error'}; }
169 @temp = split(/-/);
170 foreach (@temp) { unless ((&General::validipormask($_)) || (&General::validipandmask($_))) { $errormessage = $Lang::tr{'urlfilter invalid ip or mask error'}; } }
171 }
172 @clients = split(/\n/,$filtersettings{'BANNED_CLIENTS'});
173 foreach (@clients)
174 {
175 s/^\s+//g; s/\s+$//g; s/\s+-\s+/-/g; s/\s+/ /g; s/\n//g;
176 if (/.*-.*-.*/) { $errormessage = $Lang::tr{'urlfilter invalid ip or mask error'}; }
177 @temp = split(/-/);
178 foreach (@temp) { unless ((&General::validipormask($_)) || (&General::validipandmask($_))) { $errormessage = $Lang::tr{'urlfilter invalid ip or mask error'}; } }
179 }
180 if ($errormessage) { goto ERROR; }
181
10e4f239
MT
182 if ((!($filtersettings{'REDIRECT_PAGE'} eq '')) && (!($filtersettings{'REDIRECT_PAGE'} =~ /^https?:\/\//)))
183 {
184 $filtersettings{'REDIRECT_PAGE'} = "http://".$filtersettings{'REDIRECT_PAGE'};
185 }
186
187 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'})
188 {
189 if (-e "$repository/$filtersettings{'ID'}") { unlink("$repository/$filtersettings{'ID'}"); }
190 $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'};
191 }
192
193 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'})
194 {
195 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPLOADFILE'});
196
197 $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'};
198 $_ = $filtersettings{'UPLOADFILE'};
199 tr/\\/\//;
200 $_ = substr($_,rindex($_,"/")+1);
201 if ($_) {
202 if (copy($filtersettings{'UPLOADFILE'}, "$repository/$_") != 1)
203 {
204 $errormessage = $!;
205 goto ERROR;
206 }
207 }
208
209 }
1465b127 210
10e4f239
MT
211 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'})
212 {
213 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'});
214
215 if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/))
216 {
217 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
218 goto ERROR;
219 }
220
221 if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/blacklists.tar.gz") != 1)
222 {
223 $errormessage = $!;
224 goto ERROR;
225 }
d47ad587 226
10e4f239
MT
227 if (!(-d "${General::swroot}/urlfilter/update")) { mkdir("${General::swroot}/urlfilter/update"); }
228
229 my $exitcode = system("/bin/tar --no-same-owner -xzf ${General::swroot}/urlfilter/blacklists.tar.gz -C ${General::swroot}/urlfilter/update");
d47ad587 230
10e4f239
MT
231 if ($exitcode > 0)
232 {
233 $errormessage = $Lang::tr{'urlfilter tar error'};
234 } else {
235
1465b127
MT
236 if (-d "${General::swroot}/urlfilter/update/BL")
237 {
238 system("mv ${General::swroot}/urlfilter/update/BL ${General::swroot}/urlfilter/update/blacklists");
239 }
240
10e4f239
MT
241 if (-d "${General::swroot}/urlfilter/update/category")
242 {
243 system("mv ${General::swroot}/urlfilter/update/category ${General::swroot}/urlfilter/update/blacklists");
244 }
245
246 if (!(-d "${General::swroot}/urlfilter/update/blacklists"))
247 {
248 $errormessage = $Lang::tr{'urlfilter invalid content'};
249 } else {
250 system("cp -r ${General::swroot}/urlfilter/update/blacklists/* $dbdir");
251
252 &readblockcategories;
253 &readcustomlists;
254
255 &writeconfigfile;
256
257 $updatemessage = $Lang::tr{'urlfilter upload success'};
258 system("${General::swroot}/urlfilter/bin/prebuild.pl &");
259 system("logger -t installpackage[urlfilter] \"URL filter blacklist - Blacklist update from local source completed\"");
260 }
261 }
262 if (-d "${General::swroot}/urlfilter/update") { system("rm -rf ${General::swroot}/urlfilter/update"); }
263 if (-e "${General::swroot}/urlfilter/blacklists.tar.gz") { unlink("${General::swroot}/urlfilter/blacklists.tar.gz"); }
264 if ($errormessage) { goto ERROR; }
265 }
266
267 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'})
268 {
269 $blistbackup = ($filtersettings{'ENABLE_FULLBACKUP'} eq 'on') ? "blacklists" : "blacklists/custom";
270 if (system("/bin/tar -C ${General::swroot}/urlfilter -czf ${General::swroot}/urlfilter/backup.tar.gz settings timeconst userquota autoupdate $blistbackup"))
271 {
272 $errormessage = $Lang::tr{'urlfilter backup error'};
273 goto ERROR;
274 }
275 else
276 {
277 print "Content-type: application/gzip\n";
278 print "Content-length: ";
279 print (-s "${General::swroot}/urlfilter/backup.tar.gz");
280 print "\n";
281 print "Content-disposition: attachment; filename=urlfilter-backup.tar.gz\n\n";
282
283 open (FILE, "${General::swroot}/urlfilter/backup.tar.gz");
284 while (<FILE>) { print; }
285 close (FILE);
286
287 if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); }
288 exit;
289 }
290 }
291
292 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'})
293 {
294 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'});
295
296 if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/))
297 {
298 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
299 goto ERROR;
300 }
301
302 if (!(-d "${General::swroot}/urlfilter/restore")) { mkdir("${General::swroot}/urlfilter/restore"); }
303
304 if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/backup.tar.gz") != 1)
305 {
306 $errormessage = $!;
307 }
d47ad587 308
10e4f239
MT
309 my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf ${General::swroot}/urlfilter/backup.tar.gz -C ${General::swroot}/urlfilter/restore");
310 if ($exitcode > 0)
311 {
312 $errormessage = $Lang::tr{'urlfilter tar error'};
313 } else {
314 if (!(-e "${General::swroot}/urlfilter/restore/settings"))
315 {
316 $errormessage = $Lang::tr{'urlfilter invalid restore file'};
317 } else {
318 system("cp -rp ${General::swroot}/urlfilter/restore/* ${General::swroot}/urlfilter/");
319 &readblockcategories;
320 &readcustomlists;
321 &writeconfigfile;
322
323 $restoremessage = $Lang::tr{'urlfilter restore success'};
324 }
325 }
326
327 if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); }
328 if (-d "${General::swroot}/urlfilter/restore") { system("rm -rf ${General::swroot}/urlfilter/restore"); }
329 if ($errormessage) { goto ERROR; }
330 }
331
332 if ($filtersettings{'ACTION'} eq $Lang::tr{'save'})
333 {
334 $filtersettings{'VALID'} = 'yes';
335 &savesettings;
336 }
337
338 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'})
339 {
1465b127 340 if ((!(-e "${General::swroot}/proxy/enable")) && (!(-e "${General::swroot}/proxy/enable_blue")))
10e4f239
MT
341 {
342 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
343 goto ERROR;
344 }
345 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
346 {
347 $errormessage = $Lang::tr{'urlfilter not enabled'};
348 goto ERROR;
349 }
350
351 $filtersettings{'VALID'} = 'yes';
352 &savesettings;
353
7d3af7f7 354 system('/usr/local/bin/squidctrl restart >/dev/null 2>&1');
10e4f239 355 }
10e4f239
MT
356}
357
358if ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter set time constraints'}) { $tcsettings{'TCMODE'} = 'on'}
359
360if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'add'}))
361{
362 $tcsettings{'TCMODE'}='on';
363
364 if (!$tcsettings{'DST'})
365 {
366 $errormessage=$Lang::tr{'urlfilter dst error'};
367 }
368
369 if (!$tcsettings{'SRC'})
370 {
371 $errormessage=$Lang::tr{'urlfilter src error'};
372 }
373
374 if (!($tcsettings{'TO_HOUR'}.$tcsettings{'TO_MINUTE'} gt $tcsettings{'FROM_HOUR'}.$tcsettings{'FROM_MINUTE'}))
375 {
376 $errormessage=$Lang::tr{'urlfilter timespace error'};
377 }
378
379 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')))
380 {
381 $errormessage=$Lang::tr{'urlfilter weekday error'};
382 }
383
384 if (!$errormessage)
385 {
1465b127
MT
386 # transform to pre1.8 client definitions
387 @clients = split(/\n/,$tcsettings{'SRC'});
388 undef $tcsettings{'SRC'};
389 foreach(@clients)
390 {
391 s/^\s+//g; s/\s+$//g; s/\s+-\s+/-/g; s/\s+/ /g; s/\n//g;
392 $tcsettings{'SRC'} .= "$_ ";
393 }
394 $tcsettings{'SRC'} =~ s/\s+$//;
395
10e4f239
MT
396 if ($tcsettings{'DST'} =~ /^any/) { $tcsettings{'DST'} = 'any'; }
397 if ($tcsettings{'ENABLERULE'} eq 'on') { $tcsettings{'ACTIVE'} = $tcsettings{'ENABLERULE'}; } else { $tcsettings{'ACTIVE'} = 'off'}
398
399 $tcsettings{'ENABLERULE'} = 'on';
400 if($tcsettings{'EDITING'} eq 'no') {
401 open(FILE,">>$tcfile");
402 flock FILE, 2;
403 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";
404 } else {
405 open(FILE, ">$tcfile");
406 flock FILE, 2;
407 $id = 0;
408 foreach $line (@tclist)
409 {
410 $id++;
411 if ($tcsettings{'EDITING'} eq $id) {
412 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";
413 } else { print FILE "$line"; }
414 }
415 }
416 close(FILE);
417 undef %tcsettings;
418 $tcsettings{'CHANGED'}='yes';
419 $tcsettings{'TCMODE'}='on';
420 $changed = 'yes';
421 } else {
422 if ($tcsettings{'EDITING'} ne 'no')
423 {
424 $tcsettings{'ACTION'} = $Lang::tr{'edit'};
425 $tcsettings{'ID'} = $tcsettings{'EDITING'};
426 }
427 }
428}
429
1465b127
MT
430if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter copy rule'}) && (!$errormessage))
431{
432 $id = 0;
433 foreach $line (@tclist)
434 {
435 $id++;
436 if ($tcsettings{'ID'} eq $id)
437 {
438 chomp($line);
439 @temp = split(/\,/,$line);
440 $tcsettings{'DEFINITION'} = $temp[0];
441 $tcsettings{'MON'} = $temp[1];
442 $tcsettings{'TUE'} = $temp[2];
443 $tcsettings{'WED'} = $temp[3];
444 $tcsettings{'THU'} = $temp[4];
445 $tcsettings{'FRI'} = $temp[5];
446 $tcsettings{'SAT'} = $temp[6];
447 $tcsettings{'SUN'} = $temp[7];
448 $tcsettings{'FROM_HOUR'} = $temp[8];
449 $tcsettings{'FROM_MINUTE'} = $temp[9];
450 $tcsettings{'TO_HOUR'} = $temp[10];
451 $tcsettings{'TO_MINUTE'} = $temp[11];
452 $tcsettings{'SRC'} = $temp[12];
453 $tcsettings{'DST'} = $temp[13];
454 $tcsettings{'ACCESS'} = $temp[14];
455 $tcsettings{'ENABLERULE'} = $temp[15];
456 $tcsettings{'COMMENT'} = $temp[16];
457 }
458 }
459 $tcsettings{'TCMODE'}='on';
460}
461
10e4f239
MT
462if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'remove'}))
463{
464 $id = 0;
465 open(FILE, ">$tcfile");
466 flock FILE, 2;
467 foreach $line (@tclist)
468 {
469 $id++;
470 unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; }
471 }
472 close(FILE);
473 $tcsettings{'CHANGED'}='yes';
474 $tcsettings{'TCMODE'}='on';
475}
476
477if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'}))
478{
479 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
480 {
481 $errormessage = $Lang::tr{'urlfilter not enabled'};
482 }
1465b127 483 if ((!(-e "${General::swroot}/proxy/enable")) && (!(-e "${General::swroot}/proxy/enable_blue")))
10e4f239
MT
484 {
485 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
486 }
487
7d3af7f7 488 if (!$errormessage) { system('/usr/local/bin/squidctrl restart >/dev/null 2>&1'); }
10e4f239
MT
489 $tcsettings{'TCMODE'}='on';
490}
491
492if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'}))
493{
494 open(FILE, ">$tcfile");
495 flock FILE, 2;
496 $id = 0;
497 foreach $line (@tclist)
498 {
499 $id++;
500 unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; }
501 else
502 {
503 chomp($line);
504 @temp = split(/\,/,$line);
505 if ($temp[15] eq 'on') { $temp[15] = 'off'; } else { $temp[15] = 'on' }
506 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";
507 }
508 }
509 close(FILE);
510 $tcsettings{'CHANGED'}='yes';
511 $tcsettings{'TCMODE'}='on';
512}
513
10e4f239
MT
514if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage))
515{
516 $id = 0;
517 foreach $line (@tclist)
518 {
519 $id++;
520 if ($tcsettings{'ID'} eq $id)
521 {
522 chomp($line);
523 @temp = split(/\,/,$line);
524 $tcsettings{'DEFINITION'} = $temp[0];
525 $tcsettings{'MON'} = $temp[1];
526 $tcsettings{'TUE'} = $temp[2];
527 $tcsettings{'WED'} = $temp[3];
528 $tcsettings{'THU'} = $temp[4];
529 $tcsettings{'FRI'} = $temp[5];
530 $tcsettings{'SAT'} = $temp[6];
531 $tcsettings{'SUN'} = $temp[7];
532 $tcsettings{'FROM_HOUR'} = $temp[8];
533 $tcsettings{'FROM_MINUTE'} = $temp[9];
534 $tcsettings{'TO_HOUR'} = $temp[10];
535 $tcsettings{'TO_MINUTE'} = $temp[11];
536 $tcsettings{'SRC'} = $temp[12];
537 $tcsettings{'DST'} = $temp[13];
538 $tcsettings{'ACCESS'} = $temp[14];
539 $tcsettings{'ENABLERULE'} = $temp[15];
540 $tcsettings{'COMMENT'} = $temp[16];
541 }
542 }
543 $tcsettings{'TCMODE'}='on';
544}
545
1465b127
MT
546if ((!$errormessage) && (!($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter copy rule'})) && (!($tcsettings{'ACTION'} eq $Lang::tr{'edit'}))) {
547 $tcsettings{'ENABLERULE'}='on';
548 $tcsettings{'TO_HOUR'}='24';
549}
550
10e4f239
MT
551if ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter set user quota'}) { $uqsettings{'UQMODE'} = 'on'}
552
553if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'add'}))
554{
555 $uqsettings{'UQMODE'}='on';
556
557 if ((!($uqsettings{'TIME_QUOTA'} =~ /^\d+/)) || ($uqsettings{'TIME_QUOTA'} < '1'))
558 {
559 $errormessage=$Lang::tr{'urlfilter quota time error'};
560 }
561
562 @temp = split(/\n/,$uqsettings{'QUOTA_USERS'});
563 undef $uqsettings{'QUOTA_USERS'};
564 foreach (@temp)
565 {
566 s/^\s+//g; s/\s+$//g;
567 if ($_) { $uqsettings{'QUOTA_USERS'} .= $_."\n"; }
568 }
569
570 if ($uqsettings{'QUOTA_USERS'} eq '')
571 {
572 $errormessage=$Lang::tr{'urlfilter quota user error'};
573 }
574
575 $_ = $uqsettings{'QUOTA_USERS'};
576 chomp; s/\n/|/g;
577 my $quota_users = $_;
578
579 if ($uqsettings{'QUOTA_USERS'} =~ /\\/)
580 {
581 $errormessage=$Lang::tr{'urlfilter invalid user error'};
582 }
583
584 if (!$errormessage) {
585 if ($uqsettings{'ENABLEQUOTA'} eq 'on') { $uqsettings{'ACTIVE'} = $uqsettings{'ENABLEQUOTA'}; } else { $uqsettings{'ACTIVE'} = 'off'}
586
587 $uqsettings{'ENABLERULE'} = 'on';
588 if($uqsettings{'EDITING'} eq 'no') {
589 open(FILE,">>$uqfile");
590 flock FILE, 2;
591 print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n";
592 } else {
593 open(FILE, ">$uqfile");
594 flock FILE, 2;
595 $id = 0;
596 foreach $line (@uqlist)
597 {
598 $id++;
599 if ($uqsettings{'EDITING'} eq $id) {
600 print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n";
601 } else { print FILE "$line"; }
602 }
603 }
604 close(FILE);
605 undef %uqsettings;
606 $uqsettings{'CHANGED'}='yes';
607 $uqsettings{'MODE'}='USERQUOTA';
608 $uqsettings{'UQMODE'}='on';
609 $changed = 'yes';
610 } else {
611 if ($uqsettings{'EDITING'} ne 'no')
612 {
613 $uqsettings{'ACTION'} = $Lang::tr{'edit'};
614 $uqsettings{'ID'} = $uqsettings{'EDITING'};
615 }
616 }
617}
618
619if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'remove'}))
620{
621 $id = 0;
622 open(FILE, ">$uqfile");
623 flock FILE, 2;
624 foreach $line (@uqlist)
625 {
626 $id++;
627 unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; }
628 }
629 close(FILE);
630 $uqsettings{'CHANGED'}='yes';
631 $uqsettings{'UQMODE'}='on';
632}
633
634if (!$errormessage) {
635 $uqsettings{'ENABLEQUOTA'}='on';
636}
637
638if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage))
639{
640 $id = 0;
641 foreach $line (@uqlist)
642 {
643 $id++;
644 if ($uqsettings{'ID'} eq $id)
645 {
646 chomp($line);
647 @temp = split(/\,/,$line);
648 $uqsettings{'TIME_QUOTA'} = $temp[0];
649 $uqsettings{'SPORADIC'} = $temp[1];
650 $uqsettings{'RENEWAL'} = $temp[2];
651 $uqsettings{'QUOTA_USERS'} = $temp[3];
652 $uqsettings{'ENABLEQUOTA'} = $temp[4];
653 }
654 }
655 $uqsettings{'UQMODE'}='on';
656}
657
658if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'}))
659{
660 open(FILE, ">$uqfile");
661 flock FILE, 2;
662 $id = 0;
663 foreach $line (@uqlist)
664 {
665 $id++;
666 unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; }
667 else
668 {
669 chomp($line);
670 @temp = split(/\,/,$line);
671 if ($temp[4] eq 'on') { $temp[4] = 'off'; } else { $temp[4] = 'on' }
672 print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4]\n";
673 }
674 }
675 close(FILE);
676 $uqsettings{'CHANGED'}='yes';
677 $uqsettings{'UQMODE'}='on';
678}
679
680if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'}))
681{
682 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
683 {
684 $errormessage = $Lang::tr{'urlfilter not enabled'};
685 }
1465b127 686 if ((!(-e "${General::swroot}/proxy/enable")) && (!(-e "${General::swroot}/proxy/enable_blue")))
10e4f239
MT
687 {
688 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
689 }
690
7d3af7f7 691 if (!$errormessage) { system('/usr/local/bin/squidctrl restart >/dev/null 2>&1'); }
10e4f239
MT
692 $uqsettings{'UQMODE'}='on';
693}
694
695if ($besettings{'ACTION'} eq $Lang::tr{'urlfilter blacklist editor'}) { $besettings{'BEMODE'} = 'on'; }
696
697if ($besettings{'MODE'} eq 'BLACKLIST_EDITOR')
698{
699 @temp = split(/\n/,$besettings{'BE_DOMAINS'});
700 undef $besettings{'BE_DOMAINS'};
701 foreach (@temp)
702 {
703 s/^\s+//g; s/\s+$//g;
704 if ($_) { $besettings{'BE_DOMAINS'} .= $_."\n"; }
705 }
706 chomp($besettings{'BE_DOMAINS'});
707 @temp = split(/\n/,$besettings{'BE_URLS'});
708 undef $besettings{'BE_URLS'};
709 foreach (@temp)
710 {
711 s/^\s+//g; s/\s+$//g;
712 if ($_) { $besettings{'BE_URLS'} .= $_."\n"; }
713 }
714 chomp($besettings{'BE_URLS'});
715 @temp = split(/\n/,$besettings{'BE_EXPRESSIONS'});
716 undef $besettings{'BE_EXPRESSIONS'};
717 foreach (@temp)
718 {
719 s/^\s+//g; s/\s+$//g;
720 if ($_) { $besettings{'BE_EXPRESSIONS'} .= $_."\n"; }
721 }
722 chomp($besettings{'BE_EXPRESSIONS'});
723}
724
725if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter load blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
726{
727 $besettings{'BEMODE'} = 'on';
728
729 $besettings{'BE_NAME'} = $besettings{'BE_BLACKLIST'};
730
731 delete $besettings{'BE_DOMAINS'};
732 delete $besettings{'BE_URLS'};
733 delete $besettings{'BE_EXPRESSIONS'};
734
735 if (-e "$dbdir/$besettings{'BE_NAME'}/domains")
736 {
737 open(FILE, "$dbdir/$besettings{'BE_NAME'}/domains");
738 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } };
739 close FILE;
740 chomp($besettings{'BE_DOMAINS'});
741 }
742 if (-e "$dbdir/$besettings{'BE_NAME'}/urls")
743 {
744 open(FILE, "$dbdir/$besettings{'BE_NAME'}/urls");
745 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } };
746 close FILE;
747 chomp($besettings{'BE_URLS'});
748 }
749 if (-e "$dbdir/$besettings{'BE_NAME'}/expressions")
750 {
751 open(FILE, "$dbdir/$besettings{'BE_NAME'}/expressions");
752 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } };
753 close FILE;
754 chomp($besettings{'BE_EXPRESSIONS'});
755 }
756}
757
758if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter import blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
759{
760 $besettings{'BEMODE'} = 'on';
761
762 &Header::getcgihash(\%besettings, {'wantfile' => 1, 'filevar' => 'IMPORTFILE'});
763
764 if (!($besettings{'IMPORTFILE'} =~ /.tar.gz$/))
765 {
766 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
767 } else {
768 if (!-d "$editdir") { mkdir("$editdir"); }
769
770 if (copy($besettings{'IMPORTFILE'}, "$editdir/blacklist.tar.gz") != 1)
771 {
772 $errormessage = $!;
773 } else {
d47ad587 774
10e4f239
MT
775 my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf $editdir/blacklist.tar.gz -C $editdir");
776 if ($exitcode > 0)
777 {
778 $errormessage = $Lang::tr{'urlfilter tar error'};
779 } else {
780 $i = 0;
781 foreach (<$editdir/blacklists/*>)
782 {
783 if (-d)
784 {
785 $i++;
786 $besettings{'BE_NAME'} = substr($_, rindex($_,"/")+1);
787 }
788 }
789
790 if (!($i == 1))
791 {
792 $errormessage = $Lang::tr{'urlfilter invalid import file'};
793 } else {
794 delete $besettings{'BE_DOMAINS'};
795 delete $besettings{'BE_URLS'};
796 delete $besettings{'BE_EXPRESSIONS'};
797
798 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/domains")
799 {
800 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/domains");
801 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } };
802 close FILE;
803 chomp($besettings{'BE_DOMAINS'});
804 }
805 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/urls")
806 {
807 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/urls");
808 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } };
809 close FILE;
810 chomp($besettings{'BE_URLS'});
811 }
812 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/expressions")
813 {
814 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/expressions");
815 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } };
816 close FILE;
817 chomp($besettings{'BE_EXPRESSIONS'});
818 }
819 }
820 }
821
822 if (-d $editdir) { system("rm -rf $editdir"); }
823
824 }
825 }
826}
827
828if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter export blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
829{
830 $besettings{'BEMODE'} = 'on';
831
832 if ($besettings{'BE_NAME'} eq '')
833 {
834 $errormessage = $Lang::tr{'urlfilter category name error'};
835 } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) {
836
837 $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_;
838
839 if (!(-d "$editdir")) { mkdir("$editdir"); }
840 if (!(-d "$editdir/blacklists")) { mkdir("$editdir/blacklists"); }
841 if (!(-d "$editdir/blacklists/$besettings{'BE_NAME'}")) { mkdir("$editdir/blacklists/$besettings{'BE_NAME'}"); }
842
843 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/domains");
844 flock FILE, 2;
845 print FILE "$besettings{'BE_DOMAINS'}\n";
846 close FILE;
847 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/urls");
848 flock FILE, 2;
849 print FILE "$besettings{'BE_URLS'}\n";
850 close FILE;
851 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/expressions");
852 flock FILE, 2;
853 print FILE "$besettings{'BE_EXPRESSIONS'}\n";
854 close FILE;
855
856 if (system("/bin/tar -C $editdir -czf $editdir/$besettings{'BE_NAME'}.tar.gz blacklists"))
857 {
858 $errormessage = $Lang::tr{'urlfilter export error'};
859 }
860 else
861 {
862 print "Content-type: application/gzip\n";
863 print "Content-length: ";
864 print (-s "$editdir/$besettings{'BE_NAME'}.tar.gz");
865 print "\n";
866 print "Content-disposition: attachment; filename=$besettings{'BE_NAME'}.tar.gz\n\n";
867
868 open (FILE, "$editdir/$besettings{'BE_NAME'}.tar.gz");
869 while (<FILE>) { print; }
870 close (FILE);
871
872 if (-d $editdir) { system("rm -rf $editdir"); }
873 exit;
874 }
875 } else {
876 $errormessage = $Lang::tr{'urlfilter category data error'};
877 }
878}
879
880if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter install blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
881{
882 $besettings{'BEMODE'} = 'on';
883
884 if ($besettings{'BE_NAME'} eq '')
885 {
886 $errormessage = $Lang::tr{'urlfilter category name error'};
887 } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) {
888
889 $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_;
890
891 if (!-d "$editdir") { mkdir("$editdir"); }
892
893 if (!-d "$dbdir/$besettings{'BE_NAME'}") { mkdir("$dbdir/$besettings{'BE_NAME'}"); }
894
895 if (-e "$dbdir/$besettings{'BE_NAME'}/domains") { unlink("$dbdir/$besettings{'BE_NAME'}/domains"); }
896 if ($besettings{'BE_DOMAINS'})
897 {
898 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/domains");
899 flock FILE, 2;
900 print FILE "$besettings{'BE_DOMAINS'}\n";
901 close FILE;
902 }
903 if (-e "$dbdir/$besettings{'BE_NAME'}/urls") { unlink("$dbdir/$besettings{'BE_NAME'}/urls"); }
904 if ($besettings{'BE_URLS'})
905 {
906 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/urls");
907 flock FILE, 2;
908 print FILE "$besettings{'BE_URLS'}\n";
909 close FILE;
910 }
911 if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") { unlink("$dbdir/$besettings{'BE_NAME'}/expressions"); }
912 if ($besettings{'BE_EXPRESSIONS'})
913 {
914 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/expressions");
915 flock FILE, 2;
916 print FILE "$besettings{'BE_EXPRESSIONS'}\n";
917 close FILE;
918 }
919
920 open(FILE, ">$editdir/install.conf");
921 flock FILE, 2;
922 print FILE "logdir /var/log/squidGuard\n";
923 print FILE "dbhome $dbdir/$besettings{'BE_NAME'}\n\n";
924 print FILE "dest $besettings{'BE_NAME'} {\n";
925 if ($besettings{'BE_DOMAINS'}) { print FILE " domainlist domains\n"; }
926 if ($besettings{'BE_URLS'}) { print FILE " urllist urls\n"; }
927 if ($besettings{'BE_EXPRESSIONS'}) { print FILE " expressions expressions\n"; }
928 print FILE "}\n\n";
929 print FILE "acl {\n";
930 print FILE " default {\n";
931 print FILE " pass none\n";
932 print FILE " }\n";
933 print FILE "}\n";
934 close FILE;
935
936 system("rm -f $dbdir/$besettings{'BE_NAME'}/*.db");
34ebab46 937 system("/usr/bin/squidGuard -c $editdir/install.conf -C all");
10e4f239
MT
938 system("chmod a+w $dbdir/$besettings{'BE_NAME'}/*.db");
939
940 &readblockcategories;
941 &readcustomlists;
942
943 &writeconfigfile;
944
7d3af7f7 945 system('/usr/local/bin/squidctrl restart >/dev/null 2>&1') unless ($besettings{'NORESTART'} eq 'on');
10e4f239
MT
946
947 if (-d $editdir) { system("rm -rf $editdir"); }
948 } else {
949 $errormessage = $Lang::tr{'urlfilter category data error'};
950 }
951}
952
953if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save schedule'})
954{
955 if (($filtersettings{'UPDATE_SOURCE'} eq 'custom') && ($filtersettings{'CUSTOM_UPDATE_URL'} eq ''))
956 {
957 $errormessage = $Lang::tr{'urlfilter custom url required'};
958 } else {
959 open (FILE, ">$updconffile");
960 print FILE "ENABLE_AUTOUPDATE=$filtersettings{'ENABLE_AUTOUPDATE'}\n";
961 print FILE "UPDATE_SCHEDULE=$filtersettings{'UPDATE_SCHEDULE'}\n";
962 print FILE "UPDATE_SOURCE=$filtersettings{'UPDATE_SOURCE'}\n";
963 print FILE "CUSTOM_UPDATE_URL=$filtersettings{'CUSTOM_UPDATE_URL'}\n";
964 close FILE;
965
10e4f239
MT
966
967 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'daily'))
968 {
a4883c68 969 system('/usr/local/bin/urlfilterctrl cron daily >/dev/null 2>&1');
10e4f239
MT
970 }
971
972 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'weekly'))
973 {
a4883c68 974 system('/usr/local/bin/urlfilterctrl cron weekly >/dev/null 2>&1');
10e4f239
MT
975 }
976
977 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'monthly'))
978 {
a4883c68 979 system('/usr/local/bin/urlfilterctrl cron monthly >/dev/null 2>&1');
10e4f239
MT
980 }
981 }
982}
983
984if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter update now'})
985{
986 if ($filtersettings{'UPDATE_SOURCE'} eq 'custom')
987 {
988 if ($filtersettings{'CUSTOM_UPDATE_URL'} eq '')
989 {
990 $errormessage = $Lang::tr{'urlfilter custom url required'};
991 } else {
992 system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'CUSTOM_UPDATE_URL'} &");
993 }
994 } else {
995 system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'UPDATE_SOURCE'} &");
996 }
997}
998
999
1000if (-e "${General::swroot}/urlfilter/settings") { &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); }
1001
1002&readcustomlists;
1003
1465b127
MT
1004ERROR:
1005
1006if ($errormessage) { $filtersettings{'VALID'} = 'no'; }
1007
10e4f239
MT
1008$checked{'ENABLE_CUSTOM_BLACKLIST'}{'off'} = '';
1009$checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} = '';
1010$checked{'ENABLE_CUSTOM_BLACKLIST'}{$filtersettings{'ENABLE_CUSTOM_BLACKLIST'}} = "checked='checked'";
1011$checked{'ENABLE_CUSTOM_WHITELIST'}{'off'} = '';
1012$checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} = '';
1013$checked{'ENABLE_CUSTOM_WHITELIST'}{$filtersettings{'ENABLE_CUSTOM_WHITELIST'}} = "checked='checked'";
1014$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'off'} = '';
1015$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} = '';
1016$checked{'ENABLE_CUSTOM_EXPRESSIONS'}{$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'}} = "checked='checked'";
1017$checked{'BLOCK_EXECUTABLES'}{'off'} = '';
1018$checked{'BLOCK_EXECUTABLES'}{'on'} = '';
1019$checked{'BLOCK_EXECUTABLES'}{$filtersettings{'BLOCK_EXECUTABLES'}} = "checked='checked'";
1020$checked{'BLOCK_AUDIO-VIDEO'}{'off'} = '';
1021$checked{'BLOCK_AUDIO-VIDEO'}{'on'} = '';
1022$checked{'BLOCK_AUDIO-VIDEO'}{$filtersettings{'BLOCK_AUDIO-VIDEO'}} = "checked='checked'";
1023$checked{'BLOCK_ARCHIVES'}{'off'} = '';
1024$checked{'BLOCK_ARCHIVES'}{'on'} = '';
1025$checked{'BLOCK_ARCHIVES'}{$filtersettings{'BLOCK_ARCHIVES'}} = "checked='checked'";
1026$checked{'ENABLE_REWRITE'}{'off'} = '';
1027$checked{'ENABLE_REWRITE'}{'on'} = '';
1028$checked{'ENABLE_REWRITE'}{$filtersettings{'ENABLE_REWRITE'}} = "checked='checked'";
1029$checked{'SHOW_CATEGORY'}{'off'} = '';
1030$checked{'SHOW_CATEGORY'}{'on'} = '';
1031$checked{'SHOW_CATEGORY'}{$filtersettings{'SHOW_CATEGORY'}} = "checked='checked'";
1032$checked{'SHOW_URL'}{'off'} = '';
1033$checked{'SHOW_URL'}{'on'} = '';
1034$checked{'SHOW_URL'}{$filtersettings{'SHOW_URL'}} = "checked='checked'";
1035$checked{'SHOW_IP'}{'off'} = '';
1036$checked{'SHOW_IP'}{'on'} = '';
1037$checked{'SHOW_IP'}{$filtersettings{'SHOW_IP'}} = "checked='checked'";
1038$checked{'ENABLE_DNSERROR'}{'off'} = '';
1039$checked{'ENABLE_DNSERROR'}{'on'} = '';
1040$checked{'ENABLE_DNSERROR'}{$filtersettings{'ENABLE_DNSERROR'}} = "checked='checked'";
1041$checked{'ENABLE_JPEG'}{'off'} = '';
1042$checked{'ENABLE_JPEG'}{'on'} = '';
1043$checked{'ENABLE_JPEG'}{$filtersettings{'ENABLE_JPEG'}} = "checked='checked'";
1044$checked{'ENABLE_EXPR_LISTS'}{'off'} = '';
1045$checked{'ENABLE_EXPR_LISTS'}{'on'} = '';
1046$checked{'ENABLE_EXPR_LISTS'}{$filtersettings{'ENABLE_EXPR_LISTS'}} = "checked='checked'";
1047$checked{'BLOCK_IP_ADDR'}{'off'} = '';
1048$checked{'BLOCK_IP_ADDR'}{'on'} = '';
1049$checked{'BLOCK_IP_ADDR'}{$filtersettings{'BLOCK_IP_ADDR'}} = "checked='checked'";
1050$checked{'BLOCK_ALL'}{'off'} = '';
1051$checked{'BLOCK_ALL'}{'on'} = '';
1052$checked{'BLOCK_ALL'}{$filtersettings{'BLOCK_ALL'}} = "checked='checked'";
1053$checked{'ENABLE_EMPTY_ADS'}{'off'} = '';
1054$checked{'ENABLE_EMPTY_ADS'}{'on'} = '';
1055$checked{'ENABLE_EMPTY_ADS'}{$filtersettings{'ENABLE_EMPTY_ADS'}} = "checked='checked'";
1056$checked{'ENABLE_GLOBAL_WHITELIST'}{'off'} = '';
1057$checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} = '';
1058$checked{'ENABLE_GLOBAL_WHITELIST'}{$filtersettings{'ENABLE_GLOBAL_WHITELIST'}} = "checked='checked'";
10e4f239
MT
1059$checked{'ENABLE_LOG'}{'off'} = '';
1060$checked{'ENABLE_LOG'}{'on'} = '';
1061$checked{'ENABLE_LOG'}{$filtersettings{'ENABLE_LOG'}} = "checked='checked'";
1062$checked{'ENABLE_USERNAME_LOG'}{'off'} = '';
1063$checked{'ENABLE_USERNAME_LOG'}{'on'} = '';
1064$checked{'ENABLE_USERNAME_LOG'}{$filtersettings{'ENABLE_USERNAME_LOG'}} = "checked='checked'";
1065$checked{'ENABLE_CATEGORY_LOG'}{'off'} = '';
1066$checked{'ENABLE_CATEGORY_LOG'}{'on'} = '';
1067$checked{'ENABLE_CATEGORY_LOG'}{$filtersettings{'ENABLE_CATEGORY_LOG'}} = "checked='checked'";
1068
1069foreach $category (@filtergroups) {
1070 $checked{$category}{'off'} = '';
1071 $checked{$category}{'on'} = '';
1072 $checked{$category}{$filtersettings{$category}} = "checked='checked'";
1073}
1074
87e33a42
MT
1075$selected{'REDIRECT_TEMPLATE'}{$filtersettings{'REDIRECT_TEMPLATE'}} = "selected='selected'";
1076
10e4f239
MT
1077$selected{'DEFINITION'}{$tcsettings{'DEFINITION'}} = "selected='selected'";
1078$selected{'FROM_HOUR'}{$tcsettings{'FROM_HOUR'}} = "selected='selected'";
1079$selected{'FROM_MINUTE'}{$tcsettings{'FROM_MINUTE'}} = "selected='selected'";
1080$selected{'TO_HOUR'}{$tcsettings{'TO_HOUR'}} = "selected='selected'";
1081$selected{'TO_MINUTE'}{$tcsettings{'TO_MINUTE'}} = "selected='selected'";
1082
1083@selectedcategories = split(/\|/,$tcsettings{'DST'});
1084foreach (@selectedcategories)
1085{
1086 $selected{'DST'}{$_} = "selected='selected'";
1087}
1088
1089$selected{'ACCESS'}{$tcsettings{'ACCESS'}} = "selected='selected'";
1090
1091$checked{'ENABLERULE'}{'off'} = '';
1092$checked{'ENABLERULE'}{'on'} = '';
1093$checked{'ENABLERULE'}{$tcsettings{'ENABLERULE'}} = "checked='checked'";
1094$checked{'MON'}{'off'} = '';
1095$checked{'MON'}{'on'} = '';
1096$checked{'MON'}{$tcsettings{'MON'}} = "checked='checked'";
1097$checked{'TUE'}{'off'} = '';
1098$checked{'TUE'}{'on'} = '';
1099$checked{'TUE'}{$tcsettings{'TUE'}} = "checked='checked'";
1100$checked{'WED'}{'off'} = '';
1101$checked{'WED'}{'on'} = '';
1102$checked{'WED'}{$tcsettings{'WED'}} = "checked='checked'";
1103$checked{'THU'}{'off'} = '';
1104$checked{'THU'}{'on'} = '';
1105$checked{'THU'}{$tcsettings{'THU'}} = "checked='checked'";
1106$checked{'FRI'}{'off'} = '';
1107$checked{'FRI'}{'on'} = '';
1108$checked{'FRI'}{$tcsettings{'FRI'}} = "checked='checked'";
1109$checked{'SAT'}{'off'} = '';
1110$checked{'SAT'}{'on'} = '';
1111$checked{'SAT'}{$tcsettings{'SAT'}} = "checked='checked'";
1112$checked{'SUN'}{'off'} = '';
1113$checked{'SUN'}{'on'} = '';
1114$checked{'SUN'}{$tcsettings{'SUN'}} = "checked='checked'";
1115
1116$selected{'SPORADIC'}{$uqsettings{'SPORADIC'}} = "selected='selected'";
1117$selected{'RENEWAL'} {$uqsettings{'RENEWAL'}} = "selected='selected'";
1118
1119$checked{'ENABLEQUOTA'}{'off'} = '';
1120$checked{'ENABLEQUOTA'}{'on'} = '';
1121$checked{'ENABLEQUOTA'}{$uqsettings{'ENABLEQUOTA'}} = "checked='checked'";
1122
1123$selected{'BE_BLACKLIST'}{$besettings{'BE_BLACKLIST'}} = "selected='selected'";
1124
1125
1126&Header::showhttpheaders();
1127
1128&Header::openpage($Lang::tr{'urlfilter configuration'}, 1, '');
1129
1130&Header::openbigbox('100%', 'left', '', $errormessage);
1131
1132if ($errormessage) {
1133 &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
1134 print "<font class='base'>$errormessage&nbsp;</font>\n";
1135 &Header::closebox();
1136} elsif (($tcsettings{'CHANGED'} eq 'yes') || ($uqsettings{'CHANGED'} eq 'yes') ) {
1137 &writeconfigfile;
1138 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
1139 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restart notification'}:");
1140 print "<class name='base'>$Lang::tr{'urlfilter restart message'}\n";
1141 if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "<p><class name='base'>$Lang::tr{'urlfilter quota restart message'}\n"; }
1142 print "</class>\n";
1143 print "<p><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter restart'}' />";
1144 if ($tcsettings{'MODE'} eq 'TIMECONSTRAINT') { print "<input type='hidden' name='MODE' value='TIMECONSTRAINT' />"; }
1145 if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "<input type='hidden' name='MODE' value='USERQUOTA' />"; }
1146 &Header::closebox();
1147 print "</form>\n";
1148}
1149
1150if ($restoremessage) {
1151 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restore results'}:");
1152 print "<class name='base'>$restoremessage\n";
1153 print "&nbsp;</class>\n";
1154 &Header::closebox();
1155}
1156
1157if ((!$tcsettings{'TCMODE'}) && (!$uqsettings{'UQMODE'}) && (!$besettings{'BEMODE'})) {
1158
1159if (!($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter manage repository'})) {
1160
1161#==========================================================
1162#
1163# Section: Main Configuration
1164#
1165#==========================================================
1166
1167print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
1168
0da15c03 1169&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter filter settings'}");
10e4f239
MT
1170print <<END
1171<table width='100%'>
1172<tr>
1173 <td colspan='4'><b>$Lang::tr{'urlfilter block categories'}</b></td>
1174</tr>
1175END
1176;
1177
1178if (@categories == 0) {
1179print <<END
1180<tr>
1181 <td><i>$Lang::tr{'urlfilter no categories'}</i></td>
1182 <td>&nbsp;</td>
1183 <td>&nbsp;</td>
1184 <td>&nbsp;</td>
1185</tr>
1186
1187END
1188;
1189}
1190
1191for ($n=0; $n<=@categories; $n = $n + $i) {
1192 for ($i=0; $i<=3; $i++) {
1193 if ($i eq 0) { print "<tr>\n"; }
1194 if (($n+$i) < @categories) {
1195 print "<td width='15%'>@categories[$n+$i]:<\/td>\n";
1196 print "<td width='10%'><input type='checkbox' name=@filtergroups[$n+$i] $checked{@filtergroups[$n+$i]}{'on'} /></td>\n";
1197 }
1198 if ($i eq 3) { print "<\/tr>\n"; }
1199 }
1200}
1201
1202print <<END
1203</table>
1204<hr size='1'>
1205<table width='100%'>
1206<tr>
1207 <td><b>$Lang::tr{'urlfilter custom blacklist'}</b></td>
1208 <td>&nbsp;</td>
1209 <td>&nbsp;</td>
1210 <td>&nbsp;</td>
1211</tr>
1212<tr>
e3edceeb
LS
1213 <td colspan='2'>$Lang::tr{'urlfilter blocked domains'}</td>
1214 <td colspan='2'>$Lang::tr{'urlfilter blocked urls'}</td>
10e4f239 1215</tr>
97c3590c
JPT
1216<tr>
1217 <td colspan='2'>$Lang::tr{'urlfilter example'}</td>
1218 <td colspan='2'>$Lang::tr{'urlfilter example ads'}</td>
1219</tr>
10e4f239
MT
1220<tr>
1221 <td colspan='2' width='50%'><textarea name='CUSTOM_BLACK_DOMAINS' cols='32' rows='6' wrap='off'>
1222END
1223;
1224
1225print $filtersettings{'CUSTOM_BLACK_DOMAINS'};
1226
1227print <<END
1228</textarea></td>
1229 <td colspan='2' width='50%'><textarea name='CUSTOM_BLACK_URLS' cols='32' rows='6' wrap='off'>
1230END
1231;
1232
1233print $filtersettings{'CUSTOM_BLACK_URLS'};
1234
1235print <<END
1236</textarea></td>
1237</tr>
1238</table>
1239<table width='100%'>
1240<tr>
1241 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom blacklist'}:</td>
1242 <td><input type='checkbox' name='ENABLE_CUSTOM_BLACKLIST' $checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} /></td>
1243 <td>&nbsp;</td>
1244 <td>&nbsp;</td>
1245</tr>
1246</table>
1247<hr size='1'>
1248<table width='100%'>
1249<tr>
1250 <td><b>$Lang::tr{'urlfilter custom whitelist'}</b></td>
1251 <td>&nbsp;</td>
1252 <td>&nbsp;</td>
1253 <td>&nbsp;</td>
1254</tr>
1255<tr>
e3edceeb
LS
1256 <td colspan='2'>$Lang::tr{'urlfilter allowed domains'}</td>
1257 <td colspan='2'>$Lang::tr{'urlfilter allowed urls'}</td>
10e4f239 1258</tr>
d39287de
JPT
1259<tr>
1260 <td colspan='2'>$Lang::tr{'urlfilter example'}</td>
1261 <td colspan='2'>$Lang::tr{'urlfilter example ads'}</td>
1262</tr>
10e4f239
MT
1263<tr>
1264 <td colspan='2' width='50%'><textarea name='CUSTOM_WHITE_DOMAINS' cols='32' rows='6' wrap='off'>
1265END
1266;
1267
1268print $filtersettings{'CUSTOM_WHITE_DOMAINS'};
1269
1270print <<END
1271</textarea></td>
1272 <td colspan='2' width='50%'><textarea name='CUSTOM_WHITE_URLS' cols='32' rows='6' wrap='off'>
1273END
1274;
1275
1276print $filtersettings{'CUSTOM_WHITE_URLS'};
1277
1278print <<END
1279</textarea></td>
1280</tr>
1281</table>
1282<table width='100%'>
1283<tr>
1284 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom whitelist'}:</td>
1285 <td><input type='checkbox' name='ENABLE_CUSTOM_WHITELIST' $checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} /></td>
1286 <td>&nbsp;</td>
1287 <td>&nbsp;</td>
1288</tr>
1289</table>
1290<hr size='1'>
1291<table width='100%'>
1292<tr>
1293 <td colspan='4'><b>$Lang::tr{'urlfilter custom expression list'}</b></td>
1294</tr>
1295<tr>
e3edceeb 1296 <td colspan='4'>$Lang::tr{'urlfilter blocked expressions'}</td>
10e4f239
MT
1297</tr>
1298<tr>
1299 <td colspan='4'><textarea name='CUSTOM_EXPRESSIONS' cols='70' rows='3' wrap='off'>
1300END
1301;
1302
1303print $filtersettings{'CUSTOM_EXPRESSIONS'};
1304
1305print <<END
1306</textarea></td>
1307</tr>
1308<tr>
1309 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom expression list'}:</td>
1310 <td><input type='checkbox' name='ENABLE_CUSTOM_EXPRESSIONS' $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} /></td>
1311 <td>&nbsp;</td>
1312 <td>&nbsp;</td>
1313</tr>
1314</table>
1315<hr size='1'>
1316<table width='100%'>
1317<tr>
1318 <td colspan='4'><b>$Lang::tr{'urlfilter file ext block'}</b></td>
1319</tr>
1320<tr>
1321 <td width='25%' class='base'>$Lang::tr{'urlfilter block executables'}:</td>
1322 <td width='12%'><input type='checkbox' name='BLOCK_EXECUTABLES' $checked{'BLOCK_EXECUTABLES'}{'on'} /></td>
1323 <td width='25%' class='base'>$Lang::tr{'urlfilter block audio-video'}:</td>
1324 <td><input type='checkbox' name='BLOCK_AUDIO-VIDEO' $checked{'BLOCK_AUDIO-VIDEO'}{'on'} /></td>
1325</tr>
1326<tr>
1327 <td class='base'>$Lang::tr{'urlfilter block archives'}:</td>
1328 <td><input type='checkbox' name='BLOCK_ARCHIVES' $checked{'BLOCK_ARCHIVES'}{'on'} /></td>
1329 <td>&nbsp;</td>
1330 <td>&nbsp;</td>
1331</tr>
1332</table>
1333<hr size='1'>
1334<table width='100%'>
1335<tr>
1336 <td colspan='4'><b>$Lang::tr{'urlfilter local file redirection'}</b></td>
1337</tr>
1338<tr>
1339 <td width='25%' class='base'>$Lang::tr{'urlfilter enable rewrite rules'}:</td>
1340 <td width='12%'><input type='checkbox' name='ENABLE_REWRITE' $checked{'ENABLE_REWRITE'}{'on'} /></td>
1341 <td>&nbsp;</td>
1342 <td>&nbsp;</td>
1343</tr>
1344<tr>
1345 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter manage repository'}'></td>
1346 <td>&nbsp;</td>
1347 <td>&nbsp;</td>
1348 <td>&nbsp;</td>
1349</tr>
1350</table>
1351<hr size='1'>
1352<table width='100%'>
1353<tr>
1354 <td colspan='2'><b>$Lang::tr{'urlfilter network access control'}</b></td>
1355 <td>&nbsp;</td>
1356 <td>&nbsp;</td>
1357</tr>
1358<tr>
e3edceeb
LS
1359 <td colspan='2'>$Lang::tr{'urlfilter unfiltered clients'}</td>
1360 <td colspan='2'>$Lang::tr{'urlfilter banned clients'}</td>
1465b127
MT
1361</tr>
1362<tr>
1363 <td colspan='2' width='50%'><textarea name='UNFILTERED_CLIENTS' cols='32' rows='6' wrap='off'>
1364END
1365;
1366
1367# transform from pre1.8 client definitions
1368$filtersettings{'UNFILTERED_CLIENTS'} =~ s/^\s+//g;
1369$filtersettings{'UNFILTERED_CLIENTS'} =~ s/\s+$//g;
1370$filtersettings{'UNFILTERED_CLIENTS'} =~ s/\s+-\s+/-/g;
1371$filtersettings{'UNFILTERED_CLIENTS'} =~ s/\s+/ /g;
1372
1373@clients = split(/ /,$filtersettings{'UNFILTERED_CLIENTS'});
1374undef $filtersettings{'UNFILTERED_CLIENTS'};
1375foreach (@clients) { $filtersettings{'UNFILTERED_CLIENTS'} .= "$_\n"; }
1376
1377print $filtersettings{'UNFILTERED_CLIENTS'};
1378
1379print <<END
1380</textarea></td>
1381 <td colspan='2' width='50%'><textarea name='BANNED_CLIENTS' cols='32' rows='6' wrap='off'>
1382END
1383;
1384
1385# transform from pre1.8 client definitions
1386$filtersettings{'BANNED_CLIENTS'} =~ s/^\s+//g;
1387$filtersettings{'BANNED_CLIENTS'} =~ s/\s+$//g;
1388$filtersettings{'BANNED_CLIENTS'} =~ s/\s+-\s+/-/g;
1389$filtersettings{'BANNED_CLIENTS'} =~ s/\s+/ /g;
1390
1391@clients = split(/ /,$filtersettings{'BANNED_CLIENTS'});
1392undef $filtersettings{'BANNED_CLIENTS'};
1393foreach (@clients) { $filtersettings{'BANNED_CLIENTS'} .= "$_\n"; }
1394
1395print $filtersettings{'BANNED_CLIENTS'};
1396
1397print <<END
1398</textarea></td>
10e4f239
MT
1399</tr>
1400</table>
1401<hr size='1'>
1402<table width='100%'>
1403<tr>
1404 <td colspan='4'><b>$Lang::tr{'urlfilter timebased access control'}</b></td>
1405</tr>
1406<tr>
1407 <td width='25%'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter set time constraints'}'></td>
1408 <td width='25%'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter set user quota'}'></td>
1409 <td>&nbsp;</td>
1410 <td>&nbsp;</td>
1411</tr>
1412</table>
1413<hr size='1'>
1414<table width='100%'>
1415<tr>
1416 <td colspan='4'><b>$Lang::tr{'urlfilter block settings'}</b></td>
1417</tr>
87e33a42
MT
1418<tr>
1419 <td width='25%' class='base'>$Lang::tr{'urlfilter redirect template'}</td>
1420 <td width='75%' colspan='2'>
1421 <select name='REDIRECT_TEMPLATE'>
1422END
1423;
1424
1425 foreach (<$templatedir/*>) {
1426 if ((-d "$_") && (-e "$_/template.html")) {
1427 my $template = substr($_,rindex($_,"/")+1);
1428 print "<option value='$template' $selected{'REDIRECT_TEMPLATE'}{$template}>$template</option>\n";
1429 }
1430 }
1431
1432print <<END
1433 </select>
1434 </td>
1435</tr>
10e4f239
MT
1436<tr>
1437 <td width='25%' class='base'>$Lang::tr{'urlfilter show category'}:</td>
1438 <td width='12%'><input type='checkbox' name='SHOW_CATEGORY' $checked{'SHOW_CATEGORY'}{'on'} /></td>
e3edceeb 1439 <td width='25%' class='base'>$Lang::tr{'urlfilter redirectpage'}:</td>
10e4f239
MT
1440 <td><input type='text' name='REDIRECT_PAGE' value='$filtersettings{'REDIRECT_PAGE'}' size='40' /></td>
1441</tr>
1442<tr>
1443 <td class='base'>$Lang::tr{'urlfilter show url'}:</td>
1444 <td><input type='checkbox' name='SHOW_URL' $checked{'SHOW_URL'}{'on'} /></td>
e3edceeb 1445 <td class='base'>$Lang::tr{'urlfilter msg text 1'}:</td>
10e4f239
MT
1446 <td><input type='text' name='MSG_TEXT_1' value='$filtersettings{'MSG_TEXT_1'}' size='40' /></td>
1447</tr>
1448<tr>
1449 <td class='base'>$Lang::tr{'urlfilter show ip'}:</td>
1450 <td><input type='checkbox' name='SHOW_IP' $checked{'SHOW_IP'}{'on'} /></td>
e3edceeb 1451 <td class='base'>$Lang::tr{'urlfilter msg text 2'}:</td>
10e4f239
MT
1452 <td><input type='text' name='MSG_TEXT_2' value='$filtersettings{'MSG_TEXT_2'}' size='40' /></td>
1453</tr>
1454<tr>
1455 <td class='base'>$Lang::tr{'urlfilter show dnserror'}:</td>
1456 <td><input type='checkbox' name='ENABLE_DNSERROR' $checked{'ENABLE_DNSERROR'}{'on'} /></td>
e3edceeb 1457 <td class='base'>$Lang::tr{'urlfilter msg text 3'}:</td>
10e4f239
MT
1458 <td><input type='text' name='MSG_TEXT_3' value='$filtersettings{'MSG_TEXT_3'}' size='40' /></td>
1459</tr>
10e4f239 1460</table>
10e4f239
MT
1461<hr size='1'>
1462<table width='100%'>
1463<tr>
1464 <td colspan='4'><b>$Lang::tr{'urlfilter advanced settings'}</b></td>
1465</tr>
1466<tr>
1467 <td width='25%' class='base'>$Lang::tr{'urlfilter enable expression lists'}:</td>
1468 <td width='12%'><input type='checkbox' name='ENABLE_EXPR_LISTS' $checked{'ENABLE_EXPR_LISTS'}{'on'} /></td>
1469 <td width='25%' class='base'>$Lang::tr{'urlfilter enable log'}:</td>
1470 <td><input type='checkbox' name='ENABLE_LOG' $checked{'ENABLE_LOG'}{'on'} /></td>
1471</tr>
10e4f239
MT
1472<tr>
1473 <td class='base'>$Lang::tr{'urlfilter empty ads'}:</td>
1474 <td><input type='checkbox' name='ENABLE_EMPTY_ADS' $checked{'ENABLE_EMPTY_ADS'}{'on'} /></td>
6b2801d6
MT
1475 <td class='base'>$Lang::tr{'urlfilter username log'}:</td>
1476 <td><input type='checkbox' name='ENABLE_USERNAME_LOG' $checked{'ENABLE_USERNAME_LOG'}{'on'} /></td>
10e4f239
MT
1477</tr>
1478<tr>
1479 <td class='base'>$Lang::tr{'urlfilter block ip'}:</td>
1480 <td><input type='checkbox' name='BLOCK_IP_ADDR' $checked{'BLOCK_IP_ADDR'}{'on'} /></td>
6b2801d6
MT
1481 <td class='base'>$Lang::tr{'urlfilter category log'}:</td>
1482 <td><input type='checkbox' name='ENABLE_CATEGORY_LOG' $checked{'ENABLE_CATEGORY_LOG'}{'on'} /></td>
10e4f239
MT
1483</tr>
1484<tr>
1485 <td class='base'>$Lang::tr{'urlfilter block all'}:</td>
1486 <td><input type='checkbox' name='BLOCK_ALL' $checked{'BLOCK_ALL'}{'on'} /></td>
1487 <td class='base'>$Lang::tr{'urlfilter whitelist always allowed'}:</td>
1488 <td><input type='checkbox' name='ENABLE_GLOBAL_WHITELIST' $checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} /></td>
1489</tr>
1490</table>
1491<hr size='1'>
1492<table width='100%'>
1493<tr>
e3edceeb
LS
1494 <td><img src='/blob.gif' align='top' alt='*' />&nbsp;<font class='base'>$Lang::tr{'required field'}</font></td>
1495 <td align='right'>&nbsp;</td>
10e4f239
MT
1496</tr>
1497</table>
1498<table width='100%'>
1499<tr>
1500<td>&nbsp;</td>
1501<td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
1502<td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter save and restart'}' /></td>
1503<td>&nbsp;</td>
1504</tr>
1505</table>
1506END
1507;
1508
1509&Header::closebox();
1510
1511print "</form>\n";
1512
1513print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
1514
0da15c03 1515&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter maintenance'}");
10e4f239
MT
1516
1517print <<END
1518<table width='100%'>
1519<tr>
1520<td class='base'><b>$Lang::tr{'urlfilter blacklist update'}</b></td>
1521</tr>
1522<tr>
1523<td>$Lang::tr{'urlfilter upload information'}<p>$Lang::tr{'urlfilter upload text'}:</td>
1524</tr>
1525<tr>
1526<td><input type='file' name='UPDATEFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload blacklist'}' /></td>
1527</tr>
1528</table>
1529
1530<hr size='1'>
1531
1532<table width='100%'>
1533<tr>
1534 <td colspan='2' class='base'><b>$Lang::tr{'urlfilter automatic blacklist update'}</b>
1535END
1536;
1537if (-e "$updflagfile")
1538{
1539$blacklistage = int(-M "$updflagfile");
1540print "&nbsp; <b>[</b> <small><i>$Lang::tr{'urlfilter blacklist age 1'} <b>$blacklistage</b> $Lang::tr{'urlfilter blacklist age 2'}</i></small> <b>]</b>";
1541}
1542
1543$updatesettings{'UPDATE_SCHEDULE'} = 'monthly';
1544$updatesettings{'CUSTOM_UPDATE_URL'} = '';
1545
1546if (-e "$updconffile") { &General::readhash("$updconffile", \%updatesettings); }
1547
1548$checked{'ENABLE_AUTOUPDATE'}{'off'} = '';
1549$checked{'ENABLE_AUTOUPDATE'}{'on'} = '';
1550$checked{'ENABLE_AUTOUPDATE'}{$updatesettings{'ENABLE_AUTOUPDATE'}} = "checked='checked'";
1551
1552$selected{'UPDATE_SCHEDULE'}{$updatesettings{'UPDATE_SCHEDULE'}} = "selected='selected'";
1553
1554$selected{'UPDATE_SOURCE'}{$updatesettings{'UPDATE_SOURCE'}} = "selected='selected'";
1555
1556print <<END
1557 </td>
1558</tr>
1559<tr>
1560 <td width='25%' class='base'>$Lang::tr{'urlfilter enable automatic blacklist update'}:</td>
1561 <td width='75%' class='base'><input type='checkbox' name='ENABLE_AUTOUPDATE' $checked{'ENABLE_AUTOUPDATE'}{'on'} /></td>
1562</tr>
1563<tr>
1564 <td class='base'>$Lang::tr{'urlfilter automatic update schedule'}:</td>
1565 <td class='base'>
1566 <select name='UPDATE_SCHEDULE'>
1567 <option value='daily' $selected{'UPDATE_SCHEDULE'}{'daily'}>$Lang::tr{'urlfilter daily'}</option>
1568 <option value='weekly' $selected{'UPDATE_SCHEDULE'}{'weekly'}>$Lang::tr{'urlfilter weekly'}</option>
1569 <option value='monthly' $selected{'UPDATE_SCHEDULE'}{'monthly'}>$Lang::tr{'urlfilter monthly'}</option>
1570 </select>
1571 </td>
1572</tr>
1573<tr>
1574 <td class='base'>$Lang::tr{'urlfilter select source'}:</td>
1575 <td class='base' colspan='2'>
1576 <select name='UPDATE_SOURCE'>
1577END
1578;
1579
1580foreach (@source_urllist) {
1581 chomp;
1582 $source_name = substr($_,0,rindex($_,","));
1583 $source_url = substr($_,index($_,",")+1);
1584 print "\t<option value='$source_url' $selected{'UPDATE_SOURCE'}{$source_url}>$source_name</option>\n";
1585}
1586
1587print <<END
1588 <option value='custom' $selected{'UPDATE_SOURCE'}{'custom'}>$Lang::tr{'urlfilter custom url'}</option>
1589 </select>
1590 </td>
1591</tr>
1592<tr>
1593 <td>$Lang::tr{'urlfilter custom url'}:</td>
1594 <td><input type='text' name='CUSTOM_UPDATE_URL' value='$updatesettings{'CUSTOM_UPDATE_URL'}' size='72' /></td>
1595</tr>
1596</table>
1597<table width='100%'>
1598<tr>
1599 <td width='25%'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter save schedule'}'>&nbsp;&nbsp;&nbsp;<input type='submit' name='ACTION' value='$Lang::tr{'urlfilter update now'}'></td>
1600</tr>
1601</table>
1602
1603<hr size='1'>
1604
1605<table width='100%'>
1606<tr>
1607 <td class='base'><b>$Lang::tr{'urlfilter blacklist editor'}</b></td>
1608</tr>
1609<tr>
1610 <td>$Lang::tr{'urlfilter blacklist editor info'}</td>
1611</tr>
1612<tr>
1613 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter blacklist editor'}' /></td>
1614</tr>
1615</table>
1616
1617<hr size='1'>
1618
1619<table width='100%'>
1620<tr>
1621 <td colspan='4' class='base'><b>$Lang::tr{'urlfilter backup settings'}</b></td>
1622</tr>
1623<tr>
1624 <td width='25%' class='base'>$Lang::tr{'urlfilter enable full backup'}:</td>
1625 <td width='12%' class='base'><input type='checkbox' name='ENABLE_FULLBACKUP' $checked{'ENABLE_FULLBACKUP'}{'on'} /></td>
1626 <td>&nbsp;</td>
1627 <td>&nbsp;</td>
1628</tr>
1629<tr>
1630 <td colspan='4' class='base'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter backup'}' /></td>
1631</tr>
1632</table>
1633
1634<hr size='1'>
1635
1636<table width='100%'>
1637<tr>
1638 <td class='base'><b>$Lang::tr{'urlfilter restore settings'}</b></td>
1639</tr>
1640<tr>
1641 <td>$Lang::tr{'urlfilter restore text'}:</td>
1642</tr>
1643<tr>
1644 <td><input type='file' name='UPDATEFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter restore'}' /></td>
1645</tr>
1646</table>
1647</form>
1648END
1649;
1650
1651&Header::closebox();
1652
1653} else {
1654
1655#==========================================================
1656#
1657# Section: Manage Repository
1658#
1659#==========================================================
1660
1661print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
1662
1663&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter manage local file repository'}:");
1664print <<END
1665<table width='100%'>
1666<tr>
1667 <td>$Lang::tr{'urlfilter repository information'}<br><br></td>
1668</tr>
1669<tr>
1670 <td>$Lang::tr{'urlfilter upload file text'}:</td>
1671</tr>
1672<tr>
1673 <td><input type='file' name='UPLOADFILE' size='50' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload file'}' /></td>
1674</tr>
1675<tr>
1676 <td><br><b>$Lang::tr{'urlfilter upload file information 1'}:</b> $Lang::tr{'urlfilter upload file information 2'}</td>
1677</tr>
1678</table>
1679<hr size='1'>
1680<table width='100%'>
1681<tr>
1682 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
1683</tr>
1684</table>
1685</form>
1686END
1687;
1688
1689&Header::closebox();
1690
1691&Header::openbox('100%', 'left', "$Lang::tr{'urlfilter current files'}: </b>[$repository]");
1692
1693@repositorylist = <$repository/*>;
1694
1695undef @repositoryfiles;
1696foreach (@repositorylist)
1697{
1698 if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); }
1699}
1700
1701if (@repositoryfiles)
1702{
1703 print <<END
1704<table width='100%'>
1705<tr>
1706 <td align='center'><b>$Lang::tr{'urlfilter filename'}</b></td>
1707 <td width='15%' align='center'><b>$Lang::tr{'urlfilter filesize'}</b></td>
1708 <td width='10%'></td>
1709</tr>
1710END
1711;
1712 $id = 0;
1713 foreach $line (@repositoryfiles)
1714 {
1715 $id++;
1716 if ($id % 2) {
1717 print "<tr bgcolor='$Header::table1colour'>\n"; }
1718 else {
1719 print "<tr bgcolor='$Header::table2colour'>\n"; }
1720 $filesize = (-s "$repository/$line");
1721 1 while $filesize =~ s/^(-?\d+)(\d{3})/$1.$2/;
1722
1723print <<END
1724 <td>&nbsp; &nbsp;$line</td>
1725 <td align='right'>$filesize&nbsp; &nbsp;</td>
1726
1727 <td align='center'>
1728 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
1729 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
1730 <input type='hidden' name='ID' value='$line' />
1731 <input type='hidden' name='ACTION' value='$Lang::tr{'urlfilter remove file'}' />
1732 </form>
1733 </td>
1734
1735 </tr>
1736END
1737;
1738 }
1739
1740print <<END
1741</table>
1742<table>
1743 <tr>
1744 </tr>
1745</table>
1746<table>
1747 <tr>
1748 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
1749 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
1750 <td class='base'>$Lang::tr{'remove'}</td>
1751 </tr>
1752</table>
1753END
1754;
1755} else {
1756
1757 print "<i>$Lang::tr{'urlfilter empty repository'}</i>\n";
1758}
1759
1760&Header::closebox();
1761
1762}
1763
1764} elsif ($tcsettings{'TCMODE'}) {
1765
1766#==========================================================
1767#
1768# Section: Set Time Constraints
1769#
1770#==========================================================
1771
1772print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
1773
1774$buttontext = $Lang::tr{'urlfilter add rule'};
1775if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) {
1776&Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit time constraint rule'}.':');
1777$buttontext = $Lang::tr{'urlfilter update rule'};
1778} else {
1779&Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new time constraint rule'}.':');
1780}
1781print <<END
1782
1783<table width='100%'>
1784<tr>
1785 <td width='2%'>$Lang::tr{'urlfilter constraint definition'}</td>
1786 <td width='1%'>&nbsp;&nbsp;</td>
1787 <td width='2%' align='center'>$Lang::tr{'urlfilter monday'}</td>
1788 <td width='2%' align='center'>$Lang::tr{'urlfilter tuesday'}</td>
1789 <td width='2%' align='center'>$Lang::tr{'urlfilter wednesday'}</td>
1790 <td width='2%' align='center'>$Lang::tr{'urlfilter thursday'}</td>
1791 <td width='2%' align='center'>$Lang::tr{'urlfilter friday'}</td>
1792 <td width='2%' align='center'>$Lang::tr{'urlfilter saturday'}</td>
1793 <td width='2%' align='center'>$Lang::tr{'urlfilter sunday'}</td>
1794 <td width='1%'>&nbsp;&nbsp;</td>
1795 <td width='7%' colspan=3>$Lang::tr{'urlfilter from'}</td>
1796 <td width='1%'>&nbsp;</td>
1797 <td width='7%' colspan=3>$Lang::tr{'urlfilter to'}</td>
1798 <td>&nbsp;</td>
1799</tr>
1800<tr>
1801 <td class='base'>
1802 <select name='DEFINITION'>
1803 <option value='within' $selected{'DEFINITION'}{'within'}>$Lang::tr{'urlfilter constraint within'}</option>
1804 <option value='outside' $selected{'DEFINITION'}{'outside'}>$Lang::tr{'urlfilter constraint outside'}</option>
1805 </select>
1806 </td>
1807 <td>&nbsp;</td>
1808 <td class='base'><input type='checkbox' name='MON' $checked{'MON'}{'on'} /></td>
1809 <td class='base'><input type='checkbox' name='TUE' $checked{'TUE'}{'on'} /></td>
1810 <td class='base'><input type='checkbox' name='WED' $checked{'WED'}{'on'} /></td>
1811 <td class='base'><input type='checkbox' name='THU' $checked{'THU'}{'on'} /></td>
1812 <td class='base'><input type='checkbox' name='FRI' $checked{'FRI'}{'on'} /></td>
1813 <td class='base'><input type='checkbox' name='SAT' $checked{'SAT'}{'on'} /></td>
1814 <td class='base'><input type='checkbox' name='SUN' $checked{'SUN'}{'on'} /></td>
1815 <td>&nbsp;</td>
1816 <td class='base'>
1817 <select name='FROM_HOUR'>
1818END
1819;
1820for ($i=0;$i<=24;$i++) {
1821$_ = sprintf("%02s",$i);
1822print "<option $selected{'FROM_HOUR'}{$_}>$_</option>\n";
1823}
1824print <<END
1825 </select>
1826 </td>
1827 <td>:</td>
1828 <td class='base'>
1829 <select name='FROM_MINUTE'>
1830END
1831;
1832for ($i=0;$i<=45;$i+=15) {
1833$_ = sprintf("%02s",$i);
1834print "<option $selected{'FROM_MINUTE'}{$_}>$_</option>\n";
1835}
1836print <<END
1837 </select>
1838 <td> - </td>
1839 </td>
1840 <td class='base'>
1841 <select name='TO_HOUR'>
1842END
1843;
1844for ($i=0;$i<=24;$i++) {
1845$_ = sprintf("%02s",$i);
1846print "<option $selected{'TO_HOUR'}{$_}>$_</option>\n";
1847}
1848print <<END
1849 </select>
1850 </td>
1851 <td>:</td>
1852 <td class='base'>
1853 <select name='TO_MINUTE'>
1854END
1855;
1856for ($i=0;$i<=45;$i+=15) {
1857$_ = sprintf("%02s",$i);
1858print "<option $selected{'TO_MINUTE'}{$_}>$_</option>\n";
1859}
1860print <<END
1861 </select>
1862 </td>
1863 <td>&nbsp;</td>
1864</tr>
1865</table>
1866
1867<br>
1868
1869<table width='100%'>
1870 <tr>
e3edceeb 1871 <td width='5%'>$Lang::tr{'urlfilter source'}&nbsp;<img src='/blob.gif' alt='*' /></td>
10e4f239 1872 <td width='1%'>&nbsp;&nbsp;</td>
e3edceeb 1873 <td width='5%'>$Lang::tr{'urlfilter dst'}&nbsp;<img src='/blob.gif' alt='*' /></td>
10e4f239
MT
1874 <td width='1%'>&nbsp;&nbsp;</td>
1875 <td width='5%'>$Lang::tr{'urlfilter access'}</td>
1876 <td>&nbsp;</td>
1877 </tr>
1878 <tr>
1465b127
MT
1879 <td rowspan='2'><textarea name='SRC' cols='28' rows='5' wrap='off'>
1880END
1881;
1882
1883# transform from pre1.8 client definitions
1884$tcsettings{'SRC'} =~ s/^\s+//g;
1885$tcsettings{'SRC'} =~ s/\s+$//g;
1886$tcsettings{'SRC'} =~ s/\s+-\s+/-/g;
1887$tcsettings{'SRC'} =~ s/\s+/ /g;
1888
1889@clients = split(/ /,$tcsettings{'SRC'});
1890undef $tcsettings{'SRC'};
1891foreach (@clients) { $tcsettings{'SRC'} .= "$_\n"; }
1892
1893print $tcsettings{'SRC'};
1894
1895print <<END
1896</textarea></td>
1897
10e4f239 1898 <td>&nbsp;</td>
1465b127
MT
1899 <td class='base' rowspan='2' valign='top'>
1900 <select name='DST' size='6' multiple>
10e4f239
MT
1901 <option value='any' $selected{'DST'}{'any'} = "selected='selected'">$Lang::tr{'urlfilter category all'}</option>
1902 <option value='in-addr' $selected{'DST'}{'in-addr'} = "selected='selected'">in-addr</option>
1903END
1904;
1905
1906&readblockcategories;
1907foreach (@categories)
1908{
1909 print "<option value='$_' $selected{'DST'}{$_}>$_</option>\n";
1910}
1911
1912print <<END
1913 <option value='files' $selected{'DST'}{'files'} = "selected='selected'">files</option>
1914 <option value='custom-blocked' $selected{'DST'}{'custom-blocked'} = "selected='selected'">custom-blocked</option>
1915 <option value='custom-expressions' $selected{'DST'}{'custom-expressions'} = "selected='selected'">custom-expressions</option>
1916 </select>
1917 </td>
1918 <td>&nbsp;</td>
1919 <td class='base' valign='top'>
1920 <select name='ACCESS'>
1921 <option value='block' $selected{'ACCESS'}{'block'}>$Lang::tr{'urlfilter mode block'}</option>
1922 <option value='allow' $selected{'ACCESS'}{'allow'}>$Lang::tr{'urlfilter mode allow'}</option>
1923 </select>
1924 </td>
1925 <td>&nbsp;</td>
1926 </tr>
1465b127
MT
1927 <tr>
1928 <td>&nbsp;</td>
1929 <td>&nbsp;</td>
1930 <td>&nbsp;</td>
1931 <td>&nbsp;</td>
1932 </tr>
10e4f239 1933 <tr>
e3edceeb 1934 <td>$Lang::tr{'remark'}</td>
10e4f239
MT
1935 <td>&nbsp;</td>
1936 <td>&nbsp;</td>
1937 <td>&nbsp;</td>
1938 <td>&nbsp;</td>
1465b127 1939 <td>&nbsp;</td>
10e4f239
MT
1940 </tr>
1941 <tr>
1942 <td><input type='text' name='COMMENT' value='$tcsettings{'COMMENT'}' size='32' /></td>
1943 <td>&nbsp;</td>
1944 <td>&nbsp;</td>
1945 <td>&nbsp;</td>
1946 <td>&nbsp;</td>
1465b127 1947 <td>&nbsp;</td>
10e4f239
MT
1948 </tr>
1949</table>
1950
1951<table width='100%'>
1952 <tr>
1953 <td class='base'>$Lang::tr{'urlfilter enabled'}<input type='checkbox' name='ENABLERULE' $checked{'ENABLERULE'}{'on'} /></td>
1954 </tr>
1955</table>
1956
1957<p>
1958
1959<table width='50%'>
1960 <tr>
1961 <td><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /></td>
1962 <td><input type='hidden' name='MODE' value='TIMECONSTRAINT' /></td>
1963 <td><input type='submit' name='SUBMIT' value='$buttontext' /></td>
1964 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
1965 <td>&nbsp;</td>
1966 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
1967 </tr>
1968</table>
1969<p>
1970<table width='100%'>
1971 <tr>
1972 <td width='1%' align='right'> <img src='/blob.gif' align='top' alt='*' />&nbsp;</td>
e3edceeb 1973 <td><font class='base'>$Lang::tr{'required field'}</font></td>
10e4f239
MT
1974 </tr>
1975 <tr>
e3edceeb 1976 <td width='1%' align='right'>&nbsp;</td>
10e4f239
MT
1977 <td><font class='base'>$Lang::tr{'urlfilter select multi'}</font></td>
1978 </tr>
1979</table>
1980END
1981;
1982
1983if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) {
1984 print "<input type='hidden' name='EDITING' value='$tcsettings{'ID'}' />\n";
1985} else {
1986 print "<input type='hidden' name='EDITING' value='no' />\n";
1987}
1988
1989&Header::closebox();
1990print "</form>\n";
1991
1992&Header::openbox('100%', 'left', $Lang::tr{'current rules'});
1993print <<END
1994<table width='100%'>
1995 <tr>
1996 <td width='5%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter constraint definition'}</b></td>
1997 <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter time space'}</b></td>
1998 <td width='15%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter src'}</b></td>
1999 <td width='5%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter dst'}</b></td>
1465b127 2000 <td width='10%' class='boldbase' colspan='5' align='center'>&nbsp;</td>
10e4f239
MT
2001 </tr>
2002END
2003;
2004
2005if ($tcsettings{'ACTION'} ne '' or $changed ne 'no')
2006{
2007 open(FILE, $tcfile);
2008 @tclist = <FILE>;
2009 close(FILE);
2010}
2011
2012$id = 0;
2013foreach $line (@tclist)
2014{
2015 $id++;
2016 chomp($line);
2017 @temp = split(/\,/,$line);
2018 if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) {
2019 print "<tr bgcolor='$Header::colouryellow'>\n"; }
2020 elsif ($id % 2) {
2021 print "<tr bgcolor='$Header::table1colour'>\n"; }
2022 else {
2023 print "<tr bgcolor='$Header::table2colour'>\n"; }
2024 if ($temp[0] eq 'within') { $temp[0]=$Lang::tr{'urlfilter constraint within'}; } else { $temp[0]=$Lang::tr{'urlfilter constraint outside'}; }
2025 if ($temp[13] eq 'any') { $temp[13]=$Lang::tr{'urlfilter category all'}; }
2026 if ($temp[15] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};}
2027 else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; }
2028 if ($temp[14] eq 'block') { $led='led-red.gif'; $ldesc=$Lang::tr{'urlfilter block access'};}
2029 else { $led='led-green.gif'; $ldesc=$Lang::tr{'urlfilter allow access'}; }
2030
2031 undef $time;
2032 if ($temp[1] eq 'on') { $time.=$Lang::tr{'urlfilter mon'}; } else { $time.='='; }
2033 if ($temp[2] eq 'on') { $time.=$Lang::tr{'urlfilter tue'}; } else { $time.='='; }
2034 if ($temp[3] eq 'on') { $time.=$Lang::tr{'urlfilter wed'}; } else { $time.='='; }
2035 if ($temp[4] eq 'on') { $time.=$Lang::tr{'urlfilter thu'}; } else { $time.='='; }
2036 if ($temp[5] eq 'on') { $time.=$Lang::tr{'urlfilter fri'}; } else { $time.='='; }
2037 if ($temp[6] eq 'on') { $time.=$Lang::tr{'urlfilter sat'}; } else { $time.='='; }
2038 if ($temp[7] eq 'on') { $time.=$Lang::tr{'urlfilter sun'}; } else { $time.='='; }
2039 $time=$time.' &nbsp; '.$temp[8].':'.$temp[9].' to '.$temp[10].':'.$temp[11];
2040
2041print <<END
2042 <td align='center'>$temp[0]</td>
2043 <td align='center' nowrap>$time</td>
2044 <td align='center'>$temp[12]</td>
2045 <td align='center'>$temp[13]</td>
2046 <td align='center'><image src='/images/urlfilter/$led' alt='$ldesc'></td>
2047
2048 <td align='center'>
2049 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
2050 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' title='$gdesc' alt='$gdesc' />
2051 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
2052 <input type='hidden' name='ID' value='$id' />
2053 <input type='hidden' name='ACTIVE' value='$toggle' />
2054 <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
2055 </form>
2056 </td>
2057
2058 <td align='center'>
2059 <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>
2060 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' title='$Lang::tr{'edit'}' alt='$Lang::tr{'edit'}' />
2061 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
2062 <input type='hidden' name='ID' value='$id' />
2063 <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
2064 </form>
2065 </td>
2066
2067 <td align='center'>
2068 <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>
1465b127
MT
2069 <input type='image' name='$Lang::tr{'urlfilter copy rule'}' src='/images/urlfilter/copy.gif' title='$Lang::tr{'urlfilter copy rule'}' alt='$Lang::tr{'urlfilter copy rule'}' />
2070 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
2071 <input type='hidden' name='ID' value='$id' />
2072 <input type='hidden' name='ACTION' value='$Lang::tr{'urlfilter copy rule'}' />
2073 </form>
2074 </td>
2075
2076 <td align='center'>
2077 <form method='post' name='frmd$id' action='$ENV{'SCRIPT_NAME'}'>
10e4f239
MT
2078 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
2079 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
2080 <input type='hidden' name='ID' value='$id' />
2081 <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
2082 </form>
2083 </td>
2084
2085 </tr>
2086END
2087;
2088 if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) {
2089 print "<tr bgcolor='$Header::colouryellow'>\n"; }
2090 elsif ($id % 2) {
2091 print "<tr bgcolor='$Header::table1colour'>\n"; }
2092 else {
2093 print "<tr bgcolor='$Header::table2colour'>\n"; }
2094print <<END
2095 <td align='center' colspan='4'>$temp[16]
2096 </td>
1465b127 2097 <td align='center' colspan='5'>
10e4f239
MT
2098 </td>
2099 </tr>
2100END
2101;
2102}
2103
2104print "</table>\n";
2105
2106# If the time constraint file contains entries, print entries and action icons
2107if (! -z "$tcfile") {
2108print <<END
2109
2110<table>
2111 <tr>
2112 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
2113 <td>&nbsp; &nbsp; <img src='/images/urlfilter/led-green.gif' alt='$Lang::tr{'urlfilter allow access'}' /></td>
2114 <td class='base'>$Lang::tr{'urlfilter allow'}</td>
2115 <td>&nbsp; &nbsp; <img src='/images/urlfilter/led-red.gif' alt='$Lang::tr{'urlfilter block access'}' /></td>
2116 <td class='base'>$Lang::tr{'urlfilter block'}</td>
2117 <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
2118 <td class='base'>$Lang::tr{'click to disable'}</td>
2119 <td>&nbsp; &nbsp; <img src='/images/off.gif' alt='$Lang::tr{'click to enable'}' /></td>
2120 <td class='base'>$Lang::tr{'click to enable'}</td>
2121 <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
2122 <td class='base'>$Lang::tr{'edit'}</td>
1465b127
MT
2123 <td>&nbsp; &nbsp; <img src='/images/urlfilter/copy.gif' alt='$Lang::tr{'urlfilter copy rule'}' /></td>
2124 <td class='base'>$Lang::tr{'urlfilter copy rule'}</td>
10e4f239
MT
2125 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
2126 <td class='base'>$Lang::tr{'remove'}</td>
2127 </tr>
2128</table>
2129END
2130;
2131}
2132
2133&Header::closebox();
2134
2135} elsif ($uqsettings{'UQMODE'}) {
2136
2137#==========================================================
2138#
2139# Section: Set User Quota
2140#
2141#==========================================================
2142
2143print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
2144
2145$buttontext = $Lang::tr{'urlfilter add rule'};
2146if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) {
2147&Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit user quota rule'}.':');
2148$buttontext = $Lang::tr{'urlfilter update rule'};
2149} else {
2150&Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new user quota rule'}.':');
2151}
2152print <<END
2153
2154<table width='100%'>
2155<tr>
2156 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
2157</tr>
2158<tr>
e3edceeb 2159 <td class='base'>$Lang::tr{'urlfilter user time quota'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
10e4f239
MT
2160 <td><input type='text' name='TIME_QUOTA' value='$uqsettings{'TIME_QUOTA'}' size='5' /></td>
2161 <td colspan='2' rowspan= '5' valign='top' class='base'>
2162 <table cellpadding='0' cellspacing='0'>
2163 <tr>
2164 <!-- intentionally left empty -->
2165 </tr>
2166 <tr>
e3edceeb 2167 <td>$Lang::tr{'urlfilter assigned quota users'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
10e4f239
MT
2168 </tr>
2169 <tr>
2170 <!-- intentionally left empty -->
2171 </tr>
2172 <tr>
2173 <!-- intentionally left empty -->
2174 </tr>
2175 <tr>
2176 <td><textarea name='QUOTA_USERS' cols='32' rows='6' wrap='off'>
2177END
2178;
2179
2180$uqsettings{'QUOTA_USERS'} =~ s/\|/\n/g;
2181print $uqsettings{'QUOTA_USERS'};
2182
2183print <<END
2184</textarea></td>
2185 </tr>
2186 </table>
2187 </td>
2188</tr>
2189<tr>
2190 <td class='base'>$Lang::tr{'urlfilter activity detection'}:</td>
2191 <td class='base'><select name='SPORADIC'>
2192 <option value='0' $selected{'SPORADIC'}{'0'}>$Lang::tr{'urlfilter disabled'}</option>
2193 <option value='300' $selected{'SPORADIC'}{'300'}>5 $Lang::tr{'urlfilter minutes'}</option>
2194 <option value='900' $selected{'SPORADIC'}{'900'}>15 $Lang::tr{'urlfilter minutes'}</option>
2195 </select></td>
2196</tr>
2197<tr>
2198 <td class='base'>$Lang::tr{'urlfilter renewal period'}:</td>
2199 <td class='base'><select name='RENEWAL'>
2200 <option value='hourly' $selected{'RENEWAL'}{'hourly'}>$Lang::tr{'urlfilter hourly'}</option>
2201 <option value='daily' $selected{'RENEWAL'}{'daily'}>$Lang::tr{'urlfilter daily'}</option>
2202 <option value='weekly' $selected{'RENEWAL'}{'weekly'}>$Lang::tr{'urlfilter weekly'}</option>
2203 </select></td>
2204</tr>
2205<tr>
2206 <td colspan='2'>&nbsp;</td>
2207</tr>
2208<tr>
2209 <td class='base'>$Lang::tr{'urlfilter enabled'}</td>
2210 <td class='base'><input type='checkbox' name='ENABLEQUOTA' $checked{'ENABLEQUOTA'}{'on'} /></td>
2211</tr>
2212
2213</table>
2214<p>
2215
2216<table width='50%'>
2217 <tr>
2218 <td><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /></td>
2219 <td><input type='hidden' name='MODE' value='USERQUOTA' /></td>
2220 <td><input type='submit' name='SUBMIT' value='$buttontext' /></td>
2221 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
2222 <td>&nbsp;</td>
2223 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
2224 </tr>
2225</table>
2226
2227<p>
2228END
2229;
2230
2231if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) {
2232 print "<input type='hidden' name='EDITING' value='$uqsettings{'ID'}' />\n";
2233} else {
2234 print "<input type='hidden' name='EDITING' value='no' />\n";
2235}
2236
2237&Header::closebox();
2238print "</form>\n";
2239
2240&Header::openbox('100%', 'left', $Lang::tr{'current rules'});
2241print <<END
2242<table width='100%'>
2243 <tr>
2244 <td width='15%' class='boldbase' align='center'><b><nobr>$Lang::tr{'urlfilter time quota'}</nobr></b></td>
2245 <td width='15%' class='boldbase' align='center'><b><nobr>$Lang::tr{'urlfilter activity detection'}</nobr></b></td>
2246 <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter renewal'}</b></td>
2247 <td class='boldbase' align='center'><b>$Lang::tr{'urlfilter assigned users'}</b></td>
2248 <td width='20%' class='boldbase' colspan='4' align='center'>&nbsp;</td>
2249 </tr>
2250END
2251;
2252
2253if ($uqsettings{'ACTION'} ne '' or $changed ne 'no')
2254{
2255 open(FILE, $uqfile);
2256 @uqlist = <FILE>;
2257 close(FILE);
2258}
2259
2260$id = 0;
2261foreach $line (@uqlist)
2262{
2263 $id++;
2264 chomp($line);
2265 @temp = split(/\,/,$line);
2266 if($uqsettings{'ACTION'} eq $Lang::tr{'edit'} && $uqsettings{'ID'} eq $id) {
2267 print "<tr bgcolor='$Header::colouryellow'>\n"; }
2268 elsif ($id % 2) {
2269 print "<tr bgcolor='$Header::table1colour'>\n"; }
2270 else {
2271 print "<tr bgcolor='$Header::table2colour'>\n"; }
2272 if ($temp[4] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};}
2273 else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; }
2274
2275 $temp[5] = $temp[1];
2276 if ($temp[1] eq '0') { $temp[5] = $Lang::tr{'urlfilter disabled'} } else { $temp[5] = ($temp[5]/60).' '.$Lang::tr{'urlfilter minutes'} }
2277 $_ = $temp[3]; s/\|/, /g; $temp[6] = $_;
2278
2279print <<END
2280 <td align='center'>$temp[0] $Lang::tr{'urlfilter minutes'}</td>
2281 <td align='center'>$temp[5]</td>
2282 <td align='center'>$Lang::tr{'urlfilter '.$temp[2]}</td>
2283 <td align='center'>$temp[6]</td>
2284
2285 <td align='center'>
2286 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
2287 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' title='$gdesc' alt='$gdesc' />
2288 <input type='hidden' name='MODE' value='USERQUOTA' />
2289 <input type='hidden' name='ID' value='$id' />
2290 <input type='hidden' name='ACTIVE' value='$toggle' />
2291 <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
2292 </form>
2293 </td>
2294
2295 <td align='center'>
2296 <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>
2297 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' title='$Lang::tr{'edit'}' alt='$Lang::tr{'edit'}' />
2298 <input type='hidden' name='MODE' value='USERQUOTA' />
2299 <input type='hidden' name='ID' value='$id' />
2300 <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
2301 </form>
2302 </td>
2303
2304 <td align='center'>
2305 <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>
2306 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
2307 <input type='hidden' name='MODE' value='USERQUOTA' />
2308 <input type='hidden' name='ID' value='$id' />
2309 <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
2310 </form>
2311 </td>
2312
2313 </tr>
2314END
2315;
2316}
2317
2318print "</table>\n";
2319
2320# If the user quota file contains entries, print entries and action icons
2321if (! -z "$uqfile") {
2322print <<END
2323
2324<table>
2325 <tr>
2326 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
2327 <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
2328 <td class='base'>$Lang::tr{'click to disable'}</td>
2329 <td>&nbsp; &nbsp; <img src='/images/off.gif' alt='$Lang::tr{'click to enable'}' /></td>
2330 <td class='base'>$Lang::tr{'click to enable'}</td>
2331 <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
2332 <td class='base'>$Lang::tr{'edit'}</td>
2333 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
2334 <td class='base'>$Lang::tr{'remove'}</td>
2335 </tr>
2336</table>
2337END
2338;
2339}
2340
2341&Header::closebox();
2342
2343} else {
2344
2345#==========================================================
2346#
2347# Section: Blacklist editor
2348#
2349#==========================================================
2350
2351print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
2352
2353&Header::openbox('100%', 'left', $Lang::tr{'urlfilter urlfilter blacklist editor'}.':');
2354
2355print <<END
2356
2357<table width='100%'>
2358<tr>
2359 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
2360</tr>
2361<tr>
2362 <td class='base'><b>$Lang::tr{'urlfilter blacklist name'}</b></td>
2363</tr>
2364<tr>
e3edceeb 2365 <td class='base'>$Lang::tr{'urlfilter blacklist category name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
10e4f239
MT
2366 <td><input type='text' name='BE_NAME' value='$besettings{'BE_NAME'}' size='12' /></td>
2367</tr>
2368</table>
2369<hr size='1'>
2370<table width='100%'>
2371<tr>
2372 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='20%'></td>
2373</tr>
2374<tr>
e3edceeb 2375 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter edit domains urls expressions'}</b>&nbsp;<img src='/blob.gif' alt='*' /></td>
10e4f239
MT
2376</tr>
2377<tr>
2378 <td colspan='2'>$Lang::tr{'urlfilter domains'}</td>
2379 <td colspan='2'>$Lang::tr{'urlfilter urls'}</td>
2380</tr>
2381<tr>
2382 <td colspan='2'><textarea name='BE_DOMAINS' cols='38' rows='10' wrap='off'>
2383END
2384;
2385
2386print $besettings{'BE_DOMAINS'};
2387
2388print <<END
2389</textarea></td>
2390 <td colspan='2'><textarea name='BE_URLS' cols='38' rows='10' wrap='off'>
2391END
2392;
2393
2394print $besettings{'BE_URLS'};
2395
2396print <<END
2397</textarea></td>
2398</tr>
2399<tr>
2400 <td colspan='4'>$Lang::tr{'urlfilter expressions'}</td>
2401</tr>
2402<tr>
2403 <td colspan='4'><textarea name='BE_EXPRESSIONS' cols='80' rows='3' wrap='off'>
2404END
2405;
2406
2407print $besettings{'BE_EXPRESSIONS'};
2408
2409print <<END
2410</textarea></td>
2411</tr>
2412</table>
2413<hr size='1'>
2414<table width='100%'>
2415<tr>
2416 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter load blacklist'}</b></td>
2417</tr>
2418<tr>
2419 <td width='25%' class='base'>$Lang::tr{'urlfilter select blacklist'}:</td>
2420 <td width='20%' class='base'>
2421 <select name='BE_BLACKLIST'>
2422END
2423;
2424
2425&readblockcategories;
2426foreach (@categories)
2427{
2428 print "<option value='$_' $selected{'BE_BLACKLIST'}{$_}>$_</option>\n";
2429}
2430
2431print <<END
2432 </select>
2433 </td>
2434 <td>&nbsp;</td>
2435 <td>&nbsp;</td>
2436<tr>
2437 <td colpsan='4'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter load blacklist'}' /></td>
2438</tr>
2439</tr>
2440</table>
2441<hr size='1'>
2442<table width='100%'>
2443<tr>
2444 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter import blacklist'}</b></td>
2445</tr>
2446<tr>
2447 <td colspan='4'>$Lang::tr{'urlfilter import text'}:</td>
2448</tr>
2449<tr>
2450 <td nowrap><input type='file' name='IMPORTFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter import blacklist'}' /></td>
2451 <td><input type='hidden' name='MODE' value='BLACKLIST_EDITOR' /></td>
2452</tr>
2453</table>
2454<hr size='1'>
2455<table width='100%'>
2456<tr>
2457 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter export blacklist'}</b></td>
2458</tr>
2459<tr>
2460 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter export blacklist'}' /></td>
2461</tr>
2462</table>
2463<hr size='1'>
2464<table width='100%'>
2465<tr>
2466 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter install blacklist'}</b></td>
2467</tr>
2468<tr>
2469 <td width='25%' class='base'>$Lang::tr{'urlfilter dont restart urlfilter'}:</td>
2470 <td width='20%' class='base'><input type='checkbox' name='NORESTART' $checked{'NORESTART'}{'on'} /></td>
2471 <td>&nbsp;</td>
2472 <td>&nbsp;</td>
2473</tr>
2474<tr>
2475 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter install blacklist'}' /></td>
2476</tr>
2477<tr>
2478 <td class='base' colspan='4'><br>$Lang::tr{'urlfilter install information'}</td>
2479</tr>
2480</table>
2481<hr size='1'>
2482<table width='20%'>
2483<tr>
2484 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
2485 <td>&nbsp;</td>
2486 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
2487</tr>
2488</table>
2489
2490END
2491;
2492
2493&Header::closebox();
2494print "</form>\n";
2495
2496}
2497
2498&Header::closebigbox();
2499
2500&Header::closepage();
2501
2502# -------------------------------------------------------------------
2503
2504sub savesettings
2505{
1465b127
MT
2506 # transform to pre1.8 client definitions
2507 @clients = split(/\n/,$filtersettings{'UNFILTERED_CLIENTS'});
2508 undef $filtersettings{'UNFILTERED_CLIENTS'};
2509 foreach(@clients)
2510 {
2511 s/^\s+//g; s/\s+$//g; s/\s+-\s+/-/g; s/\s+/ /g; s/\n//g;
2512 $filtersettings{'UNFILTERED_CLIENTS'} .= "$_ ";
2513 }
2514 $filtersettings{'UNFILTERED_CLIENTS'} =~ s/\s+$//;
2515
2516 # transform to pre1.8 client definitions
2517 @clients = split(/\n/,$filtersettings{'BANNED_CLIENTS'});
2518 undef $filtersettings{'BANNED_CLIENTS'};
2519 foreach(@clients)
2520 {
2521 s/^\s+//g; s/\s+$//g; s/\s+-\s+/-/g; s/\s+/ /g; s/\n//g;
2522 $filtersettings{'BANNED_CLIENTS'} .= "$_ ";
2523 }
2524 $filtersettings{'BANNED_CLIENTS'} =~ s/\s+$//;
2525
10e4f239
MT
2526 &writeconfigfile;
2527
2528 delete $filtersettings{'CUSTOM_BLACK_DOMAINS'};
2529 delete $filtersettings{'CUSTOM_BLACK_URLS'};
2530 delete $filtersettings{'CUSTOM_WHITE_DOMAINS'};
2531 delete $filtersettings{'CUSTOM_WHITE_URLS'};
2532 delete $filtersettings{'CUSTOM_EXPRESSIONS'};
2533 delete $filtersettings{'BACKGROUND'};
2534 delete $filtersettings{'UPDATEFILE'};
2535
3fbe7122
AF
2536 system("chown -R nobody.nobody $dbdir");
2537 system('/usr/bin/squidGuard -C custom/allowed/domains >/dev/null 2>&1');
2538 system('/usr/bin/squidGuard -C custom/allowed/urls >/dev/null 2>&1');
2539 system('/usr/bin/squidGuard -C custom/blocked/domains >/dev/null 2>&1');
2540 system('/usr/bin/squidGuard -C custom/blocked/urls >/dev/null 2>&1 ');
2541 &setpermissions ($dbdir);
2542
10e4f239
MT
2543 &General::writehash("${General::swroot}/urlfilter/settings", \%filtersettings);
2544}
2545
2546# -------------------------------------------------------------------
2547
2548sub readblockcategories
2549{
2550 undef(@categories);
1465b127
MT
2551
2552 &getblockcategory ($dbdir);
2553
2554 foreach (@categories) { $_ = substr($_,length($dbdir)+1); }
10e4f239
MT
2555
2556 @filtergroups = @categories;
1465b127 2557
10e4f239 2558 foreach (@filtergroups) {
7438d80a 2559 s/\//_/g;
10e4f239
MT
2560 tr/a-z/A-Z/;
2561 $_ = "FILTER_".$_;
2562 }
2563}
2564
2565# -------------------------------------------------------------------
2566
1465b127
MT
2567sub getblockcategory
2568{
2569 foreach $category (<$_[0]/*>)
2570 {
2571 if (-d $category)
2572 {
2573 if ((-e "$category/domains") || (-e "$category/urls"))
2574 {
2575 unless ($category =~ /\bcustom\b/) { push(@categories,$category); }
2576 }
2577 &getblockcategory ($category);
2578 }
2579 }
2580}
2581
2582# -------------------------------------------------------------------
2583
10e4f239
MT
2584sub readcustomlists
2585{
2586 if (-e "$dbdir/custom/blocked/domains") {
2587 open(FILE,"$dbdir/custom/blocked/domains");
2588 delete $filtersettings{'CUSTOM_BLACK_DOMAINS'};
2589 while (<FILE>) { $filtersettings{'CUSTOM_BLACK_DOMAINS'} .= $_ };
2590 close(FILE);
2591 }
2592
2593 if (-e "$dbdir/custom/blocked/urls") {
2594 open(FILE,"$dbdir/custom/blocked/urls");
2595 delete $filtersettings{'CUSTOM_BLACK_URLS'};
2596 while (<FILE>) { $filtersettings{'CUSTOM_BLACK_URLS'} .= $_ };
2597 close(FILE);
2598 }
2599
2600 if (-e "$dbdir/custom/blocked/expressions") {
2601 open(FILE,"$dbdir/custom/blocked/expressions");
2602 delete $filtersettings{'CUSTOM_EXPRESSIONS'};
2603 while (<FILE>) { $filtersettings{'CUSTOM_EXPRESSIONS'} .= $_ };
2604 close(FILE);
2605 }
2606
2607 if (-e "$dbdir/custom/allowed/domains") {
2608 open(FILE,"$dbdir/custom/allowed/domains");
2609 delete $filtersettings{'CUSTOM_WHITE_DOMAINS'};
2610 while (<FILE>) { $filtersettings{'CUSTOM_WHITE_DOMAINS'} .= $_ };
2611 close(FILE);
2612 }
2613 if (-e "$dbdir/custom/allowed/urls") {
2614 open(FILE,"$dbdir/custom/allowed/urls");
2615 delete $filtersettings{'CUSTOM_WHITE_URLS'};
2616 while (<FILE>) { $filtersettings{'CUSTOM_WHITE_URLS'} .= $_ };
2617 close(FILE);
2618 }
2619}
2620
2621# -------------------------------------------------------------------
2622
2623sub aggregatedconstraints
2624{
2625 my $aggregated;
2626 my @old;
2627 my @new;
2628 my @tmp1;
2629 my @tmp2;
2630 my $x;
2631
2632 if (-e $tcfile)
2633 {
2634 open(TC, $tcfile);
2635 @old = <TC>;
2636 close(TC);
2637
2638 while (@old > 0)
2639 {
2640 $aggregated = 0;
2641 $x = shift(@old);
2642 chomp($x);
2643 @tmp1 = split(/\,/,$x);
2644 $tmp1[16] = '';
2645 foreach (@new)
2646 {
2647 @tmp2 = split(/\,/);
1465b127 2648 if (($tmp1[15] eq 'on') && ($tmp2[15] eq 'on'))
10e4f239
MT
2649 {
2650 if (($tmp1[0] eq $tmp2[0]) && ($tmp1[12] eq $tmp2[12]) && ($tmp1[13] eq $tmp2[13]) && ($tmp1[14] eq $tmp2[14]))
2651 {
2652 $aggregated = 1;
2653 $tmp2[16] .= " weekly ";
2654 if ($tmp1[1] eq 'on') { $tmp2[16] .= "m"; }
2655 if ($tmp1[2] eq 'on') { $tmp2[16] .= "t"; }
2656 if ($tmp1[3] eq 'on') { $tmp2[16] .= "w"; }
2657 if ($tmp1[4] eq 'on') { $tmp2[16] .= "h"; }
2658 if ($tmp1[5] eq 'on') { $tmp2[16] .= "f"; }
2659 if ($tmp1[6] eq 'on') { $tmp2[16] .= "a"; }
2660 if ($tmp1[7] eq 'on') { $tmp2[16] .= "s"; }
2661 $tmp2[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n";
2662 $_ = join(",",@tmp2);
2663 }
2664
2665 }
2666 }
2667 if (!$aggregated)
2668 {
2669 $tmp1[16] .= " weekly ";
2670 if ($tmp1[1] eq 'on') { $tmp1[16] .= "m"; }
2671 if ($tmp1[2] eq 'on') { $tmp1[16] .= "t"; }
2672 if ($tmp1[3] eq 'on') { $tmp1[16] .= "w"; }
2673 if ($tmp1[4] eq 'on') { $tmp1[16] .= "h"; }
2674 if ($tmp1[5] eq 'on') { $tmp1[16] .= "f"; }
2675 if ($tmp1[6] eq 'on') { $tmp1[16] .= "a"; }
2676 if ($tmp1[7] eq 'on') { $tmp1[16] .= "s"; }
2677 $tmp1[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n";
2678 $x = join(",",@tmp1);
2679 push(@new,$x);
2680 }
2681 }
2682 }
2683
2684 return @new;
2685
2686}
2687
2688# -------------------------------------------------------------------
2689
1465b127
MT
2690sub setpermissions
2691{
2692 my $bldir = $_[0];
2693
2694 foreach $category (<$bldir/*>)
2695 {
2696 if (-d $category){
2697 system("chmod 755 $category &> /dev/null");
2698 foreach $blacklist (<$category/*>)
2699 {
2700 if (-f $blacklist) { system("chmod 644 $blacklist &> /dev/null"); }
2701 if (-d $blacklist) { system("chmod 755 $blacklist &> /dev/null"); }
2702 }
2703 system("chmod 666 $category/*.db &> /dev/null");
2704 &setpermissions ($category);
2705 }
2706 }
2707}
2708
2709# -------------------------------------------------------------------
2710
10e4f239
MT
2711sub writeconfigfile
2712{
1c4308c1
TE
2713 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\)\$";
2714 my $audiovideo = "/[^/]*\\.\(aiff|asf|avi|dif|divx|flv|mkv|mov|movie|mp3|mp4|mpe?g?|mpv2|ogg|ra?m|snd|qt|wav|wma|wmf|wmv\)\$";
2715 my $archives = "/[^/]*\\.\(7z|bin|bz2|cab|cdr|dmg|gz|hqx|rar|smi|sit|sea|tar|tgz|zip\)\$";
10e4f239
MT
2716
2717 my $ident = " anonymous";
2718
2719 my $defaultrule='';
2720 my $tcrule='';
2721 my $redirect='';
2722 my $qredirect='';
2723
2724 my $idx;
2725
2726 my @ec=();
2727 my @tc=();
2728 my @uq=();
2729
2730 if (!(-d "$dbdir/custom")) { mkdir("$dbdir/custom") }
2731 if (!(-d "$dbdir/custom/blocked")) { mkdir("$dbdir/custom/blocked") }
2732 if (!(-d "$dbdir/custom/allowed")) { mkdir("$dbdir/custom/allowed") }
2733
2734 open(FILE, ">/$dbdir/custom/blocked/domains");
2735 print FILE $filtersettings{'CUSTOM_BLACK_DOMAINS'};
2736 close(FILE);
2737 open(FILE, ">/$dbdir/custom/blocked/urls");
2738 print FILE $filtersettings{'CUSTOM_BLACK_URLS'};
2739 close(FILE);
2740 open(FILE, ">/$dbdir/custom/blocked/expressions");
2741 print FILE $filtersettings{'CUSTOM_EXPRESSIONS'};
2742 close(FILE);
2743 open(FILE, ">/$dbdir/custom/blocked/files");
2744 if ($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') { print FILE "$executables\n"; }
2745 if ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') { print FILE "$audiovideo\n"; }
2746 if ($filtersettings{'BLOCK_ARCHIVES'} eq 'on') { print FILE "$archives\n"; }
2747 close(FILE);
2748 open(FILE, ">/$dbdir/custom/allowed/domains");
2749 print FILE $filtersettings{'CUSTOM_WHITE_DOMAINS'};
2750 close(FILE);
2751 open(FILE, ">/$dbdir/custom/allowed/urls");
2752 print FILE $filtersettings{'CUSTOM_WHITE_URLS'};
2753 close(FILE);
2754
2755 if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { $ident = ""; }
2756
2757 if ($filtersettings{'REDIRECT_PAGE'} eq '')
2758 {
2759 if (($filtersettings{'SHOW_CATEGORY'} eq 'on') || ($filtersettings{'SHOW_URL'} eq 'on') || ($filtersettings{'SHOW_IP'} eq 'on')) {
2760 if ($filtersettings{'SHOW_CATEGORY'} eq 'on') { $redirect .= "&category=%t"; }
2761 if ($filtersettings{'SHOW_URL'} eq 'on') { $redirect .= "&url=%u"; }
2762 if ($filtersettings{'SHOW_IP'} eq 'on') { $redirect .= "&ip=%a"; }
2763 $redirect =~ s/^&/?/;
d47ad587 2764 $redirect = "http:\/\/$netsettings{'GREEN_ADDRESS'}:$http_port\/redirect.cgi".$redirect;
10e4f239 2765 } else {
1465b127 2766 $redirect="http:\/\/$netsettings{'GREEN_ADDRESS'}:$http_port\/redirect.cgi";
10e4f239
MT
2767 }
2768 } else { $redirect=$filtersettings{'REDIRECT_PAGE'}; }
2769
2770 if ($filtersettings{'ENABLE_DNSERROR'} eq 'on') { $redirect = "302:http://0.0.0.0"; }
2771
2772 undef $defaultrule;
2773
2774 if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on')
2775 {
2776 $defaultrule .= "custom-allowed ";
2777 }
2778 if ($filtersettings{'BLOCK_ALL'} eq 'on')
2779 {
2780 $defaultrule .= "none";
2781 }
2782 else
2783 {
2784 if ($filtersettings{'BLOCK_IP_ADDR'} eq 'on')
2785 {
2786 $defaultrule .= "!in-addr ";
2787 }
2788 for ($i=0; $i<=@filtergroups; $i++) {
2789 if ($filtersettings{@filtergroups[$i]} eq 'on')
2790 {
2791 $defaultrule .= "!@categories[$i] ";
2792 }
2793 }
2794 if ($filtersettings{'ENABLE_CUSTOM_BLACKLIST'} eq 'on')
2795 {
2796 $defaultrule .= "!custom-blocked ";
2797 }
2798 if ($filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} eq 'on')
2799 {
2800 $defaultrule .= "!custom-expressions ";
2801 }
2802 if (($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') ||
2803 ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') ||
2804 ($filtersettings{'BLOCK_ARCHIVES'} eq 'on'))
2805 {
2806 $defaultrule .= "!files ";
2807 }
2808 $defaultrule .= "any";
2809 }
2810
1465b127
MT
2811 $defaultrule =~ s/\//_/g;
2812
10e4f239
MT
2813 open(FILE, ">${General::swroot}/urlfilter/squidGuard.conf") or die "Unable to write squidGuard.conf file";
2814 flock(FILE, 2);
2815
2816 print FILE "logdir /var/log/squidGuard\n";
2817 print FILE "dbhome $dbdir\n\n";
2818
2819 undef @repositoryfiles;
2820 if ($filtersettings{'ENABLE_REWRITE'} eq 'on')
2821 {
2822 @repositorylist = <$repository/*>;
2823 foreach (@repositorylist)
2824 {
2825 if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); }
2826 }
2827 }
2828
6b2801d6 2829 if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) {
1465b127 2830 print FILE "rewrite rew-rule-1 {\n";
10e4f239 2831
6b2801d6
MT
2832 print FILE " # rewrite localfiles\n";
2833 foreach (@repositoryfiles)
10e4f239 2834 {
6b2801d6 2835 print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:$http_port/repository/$_\@i\n";
10e4f239 2836 }
10e4f239 2837 print FILE "}\n\n";
10e4f239
MT
2838 }
2839
1465b127
MT
2840 if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) {
2841 print FILE "src unfiltered {\n";
2842 print FILE " ip $filtersettings{'UNFILTERED_CLIENTS'}\n";
2843 print FILE "}\n\n";
2844 }
2845 if (!($filtersettings{'BANNED_CLIENTS'} eq '')) {
2846 print FILE "src banned {\n";
2847 print FILE " ip $filtersettings{'BANNED_CLIENTS'}\n";
2848 if ($filtersettings{'ENABLE_LOG'} eq 'on')
2849 {
2850 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
2851 {
2852 print FILE " logfile ".$ident." banned.log\n";
2853 } else {
2854 print FILE " logfile ".$ident." urlfilter.log\n";
2855 }
2856 }
2857 print FILE "}\n\n";
2858 }
2859
10e4f239
MT
2860 if (-e $uqfile)
2861 {
2862 open(UQ, $uqfile);
2863 @uqlist = <UQ>;
2864 close(UQ);
2865
2866 if (@uqlist > 0)
2867 {
2868 $idx=0;
2869 foreach (@uqlist)
2870 {
2871 chomp;
2872 @uq = split(/\,/);
2873 if ($uq[4] eq 'on')
2874 {
2875 $idx++;
2876 $uq[0] = $uq[0] * 60;
2877 if ($uq[1] eq '0') {
2878 if ($uq[2] eq 'hourly') { $uq[1] = 3600 }
2879 if ($uq[2] eq 'daily') { $uq[1] = 86400 }
2880 if ($uq[2] eq 'weekly') { $uq[1] = 604800 }
2881 }
2882 $uq[3] =~ s/\|/ /g;
2883 print FILE "src quota-$idx {\n";
2884 print FILE " user $uq[3]\n";
2885 print FILE " userquota $uq[0] $uq[1] $uq[2]\n";
2886 print FILE "}\n\n";
2887 }
2888 }
2889
2890 }
2891 }
2892
2893 @tclist = &aggregatedconstraints;
2894
2895 if (@tclist > 0)
2896 {
2897 $idx=0;
2898 foreach (@tclist)
2899 {
2900 chomp;
2901 @tc = split(/\,/);
2902 if ($tc[15] eq 'on')
2903 {
2904 $idx++;
2905 print FILE "src network-$idx {\n";
1465b127
MT
2906 @clients = split(/ /,$tc[12]);
2907 @temp = split(/-/,$clients[0]);
2908 if ( (&General::validipormask($temp[0])) || (&General::validipandmask($temp[0])))
2909 {
2910 print FILE " ip $tc[12]\n";
2911 } else {
2912 print FILE " user";
2913 @clients = split(/ /,$tc[12]);
2914 foreach $line (@clients)
2915 {
2916 $line =~ s/(^\w+)\\(\w+$)/$1%5c$2/;
2917 print FILE " $line";
2918 }
2919 print FILE "\n";
2920 }
2921 if (($filtersettings{'ENABLE_LOG'} eq 'on') && ($tc[14] eq 'block') && ($tc[13] eq 'any'))
2922 {
2923 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
2924 {
2925 print FILE " logfile ".$ident." timeconst.log\n";
2926 } else {
2927 print FILE " logfile ".$ident." urlfilter.log\n";
2928 }
2929 }
10e4f239
MT
2930 print FILE "}\n\n";
2931 }
2932 }
2933
2934 $idx=0;
2935 foreach (@tclist)
2936 {
2937 chomp;
2938 @tc = split(/\,/);
2939 if ($tc[15] eq 'on')
2940 {
2941 $idx++;
2942 print FILE "time constraint-$idx {\n";
2943 print FILE "$tc[16]\n";
2944 print FILE "}\n\n";
2945 }
2946 }
2947 }
2948
10e4f239 2949 foreach $category (@categories) {
1465b127
MT
2950 $blacklist = $category;
2951 $category =~ s/\//_/g;
8f451574
CS
2952
2953 if ( $filtersettings{"FILTER_".uc($category)} ne "on" ){
2954 my $constraintrule = "false";
2955
2956 foreach (@tclist){
2957 chomp;
2958 @tc = split(/\,/);
2959 $tc[13] =~ s/\//_/g;
2960 if ($tc[15] eq 'on' && $tc[13] =~ $category){
2961 $constraintrule = "true";
2962 }
2963 }
2964
2965 if ( $constraintrule eq "false"){
2966 next;
2967 }
2968 }
2969
10e4f239 2970 print FILE "dest $category {\n";
1465b127
MT
2971 if (-e "$dbdir/$blacklist/domains") {
2972 print FILE " domainlist $blacklist\/domains\n";
10e4f239 2973 }
1465b127
MT
2974 if (-e "$dbdir/$blacklist/urls") {
2975 print FILE " urllist $blacklist\/urls\n";
10e4f239 2976 }
1465b127
MT
2977 if ((-e "$dbdir/$blacklist/expressions") && ($filtersettings{'ENABLE_EXPR_LISTS'} eq 'on')) {
2978 print FILE " expressionlist $blacklist\/expressions\n";
10e4f239 2979 }
1465b127 2980 if ((($category eq 'ads') || ($category eq 'adv')) && ($filtersettings{'ENABLE_EMPTY_ADS'} eq 'on'))
10e4f239 2981 {
1465b127 2982 print FILE " redirect http:\/\/$netsettings{'GREEN_ADDRESS'}:$http_port\/images/urlfilter/1x1.gif\n";
10e4f239
MT
2983 }
2984 if ($filtersettings{'ENABLE_LOG'} eq 'on')
2985 {
2986 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
2987 {
2988 print FILE " logfile $ident $category.log\n";
2989 } else {
2990 print FILE " logfile $ident urlfilter.log\n";
2991 }
2992 }
2993 print FILE "}\n\n";
1465b127 2994 $category = $blacklist;
10e4f239 2995 }
d47ad587 2996
10e4f239
MT
2997 print FILE "dest files {\n";
2998 print FILE " expressionlist custom\/blocked\/files\n";
2999 if ($filtersettings{'ENABLE_LOG'} eq 'on')
3000 {
3001 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
3002 {
3003 print FILE " logfile $ident files.log\n";
3004 } else {
3005 print FILE " logfile $ident urlfilter.log\n";
3006 }
3007 }
3008 print FILE "}\n\n";
3009
3010 print FILE "dest custom-allowed {\n";
3011 print FILE " domainlist custom\/allowed\/domains\n";
3012 print FILE " urllist custom\/allowed\/urls\n";
3013 print FILE "}\n\n";
3014
3015 print FILE "dest custom-blocked {\n";
3016 print FILE " domainlist custom\/blocked\/domains\n";
3017 print FILE " urllist custom\/blocked\/urls\n";
3018 if ($filtersettings{'ENABLE_LOG'} eq 'on')
3019 {
3020 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
3021 {
3022 print FILE " logfile $ident custom.log\n";
3023 } else {
3024 print FILE " logfile $ident urlfilter.log\n";
3025 }
3026 }
3027 print FILE "}\n\n";
3028
3029 print FILE "dest custom-expressions {\n";
3030 print FILE " expressionlist custom\/blocked\/expressions\n";
3031 if ($filtersettings{'ENABLE_LOG'} eq 'on')
3032 {
3033 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
3034 {
3035 print FILE " logfile $ident custom.log\n";
3036 } else {
3037 print FILE " logfile $ident urlfilter.log\n";
3038 }
3039 }
3040 print FILE "}\n\n";
3041
3042 print FILE "acl {\n";
3043 if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) {
3044 print FILE " unfiltered {\n";
3045 print FILE " pass all\n";
10e4f239
MT
3046 print FILE " }\n\n";
3047 }
3048 if (!($filtersettings{'BANNED_CLIENTS'} eq '')) {
3049 print FILE " banned {\n";
3050 print FILE " pass ";
3051 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
3052 {
3053 print FILE "custom-allowed ";
3054 }
3055 print FILE "none\n";
3056 print FILE " }\n\n";
3057 }
3058
3059 if (-s $uqfile)
3060 {
3061 open(UQ, $uqfile);
3062 @uqlist = <UQ>;
3063 close(UQ);
3064
3065 $idx=0;
3066 foreach (@uqlist)
3067 {
3068 chomp;
3069 @uq = split(/\,/);
3070 if ($uq[4] eq 'on')
3071 {
3072 $idx++;
3073 $qredirect = $redirect;
3074 $qredirect =~ s/\%t/\%q\%20-\%20\%i/;
3075 print FILE " quota-$idx {\n";
3076 print FILE " pass ";
3077 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
3078 {
3079 print FILE "custom-allowed ";
3080 }
3081 print FILE "none\n";
3082 unless ($redirect eq $qredirect) { print FILE " redirect $qredirect\n"; }
3083 print FILE " }\n\n";
3084 }
3085 }
3086 }
3087
3088 if (@tclist > 0)
3089 {
3090 $idx=0;
3091 foreach (@tclist)
3092 {
3093 chomp;
3094 @tc = split(/\,/);
3095 @ec = split(/\|/,$tc[13]);
1465b127 3096 foreach (@ec) { s/\//_/g; }
10e4f239
MT
3097 if ($tc[15] eq 'on')
3098 {
3099 $idx++;
3100 print FILE " network-$idx $tc[0] constraint-$idx {\n";
3101 print FILE " pass ";
3102
3103 if ($filtersettings{'BLOCK_ALL'} eq 'on')
3104 {
3105 if ($tc[14] eq 'block')
3106 {
3107 if ((@ec == 1) && ($ec[0] eq 'any')) {
3108 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
3109 {
3110 print FILE "custom-allowed ";
3111 }
3112 print FILE "none";
3113 } else {
3114 print FILE $defaultrule;
3115 }
3116 } else {
3117 foreach (@ec)
3118 {
3119 print FILE "$_ ";
3120 }
3121 print FILE $defaultrule unless ((@ec == 1) && ($ec[0] eq 'any'));
3122 }
3123 } else {
3124 if ($tc[14] eq 'block')
3125 {
3126 $tcrule = $defaultrule;
3127 if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') {
3128 $tcrule =~ s/custom-allowed //;
3129 print FILE "custom-allowed " unless ((@ec == 1) && ($ec[0] eq 'any') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'off'));
3130 }
3131 if ((@ec == 1) && ($ec[0] eq 'any')) {
3132 print FILE "none";
3133 } else {
3134 foreach (@ec)
3135 {
3136 print FILE "!$_ " unless (index($defaultrule,"!".$_." ") ge 0);
3137 }
3138 }
3139 print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any'));
3140 } else {
3141 $tcrule = $defaultrule;
1465b127 3142 if ((@ec == 1) && ($ec[0] eq 'any'))
10e4f239 3143 {
1465b127
MT
3144 print FILE "any";
3145 } else {
3146 foreach (@ec)
3147 {
3148 $tcrule = "$_ ".$tcrule unless (index($defaultrule,"!".$_." ") ge 0);
3149 $tcrule =~ s/!$_ //;
3150 }
3151 print FILE $tcrule;
10e4f239 3152 }
10e4f239
MT
3153 }
3154 }
3155
3156 print FILE "\n";
3157
3158 print FILE " }\n\n";
3159 }
3160 }
3161 }
3162
3163 print FILE " default {\n";
3164 print FILE " pass $defaultrule\n";
3165 if (($filtersettings{'ENABLE_LOG'} eq 'on') && ($filtersettings{'BLOCK_ALL'} eq 'on'))
3166 {
3167 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
3168 {
3169 print FILE " logfile".$ident." default.log\n";
3170 } else {
3171 print FILE " logfile".$ident." urlfilter.log\n";
3172 }
3173 }
6b2801d6 3174 if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles))
10e4f239 3175 {
1465b127 3176 print FILE " rewrite rew-rule-1\n";
10e4f239
MT
3177 }
3178 print FILE " redirect $redirect\n";
3179 print FILE " }\n";
3180 print FILE "}\n";
3181
3182 close FILE;
3183}
3184
3185# -------------------------------------------------------------------