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