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