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