]> git.ipfire.org Git - ipfire-2.x.git/blob - html/cgi-bin/urlfilter.cgi
HinzugefĆ¼gt:
[ipfire-2.x.git] / html / cgi-bin / urlfilter.cgi
1 #!/usr/bin/perl
2 #
3 # SmoothWall CGIs
4 #
5 # This code is distributed under the terms of the GPL
6 #
7 # (c) written from scratch
8 #
9 # $Id: urlfilter.cgi,v 1.7 2006/05/08 00:00:00 marco Exp $
10 #
11
12 use strict;
13
14 # enable only the following on debugging purpose
15 #use warnings;
16 #use CGI::Carp 'fatalsToBrowser';
17
18 use File::Copy;
19 use IO::Socket;
20
21 require '/var/ipfire/general-functions.pl';
22 require "${General::swroot}/lang.pl";
23 require "${General::swroot}/header.pl";
24
25 my %netsettings=();
26 my %mainsettings=();
27 my %proxysettings=();
28 my %filtersettings=();
29 my %tcsettings=();
30 my %uqsettings=();
31 my %besettings=();
32 my %updatesettings=();
33 my %checked=();
34 my %selected=();
35 my $id=0;
36 my $line='';
37 my $i=0;
38 my $n=0;
39 my $time='';
40 my $filesize;
41 my $category='';
42 my $section='';
43 my $blacklist='';
44 my $blistbackup='';
45
46 my $changed = 'no';
47 my $tcfile = "${General::swroot}/urlfilter/timeconst";
48 my $uqfile = "${General::swroot}/urlfilter/userquota";
49 my $dbdir = "${General::swroot}/urlfilter/blacklists";
50 my $editdir = "${General::swroot}/urlfilter/editor";
51 my $repository = "/home/httpd/html/repository";
52 my $hintcolour = '#FFFFCC';
53
54 my $sourceurlfile = "${General::swroot}/urlfilter/autoupdate/autoupdate.urls";
55 my $updconffile = "${General::swroot}/urlfilter/autoupdate/autoupdate.conf";
56 my $updflagfile = "${General::swroot}/urlfilter/blacklists/.autoupdate.last";
57 my $upd_cron_dly = "${General::swroot}/urlfilter/autoupdate/cron.daily";
58 my $upd_cron_wly = "${General::swroot}/urlfilter/autoupdate/cron.weekly";
59 my $upd_cron_mly = "${General::swroot}/urlfilter/autoupdate/cron.monthly";
60
61 my $errormessage='';
62 my $updatemessage='';
63 my $restoremessage='';
64 my $buttontext='';
65 my $source_name='';
66 my $source_url='';
67 my $blacklistage=0;
68
69 my @repositorylist=();
70 my @repositoryfiles=();
71 my @categories=();
72 my @selectedcategories=();
73 my @filtergroups=();
74 my @tclist=();
75 my @uqlist=();
76 my @source_urllist=();
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 if (!($filtersettings{'CHILDREN'} =~ /^\d+$/) || ($filtersettings{'CHILDREN'} < 1))
156 {
157 $errormessage = $Lang::tr{'urlfilter invalid num of children'};
158 goto ERROR;
159 }
160
161 if ((!($filtersettings{'REDIRECT_PAGE'} eq '')) && (!($filtersettings{'REDIRECT_PAGE'} =~ /^https?:\/\//)))
162 {
163 $filtersettings{'REDIRECT_PAGE'} = "http://".$filtersettings{'REDIRECT_PAGE'};
164 }
165
166 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'})
167 {
168 if (-e "$repository/$filtersettings{'ID'}") { unlink("$repository/$filtersettings{'ID'}"); }
169 $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'};
170 }
171
172 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'})
173 {
174 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPLOADFILE'});
175
176 $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'};
177 $_ = $filtersettings{'UPLOADFILE'};
178 tr/\\/\//;
179 $_ = substr($_,rindex($_,"/")+1);
180 if ($_) {
181 if (copy($filtersettings{'UPLOADFILE'}, "$repository/$_") != 1)
182 {
183 $errormessage = $!;
184 goto ERROR;
185 }
186 }
187
188 }
189
190 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'})
191 {
192 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'BACKGROUND'});
193
194 if (copy($filtersettings{'BACKGROUND'}, "/home/httpd/html/images/urlfilter/background.jpg") != 1)
195 {
196 $errormessage = $!;
197 goto ERROR;
198 }
199 }
200
201 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'})
202 {
203 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'});
204
205 if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/))
206 {
207 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
208 goto ERROR;
209 }
210
211 if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/blacklists.tar.gz") != 1)
212 {
213 $errormessage = $!;
214 goto ERROR;
215 }
216
217 if (!(-d "${General::swroot}/urlfilter/update")) { mkdir("${General::swroot}/urlfilter/update"); }
218
219 my $exitcode = system("/bin/tar --no-same-owner -xzf ${General::swroot}/urlfilter/blacklists.tar.gz -C ${General::swroot}/urlfilter/update");
220
221 if ($exitcode > 0)
222 {
223 $errormessage = $Lang::tr{'urlfilter tar error'};
224 } else {
225
226 if (-d "${General::swroot}/urlfilter/update/category")
227 {
228 system("mv ${General::swroot}/urlfilter/update/category ${General::swroot}/urlfilter/update/blacklists");
229 }
230
231 if (!(-d "${General::swroot}/urlfilter/update/blacklists"))
232 {
233 $errormessage = $Lang::tr{'urlfilter invalid content'};
234 } else {
235 system("cp -r ${General::swroot}/urlfilter/update/blacklists/* $dbdir");
236
237 &readblockcategories;
238 &readcustomlists;
239
240 &writeconfigfile;
241
242 $updatemessage = $Lang::tr{'urlfilter upload success'};
243 system("${General::swroot}/urlfilter/bin/prebuild.pl &");
244 system("logger -t installpackage[urlfilter] \"URL filter blacklist - Blacklist update from local source completed\"");
245 }
246 }
247 if (-d "${General::swroot}/urlfilter/update") { system("rm -rf ${General::swroot}/urlfilter/update"); }
248 if (-e "${General::swroot}/urlfilter/blacklists.tar.gz") { unlink("${General::swroot}/urlfilter/blacklists.tar.gz"); }
249 if ($errormessage) { goto ERROR; }
250 }
251
252 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'})
253 {
254 $blistbackup = ($filtersettings{'ENABLE_FULLBACKUP'} eq 'on') ? "blacklists" : "blacklists/custom";
255 if (system("/bin/tar -C ${General::swroot}/urlfilter -czf ${General::swroot}/urlfilter/backup.tar.gz settings timeconst userquota autoupdate $blistbackup"))
256 {
257 $errormessage = $Lang::tr{'urlfilter backup error'};
258 goto ERROR;
259 }
260 else
261 {
262 print "Content-type: application/gzip\n";
263 print "Content-length: ";
264 print (-s "${General::swroot}/urlfilter/backup.tar.gz");
265 print "\n";
266 print "Content-disposition: attachment; filename=urlfilter-backup.tar.gz\n\n";
267
268 open (FILE, "${General::swroot}/urlfilter/backup.tar.gz");
269 while (<FILE>) { print; }
270 close (FILE);
271
272 if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); }
273 exit;
274 }
275 }
276
277 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'})
278 {
279 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'});
280
281 if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/))
282 {
283 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
284 goto ERROR;
285 }
286
287 if (!(-d "${General::swroot}/urlfilter/restore")) { mkdir("${General::swroot}/urlfilter/restore"); }
288
289 if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/backup.tar.gz") != 1)
290 {
291 $errormessage = $!;
292 }
293
294 my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf ${General::swroot}/urlfilter/backup.tar.gz -C ${General::swroot}/urlfilter/restore");
295 if ($exitcode > 0)
296 {
297 $errormessage = $Lang::tr{'urlfilter tar error'};
298 } else {
299 if (!(-e "${General::swroot}/urlfilter/restore/settings"))
300 {
301 $errormessage = $Lang::tr{'urlfilter invalid restore file'};
302 } else {
303 system("cp -rp ${General::swroot}/urlfilter/restore/* ${General::swroot}/urlfilter/");
304 &readblockcategories;
305 &readcustomlists;
306 &writeconfigfile;
307
308 $restoremessage = $Lang::tr{'urlfilter restore success'};
309 }
310 }
311
312 if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); }
313 if (-d "${General::swroot}/urlfilter/restore") { system("rm -rf ${General::swroot}/urlfilter/restore"); }
314 if ($errormessage) { goto ERROR; }
315 }
316
317 if ($filtersettings{'ACTION'} eq $Lang::tr{'save'})
318 {
319 $filtersettings{'VALID'} = 'yes';
320 &savesettings;
321 }
322
323 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'})
324 {
325 if (!(-e "${General::swroot}/proxy/enable"))
326 {
327 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
328 goto ERROR;
329 }
330 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
331 {
332 $errormessage = $Lang::tr{'urlfilter not enabled'};
333 goto ERROR;
334 }
335
336 $filtersettings{'VALID'} = 'yes';
337 &savesettings;
338
339 system("chown -R nobody.nobody $dbdir");
340
341 if (-e "$dbdir/custom/allowed/domains.db") { unlink("$dbdir/custom/allowed/domains.db"); }
342 if (-e "$dbdir/custom/allowed/urls.db") { unlink("$dbdir/custom/allowed/urls.db"); }
343 if (-e "$dbdir/custom/blocked/domains.db") { unlink("$dbdir/custom/blocked/domains.db"); }
344 if (-e "$dbdir/custom/blocked/urls.db") { unlink("$dbdir/custom/blocked/urls.db"); }
345
346 foreach (<$dbdir/*>)
347 {
348 if (-d $_){ system("chmod 644 $_/*"); }
349 if (-d $_){ system("chmod 666 $_/*.db"); }
350 }
351 if (-d "$dbdir/custom/allowed")
352 {
353 system("chmod 755 $dbdir/custom/allowed");
354 system("chmod 644 $dbdir/custom/allowed/*");
355 }
356 if (-d "$dbdir/custom/blocked")
357 {
358 system("chmod 755 $dbdir/custom/blocked");
359 system("chmod 644 $dbdir/custom/blocked/*");
360 }
361
362 system('/usr/local/bin/restartsquid');
363 }
364
365 ERROR:
366
367 if ($errormessage) { $filtersettings{'VALID'} = 'no'; }
368
369 }
370
371 if ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter set time constraints'}) { $tcsettings{'TCMODE'} = 'on'}
372
373 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'add'}))
374 {
375 $tcsettings{'TCMODE'}='on';
376
377 if (!$tcsettings{'DST'})
378 {
379 $errormessage=$Lang::tr{'urlfilter dst error'};
380 }
381
382 if (!$tcsettings{'SRC'})
383 {
384 $errormessage=$Lang::tr{'urlfilter src error'};
385 }
386
387 if (!($tcsettings{'TO_HOUR'}.$tcsettings{'TO_MINUTE'} gt $tcsettings{'FROM_HOUR'}.$tcsettings{'FROM_MINUTE'}))
388 {
389 $errormessage=$Lang::tr{'urlfilter timespace error'};
390 }
391
392 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')))
393 {
394 $errormessage=$Lang::tr{'urlfilter weekday error'};
395 }
396
397 if (!$errormessage)
398 {
399 if ($tcsettings{'DST'} =~ /^any/) { $tcsettings{'DST'} = 'any'; }
400 if ($tcsettings{'ENABLERULE'} eq 'on') { $tcsettings{'ACTIVE'} = $tcsettings{'ENABLERULE'}; } else { $tcsettings{'ACTIVE'} = 'off'}
401
402 $tcsettings{'ENABLERULE'} = 'on';
403 if($tcsettings{'EDITING'} eq 'no') {
404 open(FILE,">>$tcfile");
405 flock FILE, 2;
406 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";
407 } else {
408 open(FILE, ">$tcfile");
409 flock FILE, 2;
410 $id = 0;
411 foreach $line (@tclist)
412 {
413 $id++;
414 if ($tcsettings{'EDITING'} eq $id) {
415 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";
416 } else { print FILE "$line"; }
417 }
418 }
419 close(FILE);
420 undef %tcsettings;
421 $tcsettings{'CHANGED'}='yes';
422 $tcsettings{'TCMODE'}='on';
423 $changed = 'yes';
424 } else {
425 if ($tcsettings{'EDITING'} ne 'no')
426 {
427 $tcsettings{'ACTION'} = $Lang::tr{'edit'};
428 $tcsettings{'ID'} = $tcsettings{'EDITING'};
429 }
430 }
431 }
432
433 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'remove'}))
434 {
435 $id = 0;
436 open(FILE, ">$tcfile");
437 flock FILE, 2;
438 foreach $line (@tclist)
439 {
440 $id++;
441 unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; }
442 }
443 close(FILE);
444 $tcsettings{'CHANGED'}='yes';
445 $tcsettings{'TCMODE'}='on';
446 }
447
448 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'}))
449 {
450 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
451 {
452 $errormessage = $Lang::tr{'urlfilter not enabled'};
453 }
454 if (!(-e "${General::swroot}/proxy/enable"))
455 {
456 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
457 }
458
459 if (!$errormessage) { system('/usr/local/bin/restartsquid'); }
460 $tcsettings{'TCMODE'}='on';
461 }
462
463 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'}))
464 {
465 open(FILE, ">$tcfile");
466 flock FILE, 2;
467 $id = 0;
468 foreach $line (@tclist)
469 {
470 $id++;
471 unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; }
472 else
473 {
474 chomp($line);
475 @temp = split(/\,/,$line);
476 if ($temp[15] eq 'on') { $temp[15] = 'off'; } else { $temp[15] = 'on' }
477 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";
478 }
479 }
480 close(FILE);
481 $tcsettings{'CHANGED'}='yes';
482 $tcsettings{'TCMODE'}='on';
483 }
484
485 if (!$errormessage) {
486 $tcsettings{'ENABLERULE'}='on';
487 $tcsettings{'TO_HOUR'}='24';
488 }
489
490 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage))
491 {
492 $id = 0;
493 foreach $line (@tclist)
494 {
495 $id++;
496 if ($tcsettings{'ID'} eq $id)
497 {
498 chomp($line);
499 @temp = split(/\,/,$line);
500 $tcsettings{'DEFINITION'} = $temp[0];
501 $tcsettings{'MON'} = $temp[1];
502 $tcsettings{'TUE'} = $temp[2];
503 $tcsettings{'WED'} = $temp[3];
504 $tcsettings{'THU'} = $temp[4];
505 $tcsettings{'FRI'} = $temp[5];
506 $tcsettings{'SAT'} = $temp[6];
507 $tcsettings{'SUN'} = $temp[7];
508 $tcsettings{'FROM_HOUR'} = $temp[8];
509 $tcsettings{'FROM_MINUTE'} = $temp[9];
510 $tcsettings{'TO_HOUR'} = $temp[10];
511 $tcsettings{'TO_MINUTE'} = $temp[11];
512 $tcsettings{'SRC'} = $temp[12];
513 $tcsettings{'DST'} = $temp[13];
514 $tcsettings{'ACCESS'} = $temp[14];
515 $tcsettings{'ENABLERULE'} = $temp[15];
516 $tcsettings{'COMMENT'} = $temp[16];
517 }
518 }
519 $tcsettings{'TCMODE'}='on';
520 }
521
522 if ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter set user quota'}) { $uqsettings{'UQMODE'} = 'on'}
523
524 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'add'}))
525 {
526 $uqsettings{'UQMODE'}='on';
527
528 if ((!($uqsettings{'TIME_QUOTA'} =~ /^\d+/)) || ($uqsettings{'TIME_QUOTA'} < '1'))
529 {
530 $errormessage=$Lang::tr{'urlfilter quota time error'};
531 }
532
533 @temp = split(/\n/,$uqsettings{'QUOTA_USERS'});
534 undef $uqsettings{'QUOTA_USERS'};
535 foreach (@temp)
536 {
537 s/^\s+//g; s/\s+$//g;
538 if ($_) { $uqsettings{'QUOTA_USERS'} .= $_."\n"; }
539 }
540
541 if ($uqsettings{'QUOTA_USERS'} eq '')
542 {
543 $errormessage=$Lang::tr{'urlfilter quota user error'};
544 }
545
546 $_ = $uqsettings{'QUOTA_USERS'};
547 chomp; s/\n/|/g;
548 my $quota_users = $_;
549
550 if ($uqsettings{'QUOTA_USERS'} =~ /\\/)
551 {
552 $errormessage=$Lang::tr{'urlfilter invalid user error'};
553 }
554
555 if (!$errormessage) {
556 if ($uqsettings{'ENABLEQUOTA'} eq 'on') { $uqsettings{'ACTIVE'} = $uqsettings{'ENABLEQUOTA'}; } else { $uqsettings{'ACTIVE'} = 'off'}
557
558 $uqsettings{'ENABLERULE'} = 'on';
559 if($uqsettings{'EDITING'} eq 'no') {
560 open(FILE,">>$uqfile");
561 flock FILE, 2;
562 print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n";
563 } else {
564 open(FILE, ">$uqfile");
565 flock FILE, 2;
566 $id = 0;
567 foreach $line (@uqlist)
568 {
569 $id++;
570 if ($uqsettings{'EDITING'} eq $id) {
571 print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n";
572 } else { print FILE "$line"; }
573 }
574 }
575 close(FILE);
576 undef %uqsettings;
577 $uqsettings{'CHANGED'}='yes';
578 $uqsettings{'MODE'}='USERQUOTA';
579 $uqsettings{'UQMODE'}='on';
580 $changed = 'yes';
581 } else {
582 if ($uqsettings{'EDITING'} ne 'no')
583 {
584 $uqsettings{'ACTION'} = $Lang::tr{'edit'};
585 $uqsettings{'ID'} = $uqsettings{'EDITING'};
586 }
587 }
588 }
589
590 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'remove'}))
591 {
592 $id = 0;
593 open(FILE, ">$uqfile");
594 flock FILE, 2;
595 foreach $line (@uqlist)
596 {
597 $id++;
598 unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; }
599 }
600 close(FILE);
601 $uqsettings{'CHANGED'}='yes';
602 $uqsettings{'UQMODE'}='on';
603 }
604
605 if (!$errormessage) {
606 $uqsettings{'ENABLEQUOTA'}='on';
607 }
608
609 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage))
610 {
611 $id = 0;
612 foreach $line (@uqlist)
613 {
614 $id++;
615 if ($uqsettings{'ID'} eq $id)
616 {
617 chomp($line);
618 @temp = split(/\,/,$line);
619 $uqsettings{'TIME_QUOTA'} = $temp[0];
620 $uqsettings{'SPORADIC'} = $temp[1];
621 $uqsettings{'RENEWAL'} = $temp[2];
622 $uqsettings{'QUOTA_USERS'} = $temp[3];
623 $uqsettings{'ENABLEQUOTA'} = $temp[4];
624 }
625 }
626 $uqsettings{'UQMODE'}='on';
627 }
628
629 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'}))
630 {
631 open(FILE, ">$uqfile");
632 flock FILE, 2;
633 $id = 0;
634 foreach $line (@uqlist)
635 {
636 $id++;
637 unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; }
638 else
639 {
640 chomp($line);
641 @temp = split(/\,/,$line);
642 if ($temp[4] eq 'on') { $temp[4] = 'off'; } else { $temp[4] = 'on' }
643 print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4]\n";
644 }
645 }
646 close(FILE);
647 $uqsettings{'CHANGED'}='yes';
648 $uqsettings{'UQMODE'}='on';
649 }
650
651 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'}))
652 {
653 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
654 {
655 $errormessage = $Lang::tr{'urlfilter not enabled'};
656 }
657 if (!(-e "${General::swroot}/proxy/enable"))
658 {
659 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
660 }
661
662 if (!$errormessage) { system('/usr/local/bin/restartsquid'); }
663 $uqsettings{'UQMODE'}='on';
664 }
665
666 if ($besettings{'ACTION'} eq $Lang::tr{'urlfilter blacklist editor'}) { $besettings{'BEMODE'} = 'on'; }
667
668 if ($besettings{'MODE'} eq 'BLACKLIST_EDITOR')
669 {
670 @temp = split(/\n/,$besettings{'BE_DOMAINS'});
671 undef $besettings{'BE_DOMAINS'};
672 foreach (@temp)
673 {
674 s/^\s+//g; s/\s+$//g;
675 if ($_) { $besettings{'BE_DOMAINS'} .= $_."\n"; }
676 }
677 chomp($besettings{'BE_DOMAINS'});
678 @temp = split(/\n/,$besettings{'BE_URLS'});
679 undef $besettings{'BE_URLS'};
680 foreach (@temp)
681 {
682 s/^\s+//g; s/\s+$//g;
683 if ($_) { $besettings{'BE_URLS'} .= $_."\n"; }
684 }
685 chomp($besettings{'BE_URLS'});
686 @temp = split(/\n/,$besettings{'BE_EXPRESSIONS'});
687 undef $besettings{'BE_EXPRESSIONS'};
688 foreach (@temp)
689 {
690 s/^\s+//g; s/\s+$//g;
691 if ($_) { $besettings{'BE_EXPRESSIONS'} .= $_."\n"; }
692 }
693 chomp($besettings{'BE_EXPRESSIONS'});
694 }
695
696 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter load blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
697 {
698 $besettings{'BEMODE'} = 'on';
699
700 $besettings{'BE_NAME'} = $besettings{'BE_BLACKLIST'};
701
702 delete $besettings{'BE_DOMAINS'};
703 delete $besettings{'BE_URLS'};
704 delete $besettings{'BE_EXPRESSIONS'};
705
706 if (-e "$dbdir/$besettings{'BE_NAME'}/domains")
707 {
708 open(FILE, "$dbdir/$besettings{'BE_NAME'}/domains");
709 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } };
710 close FILE;
711 chomp($besettings{'BE_DOMAINS'});
712 }
713 if (-e "$dbdir/$besettings{'BE_NAME'}/urls")
714 {
715 open(FILE, "$dbdir/$besettings{'BE_NAME'}/urls");
716 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } };
717 close FILE;
718 chomp($besettings{'BE_URLS'});
719 }
720 if (-e "$dbdir/$besettings{'BE_NAME'}/expressions")
721 {
722 open(FILE, "$dbdir/$besettings{'BE_NAME'}/expressions");
723 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } };
724 close FILE;
725 chomp($besettings{'BE_EXPRESSIONS'});
726 }
727 }
728
729 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter import blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
730 {
731 $besettings{'BEMODE'} = 'on';
732
733 &Header::getcgihash(\%besettings, {'wantfile' => 1, 'filevar' => 'IMPORTFILE'});
734
735 if (!($besettings{'IMPORTFILE'} =~ /.tar.gz$/))
736 {
737 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
738 } else {
739 if (!-d "$editdir") { mkdir("$editdir"); }
740
741 if (copy($besettings{'IMPORTFILE'}, "$editdir/blacklist.tar.gz") != 1)
742 {
743 $errormessage = $!;
744 } else {
745
746 my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf $editdir/blacklist.tar.gz -C $editdir");
747 if ($exitcode > 0)
748 {
749 $errormessage = $Lang::tr{'urlfilter tar error'};
750 } else {
751 $i = 0;
752 foreach (<$editdir/blacklists/*>)
753 {
754 if (-d)
755 {
756 $i++;
757 $besettings{'BE_NAME'} = substr($_, rindex($_,"/")+1);
758 }
759 }
760
761 if (!($i == 1))
762 {
763 $errormessage = $Lang::tr{'urlfilter invalid import file'};
764 } else {
765 delete $besettings{'BE_DOMAINS'};
766 delete $besettings{'BE_URLS'};
767 delete $besettings{'BE_EXPRESSIONS'};
768
769 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/domains")
770 {
771 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/domains");
772 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } };
773 close FILE;
774 chomp($besettings{'BE_DOMAINS'});
775 }
776 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/urls")
777 {
778 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/urls");
779 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } };
780 close FILE;
781 chomp($besettings{'BE_URLS'});
782 }
783 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/expressions")
784 {
785 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/expressions");
786 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } };
787 close FILE;
788 chomp($besettings{'BE_EXPRESSIONS'});
789 }
790 }
791 }
792
793 if (-d $editdir) { system("rm -rf $editdir"); }
794
795 }
796 }
797 }
798
799 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter export blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
800 {
801 $besettings{'BEMODE'} = 'on';
802
803 if ($besettings{'BE_NAME'} eq '')
804 {
805 $errormessage = $Lang::tr{'urlfilter category name error'};
806 } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) {
807
808 $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_;
809
810 if (!(-d "$editdir")) { mkdir("$editdir"); }
811 if (!(-d "$editdir/blacklists")) { mkdir("$editdir/blacklists"); }
812 if (!(-d "$editdir/blacklists/$besettings{'BE_NAME'}")) { mkdir("$editdir/blacklists/$besettings{'BE_NAME'}"); }
813
814 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/domains");
815 flock FILE, 2;
816 print FILE "$besettings{'BE_DOMAINS'}\n";
817 close FILE;
818 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/urls");
819 flock FILE, 2;
820 print FILE "$besettings{'BE_URLS'}\n";
821 close FILE;
822 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/expressions");
823 flock FILE, 2;
824 print FILE "$besettings{'BE_EXPRESSIONS'}\n";
825 close FILE;
826
827 if (system("/bin/tar -C $editdir -czf $editdir/$besettings{'BE_NAME'}.tar.gz blacklists"))
828 {
829 $errormessage = $Lang::tr{'urlfilter export error'};
830 }
831 else
832 {
833 print "Content-type: application/gzip\n";
834 print "Content-length: ";
835 print (-s "$editdir/$besettings{'BE_NAME'}.tar.gz");
836 print "\n";
837 print "Content-disposition: attachment; filename=$besettings{'BE_NAME'}.tar.gz\n\n";
838
839 open (FILE, "$editdir/$besettings{'BE_NAME'}.tar.gz");
840 while (<FILE>) { print; }
841 close (FILE);
842
843 if (-d $editdir) { system("rm -rf $editdir"); }
844 exit;
845 }
846 } else {
847 $errormessage = $Lang::tr{'urlfilter category data error'};
848 }
849 }
850
851 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter install blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
852 {
853 $besettings{'BEMODE'} = 'on';
854
855 if ($besettings{'BE_NAME'} eq '')
856 {
857 $errormessage = $Lang::tr{'urlfilter category name error'};
858 } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) {
859
860 $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_;
861
862 if (!-d "$editdir") { mkdir("$editdir"); }
863
864 if (!-d "$dbdir/$besettings{'BE_NAME'}") { mkdir("$dbdir/$besettings{'BE_NAME'}"); }
865
866 if (-e "$dbdir/$besettings{'BE_NAME'}/domains") { unlink("$dbdir/$besettings{'BE_NAME'}/domains"); }
867 if ($besettings{'BE_DOMAINS'})
868 {
869 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/domains");
870 flock FILE, 2;
871 print FILE "$besettings{'BE_DOMAINS'}\n";
872 close FILE;
873 }
874 if (-e "$dbdir/$besettings{'BE_NAME'}/urls") { unlink("$dbdir/$besettings{'BE_NAME'}/urls"); }
875 if ($besettings{'BE_URLS'})
876 {
877 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/urls");
878 flock FILE, 2;
879 print FILE "$besettings{'BE_URLS'}\n";
880 close FILE;
881 }
882 if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") { unlink("$dbdir/$besettings{'BE_NAME'}/expressions"); }
883 if ($besettings{'BE_EXPRESSIONS'})
884 {
885 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/expressions");
886 flock FILE, 2;
887 print FILE "$besettings{'BE_EXPRESSIONS'}\n";
888 close FILE;
889 }
890
891 open(FILE, ">$editdir/install.conf");
892 flock FILE, 2;
893 print FILE "logdir /var/log/squidGuard\n";
894 print FILE "dbhome $dbdir/$besettings{'BE_NAME'}\n\n";
895 print FILE "dest $besettings{'BE_NAME'} {\n";
896 if ($besettings{'BE_DOMAINS'}) { print FILE " domainlist domains\n"; }
897 if ($besettings{'BE_URLS'}) { print FILE " urllist urls\n"; }
898 if ($besettings{'BE_EXPRESSIONS'}) { print FILE " expressions expressions\n"; }
899 print FILE "}\n\n";
900 print FILE "acl {\n";
901 print FILE " default {\n";
902 print FILE " pass none\n";
903 print FILE " }\n";
904 print FILE "}\n";
905 close FILE;
906
907 system("rm -f $dbdir/$besettings{'BE_NAME'}/*.db");
908 system("/usr/sbin/squidGuard -c $editdir/install.conf -C all");
909 system("chmod a+w $dbdir/$besettings{'BE_NAME'}/*.db");
910
911 &readblockcategories;
912 &readcustomlists;
913
914 &writeconfigfile;
915
916 system('/usr/local/bin/restartsquid') unless ($besettings{'NORESTART'} eq 'on');
917
918 if (-d $editdir) { system("rm -rf $editdir"); }
919 } else {
920 $errormessage = $Lang::tr{'urlfilter category data error'};
921 }
922 }
923
924 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save schedule'})
925 {
926 if (($filtersettings{'UPDATE_SOURCE'} eq 'custom') && ($filtersettings{'CUSTOM_UPDATE_URL'} eq ''))
927 {
928 $errormessage = $Lang::tr{'urlfilter custom url required'};
929 } else {
930 open (FILE, ">$updconffile");
931 print FILE "ENABLE_AUTOUPDATE=$filtersettings{'ENABLE_AUTOUPDATE'}\n";
932 print FILE "UPDATE_SCHEDULE=$filtersettings{'UPDATE_SCHEDULE'}\n";
933 print FILE "UPDATE_SOURCE=$filtersettings{'UPDATE_SOURCE'}\n";
934 print FILE "CUSTOM_UPDATE_URL=$filtersettings{'CUSTOM_UPDATE_URL'}\n";
935 close FILE;
936
937 if (-e $upd_cron_dly) { unlink($upd_cron_dly); }
938 if (-e $upd_cron_wly) { unlink($upd_cron_wly); }
939 if (-e $upd_cron_mly) { unlink($upd_cron_mly); }
940
941 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'daily'))
942 {
943 symlink("../bin/autoupdate.pl",$upd_cron_dly)
944 } else {
945 symlink("/bin/false",$upd_cron_dly)
946 }
947
948 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'weekly'))
949 {
950 symlink("../bin/autoupdate.pl",$upd_cron_wly)
951 } else {
952 symlink("/bin/false",$upd_cron_wly)
953 }
954
955 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'monthly'))
956 {
957 symlink("../bin/autoupdate.pl",$upd_cron_mly)
958 } else {
959 symlink("/bin/false",$upd_cron_mly)
960 }
961 }
962 }
963
964 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter update now'})
965 {
966 if ($filtersettings{'UPDATE_SOURCE'} eq 'custom')
967 {
968 if ($filtersettings{'CUSTOM_UPDATE_URL'} eq '')
969 {
970 $errormessage = $Lang::tr{'urlfilter custom url required'};
971 } else {
972 system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'CUSTOM_UPDATE_URL'} &");
973 }
974 } else {
975 system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'UPDATE_SOURCE'} &");
976 }
977 }
978
979
980 if (-e "${General::swroot}/urlfilter/settings") { &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); }
981
982 &readcustomlists;
983
984 $checked{'ENABLE_CUSTOM_BLACKLIST'}{'off'} = '';
985 $checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} = '';
986 $checked{'ENABLE_CUSTOM_BLACKLIST'}{$filtersettings{'ENABLE_CUSTOM_BLACKLIST'}} = "checked='checked'";
987 $checked{'ENABLE_CUSTOM_WHITELIST'}{'off'} = '';
988 $checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} = '';
989 $checked{'ENABLE_CUSTOM_WHITELIST'}{$filtersettings{'ENABLE_CUSTOM_WHITELIST'}} = "checked='checked'";
990 $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'off'} = '';
991 $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} = '';
992 $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'}} = "checked='checked'";
993 $checked{'BLOCK_EXECUTABLES'}{'off'} = '';
994 $checked{'BLOCK_EXECUTABLES'}{'on'} = '';
995 $checked{'BLOCK_EXECUTABLES'}{$filtersettings{'BLOCK_EXECUTABLES'}} = "checked='checked'";
996 $checked{'BLOCK_AUDIO-VIDEO'}{'off'} = '';
997 $checked{'BLOCK_AUDIO-VIDEO'}{'on'} = '';
998 $checked{'BLOCK_AUDIO-VIDEO'}{$filtersettings{'BLOCK_AUDIO-VIDEO'}} = "checked='checked'";
999 $checked{'BLOCK_ARCHIVES'}{'off'} = '';
1000 $checked{'BLOCK_ARCHIVES'}{'on'} = '';
1001 $checked{'BLOCK_ARCHIVES'}{$filtersettings{'BLOCK_ARCHIVES'}} = "checked='checked'";
1002 $checked{'ENABLE_REWRITE'}{'off'} = '';
1003 $checked{'ENABLE_REWRITE'}{'on'} = '';
1004 $checked{'ENABLE_REWRITE'}{$filtersettings{'ENABLE_REWRITE'}} = "checked='checked'";
1005 $checked{'SHOW_CATEGORY'}{'off'} = '';
1006 $checked{'SHOW_CATEGORY'}{'on'} = '';
1007 $checked{'SHOW_CATEGORY'}{$filtersettings{'SHOW_CATEGORY'}} = "checked='checked'";
1008 $checked{'SHOW_URL'}{'off'} = '';
1009 $checked{'SHOW_URL'}{'on'} = '';
1010 $checked{'SHOW_URL'}{$filtersettings{'SHOW_URL'}} = "checked='checked'";
1011 $checked{'SHOW_IP'}{'off'} = '';
1012 $checked{'SHOW_IP'}{'on'} = '';
1013 $checked{'SHOW_IP'}{$filtersettings{'SHOW_IP'}} = "checked='checked'";
1014 $checked{'ENABLE_DNSERROR'}{'off'} = '';
1015 $checked{'ENABLE_DNSERROR'}{'on'} = '';
1016 $checked{'ENABLE_DNSERROR'}{$filtersettings{'ENABLE_DNSERROR'}} = "checked='checked'";
1017 $checked{'ENABLE_JPEG'}{'off'} = '';
1018 $checked{'ENABLE_JPEG'}{'on'} = '';
1019 $checked{'ENABLE_JPEG'}{$filtersettings{'ENABLE_JPEG'}} = "checked='checked'";
1020 $checked{'ENABLE_EXPR_LISTS'}{'off'} = '';
1021 $checked{'ENABLE_EXPR_LISTS'}{'on'} = '';
1022 $checked{'ENABLE_EXPR_LISTS'}{$filtersettings{'ENABLE_EXPR_LISTS'}} = "checked='checked'";
1023 $checked{'BLOCK_IP_ADDR'}{'off'} = '';
1024 $checked{'BLOCK_IP_ADDR'}{'on'} = '';
1025 $checked{'BLOCK_IP_ADDR'}{$filtersettings{'BLOCK_IP_ADDR'}} = "checked='checked'";
1026 $checked{'BLOCK_ALL'}{'off'} = '';
1027 $checked{'BLOCK_ALL'}{'on'} = '';
1028 $checked{'BLOCK_ALL'}{$filtersettings{'BLOCK_ALL'}} = "checked='checked'";
1029 $checked{'ENABLE_EMPTY_ADS'}{'off'} = '';
1030 $checked{'ENABLE_EMPTY_ADS'}{'on'} = '';
1031 $checked{'ENABLE_EMPTY_ADS'}{$filtersettings{'ENABLE_EMPTY_ADS'}} = "checked='checked'";
1032 $checked{'ENABLE_GLOBAL_WHITELIST'}{'off'} = '';
1033 $checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} = '';
1034 $checked{'ENABLE_GLOBAL_WHITELIST'}{$filtersettings{'ENABLE_GLOBAL_WHITELIST'}} = "checked='checked'";
1035 $checked{'ENABLE_SAFESEARCH'}{'off'} = '';
1036 $checked{'ENABLE_SAFESEARCH'}{'on'} = '';
1037 $checked{'ENABLE_SAFESEARCH'}{$filtersettings{'ENABLE_SAFESEARCH'}} = "checked='checked'";
1038 $checked{'ENABLE_LOG'}{'off'} = '';
1039 $checked{'ENABLE_LOG'}{'on'} = '';
1040 $checked{'ENABLE_LOG'}{$filtersettings{'ENABLE_LOG'}} = "checked='checked'";
1041 $checked{'ENABLE_USERNAME_LOG'}{'off'} = '';
1042 $checked{'ENABLE_USERNAME_LOG'}{'on'} = '';
1043 $checked{'ENABLE_USERNAME_LOG'}{$filtersettings{'ENABLE_USERNAME_LOG'}} = "checked='checked'";
1044 $checked{'ENABLE_CATEGORY_LOG'}{'off'} = '';
1045 $checked{'ENABLE_CATEGORY_LOG'}{'on'} = '';
1046 $checked{'ENABLE_CATEGORY_LOG'}{$filtersettings{'ENABLE_CATEGORY_LOG'}} = "checked='checked'";
1047
1048 foreach $category (@filtergroups) {
1049 $checked{$category}{'off'} = '';
1050 $checked{$category}{'on'} = '';
1051 $checked{$category}{$filtersettings{$category}} = "checked='checked'";
1052 }
1053
1054 $selected{'DEFINITION'}{$tcsettings{'DEFINITION'}} = "selected='selected'";
1055 $selected{'FROM_HOUR'}{$tcsettings{'FROM_HOUR'}} = "selected='selected'";
1056 $selected{'FROM_MINUTE'}{$tcsettings{'FROM_MINUTE'}} = "selected='selected'";
1057 $selected{'TO_HOUR'}{$tcsettings{'TO_HOUR'}} = "selected='selected'";
1058 $selected{'TO_MINUTE'}{$tcsettings{'TO_MINUTE'}} = "selected='selected'";
1059
1060 @selectedcategories = split(/\|/,$tcsettings{'DST'});
1061 foreach (@selectedcategories)
1062 {
1063 $selected{'DST'}{$_} = "selected='selected'";
1064 }
1065
1066 $selected{'ACCESS'}{$tcsettings{'ACCESS'}} = "selected='selected'";
1067
1068 $checked{'ENABLERULE'}{'off'} = '';
1069 $checked{'ENABLERULE'}{'on'} = '';
1070 $checked{'ENABLERULE'}{$tcsettings{'ENABLERULE'}} = "checked='checked'";
1071 $checked{'MON'}{'off'} = '';
1072 $checked{'MON'}{'on'} = '';
1073 $checked{'MON'}{$tcsettings{'MON'}} = "checked='checked'";
1074 $checked{'TUE'}{'off'} = '';
1075 $checked{'TUE'}{'on'} = '';
1076 $checked{'TUE'}{$tcsettings{'TUE'}} = "checked='checked'";
1077 $checked{'WED'}{'off'} = '';
1078 $checked{'WED'}{'on'} = '';
1079 $checked{'WED'}{$tcsettings{'WED'}} = "checked='checked'";
1080 $checked{'THU'}{'off'} = '';
1081 $checked{'THU'}{'on'} = '';
1082 $checked{'THU'}{$tcsettings{'THU'}} = "checked='checked'";
1083 $checked{'FRI'}{'off'} = '';
1084 $checked{'FRI'}{'on'} = '';
1085 $checked{'FRI'}{$tcsettings{'FRI'}} = "checked='checked'";
1086 $checked{'SAT'}{'off'} = '';
1087 $checked{'SAT'}{'on'} = '';
1088 $checked{'SAT'}{$tcsettings{'SAT'}} = "checked='checked'";
1089 $checked{'SUN'}{'off'} = '';
1090 $checked{'SUN'}{'on'} = '';
1091 $checked{'SUN'}{$tcsettings{'SUN'}} = "checked='checked'";
1092
1093 $selected{'SPORADIC'}{$uqsettings{'SPORADIC'}} = "selected='selected'";
1094 $selected{'RENEWAL'} {$uqsettings{'RENEWAL'}} = "selected='selected'";
1095
1096 $checked{'ENABLEQUOTA'}{'off'} = '';
1097 $checked{'ENABLEQUOTA'}{'on'} = '';
1098 $checked{'ENABLEQUOTA'}{$uqsettings{'ENABLEQUOTA'}} = "checked='checked'";
1099
1100 $selected{'BE_BLACKLIST'}{$besettings{'BE_BLACKLIST'}} = "selected='selected'";
1101
1102
1103 &Header::showhttpheaders();
1104
1105 &Header::openpage($Lang::tr{'urlfilter configuration'}, 1, '');
1106
1107 &Header::openbigbox('100%', 'left', '', $errormessage);
1108
1109 if ($errormessage) {
1110 &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
1111 print "<font class='base'>$errormessage&nbsp;</font>\n";
1112 &Header::closebox();
1113 } elsif (($tcsettings{'CHANGED'} eq 'yes') || ($uqsettings{'CHANGED'} eq 'yes') ) {
1114 &writeconfigfile;
1115 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
1116 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restart notification'}:");
1117 print "<class name='base'>$Lang::tr{'urlfilter restart message'}\n";
1118 if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "<p><class name='base'>$Lang::tr{'urlfilter quota restart message'}\n"; }
1119 print "</class>\n";
1120 print "<p><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter restart'}' />";
1121 if ($tcsettings{'MODE'} eq 'TIMECONSTRAINT') { print "<input type='hidden' name='MODE' value='TIMECONSTRAINT' />"; }
1122 if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "<input type='hidden' name='MODE' value='USERQUOTA' />"; }
1123 &Header::closebox();
1124 print "</form>\n";
1125 }
1126
1127 if ($restoremessage) {
1128 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restore results'}:");
1129 print "<class name='base'>$restoremessage\n";
1130 print "&nbsp;</class>\n";
1131 &Header::closebox();
1132 }
1133
1134 if ((!$tcsettings{'TCMODE'}) && (!$uqsettings{'UQMODE'}) && (!$besettings{'BEMODE'})) {
1135
1136 if (!($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter manage repository'})) {
1137
1138 #==========================================================
1139 #
1140 # Section: Main Configuration
1141 #
1142 #==========================================================
1143
1144 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
1145
1146 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter filter settings'}:");
1147 print <<END
1148 <table width='100%'>
1149 <tr>
1150 <td colspan='4'><b>$Lang::tr{'urlfilter block categories'}</b></td>
1151 </tr>
1152 END
1153 ;
1154
1155 if (@categories == 0) {
1156 print <<END
1157 <tr>
1158 <td><i>$Lang::tr{'urlfilter no categories'}</i></td>
1159 <td>&nbsp;</td>
1160 <td>&nbsp;</td>
1161 <td>&nbsp;</td>
1162 </tr>
1163
1164 END
1165 ;
1166 }
1167
1168 for ($n=0; $n<=@categories; $n = $n + $i) {
1169 for ($i=0; $i<=3; $i++) {
1170 if ($i eq 0) { print "<tr>\n"; }
1171 if (($n+$i) < @categories) {
1172 print "<td width='15%'>@categories[$n+$i]:<\/td>\n";
1173 print "<td width='10%'><input type='checkbox' name=@filtergroups[$n+$i] $checked{@filtergroups[$n+$i]}{'on'} /></td>\n";
1174 }
1175 if ($i eq 3) { print "<\/tr>\n"; }
1176 }
1177 }
1178
1179 print <<END
1180 </table>
1181 <hr size='1'>
1182 <table width='100%'>
1183 <tr>
1184 <td><b>$Lang::tr{'urlfilter custom blacklist'}</b></td>
1185 <td>&nbsp;</td>
1186 <td>&nbsp;</td>
1187 <td>&nbsp;</td>
1188 </tr>
1189 <tr>
1190 <td colspan='2'>$Lang::tr{'urlfilter blocked domains'}&nbsp;<img src='/blob.gif' alt='*' /></td>
1191 <td colspan='2'>$Lang::tr{'urlfilter blocked urls'}&nbsp;<img src='/blob.gif' alt='*' /></td>
1192 </tr>
1193 <tr>
1194 <td colspan='2' width='50%'><textarea name='CUSTOM_BLACK_DOMAINS' cols='32' rows='6' wrap='off'>
1195 END
1196 ;
1197
1198 print $filtersettings{'CUSTOM_BLACK_DOMAINS'};
1199
1200 print <<END
1201 </textarea></td>
1202 <td colspan='2' width='50%'><textarea name='CUSTOM_BLACK_URLS' cols='32' rows='6' wrap='off'>
1203 END
1204 ;
1205
1206 print $filtersettings{'CUSTOM_BLACK_URLS'};
1207
1208 print <<END
1209 </textarea></td>
1210 </tr>
1211 </table>
1212 <table width='100%'>
1213 <tr>
1214 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom blacklist'}:</td>
1215 <td><input type='checkbox' name='ENABLE_CUSTOM_BLACKLIST' $checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} /></td>
1216 <td>&nbsp;</td>
1217 <td>&nbsp;</td>
1218 </tr>
1219 </table>
1220 <hr size='1'>
1221 <table width='100%'>
1222 <tr>
1223 <td><b>$Lang::tr{'urlfilter custom whitelist'}</b></td>
1224 <td>&nbsp;</td>
1225 <td>&nbsp;</td>
1226 <td>&nbsp;</td>
1227 </tr>
1228 <tr>
1229 <td colspan='2'>$Lang::tr{'urlfilter allowed domains'}&nbsp;<img src='/blob.gif' alt='*' /></td>
1230 <td colspan='2'>$Lang::tr{'urlfilter allowed urls'}&nbsp;<img src='/blob.gif' alt='*' /></td>
1231 </tr>
1232 <tr>
1233 <td colspan='2' width='50%'><textarea name='CUSTOM_WHITE_DOMAINS' cols='32' rows='6' wrap='off'>
1234 END
1235 ;
1236
1237 print $filtersettings{'CUSTOM_WHITE_DOMAINS'};
1238
1239 print <<END
1240 </textarea></td>
1241 <td colspan='2' width='50%'><textarea name='CUSTOM_WHITE_URLS' cols='32' rows='6' wrap='off'>
1242 END
1243 ;
1244
1245 print $filtersettings{'CUSTOM_WHITE_URLS'};
1246
1247 print <<END
1248 </textarea></td>
1249 </tr>
1250 </table>
1251 <table width='100%'>
1252 <tr>
1253 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom whitelist'}:</td>
1254 <td><input type='checkbox' name='ENABLE_CUSTOM_WHITELIST' $checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} /></td>
1255 <td>&nbsp;</td>
1256 <td>&nbsp;</td>
1257 </tr>
1258 </table>
1259 <hr size='1'>
1260 <table width='100%'>
1261 <tr>
1262 <td colspan='4'><b>$Lang::tr{'urlfilter custom expression list'}</b></td>
1263 </tr>
1264 <tr>
1265 <td colspan='4'>$Lang::tr{'urlfilter blocked expressions'}&nbsp;<img src='/blob.gif' alt='*' /></td>
1266 </tr>
1267 <tr>
1268 <td colspan='4'><textarea name='CUSTOM_EXPRESSIONS' cols='70' rows='3' wrap='off'>
1269 END
1270 ;
1271
1272 print $filtersettings{'CUSTOM_EXPRESSIONS'};
1273
1274 print <<END
1275 </textarea></td>
1276 </tr>
1277 <tr>
1278 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom expression list'}:</td>
1279 <td><input type='checkbox' name='ENABLE_CUSTOM_EXPRESSIONS' $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} /></td>
1280 <td>&nbsp;</td>
1281 <td>&nbsp;</td>
1282 </tr>
1283 </table>
1284 <hr size='1'>
1285 <table width='100%'>
1286 <tr>
1287 <td colspan='4'><b>$Lang::tr{'urlfilter file ext block'}</b></td>
1288 </tr>
1289 <tr>
1290 <td width='25%' class='base'>$Lang::tr{'urlfilter block executables'}:</td>
1291 <td width='12%'><input type='checkbox' name='BLOCK_EXECUTABLES' $checked{'BLOCK_EXECUTABLES'}{'on'} /></td>
1292 <td width='25%' class='base'>$Lang::tr{'urlfilter block audio-video'}:</td>
1293 <td><input type='checkbox' name='BLOCK_AUDIO-VIDEO' $checked{'BLOCK_AUDIO-VIDEO'}{'on'} /></td>
1294 </tr>
1295 <tr>
1296 <td class='base'>$Lang::tr{'urlfilter block archives'}:</td>
1297 <td><input type='checkbox' name='BLOCK_ARCHIVES' $checked{'BLOCK_ARCHIVES'}{'on'} /></td>
1298 <td>&nbsp;</td>
1299 <td>&nbsp;</td>
1300 </tr>
1301 </table>
1302 <hr size='1'>
1303 <table width='100%'>
1304 <tr>
1305 <td colspan='4'><b>$Lang::tr{'urlfilter local file redirection'}</b></td>
1306 </tr>
1307 <tr>
1308 <td width='25%' class='base'>$Lang::tr{'urlfilter enable rewrite rules'}:</td>
1309 <td width='12%'><input type='checkbox' name='ENABLE_REWRITE' $checked{'ENABLE_REWRITE'}{'on'} /></td>
1310 <td>&nbsp;</td>
1311 <td>&nbsp;</td>
1312 </tr>
1313 <tr>
1314 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter manage repository'}'></td>
1315 <td>&nbsp;</td>
1316 <td>&nbsp;</td>
1317 <td>&nbsp;</td>
1318 </tr>
1319 </table>
1320 <hr size='1'>
1321 <table width='100%'>
1322 <tr>
1323 <td colspan='2'><b>$Lang::tr{'urlfilter network access control'}</b></td>
1324 <td>&nbsp;</td>
1325 <td>&nbsp;</td>
1326 </tr>
1327 <tr>
1328 <td class='base'>$Lang::tr{'urlfilter unfiltered clients'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
1329 <td><input type='text' name='UNFILTERED_CLIENTS' value='$filtersettings{'UNFILTERED_CLIENTS'}' size='30' /></td>
1330 <td class='base'>$Lang::tr{'urlfilter banned clients'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
1331 <td><input type='text' name='BANNED_CLIENTS' value='$filtersettings{'BANNED_CLIENTS'}' size='30' /></td>
1332 </tr>
1333 </table>
1334 <hr size='1'>
1335 <table width='100%'>
1336 <tr>
1337 <td colspan='4'><b>$Lang::tr{'urlfilter timebased access control'}</b></td>
1338 </tr>
1339 <tr>
1340 <td width='25%'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter set time constraints'}'></td>
1341 <td width='25%'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter set user quota'}'></td>
1342 <td>&nbsp;</td>
1343 <td>&nbsp;</td>
1344 </tr>
1345 </table>
1346 <hr size='1'>
1347 <table width='100%'>
1348 <tr>
1349 <td colspan='4'><b>$Lang::tr{'urlfilter block settings'}</b></td>
1350 </tr>
1351 <tr>
1352 <td width='25%' class='base'>$Lang::tr{'urlfilter show category'}:</td>
1353 <td width='12%'><input type='checkbox' name='SHOW_CATEGORY' $checked{'SHOW_CATEGORY'}{'on'} /></td>
1354 <td width='25%' class='base'>$Lang::tr{'urlfilter redirectpage'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
1355 <td><input type='text' name='REDIRECT_PAGE' value='$filtersettings{'REDIRECT_PAGE'}' size='40' /></td>
1356 </tr>
1357 <tr>
1358 <td class='base'>$Lang::tr{'urlfilter show url'}:</td>
1359 <td><input type='checkbox' name='SHOW_URL' $checked{'SHOW_URL'}{'on'} /></td>
1360 <td class='base'>$Lang::tr{'urlfilter msg text 1'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
1361 <td><input type='text' name='MSG_TEXT_1' value='$filtersettings{'MSG_TEXT_1'}' size='40' /></td>
1362 </tr>
1363 <tr>
1364 <td class='base'>$Lang::tr{'urlfilter show ip'}:</td>
1365 <td><input type='checkbox' name='SHOW_IP' $checked{'SHOW_IP'}{'on'} /></td>
1366 <td class='base'>$Lang::tr{'urlfilter msg text 2'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
1367 <td><input type='text' name='MSG_TEXT_2' value='$filtersettings{'MSG_TEXT_2'}' size='40' /></td>
1368 </tr>
1369 <tr>
1370 <td class='base'>$Lang::tr{'urlfilter show dnserror'}:</td>
1371 <td><input type='checkbox' name='ENABLE_DNSERROR' $checked{'ENABLE_DNSERROR'}{'on'} /></td>
1372 <td class='base'>$Lang::tr{'urlfilter msg text 3'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
1373 <td><input type='text' name='MSG_TEXT_3' value='$filtersettings{'MSG_TEXT_3'}' size='40' /></td>
1374 </tr>
1375 <tr>
1376 <td class='base'>$Lang::tr{'urlfilter enable jpeg'}:</td>
1377 <td><input type='checkbox' name='ENABLE_JPEG' $checked{'ENABLE_JPEG'}{'on'} /></td>
1378 <td>&nbsp;</td>
1379 <td>&nbsp;</td>
1380 </tr>
1381 </table>
1382 <table width='100%'>
1383 <tr>
1384 <td class='base'><b>$Lang::tr{'urlfilter background image'}</b></td>
1385 </tr>
1386 <tr>
1387 <td><br>$Lang::tr{'urlfilter background text'}:</td>
1388 </tr>
1389 <tr>
1390 <td><input type='file' name='BACKGROUND' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload background'}' /></td>
1391 </tr>
1392 </table>
1393 <hr size='1'>
1394 <table width='100%'>
1395 <tr>
1396 <td colspan='4'><b>$Lang::tr{'urlfilter advanced settings'}</b></td>
1397 </tr>
1398 <tr>
1399 <td width='25%' class='base'>$Lang::tr{'urlfilter enable expression lists'}:</td>
1400 <td width='12%'><input type='checkbox' name='ENABLE_EXPR_LISTS' $checked{'ENABLE_EXPR_LISTS'}{'on'} /></td>
1401 <td width='25%' class='base'>$Lang::tr{'urlfilter enable log'}:</td>
1402 <td><input type='checkbox' name='ENABLE_LOG' $checked{'ENABLE_LOG'}{'on'} /></td>
1403 </tr>
1404 <tr>
1405 <td class='base'>$Lang::tr{'urlfilter safesearch'}:</td>
1406 <td><input type='checkbox' name='ENABLE_SAFESEARCH' $checked{'ENABLE_SAFESEARCH'}{'on'} /></td>
1407 <td class='base'>$Lang::tr{'urlfilter username log'}:</td>
1408 <td><input type='checkbox' name='ENABLE_USERNAME_LOG' $checked{'ENABLE_USERNAME_LOG'}{'on'} /></td>
1409 </tr>
1410 <tr>
1411 <td class='base'>$Lang::tr{'urlfilter empty ads'}:</td>
1412 <td><input type='checkbox' name='ENABLE_EMPTY_ADS' $checked{'ENABLE_EMPTY_ADS'}{'on'} /></td>
1413 <td class='base'>$Lang::tr{'urlfilter category log'}:</td>
1414 <td><input type='checkbox' name='ENABLE_CATEGORY_LOG' $checked{'ENABLE_CATEGORY_LOG'}{'on'} /></td>
1415 </tr>
1416 <tr>
1417 <td class='base'>$Lang::tr{'urlfilter block ip'}:</td>
1418 <td><input type='checkbox' name='BLOCK_IP_ADDR' $checked{'BLOCK_IP_ADDR'}{'on'} /></td>
1419 <td class='base'>$Lang::tr{'urlfilter children'}:</td>
1420 <td><input type='text' name='CHILDREN' value='$filtersettings{'CHILDREN'}' size='5' /></td>
1421 </tr>
1422 <tr>
1423 <td class='base'>$Lang::tr{'urlfilter block all'}:</td>
1424 <td><input type='checkbox' name='BLOCK_ALL' $checked{'BLOCK_ALL'}{'on'} /></td>
1425 <td class='base'>$Lang::tr{'urlfilter whitelist always allowed'}:</td>
1426 <td><input type='checkbox' name='ENABLE_GLOBAL_WHITELIST' $checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} /></td>
1427 </tr>
1428 </table>
1429 <hr size='1'>
1430 <table width='100%'>
1431 <tr>
1432 <td>
1433 <img src='/blob.gif' align='top' alt='*' />&nbsp;
1434 <font class='base'>$Lang::tr{'this field may be blank'}</font>
1435 </td>
1436 <td align='right'>
1437 <sup><small><a href='http://www.urlfilter.net' target='_blank'>URL filter</a></small></sup>
1438 </td>
1439 </tr>
1440 </table>
1441 <table width='100%'>
1442 <tr>
1443 <td>&nbsp;</td>
1444 <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
1445 <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter save and restart'}' /></td>
1446 <td>&nbsp;</td>
1447 </tr>
1448 </table>
1449 END
1450 ;
1451
1452 &Header::closebox();
1453
1454 print "</form>\n";
1455
1456 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
1457
1458 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter maintenance'}:");
1459
1460 print <<END
1461 <table width='100%'>
1462 <tr>
1463 <td class='base'><b>$Lang::tr{'urlfilter blacklist update'}</b></td>
1464 </tr>
1465 <tr>
1466 <td>$Lang::tr{'urlfilter upload information'}<p>$Lang::tr{'urlfilter upload text'}:</td>
1467 </tr>
1468 <tr>
1469 <td><input type='file' name='UPDATEFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload blacklist'}' /></td>
1470 </tr>
1471 </table>
1472
1473 <hr size='1'>
1474
1475 <table width='100%'>
1476 <tr>
1477 <td colspan='2' class='base'><b>$Lang::tr{'urlfilter automatic blacklist update'}</b>
1478 END
1479 ;
1480 if (-e "$updflagfile")
1481 {
1482 $blacklistage = int(-M "$updflagfile");
1483 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>";
1484 }
1485
1486 $updatesettings{'UPDATE_SCHEDULE'} = 'monthly';
1487 $updatesettings{'CUSTOM_UPDATE_URL'} = '';
1488
1489 if (-e "$updconffile") { &General::readhash("$updconffile", \%updatesettings); }
1490
1491 $checked{'ENABLE_AUTOUPDATE'}{'off'} = '';
1492 $checked{'ENABLE_AUTOUPDATE'}{'on'} = '';
1493 $checked{'ENABLE_AUTOUPDATE'}{$updatesettings{'ENABLE_AUTOUPDATE'}} = "checked='checked'";
1494
1495 $selected{'UPDATE_SCHEDULE'}{$updatesettings{'UPDATE_SCHEDULE'}} = "selected='selected'";
1496
1497 $selected{'UPDATE_SOURCE'}{$updatesettings{'UPDATE_SOURCE'}} = "selected='selected'";
1498
1499 print <<END
1500 </td>
1501 </tr>
1502 <tr>
1503 <td width='25%' class='base'>$Lang::tr{'urlfilter enable automatic blacklist update'}:</td>
1504 <td width='75%' class='base'><input type='checkbox' name='ENABLE_AUTOUPDATE' $checked{'ENABLE_AUTOUPDATE'}{'on'} /></td>
1505 </tr>
1506 <tr>
1507 <td class='base'>$Lang::tr{'urlfilter automatic update schedule'}:</td>
1508 <td class='base'>
1509 <select name='UPDATE_SCHEDULE'>
1510 <option value='daily' $selected{'UPDATE_SCHEDULE'}{'daily'}>$Lang::tr{'urlfilter daily'}</option>
1511 <option value='weekly' $selected{'UPDATE_SCHEDULE'}{'weekly'}>$Lang::tr{'urlfilter weekly'}</option>
1512 <option value='monthly' $selected{'UPDATE_SCHEDULE'}{'monthly'}>$Lang::tr{'urlfilter monthly'}</option>
1513 </select>
1514 </td>
1515 </tr>
1516 <tr>
1517 <td class='base'>$Lang::tr{'urlfilter select source'}:</td>
1518 <td class='base' colspan='2'>
1519 <select name='UPDATE_SOURCE'>
1520 END
1521 ;
1522
1523 foreach (@source_urllist) {
1524 chomp;
1525 $source_name = substr($_,0,rindex($_,","));
1526 $source_url = substr($_,index($_,",")+1);
1527 print "\t<option value='$source_url' $selected{'UPDATE_SOURCE'}{$source_url}>$source_name</option>\n";
1528 }
1529
1530 print <<END
1531 <option value='custom' $selected{'UPDATE_SOURCE'}{'custom'}>$Lang::tr{'urlfilter custom url'}</option>
1532 </select>
1533 </td>
1534 </tr>
1535 <tr>
1536 <td>$Lang::tr{'urlfilter custom url'}:</td>
1537 <td><input type='text' name='CUSTOM_UPDATE_URL' value='$updatesettings{'CUSTOM_UPDATE_URL'}' size='72' /></td>
1538 </tr>
1539 </table>
1540 <table width='100%'>
1541 <tr>
1542 <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>
1543 </tr>
1544 </table>
1545
1546 <hr size='1'>
1547
1548 <table width='100%'>
1549 <tr>
1550 <td class='base'><b>$Lang::tr{'urlfilter blacklist editor'}</b></td>
1551 </tr>
1552 <tr>
1553 <td>$Lang::tr{'urlfilter blacklist editor info'}</td>
1554 </tr>
1555 <tr>
1556 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter blacklist editor'}' /></td>
1557 </tr>
1558 </table>
1559
1560 <hr size='1'>
1561
1562 <table width='100%'>
1563 <tr>
1564 <td colspan='4' class='base'><b>$Lang::tr{'urlfilter backup settings'}</b></td>
1565 </tr>
1566 <tr>
1567 <td width='25%' class='base'>$Lang::tr{'urlfilter enable full backup'}:</td>
1568 <td width='12%' class='base'><input type='checkbox' name='ENABLE_FULLBACKUP' $checked{'ENABLE_FULLBACKUP'}{'on'} /></td>
1569 <td>&nbsp;</td>
1570 <td>&nbsp;</td>
1571 </tr>
1572 <tr>
1573 <td colspan='4' class='base'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter backup'}' /></td>
1574 </tr>
1575 </table>
1576
1577 <hr size='1'>
1578
1579 <table width='100%'>
1580 <tr>
1581 <td class='base'><b>$Lang::tr{'urlfilter restore settings'}</b></td>
1582 </tr>
1583 <tr>
1584 <td>$Lang::tr{'urlfilter restore text'}:</td>
1585 </tr>
1586 <tr>
1587 <td><input type='file' name='UPDATEFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter restore'}' /></td>
1588 </tr>
1589 </table>
1590 </form>
1591 END
1592 ;
1593
1594 &Header::closebox();
1595
1596 } else {
1597
1598 #==========================================================
1599 #
1600 # Section: Manage Repository
1601 #
1602 #==========================================================
1603
1604 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
1605
1606 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter manage local file repository'}:");
1607 print <<END
1608 <table width='100%'>
1609 <tr>
1610 <td>$Lang::tr{'urlfilter repository information'}<br><br></td>
1611 </tr>
1612 <tr>
1613 <td>$Lang::tr{'urlfilter upload file text'}:</td>
1614 </tr>
1615 <tr>
1616 <td><input type='file' name='UPLOADFILE' size='50' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload file'}' /></td>
1617 </tr>
1618 <tr>
1619 <td><br><b>$Lang::tr{'urlfilter upload file information 1'}:</b> $Lang::tr{'urlfilter upload file information 2'}</td>
1620 </tr>
1621 </table>
1622 <hr size='1'>
1623 <table width='100%'>
1624 <tr>
1625 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
1626 </tr>
1627 </table>
1628 </form>
1629 END
1630 ;
1631
1632 &Header::closebox();
1633
1634 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter current files'}: </b>[$repository]");
1635
1636 @repositorylist = <$repository/*>;
1637
1638 undef @repositoryfiles;
1639 foreach (@repositorylist)
1640 {
1641 if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); }
1642 }
1643
1644 if (@repositoryfiles)
1645 {
1646 print <<END
1647 <table width='100%'>
1648 <tr>
1649 <td align='center'><b>$Lang::tr{'urlfilter filename'}</b></td>
1650 <td width='15%' align='center'><b>$Lang::tr{'urlfilter filesize'}</b></td>
1651 <td width='10%'></td>
1652 </tr>
1653 END
1654 ;
1655 $id = 0;
1656 foreach $line (@repositoryfiles)
1657 {
1658 $id++;
1659 if ($id % 2) {
1660 print "<tr bgcolor='$Header::table1colour'>\n"; }
1661 else {
1662 print "<tr bgcolor='$Header::table2colour'>\n"; }
1663 $filesize = (-s "$repository/$line");
1664 1 while $filesize =~ s/^(-?\d+)(\d{3})/$1.$2/;
1665
1666 print <<END
1667 <td>&nbsp; &nbsp;$line</td>
1668 <td align='right'>$filesize&nbsp; &nbsp;</td>
1669
1670 <td align='center'>
1671 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
1672 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
1673 <input type='hidden' name='ID' value='$line' />
1674 <input type='hidden' name='ACTION' value='$Lang::tr{'urlfilter remove file'}' />
1675 </form>
1676 </td>
1677
1678 </tr>
1679 END
1680 ;
1681 }
1682
1683 print <<END
1684 </table>
1685 <table>
1686 <tr>
1687 </tr>
1688 </table>
1689 <table>
1690 <tr>
1691 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
1692 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
1693 <td class='base'>$Lang::tr{'remove'}</td>
1694 </tr>
1695 </table>
1696 END
1697 ;
1698 } else {
1699
1700 print "<i>$Lang::tr{'urlfilter empty repository'}</i>\n";
1701 }
1702
1703 &Header::closebox();
1704
1705 }
1706
1707 } elsif ($tcsettings{'TCMODE'}) {
1708
1709 #==========================================================
1710 #
1711 # Section: Set Time Constraints
1712 #
1713 #==========================================================
1714
1715 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
1716
1717 $buttontext = $Lang::tr{'urlfilter add rule'};
1718 if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) {
1719 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit time constraint rule'}.':');
1720 $buttontext = $Lang::tr{'urlfilter update rule'};
1721 } else {
1722 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new time constraint rule'}.':');
1723 }
1724 print <<END
1725
1726 <table width='100%'>
1727 <tr>
1728 <td width='2%'>$Lang::tr{'urlfilter constraint definition'}</td>
1729 <td width='1%'>&nbsp;&nbsp;</td>
1730 <td width='2%' align='center'>$Lang::tr{'urlfilter monday'}</td>
1731 <td width='2%' align='center'>$Lang::tr{'urlfilter tuesday'}</td>
1732 <td width='2%' align='center'>$Lang::tr{'urlfilter wednesday'}</td>
1733 <td width='2%' align='center'>$Lang::tr{'urlfilter thursday'}</td>
1734 <td width='2%' align='center'>$Lang::tr{'urlfilter friday'}</td>
1735 <td width='2%' align='center'>$Lang::tr{'urlfilter saturday'}</td>
1736 <td width='2%' align='center'>$Lang::tr{'urlfilter sunday'}</td>
1737 <td width='1%'>&nbsp;&nbsp;</td>
1738 <td width='7%' colspan=3>$Lang::tr{'urlfilter from'}</td>
1739 <td width='1%'>&nbsp;</td>
1740 <td width='7%' colspan=3>$Lang::tr{'urlfilter to'}</td>
1741 <td>&nbsp;</td>
1742 </tr>
1743 <tr>
1744 <td class='base'>
1745 <select name='DEFINITION'>
1746 <option value='within' $selected{'DEFINITION'}{'within'}>$Lang::tr{'urlfilter constraint within'}</option>
1747 <option value='outside' $selected{'DEFINITION'}{'outside'}>$Lang::tr{'urlfilter constraint outside'}</option>
1748 </select>
1749 </td>
1750 <td>&nbsp;</td>
1751 <td class='base'><input type='checkbox' name='MON' $checked{'MON'}{'on'} /></td>
1752 <td class='base'><input type='checkbox' name='TUE' $checked{'TUE'}{'on'} /></td>
1753 <td class='base'><input type='checkbox' name='WED' $checked{'WED'}{'on'} /></td>
1754 <td class='base'><input type='checkbox' name='THU' $checked{'THU'}{'on'} /></td>
1755 <td class='base'><input type='checkbox' name='FRI' $checked{'FRI'}{'on'} /></td>
1756 <td class='base'><input type='checkbox' name='SAT' $checked{'SAT'}{'on'} /></td>
1757 <td class='base'><input type='checkbox' name='SUN' $checked{'SUN'}{'on'} /></td>
1758 <td>&nbsp;</td>
1759 <td class='base'>
1760 <select name='FROM_HOUR'>
1761 END
1762 ;
1763 for ($i=0;$i<=24;$i++) {
1764 $_ = sprintf("%02s",$i);
1765 print "<option $selected{'FROM_HOUR'}{$_}>$_</option>\n";
1766 }
1767 print <<END
1768 </select>
1769 </td>
1770 <td>:</td>
1771 <td class='base'>
1772 <select name='FROM_MINUTE'>
1773 END
1774 ;
1775 for ($i=0;$i<=45;$i+=15) {
1776 $_ = sprintf("%02s",$i);
1777 print "<option $selected{'FROM_MINUTE'}{$_}>$_</option>\n";
1778 }
1779 print <<END
1780 </select>
1781 <td> - </td>
1782 </td>
1783 <td class='base'>
1784 <select name='TO_HOUR'>
1785 END
1786 ;
1787 for ($i=0;$i<=24;$i++) {
1788 $_ = sprintf("%02s",$i);
1789 print "<option $selected{'TO_HOUR'}{$_}>$_</option>\n";
1790 }
1791 print <<END
1792 </select>
1793 </td>
1794 <td>:</td>
1795 <td class='base'>
1796 <select name='TO_MINUTE'>
1797 END
1798 ;
1799 for ($i=0;$i<=45;$i+=15) {
1800 $_ = sprintf("%02s",$i);
1801 print "<option $selected{'TO_MINUTE'}{$_}>$_</option>\n";
1802 }
1803 print <<END
1804 </select>
1805 </td>
1806 <td>&nbsp;</td>
1807 </tr>
1808 </table>
1809
1810 <br>
1811
1812 <table width='100%'>
1813 <tr>
1814 <td width='5%'>$Lang::tr{'urlfilter source'}</td>
1815 <td width='1%'>&nbsp;&nbsp;</td>
1816 <td width='5%'>$Lang::tr{'urlfilter dst'}&nbsp;<img src='/blob.gif' alt='*'><img src='/blob.gif' alt='*'></td>
1817 <td width='1%'>&nbsp;&nbsp;</td>
1818 <td width='5%'>$Lang::tr{'urlfilter access'}</td>
1819 <td>&nbsp;</td>
1820 </tr>
1821 <tr>
1822 <td valign='top'><input type='text' name='SRC' value='$tcsettings{'SRC'}' size='32' /></td>
1823 <td>&nbsp;</td>
1824 <td class='base' rowspan='3' valign='top'>
1825 <select name='DST' size='4' multiple>
1826 <option value='any' $selected{'DST'}{'any'} = "selected='selected'">$Lang::tr{'urlfilter category all'}</option>
1827 <option value='in-addr' $selected{'DST'}{'in-addr'} = "selected='selected'">in-addr</option>
1828 END
1829 ;
1830
1831 &readblockcategories;
1832 foreach (@categories)
1833 {
1834 print "<option value='$_' $selected{'DST'}{$_}>$_</option>\n";
1835 }
1836
1837 print <<END
1838 <option value='files' $selected{'DST'}{'files'} = "selected='selected'">files</option>
1839 <option value='custom-blocked' $selected{'DST'}{'custom-blocked'} = "selected='selected'">custom-blocked</option>
1840 <option value='custom-expressions' $selected{'DST'}{'custom-expressions'} = "selected='selected'">custom-expressions</option>
1841 </select>
1842 </td>
1843 <td>&nbsp;</td>
1844 <td class='base' valign='top'>
1845 <select name='ACCESS'>
1846 <option value='block' $selected{'ACCESS'}{'block'}>$Lang::tr{'urlfilter mode block'}</option>
1847 <option value='allow' $selected{'ACCESS'}{'allow'}>$Lang::tr{'urlfilter mode allow'}</option>
1848 </select>
1849 </td>
1850 <td>&nbsp;</td>
1851 </tr>
1852 <tr>
1853 <td>$Lang::tr{'remark'}&nbsp;<img src='/blob.gif' alt='*'></td>
1854 <td>&nbsp;</td>
1855 <td>&nbsp;</td>
1856 <td>&nbsp;</td>
1857 <td>&nbsp;</td>
1858 </tr>
1859 <tr>
1860 <td><input type='text' name='COMMENT' value='$tcsettings{'COMMENT'}' size='32' /></td>
1861 <td>&nbsp;</td>
1862 <td>&nbsp;</td>
1863 <td>&nbsp;</td>
1864 <td>&nbsp;</td>
1865 </tr>
1866 </table>
1867
1868 <table width='100%'>
1869 <tr>
1870 <td class='base'>$Lang::tr{'urlfilter enabled'}<input type='checkbox' name='ENABLERULE' $checked{'ENABLERULE'}{'on'} /></td>
1871 </tr>
1872 </table>
1873
1874 <p>
1875
1876 <table width='50%'>
1877 <tr>
1878 <td><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /></td>
1879 <td><input type='hidden' name='MODE' value='TIMECONSTRAINT' /></td>
1880 <td><input type='submit' name='SUBMIT' value='$buttontext' /></td>
1881 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
1882 <td>&nbsp;</td>
1883 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
1884 </tr>
1885 </table>
1886 <p>
1887 <table width='100%'>
1888 <tr>
1889 <td width='1%' align='right'> <img src='/blob.gif' align='top' alt='*' />&nbsp;</td>
1890 <td><font class='base'>$Lang::tr{'this field may be blank'}</font></td>
1891 </tr>
1892 <tr>
1893 <td width='1%' align='right'><img src='/blob.gif' align='top' alt='*' /><img src='/blob.gif' align='top' alt='*' />&nbsp;</td>
1894 <td><font class='base'>$Lang::tr{'urlfilter select multi'}</font></td>
1895 </tr>
1896 </table>
1897 END
1898 ;
1899
1900 if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) {
1901 print "<input type='hidden' name='EDITING' value='$tcsettings{'ID'}' />\n";
1902 } else {
1903 print "<input type='hidden' name='EDITING' value='no' />\n";
1904 }
1905
1906 &Header::closebox();
1907 print "</form>\n";
1908
1909 &Header::openbox('100%', 'left', $Lang::tr{'current rules'});
1910 print <<END
1911 <table width='100%'>
1912 <tr>
1913 <td width='5%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter constraint definition'}</b></td>
1914 <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter time space'}</b></td>
1915 <td width='15%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter src'}</b></td>
1916 <td width='5%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter dst'}</b></td>
1917 <td width='10%' class='boldbase' colspan='4' align='center'>&nbsp;</td>
1918 </tr>
1919 END
1920 ;
1921
1922 if ($tcsettings{'ACTION'} ne '' or $changed ne 'no')
1923 {
1924 open(FILE, $tcfile);
1925 @tclist = <FILE>;
1926 close(FILE);
1927 }
1928
1929 $id = 0;
1930 foreach $line (@tclist)
1931 {
1932 $id++;
1933 chomp($line);
1934 @temp = split(/\,/,$line);
1935 if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) {
1936 print "<tr bgcolor='$Header::colouryellow'>\n"; }
1937 elsif ($id % 2) {
1938 print "<tr bgcolor='$Header::table1colour'>\n"; }
1939 else {
1940 print "<tr bgcolor='$Header::table2colour'>\n"; }
1941 if ($temp[0] eq 'within') { $temp[0]=$Lang::tr{'urlfilter constraint within'}; } else { $temp[0]=$Lang::tr{'urlfilter constraint outside'}; }
1942 if ($temp[13] eq 'any') { $temp[13]=$Lang::tr{'urlfilter category all'}; }
1943 if ($temp[15] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};}
1944 else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; }
1945 if ($temp[14] eq 'block') { $led='led-red.gif'; $ldesc=$Lang::tr{'urlfilter block access'};}
1946 else { $led='led-green.gif'; $ldesc=$Lang::tr{'urlfilter allow access'}; }
1947
1948 undef $time;
1949 if ($temp[1] eq 'on') { $time.=$Lang::tr{'urlfilter mon'}; } else { $time.='='; }
1950 if ($temp[2] eq 'on') { $time.=$Lang::tr{'urlfilter tue'}; } else { $time.='='; }
1951 if ($temp[3] eq 'on') { $time.=$Lang::tr{'urlfilter wed'}; } else { $time.='='; }
1952 if ($temp[4] eq 'on') { $time.=$Lang::tr{'urlfilter thu'}; } else { $time.='='; }
1953 if ($temp[5] eq 'on') { $time.=$Lang::tr{'urlfilter fri'}; } else { $time.='='; }
1954 if ($temp[6] eq 'on') { $time.=$Lang::tr{'urlfilter sat'}; } else { $time.='='; }
1955 if ($temp[7] eq 'on') { $time.=$Lang::tr{'urlfilter sun'}; } else { $time.='='; }
1956 $time=$time.' &nbsp; '.$temp[8].':'.$temp[9].' to '.$temp[10].':'.$temp[11];
1957
1958 print <<END
1959 <td align='center'>$temp[0]</td>
1960 <td align='center' nowrap>$time</td>
1961 <td align='center'>$temp[12]</td>
1962 <td align='center'>$temp[13]</td>
1963 <td align='center'><image src='/images/urlfilter/$led' alt='$ldesc'></td>
1964
1965 <td align='center'>
1966 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
1967 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' title='$gdesc' alt='$gdesc' />
1968 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
1969 <input type='hidden' name='ID' value='$id' />
1970 <input type='hidden' name='ACTIVE' value='$toggle' />
1971 <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
1972 </form>
1973 </td>
1974
1975 <td align='center'>
1976 <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>
1977 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' title='$Lang::tr{'edit'}' alt='$Lang::tr{'edit'}' />
1978 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
1979 <input type='hidden' name='ID' value='$id' />
1980 <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
1981 </form>
1982 </td>
1983
1984 <td align='center'>
1985 <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>
1986 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
1987 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
1988 <input type='hidden' name='ID' value='$id' />
1989 <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
1990 </form>
1991 </td>
1992
1993 </tr>
1994 END
1995 ;
1996 if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) {
1997 print "<tr bgcolor='$Header::colouryellow'>\n"; }
1998 elsif ($id % 2) {
1999 print "<tr bgcolor='$Header::table1colour'>\n"; }
2000 else {
2001 print "<tr bgcolor='$Header::table2colour'>\n"; }
2002 print <<END
2003 <td align='center' colspan='4'>$temp[16]
2004 </td>
2005 <td align='center' colspan='4'>
2006 </td>
2007 </tr>
2008 END
2009 ;
2010 }
2011
2012 print "</table>\n";
2013
2014 # If the time constraint file contains entries, print entries and action icons
2015 if (! -z "$tcfile") {
2016 print <<END
2017
2018 <table>
2019 <tr>
2020 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
2021 <td>&nbsp; &nbsp; <img src='/images/urlfilter/led-green.gif' alt='$Lang::tr{'urlfilter allow access'}' /></td>
2022 <td class='base'>$Lang::tr{'urlfilter allow'}</td>
2023 <td>&nbsp; &nbsp; <img src='/images/urlfilter/led-red.gif' alt='$Lang::tr{'urlfilter block access'}' /></td>
2024 <td class='base'>$Lang::tr{'urlfilter block'}</td>
2025 <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
2026 <td class='base'>$Lang::tr{'click to disable'}</td>
2027 <td>&nbsp; &nbsp; <img src='/images/off.gif' alt='$Lang::tr{'click to enable'}' /></td>
2028 <td class='base'>$Lang::tr{'click to enable'}</td>
2029 <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
2030 <td class='base'>$Lang::tr{'edit'}</td>
2031 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
2032 <td class='base'>$Lang::tr{'remove'}</td>
2033 </tr>
2034 </table>
2035 END
2036 ;
2037 }
2038
2039 &Header::closebox();
2040
2041 } elsif ($uqsettings{'UQMODE'}) {
2042
2043 #==========================================================
2044 #
2045 # Section: Set User Quota
2046 #
2047 #==========================================================
2048
2049 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
2050
2051 $buttontext = $Lang::tr{'urlfilter add rule'};
2052 if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) {
2053 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit user quota rule'}.':');
2054 $buttontext = $Lang::tr{'urlfilter update rule'};
2055 } else {
2056 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new user quota rule'}.':');
2057 }
2058 print <<END
2059
2060 <table width='100%'>
2061 <tr>
2062 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
2063 </tr>
2064 <tr>
2065 <td class='base'>$Lang::tr{'urlfilter user time quota'}:</td>
2066 <td><input type='text' name='TIME_QUOTA' value='$uqsettings{'TIME_QUOTA'}' size='5' /></td>
2067 <td colspan='2' rowspan= '5' valign='top' class='base'>
2068 <table cellpadding='0' cellspacing='0'>
2069 <tr>
2070 <!-- intentionally left empty -->
2071 </tr>
2072 <tr>
2073 <td>$Lang::tr{'urlfilter assigned quota users'}:</td>
2074 </tr>
2075 <tr>
2076 <!-- intentionally left empty -->
2077 </tr>
2078 <tr>
2079 <!-- intentionally left empty -->
2080 </tr>
2081 <tr>
2082 <td><textarea name='QUOTA_USERS' cols='32' rows='6' wrap='off'>
2083 END
2084 ;
2085
2086 $uqsettings{'QUOTA_USERS'} =~ s/\|/\n/g;
2087 print $uqsettings{'QUOTA_USERS'};
2088
2089 print <<END
2090 </textarea></td>
2091 </tr>
2092 </table>
2093 </td>
2094 </tr>
2095 <tr>
2096 <td class='base'>$Lang::tr{'urlfilter activity detection'}:</td>
2097 <td class='base'><select name='SPORADIC'>
2098 <option value='0' $selected{'SPORADIC'}{'0'}>$Lang::tr{'urlfilter disabled'}</option>
2099 <option value='300' $selected{'SPORADIC'}{'300'}>5 $Lang::tr{'urlfilter minutes'}</option>
2100 <option value='900' $selected{'SPORADIC'}{'900'}>15 $Lang::tr{'urlfilter minutes'}</option>
2101 </select></td>
2102 </tr>
2103 <tr>
2104 <td class='base'>$Lang::tr{'urlfilter renewal period'}:</td>
2105 <td class='base'><select name='RENEWAL'>
2106 <option value='hourly' $selected{'RENEWAL'}{'hourly'}>$Lang::tr{'urlfilter hourly'}</option>
2107 <option value='daily' $selected{'RENEWAL'}{'daily'}>$Lang::tr{'urlfilter daily'}</option>
2108 <option value='weekly' $selected{'RENEWAL'}{'weekly'}>$Lang::tr{'urlfilter weekly'}</option>
2109 </select></td>
2110 </tr>
2111 <tr>
2112 <td colspan='2'>&nbsp;</td>
2113 </tr>
2114 <tr>
2115 <td class='base'>$Lang::tr{'urlfilter enabled'}</td>
2116 <td class='base'><input type='checkbox' name='ENABLEQUOTA' $checked{'ENABLEQUOTA'}{'on'} /></td>
2117 </tr>
2118
2119 </table>
2120 <p>
2121
2122 <table width='50%'>
2123 <tr>
2124 <td><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /></td>
2125 <td><input type='hidden' name='MODE' value='USERQUOTA' /></td>
2126 <td><input type='submit' name='SUBMIT' value='$buttontext' /></td>
2127 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
2128 <td>&nbsp;</td>
2129 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
2130 </tr>
2131 </table>
2132
2133 <p>
2134 END
2135 ;
2136
2137 if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) {
2138 print "<input type='hidden' name='EDITING' value='$uqsettings{'ID'}' />\n";
2139 } else {
2140 print "<input type='hidden' name='EDITING' value='no' />\n";
2141 }
2142
2143 &Header::closebox();
2144 print "</form>\n";
2145
2146 &Header::openbox('100%', 'left', $Lang::tr{'current rules'});
2147 print <<END
2148 <table width='100%'>
2149 <tr>
2150 <td width='15%' class='boldbase' align='center'><b><nobr>$Lang::tr{'urlfilter time quota'}</nobr></b></td>
2151 <td width='15%' class='boldbase' align='center'><b><nobr>$Lang::tr{'urlfilter activity detection'}</nobr></b></td>
2152 <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter renewal'}</b></td>
2153 <td class='boldbase' align='center'><b>$Lang::tr{'urlfilter assigned users'}</b></td>
2154 <td width='20%' class='boldbase' colspan='4' align='center'>&nbsp;</td>
2155 </tr>
2156 END
2157 ;
2158
2159 if ($uqsettings{'ACTION'} ne '' or $changed ne 'no')
2160 {
2161 open(FILE, $uqfile);
2162 @uqlist = <FILE>;
2163 close(FILE);
2164 }
2165
2166 $id = 0;
2167 foreach $line (@uqlist)
2168 {
2169 $id++;
2170 chomp($line);
2171 @temp = split(/\,/,$line);
2172 if($uqsettings{'ACTION'} eq $Lang::tr{'edit'} && $uqsettings{'ID'} eq $id) {
2173 print "<tr bgcolor='$Header::colouryellow'>\n"; }
2174 elsif ($id % 2) {
2175 print "<tr bgcolor='$Header::table1colour'>\n"; }
2176 else {
2177 print "<tr bgcolor='$Header::table2colour'>\n"; }
2178 if ($temp[4] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};}
2179 else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; }
2180
2181 $temp[5] = $temp[1];
2182 if ($temp[1] eq '0') { $temp[5] = $Lang::tr{'urlfilter disabled'} } else { $temp[5] = ($temp[5]/60).' '.$Lang::tr{'urlfilter minutes'} }
2183 $_ = $temp[3]; s/\|/, /g; $temp[6] = $_;
2184
2185 print <<END
2186 <td align='center'>$temp[0] $Lang::tr{'urlfilter minutes'}</td>
2187 <td align='center'>$temp[5]</td>
2188 <td align='center'>$Lang::tr{'urlfilter '.$temp[2]}</td>
2189 <td align='center'>$temp[6]</td>
2190
2191 <td align='center'>
2192 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
2193 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' title='$gdesc' alt='$gdesc' />
2194 <input type='hidden' name='MODE' value='USERQUOTA' />
2195 <input type='hidden' name='ID' value='$id' />
2196 <input type='hidden' name='ACTIVE' value='$toggle' />
2197 <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
2198 </form>
2199 </td>
2200
2201 <td align='center'>
2202 <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>
2203 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' title='$Lang::tr{'edit'}' alt='$Lang::tr{'edit'}' />
2204 <input type='hidden' name='MODE' value='USERQUOTA' />
2205 <input type='hidden' name='ID' value='$id' />
2206 <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
2207 </form>
2208 </td>
2209
2210 <td align='center'>
2211 <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>
2212 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
2213 <input type='hidden' name='MODE' value='USERQUOTA' />
2214 <input type='hidden' name='ID' value='$id' />
2215 <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
2216 </form>
2217 </td>
2218
2219 </tr>
2220 END
2221 ;
2222 }
2223
2224 print "</table>\n";
2225
2226 # If the user quota file contains entries, print entries and action icons
2227 if (! -z "$uqfile") {
2228 print <<END
2229
2230 <table>
2231 <tr>
2232 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
2233 <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
2234 <td class='base'>$Lang::tr{'click to disable'}</td>
2235 <td>&nbsp; &nbsp; <img src='/images/off.gif' alt='$Lang::tr{'click to enable'}' /></td>
2236 <td class='base'>$Lang::tr{'click to enable'}</td>
2237 <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
2238 <td class='base'>$Lang::tr{'edit'}</td>
2239 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
2240 <td class='base'>$Lang::tr{'remove'}</td>
2241 </tr>
2242 </table>
2243 END
2244 ;
2245 }
2246
2247 &Header::closebox();
2248
2249 } else {
2250
2251 #==========================================================
2252 #
2253 # Section: Blacklist editor
2254 #
2255 #==========================================================
2256
2257 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
2258
2259 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter urlfilter blacklist editor'}.':');
2260
2261 print <<END
2262
2263 <table width='100%'>
2264 <tr>
2265 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
2266 </tr>
2267 <tr>
2268 <td class='base'><b>$Lang::tr{'urlfilter blacklist name'}</b></td>
2269 </tr>
2270 <tr>
2271 <td class='base'>$Lang::tr{'urlfilter blacklist category name'}:</td>
2272 <td><input type='text' name='BE_NAME' value='$besettings{'BE_NAME'}' size='12' /></td>
2273 </tr>
2274 </table>
2275 <hr size='1'>
2276 <table width='100%'>
2277 <tr>
2278 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='20%'></td>
2279 </tr>
2280 <tr>
2281 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter edit domains urls expressions'}</b></td>
2282 </tr>
2283 <tr>
2284 <td colspan='2'>$Lang::tr{'urlfilter domains'}</td>
2285 <td colspan='2'>$Lang::tr{'urlfilter urls'}</td>
2286 </tr>
2287 <tr>
2288 <td colspan='2'><textarea name='BE_DOMAINS' cols='38' rows='10' wrap='off'>
2289 END
2290 ;
2291
2292 print $besettings{'BE_DOMAINS'};
2293
2294 print <<END
2295 </textarea></td>
2296 <td colspan='2'><textarea name='BE_URLS' cols='38' rows='10' wrap='off'>
2297 END
2298 ;
2299
2300 print $besettings{'BE_URLS'};
2301
2302 print <<END
2303 </textarea></td>
2304 </tr>
2305 <tr>
2306 <td colspan='4'>$Lang::tr{'urlfilter expressions'}</td>
2307 </tr>
2308 <tr>
2309 <td colspan='4'><textarea name='BE_EXPRESSIONS' cols='80' rows='3' wrap='off'>
2310 END
2311 ;
2312
2313 print $besettings{'BE_EXPRESSIONS'};
2314
2315 print <<END
2316 </textarea></td>
2317 </tr>
2318 </table>
2319 <hr size='1'>
2320 <table width='100%'>
2321 <tr>
2322 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter load blacklist'}</b></td>
2323 </tr>
2324 <tr>
2325 <td width='25%' class='base'>$Lang::tr{'urlfilter select blacklist'}:</td>
2326 <td width='20%' class='base'>
2327 <select name='BE_BLACKLIST'>
2328 END
2329 ;
2330
2331 &readblockcategories;
2332 foreach (@categories)
2333 {
2334 print "<option value='$_' $selected{'BE_BLACKLIST'}{$_}>$_</option>\n";
2335 }
2336
2337 print <<END
2338 </select>
2339 </td>
2340 <td>&nbsp;</td>
2341 <td>&nbsp;</td>
2342 <tr>
2343 <td colpsan='4'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter load blacklist'}' /></td>
2344 </tr>
2345 </tr>
2346 </table>
2347 <hr size='1'>
2348 <table width='100%'>
2349 <tr>
2350 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter import blacklist'}</b></td>
2351 </tr>
2352 <tr>
2353 <td colspan='4'>$Lang::tr{'urlfilter import text'}:</td>
2354 </tr>
2355 <tr>
2356 <td nowrap><input type='file' name='IMPORTFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter import blacklist'}' /></td>
2357 <td><input type='hidden' name='MODE' value='BLACKLIST_EDITOR' /></td>
2358 </tr>
2359 </table>
2360 <hr size='1'>
2361 <table width='100%'>
2362 <tr>
2363 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter export blacklist'}</b></td>
2364 </tr>
2365 <tr>
2366 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter export blacklist'}' /></td>
2367 </tr>
2368 </table>
2369 <hr size='1'>
2370 <table width='100%'>
2371 <tr>
2372 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter install blacklist'}</b></td>
2373 </tr>
2374 <tr>
2375 <td width='25%' class='base'>$Lang::tr{'urlfilter dont restart urlfilter'}:</td>
2376 <td width='20%' class='base'><input type='checkbox' name='NORESTART' $checked{'NORESTART'}{'on'} /></td>
2377 <td>&nbsp;</td>
2378 <td>&nbsp;</td>
2379 </tr>
2380 <tr>
2381 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter install blacklist'}' /></td>
2382 </tr>
2383 <tr>
2384 <td class='base' colspan='4'><br>$Lang::tr{'urlfilter install information'}</td>
2385 </tr>
2386 </table>
2387 <hr size='1'>
2388 <table width='20%'>
2389 <tr>
2390 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
2391 <td>&nbsp;</td>
2392 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
2393 </tr>
2394 </table>
2395
2396 END
2397 ;
2398
2399 &Header::closebox();
2400 print "</form>\n";
2401
2402 }
2403
2404 &Header::closebigbox();
2405
2406 &Header::closepage();
2407
2408 # -------------------------------------------------------------------
2409
2410 sub savesettings
2411 {
2412 &writeconfigfile;
2413
2414 delete $filtersettings{'CUSTOM_BLACK_DOMAINS'};
2415 delete $filtersettings{'CUSTOM_BLACK_URLS'};
2416 delete $filtersettings{'CUSTOM_WHITE_DOMAINS'};
2417 delete $filtersettings{'CUSTOM_WHITE_URLS'};
2418 delete $filtersettings{'CUSTOM_EXPRESSIONS'};
2419 delete $filtersettings{'BACKGROUND'};
2420 delete $filtersettings{'UPDATEFILE'};
2421
2422 &General::writehash("${General::swroot}/urlfilter/settings", \%filtersettings);
2423 }
2424
2425 # -------------------------------------------------------------------
2426
2427 sub readblockcategories
2428 {
2429 undef(@categories);
2430 foreach $blacklist (<$dbdir/*>) {
2431 if (-d $blacklist) {
2432 $lastslashpos = rindex($blacklist,"/");
2433 if ($lastslashpos > -1) {
2434 $section = substr($blacklist,$lastslashpos+1);
2435 } else {
2436 $section = $blacklist;
2437 }
2438 if (!($section eq 'custom')) { push(@categories,$section) };
2439 }
2440 }
2441
2442 @filtergroups = @categories;
2443 foreach (@filtergroups) {
2444 tr/a-z/A-Z/;
2445 $_ = "FILTER_".$_;
2446 }
2447 }
2448
2449 # -------------------------------------------------------------------
2450
2451 sub readcustomlists
2452 {
2453 if (-e "$dbdir/custom/blocked/domains") {
2454 open(FILE,"$dbdir/custom/blocked/domains");
2455 delete $filtersettings{'CUSTOM_BLACK_DOMAINS'};
2456 while (<FILE>) { $filtersettings{'CUSTOM_BLACK_DOMAINS'} .= $_ };
2457 close(FILE);
2458 }
2459
2460 if (-e "$dbdir/custom/blocked/urls") {
2461 open(FILE,"$dbdir/custom/blocked/urls");
2462 delete $filtersettings{'CUSTOM_BLACK_URLS'};
2463 while (<FILE>) { $filtersettings{'CUSTOM_BLACK_URLS'} .= $_ };
2464 close(FILE);
2465 }
2466
2467 if (-e "$dbdir/custom/blocked/expressions") {
2468 open(FILE,"$dbdir/custom/blocked/expressions");
2469 delete $filtersettings{'CUSTOM_EXPRESSIONS'};
2470 while (<FILE>) { $filtersettings{'CUSTOM_EXPRESSIONS'} .= $_ };
2471 close(FILE);
2472 }
2473
2474 if (-e "$dbdir/custom/allowed/domains") {
2475 open(FILE,"$dbdir/custom/allowed/domains");
2476 delete $filtersettings{'CUSTOM_WHITE_DOMAINS'};
2477 while (<FILE>) { $filtersettings{'CUSTOM_WHITE_DOMAINS'} .= $_ };
2478 close(FILE);
2479 }
2480 if (-e "$dbdir/custom/allowed/urls") {
2481 open(FILE,"$dbdir/custom/allowed/urls");
2482 delete $filtersettings{'CUSTOM_WHITE_URLS'};
2483 while (<FILE>) { $filtersettings{'CUSTOM_WHITE_URLS'} .= $_ };
2484 close(FILE);
2485 }
2486 }
2487
2488 # -------------------------------------------------------------------
2489
2490 sub aggregatedconstraints
2491 {
2492 my $aggregated;
2493 my @old;
2494 my @new;
2495 my @tmp1;
2496 my @tmp2;
2497 my $x;
2498
2499 if (-e $tcfile)
2500 {
2501 open(TC, $tcfile);
2502 @old = <TC>;
2503 close(TC);
2504
2505 while (@old > 0)
2506 {
2507 $aggregated = 0;
2508 $x = shift(@old);
2509 chomp($x);
2510 @tmp1 = split(/\,/,$x);
2511 $tmp1[16] = '';
2512 foreach (@new)
2513 {
2514 @tmp2 = split(/\,/);
2515 if ($tmp2[15] eq 'on')
2516 {
2517 if (($tmp1[0] eq $tmp2[0]) && ($tmp1[12] eq $tmp2[12]) && ($tmp1[13] eq $tmp2[13]) && ($tmp1[14] eq $tmp2[14]))
2518 {
2519 $aggregated = 1;
2520 $tmp2[16] .= " weekly ";
2521 if ($tmp1[1] eq 'on') { $tmp2[16] .= "m"; }
2522 if ($tmp1[2] eq 'on') { $tmp2[16] .= "t"; }
2523 if ($tmp1[3] eq 'on') { $tmp2[16] .= "w"; }
2524 if ($tmp1[4] eq 'on') { $tmp2[16] .= "h"; }
2525 if ($tmp1[5] eq 'on') { $tmp2[16] .= "f"; }
2526 if ($tmp1[6] eq 'on') { $tmp2[16] .= "a"; }
2527 if ($tmp1[7] eq 'on') { $tmp2[16] .= "s"; }
2528 $tmp2[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n";
2529 $_ = join(",",@tmp2);
2530 }
2531
2532 }
2533 }
2534 if (!$aggregated)
2535 {
2536 $tmp1[16] .= " weekly ";
2537 if ($tmp1[1] eq 'on') { $tmp1[16] .= "m"; }
2538 if ($tmp1[2] eq 'on') { $tmp1[16] .= "t"; }
2539 if ($tmp1[3] eq 'on') { $tmp1[16] .= "w"; }
2540 if ($tmp1[4] eq 'on') { $tmp1[16] .= "h"; }
2541 if ($tmp1[5] eq 'on') { $tmp1[16] .= "f"; }
2542 if ($tmp1[6] eq 'on') { $tmp1[16] .= "a"; }
2543 if ($tmp1[7] eq 'on') { $tmp1[16] .= "s"; }
2544 $tmp1[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n";
2545 $x = join(",",@tmp1);
2546 push(@new,$x);
2547 }
2548 }
2549 }
2550
2551 return @new;
2552
2553 }
2554
2555 # -------------------------------------------------------------------
2556
2557 sub writeconfigfile
2558 {
2559 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\)\$";
2560 my $audiovideo = "\\.\(aiff|asf|avi|dif|divx|mov|movie|mp3|mpe?g?|mpv2|ogg|ra?m|snd|qt|wav|wmf|wmv\)\$";
2561 my $archives = "\\.\(bin|bz2|cab|cdr|dmg|gz|hqx|rar|smi|sit|sea|tar|tgz|zip\)\$";
2562
2563 my $ident = " anonymous";
2564
2565 my $defaultrule='';
2566 my $tcrule='';
2567 my $redirect='';
2568 my $qredirect='';
2569
2570 my $idx;
2571
2572 my @ec=();
2573 my @tc=();
2574 my @uq=();
2575
2576 if (!(-d "$dbdir/custom")) { mkdir("$dbdir/custom") }
2577 if (!(-d "$dbdir/custom/blocked")) { mkdir("$dbdir/custom/blocked") }
2578 if (!(-d "$dbdir/custom/allowed")) { mkdir("$dbdir/custom/allowed") }
2579
2580 open(FILE, ">/$dbdir/custom/blocked/domains");
2581 print FILE $filtersettings{'CUSTOM_BLACK_DOMAINS'};
2582 close(FILE);
2583 open(FILE, ">/$dbdir/custom/blocked/urls");
2584 print FILE $filtersettings{'CUSTOM_BLACK_URLS'};
2585 close(FILE);
2586 open(FILE, ">/$dbdir/custom/blocked/expressions");
2587 print FILE $filtersettings{'CUSTOM_EXPRESSIONS'};
2588 close(FILE);
2589 open(FILE, ">/$dbdir/custom/blocked/files");
2590 if ($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') { print FILE "$executables\n"; }
2591 if ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') { print FILE "$audiovideo\n"; }
2592 if ($filtersettings{'BLOCK_ARCHIVES'} eq 'on') { print FILE "$archives\n"; }
2593 close(FILE);
2594 open(FILE, ">/$dbdir/custom/allowed/domains");
2595 print FILE $filtersettings{'CUSTOM_WHITE_DOMAINS'};
2596 close(FILE);
2597 open(FILE, ">/$dbdir/custom/allowed/urls");
2598 print FILE $filtersettings{'CUSTOM_WHITE_URLS'};
2599 close(FILE);
2600
2601 if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { $ident = ""; }
2602
2603 if ($filtersettings{'REDIRECT_PAGE'} eq '')
2604 {
2605 if (($filtersettings{'SHOW_CATEGORY'} eq 'on') || ($filtersettings{'SHOW_URL'} eq 'on') || ($filtersettings{'SHOW_IP'} eq 'on')) {
2606 if ($filtersettings{'SHOW_CATEGORY'} eq 'on') { $redirect .= "&category=%t"; }
2607 if ($filtersettings{'SHOW_URL'} eq 'on') { $redirect .= "&url=%u"; }
2608 if ($filtersettings{'SHOW_IP'} eq 'on') { $redirect .= "&ip=%a"; }
2609 $redirect =~ s/^&/?/;
2610 $redirect = "http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi".$redirect;
2611 } else {
2612 $redirect="http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi";
2613 }
2614 } else { $redirect=$filtersettings{'REDIRECT_PAGE'}; }
2615
2616 if ($filtersettings{'ENABLE_DNSERROR'} eq 'on') { $redirect = "302:http://0.0.0.0"; }
2617
2618 undef $defaultrule;
2619
2620 if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on')
2621 {
2622 $defaultrule .= "custom-allowed ";
2623 }
2624 if ($filtersettings{'BLOCK_ALL'} eq 'on')
2625 {
2626 $defaultrule .= "none";
2627 }
2628 else
2629 {
2630 if ($filtersettings{'BLOCK_IP_ADDR'} eq 'on')
2631 {
2632 $defaultrule .= "!in-addr ";
2633 }
2634 for ($i=0; $i<=@filtergroups; $i++) {
2635 if ($filtersettings{@filtergroups[$i]} eq 'on')
2636 {
2637 $defaultrule .= "!@categories[$i] ";
2638 }
2639 }
2640 if ($filtersettings{'ENABLE_CUSTOM_BLACKLIST'} eq 'on')
2641 {
2642 $defaultrule .= "!custom-blocked ";
2643 }
2644 if ($filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} eq 'on')
2645 {
2646 $defaultrule .= "!custom-expressions ";
2647 }
2648 if (($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') ||
2649 ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') ||
2650 ($filtersettings{'BLOCK_ARCHIVES'} eq 'on'))
2651 {
2652 $defaultrule .= "!files ";
2653 }
2654 $defaultrule .= "any";
2655 }
2656
2657 open(FILE, ">${General::swroot}/urlfilter/squidGuard.conf") or die "Unable to write squidGuard.conf file";
2658 flock(FILE, 2);
2659
2660 print FILE "logdir /var/log/squidGuard\n";
2661 print FILE "dbhome $dbdir\n\n";
2662
2663 undef @repositoryfiles;
2664 if ($filtersettings{'ENABLE_REWRITE'} eq 'on')
2665 {
2666 @repositorylist = <$repository/*>;
2667 foreach (@repositorylist)
2668 {
2669 if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); }
2670 }
2671 }
2672
2673 if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on'))
2674 {
2675 print FILE "rewrite rew-rule-0 {\n";
2676
2677 if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles))
2678 {
2679 print FILE " # rewrite localfiles\n";
2680 foreach (@repositoryfiles)
2681 {
2682 print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n";
2683 }
2684 }
2685
2686 if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')
2687 {
2688 print FILE " # rewrite safesearch\n";
2689 print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)(\\bsafe=\\w+)(.*)\@\\1\\3safe=strict\\5\@i\n";
2690 print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)\@\\1safe=strict\\\&\\3\@i\n";
2691 print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W)(.*)(\\bvm=\\w+)(.*)\@\\1\\2vm=r\\4\@i\n";
2692 print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W.*)\@\\1\\\&vm=r\@i\n";
2693 print FILE " s@(.*\\Walltheweb\\.com/customize\\?)(.*)(\\bcopt_offensive=\\w+)(.*)\@\\1\\2copt_offensive=on\\4\@i\n";
2694 }
2695
2696 print FILE "}\n\n";
2697
2698 if ((!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) && ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) {
2699 print FILE "rewrite rew-rule-1 {\n";
2700 if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles))
2701 {
2702 print FILE " # rewrite localfiles\n";
2703 foreach (@repositoryfiles)
2704 {
2705 print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n";
2706 }
2707 } else {
2708 print FILE " # rewrite nothing\n";
2709 }
2710 print FILE "}\n\n";
2711 }
2712 }
2713
2714 if (-e $uqfile)
2715 {
2716 open(UQ, $uqfile);
2717 @uqlist = <UQ>;
2718 close(UQ);
2719
2720 if (@uqlist > 0)
2721 {
2722 $idx=0;
2723 foreach (@uqlist)
2724 {
2725 chomp;
2726 @uq = split(/\,/);
2727 if ($uq[4] eq 'on')
2728 {
2729 $idx++;
2730 $uq[0] = $uq[0] * 60;
2731 if ($uq[1] eq '0') {
2732 if ($uq[2] eq 'hourly') { $uq[1] = 3600 }
2733 if ($uq[2] eq 'daily') { $uq[1] = 86400 }
2734 if ($uq[2] eq 'weekly') { $uq[1] = 604800 }
2735 }
2736 $uq[3] =~ s/\|/ /g;
2737 print FILE "src quota-$idx {\n";
2738 print FILE " user $uq[3]\n";
2739 print FILE " userquota $uq[0] $uq[1] $uq[2]\n";
2740 print FILE "}\n\n";
2741 }
2742 }
2743
2744 }
2745 }
2746
2747 @tclist = &aggregatedconstraints;
2748
2749 if (@tclist > 0)
2750 {
2751 $idx=0;
2752 foreach (@tclist)
2753 {
2754 chomp;
2755 @tc = split(/\,/);
2756 if ($tc[15] eq 'on')
2757 {
2758 $idx++;
2759 print FILE "src network-$idx {\n";
2760 print FILE " ip $tc[12]\n";
2761 print FILE "}\n\n";
2762 }
2763 }
2764
2765 $idx=0;
2766 foreach (@tclist)
2767 {
2768 chomp;
2769 @tc = split(/\,/);
2770 if ($tc[15] eq 'on')
2771 {
2772 $idx++;
2773 print FILE "time constraint-$idx {\n";
2774 print FILE "$tc[16]\n";
2775 print FILE "}\n\n";
2776 }
2777 }
2778 }
2779
2780 if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) {
2781 print FILE "src unfiltered {\n";
2782 print FILE " ip $filtersettings{'UNFILTERED_CLIENTS'}\n";
2783 print FILE "}\n\n";
2784 }
2785 if (!($filtersettings{'BANNED_CLIENTS'} eq '')) {
2786 print FILE "src banned {\n";
2787 print FILE " ip $filtersettings{'BANNED_CLIENTS'}\n";
2788 print FILE "}\n\n";
2789 }
2790
2791 foreach $category (@categories) {
2792 print FILE "dest $category {\n";
2793 if (-e "$dbdir/$category/domains") {
2794 print FILE " domainlist $category\/domains\n";
2795 }
2796 if (-e "$dbdir/$category/urls") {
2797 print FILE " urllist $category\/urls\n";
2798 }
2799 if ((-e "$dbdir/$category/expressions") && ($filtersettings{'ENABLE_EXPR_LISTS'} eq 'on')) {
2800 print FILE " expressionlist $category\/expressions\n";
2801 }
2802 if (($category eq 'ads') && ($filtersettings{'ENABLE_EMPTY_ADS'} eq 'on'))
2803 {
2804 print FILE " redirect http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/images/urlfilter/1x1.gif\n";
2805 }
2806 if ($filtersettings{'ENABLE_LOG'} eq 'on')
2807 {
2808 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
2809 {
2810 print FILE " logfile $ident $category.log\n";
2811 } else {
2812 print FILE " logfile $ident urlfilter.log\n";
2813 }
2814 }
2815 print FILE "}\n\n";
2816 }
2817
2818 print FILE "dest files {\n";
2819 print FILE " expressionlist custom\/blocked\/files\n";
2820 if ($filtersettings{'ENABLE_LOG'} eq 'on')
2821 {
2822 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
2823 {
2824 print FILE " logfile $ident files.log\n";
2825 } else {
2826 print FILE " logfile $ident urlfilter.log\n";
2827 }
2828 }
2829 print FILE "}\n\n";
2830
2831 print FILE "dest custom-allowed {\n";
2832 print FILE " domainlist custom\/allowed\/domains\n";
2833 print FILE " urllist custom\/allowed\/urls\n";
2834 print FILE "}\n\n";
2835
2836 print FILE "dest custom-blocked {\n";
2837 print FILE " domainlist custom\/blocked\/domains\n";
2838 print FILE " urllist custom\/blocked\/urls\n";
2839 if ($filtersettings{'ENABLE_LOG'} eq 'on')
2840 {
2841 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
2842 {
2843 print FILE " logfile $ident custom.log\n";
2844 } else {
2845 print FILE " logfile $ident urlfilter.log\n";
2846 }
2847 }
2848 print FILE "}\n\n";
2849
2850 print FILE "dest custom-expressions {\n";
2851 print FILE " expressionlist custom\/blocked\/expressions\n";
2852 if ($filtersettings{'ENABLE_LOG'} eq 'on')
2853 {
2854 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
2855 {
2856 print FILE " logfile $ident custom.log\n";
2857 } else {
2858 print FILE " logfile $ident urlfilter.log\n";
2859 }
2860 }
2861 print FILE "}\n\n";
2862
2863 print FILE "acl {\n";
2864 if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) {
2865 print FILE " unfiltered {\n";
2866 print FILE " pass all\n";
2867 if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')
2868 {
2869 print FILE " rewrite rew-rule-1\n";
2870 }
2871 print FILE " }\n\n";
2872 }
2873 if (!($filtersettings{'BANNED_CLIENTS'} eq '')) {
2874 print FILE " banned {\n";
2875 print FILE " pass ";
2876 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
2877 {
2878 print FILE "custom-allowed ";
2879 }
2880 print FILE "none\n";
2881 print FILE " }\n\n";
2882 }
2883
2884 if (-s $uqfile)
2885 {
2886 open(UQ, $uqfile);
2887 @uqlist = <UQ>;
2888 close(UQ);
2889
2890 $idx=0;
2891 foreach (@uqlist)
2892 {
2893 chomp;
2894 @uq = split(/\,/);
2895 if ($uq[4] eq 'on')
2896 {
2897 $idx++;
2898 $qredirect = $redirect;
2899 $qredirect =~ s/\%t/\%q\%20-\%20\%i/;
2900 print FILE " quota-$idx {\n";
2901 print FILE " pass ";
2902 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
2903 {
2904 print FILE "custom-allowed ";
2905 }
2906 print FILE "none\n";
2907 unless ($redirect eq $qredirect) { print FILE " redirect $qredirect\n"; }
2908 print FILE " }\n\n";
2909 }
2910 }
2911 }
2912
2913 if (@tclist > 0)
2914 {
2915 $idx=0;
2916 foreach (@tclist)
2917 {
2918 chomp;
2919 @tc = split(/\,/);
2920 @ec = split(/\|/,$tc[13]);
2921 if ($tc[15] eq 'on')
2922 {
2923 $idx++;
2924 print FILE " network-$idx $tc[0] constraint-$idx {\n";
2925 print FILE " pass ";
2926
2927 if ($filtersettings{'BLOCK_ALL'} eq 'on')
2928 {
2929 if ($tc[14] eq 'block')
2930 {
2931 if ((@ec == 1) && ($ec[0] eq 'any')) {
2932 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
2933 {
2934 print FILE "custom-allowed ";
2935 }
2936 print FILE "none";
2937 } else {
2938 print FILE $defaultrule;
2939 }
2940 } else {
2941 foreach (@ec)
2942 {
2943 print FILE "$_ ";
2944 }
2945 print FILE $defaultrule unless ((@ec == 1) && ($ec[0] eq 'any'));
2946 }
2947 } else {
2948 if ($tc[14] eq 'block')
2949 {
2950 $tcrule = $defaultrule;
2951 if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') {
2952 $tcrule =~ s/custom-allowed //;
2953 print FILE "custom-allowed " unless ((@ec == 1) && ($ec[0] eq 'any') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'off'));
2954 }
2955 if ((@ec == 1) && ($ec[0] eq 'any')) {
2956 print FILE "none";
2957 } else {
2958 foreach (@ec)
2959 {
2960 print FILE "!$_ " unless (index($defaultrule,"!".$_." ") ge 0);
2961 }
2962 }
2963 print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any'));
2964 } else {
2965 $tcrule = $defaultrule;
2966 foreach (@ec)
2967 {
2968 $tcrule =~ s/!$_ //;
2969 print FILE "$_ " if ($_ eq 'any');
2970 }
2971 print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any'));
2972 }
2973 }
2974
2975 print FILE "\n";
2976
2977 print FILE " }\n\n";
2978 }
2979 }
2980 }
2981
2982 print FILE " default {\n";
2983 print FILE " pass $defaultrule\n";
2984 if (($filtersettings{'ENABLE_LOG'} eq 'on') && ($filtersettings{'BLOCK_ALL'} eq 'on'))
2985 {
2986 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
2987 {
2988 print FILE " logfile".$ident." default.log\n";
2989 } else {
2990 print FILE " logfile".$ident." urlfilter.log\n";
2991 }
2992 }
2993 if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on'))
2994 {
2995 print FILE " rewrite rew-rule-0\n";
2996 }
2997 print FILE " redirect $redirect\n";
2998 print FILE " }\n";
2999 print FILE "}\n";
3000
3001 close FILE;
3002 }
3003
3004 # -------------------------------------------------------------------
3005 #!/usr/bin/perl
3006 #
3007 # SmoothWall CGIs
3008 #
3009 # This code is distributed under the terms of the GPL
3010 #
3011 # (c) written from scratch
3012 #
3013 # $Id: urlfilter.cgi,v 1.7 2006/05/08 00:00:00 marco Exp $
3014 #
3015
3016 use strict;
3017
3018 # enable only the following on debugging purpose
3019 #use warnings;
3020 #use CGI::Carp 'fatalsToBrowser';
3021
3022 use File::Copy;
3023 use IO::Socket;
3024
3025 require '/var/ipfire/general-functions.pl';
3026 require "${General::swroot}/lang.pl";
3027 require "${General::swroot}/header.pl";
3028
3029 my %netsettings=();
3030 my %mainsettings=();
3031 my %proxysettings=();
3032 my %filtersettings=();
3033 my %tcsettings=();
3034 my %uqsettings=();
3035 my %besettings=();
3036 my %updatesettings=();
3037 my %checked=();
3038 my %selected=();
3039 my $id=0;
3040 my $line='';
3041 my $i=0;
3042 my $n=0;
3043 my $time='';
3044 my $filesize;
3045 my $category='';
3046 my $section='';
3047 my $blacklist='';
3048 my $blistbackup='';
3049
3050 my $changed = 'no';
3051 my $tcfile = "${General::swroot}/urlfilter/timeconst";
3052 my $uqfile = "${General::swroot}/urlfilter/userquota";
3053 my $dbdir = "${General::swroot}/urlfilter/blacklists";
3054 my $editdir = "${General::swroot}/urlfilter/editor";
3055 my $repository = "/home/httpd/html/repository";
3056 my $hintcolour = '#FFFFCC';
3057
3058 my $sourceurlfile = "${General::swroot}/urlfilter/autoupdate/autoupdate.urls";
3059 my $updconffile = "${General::swroot}/urlfilter/autoupdate/autoupdate.conf";
3060 my $updflagfile = "${General::swroot}/urlfilter/blacklists/.autoupdate.last";
3061 my $upd_cron_dly = "${General::swroot}/urlfilter/autoupdate/cron.daily";
3062 my $upd_cron_wly = "${General::swroot}/urlfilter/autoupdate/cron.weekly";
3063 my $upd_cron_mly = "${General::swroot}/urlfilter/autoupdate/cron.monthly";
3064
3065 my $errormessage='';
3066 my $updatemessage='';
3067 my $restoremessage='';
3068 my $buttontext='';
3069 my $source_name='';
3070 my $source_url='';
3071 my $blacklistage=0;
3072
3073 my @repositorylist=();
3074 my @repositoryfiles=();
3075 my @categories=();
3076 my @selectedcategories=();
3077 my @filtergroups=();
3078 my @tclist=();
3079 my @uqlist=();
3080 my @source_urllist=();
3081 my @temp=();
3082
3083 my $lastslashpos=0;
3084
3085 my $toggle='';
3086 my $gif='';
3087 my $led='';
3088 my $ldesc='';
3089 my $gdesc='';
3090
3091 if (! -d $dbdir) { mkdir("$dbdir"); }
3092 if (! -e $tcfile) { system("touch $tcfile"); }
3093 if (! -e $uqfile) { system("touch $uqfile"); }
3094 if (! -e $sourceurlfile) { system("touch $sourceurlfile"); }
3095
3096 &General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
3097 &General::readhash("${General::swroot}/main/settings", \%mainsettings);
3098 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
3099
3100 &readblockcategories;
3101
3102 open(FILE, $tcfile);
3103 @tclist = <FILE>;
3104 close(FILE);
3105 open(FILE, $uqfile);
3106 @uqlist = <FILE>;
3107 close(FILE);
3108 open(FILE, $sourceurlfile);
3109 @source_urllist = <FILE>;
3110 close(FILE);
3111
3112 $filtersettings{'ENABLE_CUSTOM_BLACKLIST'} = 'off';
3113 $filtersettings{'ENABLE_CUSTOM_WHITELIST'} = 'off';
3114 $filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} = 'off';
3115 $filtersettings{'BLOCK_EXECUTABLES'} = 'off';
3116 $filtersettings{'BLOCK_AUDIO-VIDEO'} = 'off';
3117 $filtersettings{'BLOCK_ARCHIVES'} = 'off';
3118 $filtersettings{'ENABLE_REWRITE'} = 'off';
3119 $filtersettings{'UNFILTERED_CLIENTS'} = '';
3120 $filtersettings{'BANNED_CLIENTS'} = '';
3121 $filtersettings{'SHOW_CATEGORY'} = 'off';
3122 $filtersettings{'SHOW_URL'} = 'off';
3123 $filtersettings{'SHOW_IP'} = 'off';
3124 $filtersettings{'ENABLE_DNSERROR'} = 'off';
3125 $filtersettings{'ENABLE_JPEG'} = 'off';
3126 $filtersettings{'REDIRECT_PAGE'} = '';
3127 $filtersettings{'MSG_TEXT_1'} = '';
3128 $filtersettings{'MSG_TEXT_2'} = '';
3129 $filtersettings{'MSG_TEXT_3'} = '';
3130 $filtersettings{'ENABLE_EXPR_LISTS'} = 'off';
3131 $filtersettings{'BLOCK_IP_ADDR'} = 'off';
3132 $filtersettings{'BLOCK_ALL'} = 'off';
3133 $filtersettings{'ENABLE_EMPTY_ADS'} = 'off';
3134 $filtersettings{'ENABLE_GLOBAL_WHITELIST'} = 'off';
3135 $filtersettings{'ENABLE_SAFESEARCH'} = 'off';
3136 $filtersettings{'ENABLE_LOG'} = 'off';
3137 $filtersettings{'ENABLE_USERNAME_LOG'} = 'off';
3138 $filtersettings{'ENABLE_CATEGORY_LOG'} = 'off';
3139 $filtersettings{'CHILDREN'} = '5';
3140 $filtersettings{'ENABLE_AUTOUPDATE'} = 'off';
3141
3142 $filtersettings{'ACTION'} = '';
3143 $filtersettings{'VALID'} = '';
3144
3145 &Header::getcgihash(\%filtersettings);
3146 &Header::getcgihash(\%tcsettings);
3147 &Header::getcgihash(\%uqsettings);
3148 &Header::getcgihash(\%besettings);
3149
3150 if (($filtersettings{'ACTION'} eq $Lang::tr{'save'}) ||
3151 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) ||
3152 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) ||
3153 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) ||
3154 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'}) ||
3155 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) ||
3156 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) ||
3157 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'}))
3158 {
3159 if (!($filtersettings{'CHILDREN'} =~ /^\d+$/) || ($filtersettings{'CHILDREN'} < 1))
3160 {
3161 $errormessage = $Lang::tr{'urlfilter invalid num of children'};
3162 goto ERROR;
3163 }
3164
3165 if ((!($filtersettings{'REDIRECT_PAGE'} eq '')) && (!($filtersettings{'REDIRECT_PAGE'} =~ /^https?:\/\//)))
3166 {
3167 $filtersettings{'REDIRECT_PAGE'} = "http://".$filtersettings{'REDIRECT_PAGE'};
3168 }
3169
3170 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'})
3171 {
3172 if (-e "$repository/$filtersettings{'ID'}") { unlink("$repository/$filtersettings{'ID'}"); }
3173 $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'};
3174 }
3175
3176 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'})
3177 {
3178 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPLOADFILE'});
3179
3180 $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'};
3181 $_ = $filtersettings{'UPLOADFILE'};
3182 tr/\\/\//;
3183 $_ = substr($_,rindex($_,"/")+1);
3184 if ($_) {
3185 if (copy($filtersettings{'UPLOADFILE'}, "$repository/$_") != 1)
3186 {
3187 $errormessage = $!;
3188 goto ERROR;
3189 }
3190 }
3191
3192 }
3193
3194 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'})
3195 {
3196 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'BACKGROUND'});
3197
3198 if (copy($filtersettings{'BACKGROUND'}, "/home/httpd/html/images/urlfilter/background.jpg") != 1)
3199 {
3200 $errormessage = $!;
3201 goto ERROR;
3202 }
3203 }
3204
3205 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'})
3206 {
3207 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'});
3208
3209 if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/))
3210 {
3211 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
3212 goto ERROR;
3213 }
3214
3215 if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/blacklists.tar.gz") != 1)
3216 {
3217 $errormessage = $!;
3218 goto ERROR;
3219 }
3220
3221 if (!(-d "${General::swroot}/urlfilter/update")) { mkdir("${General::swroot}/urlfilter/update"); }
3222
3223 my $exitcode = system("/bin/tar --no-same-owner -xzf ${General::swroot}/urlfilter/blacklists.tar.gz -C ${General::swroot}/urlfilter/update");
3224
3225 if ($exitcode > 0)
3226 {
3227 $errormessage = $Lang::tr{'urlfilter tar error'};
3228 } else {
3229
3230 if (-d "${General::swroot}/urlfilter/update/category")
3231 {
3232 system("mv ${General::swroot}/urlfilter/update/category ${General::swroot}/urlfilter/update/blacklists");
3233 }
3234
3235 if (!(-d "${General::swroot}/urlfilter/update/blacklists"))
3236 {
3237 $errormessage = $Lang::tr{'urlfilter invalid content'};
3238 } else {
3239 system("cp -r ${General::swroot}/urlfilter/update/blacklists/* $dbdir");
3240
3241 &readblockcategories;
3242 &readcustomlists;
3243
3244 &writeconfigfile;
3245
3246 $updatemessage = $Lang::tr{'urlfilter upload success'};
3247 system("${General::swroot}/urlfilter/bin/prebuild.pl &");
3248 system("logger -t installpackage[urlfilter] \"URL filter blacklist - Blacklist update from local source completed\"");
3249 }
3250 }
3251 if (-d "${General::swroot}/urlfilter/update") { system("rm -rf ${General::swroot}/urlfilter/update"); }
3252 if (-e "${General::swroot}/urlfilter/blacklists.tar.gz") { unlink("${General::swroot}/urlfilter/blacklists.tar.gz"); }
3253 if ($errormessage) { goto ERROR; }
3254 }
3255
3256 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'})
3257 {
3258 $blistbackup = ($filtersettings{'ENABLE_FULLBACKUP'} eq 'on') ? "blacklists" : "blacklists/custom";
3259 if (system("/bin/tar -C ${General::swroot}/urlfilter -czf ${General::swroot}/urlfilter/backup.tar.gz settings timeconst userquota autoupdate $blistbackup"))
3260 {
3261 $errormessage = $Lang::tr{'urlfilter backup error'};
3262 goto ERROR;
3263 }
3264 else
3265 {
3266 print "Content-type: application/gzip\n";
3267 print "Content-length: ";
3268 print (-s "${General::swroot}/urlfilter/backup.tar.gz");
3269 print "\n";
3270 print "Content-disposition: attachment; filename=urlfilter-backup.tar.gz\n\n";
3271
3272 open (FILE, "${General::swroot}/urlfilter/backup.tar.gz");
3273 while (<FILE>) { print; }
3274 close (FILE);
3275
3276 if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); }
3277 exit;
3278 }
3279 }
3280
3281 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'})
3282 {
3283 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'});
3284
3285 if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/))
3286 {
3287 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
3288 goto ERROR;
3289 }
3290
3291 if (!(-d "${General::swroot}/urlfilter/restore")) { mkdir("${General::swroot}/urlfilter/restore"); }
3292
3293 if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/backup.tar.gz") != 1)
3294 {
3295 $errormessage = $!;
3296 }
3297
3298 my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf ${General::swroot}/urlfilter/backup.tar.gz -C ${General::swroot}/urlfilter/restore");
3299 if ($exitcode > 0)
3300 {
3301 $errormessage = $Lang::tr{'urlfilter tar error'};
3302 } else {
3303 if (!(-e "${General::swroot}/urlfilter/restore/settings"))
3304 {
3305 $errormessage = $Lang::tr{'urlfilter invalid restore file'};
3306 } else {
3307 system("cp -rp ${General::swroot}/urlfilter/restore/* ${General::swroot}/urlfilter/");
3308 &readblockcategories;
3309 &readcustomlists;
3310 &writeconfigfile;
3311
3312 $restoremessage = $Lang::tr{'urlfilter restore success'};
3313 }
3314 }
3315
3316 if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); }
3317 if (-d "${General::swroot}/urlfilter/restore") { system("rm -rf ${General::swroot}/urlfilter/restore"); }
3318 if ($errormessage) { goto ERROR; }
3319 }
3320
3321 if ($filtersettings{'ACTION'} eq $Lang::tr{'save'})
3322 {
3323 $filtersettings{'VALID'} = 'yes';
3324 &savesettings;
3325 }
3326
3327 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'})
3328 {
3329 if (!(-e "${General::swroot}/proxy/enable"))
3330 {
3331 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
3332 goto ERROR;
3333 }
3334 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
3335 {
3336 $errormessage = $Lang::tr{'urlfilter not enabled'};
3337 goto ERROR;
3338 }
3339
3340 $filtersettings{'VALID'} = 'yes';
3341 &savesettings;
3342
3343 system("chown -R nobody.nobody $dbdir");
3344
3345 if (-e "$dbdir/custom/allowed/domains.db") { unlink("$dbdir/custom/allowed/domains.db"); }
3346 if (-e "$dbdir/custom/allowed/urls.db") { unlink("$dbdir/custom/allowed/urls.db"); }
3347 if (-e "$dbdir/custom/blocked/domains.db") { unlink("$dbdir/custom/blocked/domains.db"); }
3348 if (-e "$dbdir/custom/blocked/urls.db") { unlink("$dbdir/custom/blocked/urls.db"); }
3349
3350 foreach (<$dbdir/*>)
3351 {
3352 if (-d $_){ system("chmod 644 $_/*"); }
3353 if (-d $_){ system("chmod 666 $_/*.db"); }
3354 }
3355 if (-d "$dbdir/custom/allowed")
3356 {
3357 system("chmod 755 $dbdir/custom/allowed");
3358 system("chmod 644 $dbdir/custom/allowed/*");
3359 }
3360 if (-d "$dbdir/custom/blocked")
3361 {
3362 system("chmod 755 $dbdir/custom/blocked");
3363 system("chmod 644 $dbdir/custom/blocked/*");
3364 }
3365
3366 system('/usr/local/bin/restartsquid');
3367 }
3368
3369 ERROR:
3370
3371 if ($errormessage) { $filtersettings{'VALID'} = 'no'; }
3372
3373 }
3374
3375 if ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter set time constraints'}) { $tcsettings{'TCMODE'} = 'on'}
3376
3377 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'add'}))
3378 {
3379 $tcsettings{'TCMODE'}='on';
3380
3381 if (!$tcsettings{'DST'})
3382 {
3383 $errormessage=$Lang::tr{'urlfilter dst error'};
3384 }
3385
3386 if (!$tcsettings{'SRC'})
3387 {
3388 $errormessage=$Lang::tr{'urlfilter src error'};
3389 }
3390
3391 if (!($tcsettings{'TO_HOUR'}.$tcsettings{'TO_MINUTE'} gt $tcsettings{'FROM_HOUR'}.$tcsettings{'FROM_MINUTE'}))
3392 {
3393 $errormessage=$Lang::tr{'urlfilter timespace error'};
3394 }
3395
3396 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')))
3397 {
3398 $errormessage=$Lang::tr{'urlfilter weekday error'};
3399 }
3400
3401 if (!$errormessage)
3402 {
3403 if ($tcsettings{'DST'} =~ /^any/) { $tcsettings{'DST'} = 'any'; }
3404 if ($tcsettings{'ENABLERULE'} eq 'on') { $tcsettings{'ACTIVE'} = $tcsettings{'ENABLERULE'}; } else { $tcsettings{'ACTIVE'} = 'off'}
3405
3406 $tcsettings{'ENABLERULE'} = 'on';
3407 if($tcsettings{'EDITING'} eq 'no') {
3408 open(FILE,">>$tcfile");
3409 flock FILE, 2;
3410 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";
3411 } else {
3412 open(FILE, ">$tcfile");
3413 flock FILE, 2;
3414 $id = 0;
3415 foreach $line (@tclist)
3416 {
3417 $id++;
3418 if ($tcsettings{'EDITING'} eq $id) {
3419 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";
3420 } else { print FILE "$line"; }
3421 }
3422 }
3423 close(FILE);
3424 undef %tcsettings;
3425 $tcsettings{'CHANGED'}='yes';
3426 $tcsettings{'TCMODE'}='on';
3427 $changed = 'yes';
3428 } else {
3429 if ($tcsettings{'EDITING'} ne 'no')
3430 {
3431 $tcsettings{'ACTION'} = $Lang::tr{'edit'};
3432 $tcsettings{'ID'} = $tcsettings{'EDITING'};
3433 }
3434 }
3435 }
3436
3437 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'remove'}))
3438 {
3439 $id = 0;
3440 open(FILE, ">$tcfile");
3441 flock FILE, 2;
3442 foreach $line (@tclist)
3443 {
3444 $id++;
3445 unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; }
3446 }
3447 close(FILE);
3448 $tcsettings{'CHANGED'}='yes';
3449 $tcsettings{'TCMODE'}='on';
3450 }
3451
3452 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'}))
3453 {
3454 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
3455 {
3456 $errormessage = $Lang::tr{'urlfilter not enabled'};
3457 }
3458 if (!(-e "${General::swroot}/proxy/enable"))
3459 {
3460 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
3461 }
3462
3463 if (!$errormessage) { system('/usr/local/bin/restartsquid'); }
3464 $tcsettings{'TCMODE'}='on';
3465 }
3466
3467 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'}))
3468 {
3469 open(FILE, ">$tcfile");
3470 flock FILE, 2;
3471 $id = 0;
3472 foreach $line (@tclist)
3473 {
3474 $id++;
3475 unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; }
3476 else
3477 {
3478 chomp($line);
3479 @temp = split(/\,/,$line);
3480 if ($temp[15] eq 'on') { $temp[15] = 'off'; } else { $temp[15] = 'on' }
3481 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";
3482 }
3483 }
3484 close(FILE);
3485 $tcsettings{'CHANGED'}='yes';
3486 $tcsettings{'TCMODE'}='on';
3487 }
3488
3489 if (!$errormessage) {
3490 $tcsettings{'ENABLERULE'}='on';
3491 $tcsettings{'TO_HOUR'}='24';
3492 }
3493
3494 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage))
3495 {
3496 $id = 0;
3497 foreach $line (@tclist)
3498 {
3499 $id++;
3500 if ($tcsettings{'ID'} eq $id)
3501 {
3502 chomp($line);
3503 @temp = split(/\,/,$line);
3504 $tcsettings{'DEFINITION'} = $temp[0];
3505 $tcsettings{'MON'} = $temp[1];
3506 $tcsettings{'TUE'} = $temp[2];
3507 $tcsettings{'WED'} = $temp[3];
3508 $tcsettings{'THU'} = $temp[4];
3509 $tcsettings{'FRI'} = $temp[5];
3510 $tcsettings{'SAT'} = $temp[6];
3511 $tcsettings{'SUN'} = $temp[7];
3512 $tcsettings{'FROM_HOUR'} = $temp[8];
3513 $tcsettings{'FROM_MINUTE'} = $temp[9];
3514 $tcsettings{'TO_HOUR'} = $temp[10];
3515 $tcsettings{'TO_MINUTE'} = $temp[11];
3516 $tcsettings{'SRC'} = $temp[12];
3517 $tcsettings{'DST'} = $temp[13];
3518 $tcsettings{'ACCESS'} = $temp[14];
3519 $tcsettings{'ENABLERULE'} = $temp[15];
3520 $tcsettings{'COMMENT'} = $temp[16];
3521 }
3522 }
3523 $tcsettings{'TCMODE'}='on';
3524 }
3525
3526 if ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter set user quota'}) { $uqsettings{'UQMODE'} = 'on'}
3527
3528 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'add'}))
3529 {
3530 $uqsettings{'UQMODE'}='on';
3531
3532 if ((!($uqsettings{'TIME_QUOTA'} =~ /^\d+/)) || ($uqsettings{'TIME_QUOTA'} < '1'))
3533 {
3534 $errormessage=$Lang::tr{'urlfilter quota time error'};
3535 }
3536
3537 @temp = split(/\n/,$uqsettings{'QUOTA_USERS'});
3538 undef $uqsettings{'QUOTA_USERS'};
3539 foreach (@temp)
3540 {
3541 s/^\s+//g; s/\s+$//g;
3542 if ($_) { $uqsettings{'QUOTA_USERS'} .= $_."\n"; }
3543 }
3544
3545 if ($uqsettings{'QUOTA_USERS'} eq '')
3546 {
3547 $errormessage=$Lang::tr{'urlfilter quota user error'};
3548 }
3549
3550 $_ = $uqsettings{'QUOTA_USERS'};
3551 chomp; s/\n/|/g;
3552 my $quota_users = $_;
3553
3554 if ($uqsettings{'QUOTA_USERS'} =~ /\\/)
3555 {
3556 $errormessage=$Lang::tr{'urlfilter invalid user error'};
3557 }
3558
3559 if (!$errormessage) {
3560 if ($uqsettings{'ENABLEQUOTA'} eq 'on') { $uqsettings{'ACTIVE'} = $uqsettings{'ENABLEQUOTA'}; } else { $uqsettings{'ACTIVE'} = 'off'}
3561
3562 $uqsettings{'ENABLERULE'} = 'on';
3563 if($uqsettings{'EDITING'} eq 'no') {
3564 open(FILE,">>$uqfile");
3565 flock FILE, 2;
3566 print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n";
3567 } else {
3568 open(FILE, ">$uqfile");
3569 flock FILE, 2;
3570 $id = 0;
3571 foreach $line (@uqlist)
3572 {
3573 $id++;
3574 if ($uqsettings{'EDITING'} eq $id) {
3575 print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n";
3576 } else { print FILE "$line"; }
3577 }
3578 }
3579 close(FILE);
3580 undef %uqsettings;
3581 $uqsettings{'CHANGED'}='yes';
3582 $uqsettings{'MODE'}='USERQUOTA';
3583 $uqsettings{'UQMODE'}='on';
3584 $changed = 'yes';
3585 } else {
3586 if ($uqsettings{'EDITING'} ne 'no')
3587 {
3588 $uqsettings{'ACTION'} = $Lang::tr{'edit'};
3589 $uqsettings{'ID'} = $uqsettings{'EDITING'};
3590 }
3591 }
3592 }
3593
3594 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'remove'}))
3595 {
3596 $id = 0;
3597 open(FILE, ">$uqfile");
3598 flock FILE, 2;
3599 foreach $line (@uqlist)
3600 {
3601 $id++;
3602 unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; }
3603 }
3604 close(FILE);
3605 $uqsettings{'CHANGED'}='yes';
3606 $uqsettings{'UQMODE'}='on';
3607 }
3608
3609 if (!$errormessage) {
3610 $uqsettings{'ENABLEQUOTA'}='on';
3611 }
3612
3613 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage))
3614 {
3615 $id = 0;
3616 foreach $line (@uqlist)
3617 {
3618 $id++;
3619 if ($uqsettings{'ID'} eq $id)
3620 {
3621 chomp($line);
3622 @temp = split(/\,/,$line);
3623 $uqsettings{'TIME_QUOTA'} = $temp[0];
3624 $uqsettings{'SPORADIC'} = $temp[1];
3625 $uqsettings{'RENEWAL'} = $temp[2];
3626 $uqsettings{'QUOTA_USERS'} = $temp[3];
3627 $uqsettings{'ENABLEQUOTA'} = $temp[4];
3628 }
3629 }
3630 $uqsettings{'UQMODE'}='on';
3631 }
3632
3633 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'}))
3634 {
3635 open(FILE, ">$uqfile");
3636 flock FILE, 2;
3637 $id = 0;
3638 foreach $line (@uqlist)
3639 {
3640 $id++;
3641 unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; }
3642 else
3643 {
3644 chomp($line);
3645 @temp = split(/\,/,$line);
3646 if ($temp[4] eq 'on') { $temp[4] = 'off'; } else { $temp[4] = 'on' }
3647 print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4]\n";
3648 }
3649 }
3650 close(FILE);
3651 $uqsettings{'CHANGED'}='yes';
3652 $uqsettings{'UQMODE'}='on';
3653 }
3654
3655 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'}))
3656 {
3657 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
3658 {
3659 $errormessage = $Lang::tr{'urlfilter not enabled'};
3660 }
3661 if (!(-e "${General::swroot}/proxy/enable"))
3662 {
3663 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
3664 }
3665
3666 if (!$errormessage) { system('/usr/local/bin/restartsquid'); }
3667 $uqsettings{'UQMODE'}='on';
3668 }
3669
3670 if ($besettings{'ACTION'} eq $Lang::tr{'urlfilter blacklist editor'}) { $besettings{'BEMODE'} = 'on'; }
3671
3672 if ($besettings{'MODE'} eq 'BLACKLIST_EDITOR')
3673 {
3674 @temp = split(/\n/,$besettings{'BE_DOMAINS'});
3675 undef $besettings{'BE_DOMAINS'};
3676 foreach (@temp)
3677 {
3678 s/^\s+//g; s/\s+$//g;
3679 if ($_) { $besettings{'BE_DOMAINS'} .= $_."\n"; }
3680 }
3681 chomp($besettings{'BE_DOMAINS'});
3682 @temp = split(/\n/,$besettings{'BE_URLS'});
3683 undef $besettings{'BE_URLS'};
3684 foreach (@temp)
3685 {
3686 s/^\s+//g; s/\s+$//g;
3687 if ($_) { $besettings{'BE_URLS'} .= $_."\n"; }
3688 }
3689 chomp($besettings{'BE_URLS'});
3690 @temp = split(/\n/,$besettings{'BE_EXPRESSIONS'});
3691 undef $besettings{'BE_EXPRESSIONS'};
3692 foreach (@temp)
3693 {
3694 s/^\s+//g; s/\s+$//g;
3695 if ($_) { $besettings{'BE_EXPRESSIONS'} .= $_."\n"; }
3696 }
3697 chomp($besettings{'BE_EXPRESSIONS'});
3698 }
3699
3700 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter load blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
3701 {
3702 $besettings{'BEMODE'} = 'on';
3703
3704 $besettings{'BE_NAME'} = $besettings{'BE_BLACKLIST'};
3705
3706 delete $besettings{'BE_DOMAINS'};
3707 delete $besettings{'BE_URLS'};
3708 delete $besettings{'BE_EXPRESSIONS'};
3709
3710 if (-e "$dbdir/$besettings{'BE_NAME'}/domains")
3711 {
3712 open(FILE, "$dbdir/$besettings{'BE_NAME'}/domains");
3713 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } };
3714 close FILE;
3715 chomp($besettings{'BE_DOMAINS'});
3716 }
3717 if (-e "$dbdir/$besettings{'BE_NAME'}/urls")
3718 {
3719 open(FILE, "$dbdir/$besettings{'BE_NAME'}/urls");
3720 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } };
3721 close FILE;
3722 chomp($besettings{'BE_URLS'});
3723 }
3724 if (-e "$dbdir/$besettings{'BE_NAME'}/expressions")
3725 {
3726 open(FILE, "$dbdir/$besettings{'BE_NAME'}/expressions");
3727 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } };
3728 close FILE;
3729 chomp($besettings{'BE_EXPRESSIONS'});
3730 }
3731 }
3732
3733 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter import blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
3734 {
3735 $besettings{'BEMODE'} = 'on';
3736
3737 &Header::getcgihash(\%besettings, {'wantfile' => 1, 'filevar' => 'IMPORTFILE'});
3738
3739 if (!($besettings{'IMPORTFILE'} =~ /.tar.gz$/))
3740 {
3741 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
3742 } else {
3743 if (!-d "$editdir") { mkdir("$editdir"); }
3744
3745 if (copy($besettings{'IMPORTFILE'}, "$editdir/blacklist.tar.gz") != 1)
3746 {
3747 $errormessage = $!;
3748 } else {
3749
3750 my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf $editdir/blacklist.tar.gz -C $editdir");
3751 if ($exitcode > 0)
3752 {
3753 $errormessage = $Lang::tr{'urlfilter tar error'};
3754 } else {
3755 $i = 0;
3756 foreach (<$editdir/blacklists/*>)
3757 {
3758 if (-d)
3759 {
3760 $i++;
3761 $besettings{'BE_NAME'} = substr($_, rindex($_,"/")+1);
3762 }
3763 }
3764
3765 if (!($i == 1))
3766 {
3767 $errormessage = $Lang::tr{'urlfilter invalid import file'};
3768 } else {
3769 delete $besettings{'BE_DOMAINS'};
3770 delete $besettings{'BE_URLS'};
3771 delete $besettings{'BE_EXPRESSIONS'};
3772
3773 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/domains")
3774 {
3775 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/domains");
3776 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } };
3777 close FILE;
3778 chomp($besettings{'BE_DOMAINS'});
3779 }
3780 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/urls")
3781 {
3782 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/urls");
3783 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } };
3784 close FILE;
3785 chomp($besettings{'BE_URLS'});
3786 }
3787 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/expressions")
3788 {
3789 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/expressions");
3790 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } };
3791 close FILE;
3792 chomp($besettings{'BE_EXPRESSIONS'});
3793 }
3794 }
3795 }
3796
3797 if (-d $editdir) { system("rm -rf $editdir"); }
3798
3799 }
3800 }
3801 }
3802
3803 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter export blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
3804 {
3805 $besettings{'BEMODE'} = 'on';
3806
3807 if ($besettings{'BE_NAME'} eq '')
3808 {
3809 $errormessage = $Lang::tr{'urlfilter category name error'};
3810 } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) {
3811
3812 $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_;
3813
3814 if (!(-d "$editdir")) { mkdir("$editdir"); }
3815 if (!(-d "$editdir/blacklists")) { mkdir("$editdir/blacklists"); }
3816 if (!(-d "$editdir/blacklists/$besettings{'BE_NAME'}")) { mkdir("$editdir/blacklists/$besettings{'BE_NAME'}"); }
3817
3818 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/domains");
3819 flock FILE, 2;
3820 print FILE "$besettings{'BE_DOMAINS'}\n";
3821 close FILE;
3822 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/urls");
3823 flock FILE, 2;
3824 print FILE "$besettings{'BE_URLS'}\n";
3825 close FILE;
3826 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/expressions");
3827 flock FILE, 2;
3828 print FILE "$besettings{'BE_EXPRESSIONS'}\n";
3829 close FILE;
3830
3831 if (system("/bin/tar -C $editdir -czf $editdir/$besettings{'BE_NAME'}.tar.gz blacklists"))
3832 {
3833 $errormessage = $Lang::tr{'urlfilter export error'};
3834 }
3835 else
3836 {
3837 print "Content-type: application/gzip\n";
3838 print "Content-length: ";
3839 print (-s "$editdir/$besettings{'BE_NAME'}.tar.gz");
3840 print "\n";
3841 print "Content-disposition: attachment; filename=$besettings{'BE_NAME'}.tar.gz\n\n";
3842
3843 open (FILE, "$editdir/$besettings{'BE_NAME'}.tar.gz");
3844 while (<FILE>) { print; }
3845 close (FILE);
3846
3847 if (-d $editdir) { system("rm -rf $editdir"); }
3848 exit;
3849 }
3850 } else {
3851 $errormessage = $Lang::tr{'urlfilter category data error'};
3852 }
3853 }
3854
3855 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter install blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
3856 {
3857 $besettings{'BEMODE'} = 'on';
3858
3859 if ($besettings{'BE_NAME'} eq '')
3860 {
3861 $errormessage = $Lang::tr{'urlfilter category name error'};
3862 } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) {
3863
3864 $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_;
3865
3866 if (!-d "$editdir") { mkdir("$editdir"); }
3867
3868 if (!-d "$dbdir/$besettings{'BE_NAME'}") { mkdir("$dbdir/$besettings{'BE_NAME'}"); }
3869
3870 if (-e "$dbdir/$besettings{'BE_NAME'}/domains") { unlink("$dbdir/$besettings{'BE_NAME'}/domains"); }
3871 if ($besettings{'BE_DOMAINS'})
3872 {
3873 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/domains");
3874 flock FILE, 2;
3875 print FILE "$besettings{'BE_DOMAINS'}\n";
3876 close FILE;
3877 }
3878 if (-e "$dbdir/$besettings{'BE_NAME'}/urls") { unlink("$dbdir/$besettings{'BE_NAME'}/urls"); }
3879 if ($besettings{'BE_URLS'})
3880 {
3881 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/urls");
3882 flock FILE, 2;
3883 print FILE "$besettings{'BE_URLS'}\n";
3884 close FILE;
3885 }
3886 if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") { unlink("$dbdir/$besettings{'BE_NAME'}/expressions"); }
3887 if ($besettings{'BE_EXPRESSIONS'})
3888 {
3889 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/expressions");
3890 flock FILE, 2;
3891 print FILE "$besettings{'BE_EXPRESSIONS'}\n";
3892 close FILE;
3893 }
3894
3895 open(FILE, ">$editdir/install.conf");
3896 flock FILE, 2;
3897 print FILE "logdir /var/log/squidGuard\n";
3898 print FILE "dbhome $dbdir/$besettings{'BE_NAME'}\n\n";
3899 print FILE "dest $besettings{'BE_NAME'} {\n";
3900 if ($besettings{'BE_DOMAINS'}) { print FILE " domainlist domains\n"; }
3901 if ($besettings{'BE_URLS'}) { print FILE " urllist urls\n"; }
3902 if ($besettings{'BE_EXPRESSIONS'}) { print FILE " expressions expressions\n"; }
3903 print FILE "}\n\n";
3904 print FILE "acl {\n";
3905 print FILE " default {\n";
3906 print FILE " pass none\n";
3907 print FILE " }\n";
3908 print FILE "}\n";
3909 close FILE;
3910
3911 system("rm -f $dbdir/$besettings{'BE_NAME'}/*.db");
3912 system("/usr/sbin/squidGuard -c $editdir/install.conf -C all");
3913 system("chmod a+w $dbdir/$besettings{'BE_NAME'}/*.db");
3914
3915 &readblockcategories;
3916 &readcustomlists;
3917
3918 &writeconfigfile;
3919
3920 system('/usr/local/bin/restartsquid') unless ($besettings{'NORESTART'} eq 'on');
3921
3922 if (-d $editdir) { system("rm -rf $editdir"); }
3923 } else {
3924 $errormessage = $Lang::tr{'urlfilter category data error'};
3925 }
3926 }
3927
3928 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save schedule'})
3929 {
3930 if (($filtersettings{'UPDATE_SOURCE'} eq 'custom') && ($filtersettings{'CUSTOM_UPDATE_URL'} eq ''))
3931 {
3932 $errormessage = $Lang::tr{'urlfilter custom url required'};
3933 } else {
3934 open (FILE, ">$updconffile");
3935 print FILE "ENABLE_AUTOUPDATE=$filtersettings{'ENABLE_AUTOUPDATE'}\n";
3936 print FILE "UPDATE_SCHEDULE=$filtersettings{'UPDATE_SCHEDULE'}\n";
3937 print FILE "UPDATE_SOURCE=$filtersettings{'UPDATE_SOURCE'}\n";
3938 print FILE "CUSTOM_UPDATE_URL=$filtersettings{'CUSTOM_UPDATE_URL'}\n";
3939 close FILE;
3940
3941 if (-e $upd_cron_dly) { unlink($upd_cron_dly); }
3942 if (-e $upd_cron_wly) { unlink($upd_cron_wly); }
3943 if (-e $upd_cron_mly) { unlink($upd_cron_mly); }
3944
3945 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'daily'))
3946 {
3947 symlink("../bin/autoupdate.pl",$upd_cron_dly)
3948 } else {
3949 symlink("/bin/false",$upd_cron_dly)
3950 }
3951
3952 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'weekly'))
3953 {
3954 symlink("../bin/autoupdate.pl",$upd_cron_wly)
3955 } else {
3956 symlink("/bin/false",$upd_cron_wly)
3957 }
3958
3959 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'monthly'))
3960 {
3961 symlink("../bin/autoupdate.pl",$upd_cron_mly)
3962 } else {
3963 symlink("/bin/false",$upd_cron_mly)
3964 }
3965 }
3966 }
3967
3968 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter update now'})
3969 {
3970 if ($filtersettings{'UPDATE_SOURCE'} eq 'custom')
3971 {
3972 if ($filtersettings{'CUSTOM_UPDATE_URL'} eq '')
3973 {
3974 $errormessage = $Lang::tr{'urlfilter custom url required'};
3975 } else {
3976 system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'CUSTOM_UPDATE_URL'} &");
3977 }
3978 } else {
3979 system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'UPDATE_SOURCE'} &");
3980 }
3981 }
3982
3983
3984 if (-e "${General::swroot}/urlfilter/settings") { &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); }
3985
3986 &readcustomlists;
3987
3988 $checked{'ENABLE_CUSTOM_BLACKLIST'}{'off'} = '';
3989 $checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} = '';
3990 $checked{'ENABLE_CUSTOM_BLACKLIST'}{$filtersettings{'ENABLE_CUSTOM_BLACKLIST'}} = "checked='checked'";
3991 $checked{'ENABLE_CUSTOM_WHITELIST'}{'off'} = '';
3992 $checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} = '';
3993 $checked{'ENABLE_CUSTOM_WHITELIST'}{$filtersettings{'ENABLE_CUSTOM_WHITELIST'}} = "checked='checked'";
3994 $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'off'} = '';
3995 $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} = '';
3996 $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'}} = "checked='checked'";
3997 $checked{'BLOCK_EXECUTABLES'}{'off'} = '';
3998 $checked{'BLOCK_EXECUTABLES'}{'on'} = '';
3999 $checked{'BLOCK_EXECUTABLES'}{$filtersettings{'BLOCK_EXECUTABLES'}} = "checked='checked'";
4000 $checked{'BLOCK_AUDIO-VIDEO'}{'off'} = '';
4001 $checked{'BLOCK_AUDIO-VIDEO'}{'on'} = '';
4002 $checked{'BLOCK_AUDIO-VIDEO'}{$filtersettings{'BLOCK_AUDIO-VIDEO'}} = "checked='checked'";
4003 $checked{'BLOCK_ARCHIVES'}{'off'} = '';
4004 $checked{'BLOCK_ARCHIVES'}{'on'} = '';
4005 $checked{'BLOCK_ARCHIVES'}{$filtersettings{'BLOCK_ARCHIVES'}} = "checked='checked'";
4006 $checked{'ENABLE_REWRITE'}{'off'} = '';
4007 $checked{'ENABLE_REWRITE'}{'on'} = '';
4008 $checked{'ENABLE_REWRITE'}{$filtersettings{'ENABLE_REWRITE'}} = "checked='checked'";
4009 $checked{'SHOW_CATEGORY'}{'off'} = '';
4010 $checked{'SHOW_CATEGORY'}{'on'} = '';
4011 $checked{'SHOW_CATEGORY'}{$filtersettings{'SHOW_CATEGORY'}} = "checked='checked'";
4012 $checked{'SHOW_URL'}{'off'} = '';
4013 $checked{'SHOW_URL'}{'on'} = '';
4014 $checked{'SHOW_URL'}{$filtersettings{'SHOW_URL'}} = "checked='checked'";
4015 $checked{'SHOW_IP'}{'off'} = '';
4016 $checked{'SHOW_IP'}{'on'} = '';
4017 $checked{'SHOW_IP'}{$filtersettings{'SHOW_IP'}} = "checked='checked'";
4018 $checked{'ENABLE_DNSERROR'}{'off'} = '';
4019 $checked{'ENABLE_DNSERROR'}{'on'} = '';
4020 $checked{'ENABLE_DNSERROR'}{$filtersettings{'ENABLE_DNSERROR'}} = "checked='checked'";
4021 $checked{'ENABLE_JPEG'}{'off'} = '';
4022 $checked{'ENABLE_JPEG'}{'on'} = '';
4023 $checked{'ENABLE_JPEG'}{$filtersettings{'ENABLE_JPEG'}} = "checked='checked'";
4024 $checked{'ENABLE_EXPR_LISTS'}{'off'} = '';
4025 $checked{'ENABLE_EXPR_LISTS'}{'on'} = '';
4026 $checked{'ENABLE_EXPR_LISTS'}{$filtersettings{'ENABLE_EXPR_LISTS'}} = "checked='checked'";
4027 $checked{'BLOCK_IP_ADDR'}{'off'} = '';
4028 $checked{'BLOCK_IP_ADDR'}{'on'} = '';
4029 $checked{'BLOCK_IP_ADDR'}{$filtersettings{'BLOCK_IP_ADDR'}} = "checked='checked'";
4030 $checked{'BLOCK_ALL'}{'off'} = '';
4031 $checked{'BLOCK_ALL'}{'on'} = '';
4032 $checked{'BLOCK_ALL'}{$filtersettings{'BLOCK_ALL'}} = "checked='checked'";
4033 $checked{'ENABLE_EMPTY_ADS'}{'off'} = '';
4034 $checked{'ENABLE_EMPTY_ADS'}{'on'} = '';
4035 $checked{'ENABLE_EMPTY_ADS'}{$filtersettings{'ENABLE_EMPTY_ADS'}} = "checked='checked'";
4036 $checked{'ENABLE_GLOBAL_WHITELIST'}{'off'} = '';
4037 $checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} = '';
4038 $checked{'ENABLE_GLOBAL_WHITELIST'}{$filtersettings{'ENABLE_GLOBAL_WHITELIST'}} = "checked='checked'";
4039 $checked{'ENABLE_SAFESEARCH'}{'off'} = '';
4040 $checked{'ENABLE_SAFESEARCH'}{'on'} = '';
4041 $checked{'ENABLE_SAFESEARCH'}{$filtersettings{'ENABLE_SAFESEARCH'}} = "checked='checked'";
4042 $checked{'ENABLE_LOG'}{'off'} = '';
4043 $checked{'ENABLE_LOG'}{'on'} = '';
4044 $checked{'ENABLE_LOG'}{$filtersettings{'ENABLE_LOG'}} = "checked='checked'";
4045 $checked{'ENABLE_USERNAME_LOG'}{'off'} = '';
4046 $checked{'ENABLE_USERNAME_LOG'}{'on'} = '';
4047 $checked{'ENABLE_USERNAME_LOG'}{$filtersettings{'ENABLE_USERNAME_LOG'}} = "checked='checked'";
4048 $checked{'ENABLE_CATEGORY_LOG'}{'off'} = '';
4049 $checked{'ENABLE_CATEGORY_LOG'}{'on'} = '';
4050 $checked{'ENABLE_CATEGORY_LOG'}{$filtersettings{'ENABLE_CATEGORY_LOG'}} = "checked='checked'";
4051
4052 foreach $category (@filtergroups) {
4053 $checked{$category}{'off'} = '';
4054 $checked{$category}{'on'} = '';
4055 $checked{$category}{$filtersettings{$category}} = "checked='checked'";
4056 }
4057
4058 $selected{'DEFINITION'}{$tcsettings{'DEFINITION'}} = "selected='selected'";
4059 $selected{'FROM_HOUR'}{$tcsettings{'FROM_HOUR'}} = "selected='selected'";
4060 $selected{'FROM_MINUTE'}{$tcsettings{'FROM_MINUTE'}} = "selected='selected'";
4061 $selected{'TO_HOUR'}{$tcsettings{'TO_HOUR'}} = "selected='selected'";
4062 $selected{'TO_MINUTE'}{$tcsettings{'TO_MINUTE'}} = "selected='selected'";
4063
4064 @selectedcategories = split(/\|/,$tcsettings{'DST'});
4065 foreach (@selectedcategories)
4066 {
4067 $selected{'DST'}{$_} = "selected='selected'";
4068 }
4069
4070 $selected{'ACCESS'}{$tcsettings{'ACCESS'}} = "selected='selected'";
4071
4072 $checked{'ENABLERULE'}{'off'} = '';
4073 $checked{'ENABLERULE'}{'on'} = '';
4074 $checked{'ENABLERULE'}{$tcsettings{'ENABLERULE'}} = "checked='checked'";
4075 $checked{'MON'}{'off'} = '';
4076 $checked{'MON'}{'on'} = '';
4077 $checked{'MON'}{$tcsettings{'MON'}} = "checked='checked'";
4078 $checked{'TUE'}{'off'} = '';
4079 $checked{'TUE'}{'on'} = '';
4080 $checked{'TUE'}{$tcsettings{'TUE'}} = "checked='checked'";
4081 $checked{'WED'}{'off'} = '';
4082 $checked{'WED'}{'on'} = '';
4083 $checked{'WED'}{$tcsettings{'WED'}} = "checked='checked'";
4084 $checked{'THU'}{'off'} = '';
4085 $checked{'THU'}{'on'} = '';
4086 $checked{'THU'}{$tcsettings{'THU'}} = "checked='checked'";
4087 $checked{'FRI'}{'off'} = '';
4088 $checked{'FRI'}{'on'} = '';
4089 $checked{'FRI'}{$tcsettings{'FRI'}} = "checked='checked'";
4090 $checked{'SAT'}{'off'} = '';
4091 $checked{'SAT'}{'on'} = '';
4092 $checked{'SAT'}{$tcsettings{'SAT'}} = "checked='checked'";
4093 $checked{'SUN'}{'off'} = '';
4094 $checked{'SUN'}{'on'} = '';
4095 $checked{'SUN'}{$tcsettings{'SUN'}} = "checked='checked'";
4096
4097 $selected{'SPORADIC'}{$uqsettings{'SPORADIC'}} = "selected='selected'";
4098 $selected{'RENEWAL'} {$uqsettings{'RENEWAL'}} = "selected='selected'";
4099
4100 $checked{'ENABLEQUOTA'}{'off'} = '';
4101 $checked{'ENABLEQUOTA'}{'on'} = '';
4102 $checked{'ENABLEQUOTA'}{$uqsettings{'ENABLEQUOTA'}} = "checked='checked'";
4103
4104 $selected{'BE_BLACKLIST'}{$besettings{'BE_BLACKLIST'}} = "selected='selected'";
4105
4106
4107 &Header::showhttpheaders();
4108
4109 &Header::openpage($Lang::tr{'urlfilter configuration'}, 1, '');
4110
4111 &Header::openbigbox('100%', 'left', '', $errormessage);
4112
4113 if ($errormessage) {
4114 &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
4115 print "<font class='base'>$errormessage&nbsp;</font>\n";
4116 &Header::closebox();
4117 } elsif (($tcsettings{'CHANGED'} eq 'yes') || ($uqsettings{'CHANGED'} eq 'yes') ) {
4118 &writeconfigfile;
4119 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
4120 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restart notification'}:");
4121 print "<class name='base'>$Lang::tr{'urlfilter restart message'}\n";
4122 if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "<p><class name='base'>$Lang::tr{'urlfilter quota restart message'}\n"; }
4123 print "</class>\n";
4124 print "<p><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter restart'}' />";
4125 if ($tcsettings{'MODE'} eq 'TIMECONSTRAINT') { print "<input type='hidden' name='MODE' value='TIMECONSTRAINT' />"; }
4126 if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "<input type='hidden' name='MODE' value='USERQUOTA' />"; }
4127 &Header::closebox();
4128 print "</form>\n";
4129 }
4130
4131 if ($restoremessage) {
4132 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restore results'}:");
4133 print "<class name='base'>$restoremessage\n";
4134 print "&nbsp;</class>\n";
4135 &Header::closebox();
4136 }
4137
4138 if ((!$tcsettings{'TCMODE'}) && (!$uqsettings{'UQMODE'}) && (!$besettings{'BEMODE'})) {
4139
4140 if (!($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter manage repository'})) {
4141
4142 #==========================================================
4143 #
4144 # Section: Main Configuration
4145 #
4146 #==========================================================
4147
4148 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
4149
4150 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter filter settings'}:");
4151 print <<END
4152 <table width='100%'>
4153 <tr>
4154 <td colspan='4'><b>$Lang::tr{'urlfilter block categories'}</b></td>
4155 </tr>
4156 END
4157 ;
4158
4159 if (@categories == 0) {
4160 print <<END
4161 <tr>
4162 <td><i>$Lang::tr{'urlfilter no categories'}</i></td>
4163 <td>&nbsp;</td>
4164 <td>&nbsp;</td>
4165 <td>&nbsp;</td>
4166 </tr>
4167
4168 END
4169 ;
4170 }
4171
4172 for ($n=0; $n<=@categories; $n = $n + $i) {
4173 for ($i=0; $i<=3; $i++) {
4174 if ($i eq 0) { print "<tr>\n"; }
4175 if (($n+$i) < @categories) {
4176 print "<td width='15%'>@categories[$n+$i]:<\/td>\n";
4177 print "<td width='10%'><input type='checkbox' name=@filtergroups[$n+$i] $checked{@filtergroups[$n+$i]}{'on'} /></td>\n";
4178 }
4179 if ($i eq 3) { print "<\/tr>\n"; }
4180 }
4181 }
4182
4183 print <<END
4184 </table>
4185 <hr size='1'>
4186 <table width='100%'>
4187 <tr>
4188 <td><b>$Lang::tr{'urlfilter custom blacklist'}</b></td>
4189 <td>&nbsp;</td>
4190 <td>&nbsp;</td>
4191 <td>&nbsp;</td>
4192 </tr>
4193 <tr>
4194 <td colspan='2'>$Lang::tr{'urlfilter blocked domains'}&nbsp;<img src='/blob.gif' alt='*' /></td>
4195 <td colspan='2'>$Lang::tr{'urlfilter blocked urls'}&nbsp;<img src='/blob.gif' alt='*' /></td>
4196 </tr>
4197 <tr>
4198 <td colspan='2' width='50%'><textarea name='CUSTOM_BLACK_DOMAINS' cols='32' rows='6' wrap='off'>
4199 END
4200 ;
4201
4202 print $filtersettings{'CUSTOM_BLACK_DOMAINS'};
4203
4204 print <<END
4205 </textarea></td>
4206 <td colspan='2' width='50%'><textarea name='CUSTOM_BLACK_URLS' cols='32' rows='6' wrap='off'>
4207 END
4208 ;
4209
4210 print $filtersettings{'CUSTOM_BLACK_URLS'};
4211
4212 print <<END
4213 </textarea></td>
4214 </tr>
4215 </table>
4216 <table width='100%'>
4217 <tr>
4218 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom blacklist'}:</td>
4219 <td><input type='checkbox' name='ENABLE_CUSTOM_BLACKLIST' $checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} /></td>
4220 <td>&nbsp;</td>
4221 <td>&nbsp;</td>
4222 </tr>
4223 </table>
4224 <hr size='1'>
4225 <table width='100%'>
4226 <tr>
4227 <td><b>$Lang::tr{'urlfilter custom whitelist'}</b></td>
4228 <td>&nbsp;</td>
4229 <td>&nbsp;</td>
4230 <td>&nbsp;</td>
4231 </tr>
4232 <tr>
4233 <td colspan='2'>$Lang::tr{'urlfilter allowed domains'}&nbsp;<img src='/blob.gif' alt='*' /></td>
4234 <td colspan='2'>$Lang::tr{'urlfilter allowed urls'}&nbsp;<img src='/blob.gif' alt='*' /></td>
4235 </tr>
4236 <tr>
4237 <td colspan='2' width='50%'><textarea name='CUSTOM_WHITE_DOMAINS' cols='32' rows='6' wrap='off'>
4238 END
4239 ;
4240
4241 print $filtersettings{'CUSTOM_WHITE_DOMAINS'};
4242
4243 print <<END
4244 </textarea></td>
4245 <td colspan='2' width='50%'><textarea name='CUSTOM_WHITE_URLS' cols='32' rows='6' wrap='off'>
4246 END
4247 ;
4248
4249 print $filtersettings{'CUSTOM_WHITE_URLS'};
4250
4251 print <<END
4252 </textarea></td>
4253 </tr>
4254 </table>
4255 <table width='100%'>
4256 <tr>
4257 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom whitelist'}:</td>
4258 <td><input type='checkbox' name='ENABLE_CUSTOM_WHITELIST' $checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} /></td>
4259 <td>&nbsp;</td>
4260 <td>&nbsp;</td>
4261 </tr>
4262 </table>
4263 <hr size='1'>
4264 <table width='100%'>
4265 <tr>
4266 <td colspan='4'><b>$Lang::tr{'urlfilter custom expression list'}</b></td>
4267 </tr>
4268 <tr>
4269 <td colspan='4'>$Lang::tr{'urlfilter blocked expressions'}&nbsp;<img src='/blob.gif' alt='*' /></td>
4270 </tr>
4271 <tr>
4272 <td colspan='4'><textarea name='CUSTOM_EXPRESSIONS' cols='70' rows='3' wrap='off'>
4273 END
4274 ;
4275
4276 print $filtersettings{'CUSTOM_EXPRESSIONS'};
4277
4278 print <<END
4279 </textarea></td>
4280 </tr>
4281 <tr>
4282 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom expression list'}:</td>
4283 <td><input type='checkbox' name='ENABLE_CUSTOM_EXPRESSIONS' $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} /></td>
4284 <td>&nbsp;</td>
4285 <td>&nbsp;</td>
4286 </tr>
4287 </table>
4288 <hr size='1'>
4289 <table width='100%'>
4290 <tr>
4291 <td colspan='4'><b>$Lang::tr{'urlfilter file ext block'}</b></td>
4292 </tr>
4293 <tr>
4294 <td width='25%' class='base'>$Lang::tr{'urlfilter block executables'}:</td>
4295 <td width='12%'><input type='checkbox' name='BLOCK_EXECUTABLES' $checked{'BLOCK_EXECUTABLES'}{'on'} /></td>
4296 <td width='25%' class='base'>$Lang::tr{'urlfilter block audio-video'}:</td>
4297 <td><input type='checkbox' name='BLOCK_AUDIO-VIDEO' $checked{'BLOCK_AUDIO-VIDEO'}{'on'} /></td>
4298 </tr>
4299 <tr>
4300 <td class='base'>$Lang::tr{'urlfilter block archives'}:</td>
4301 <td><input type='checkbox' name='BLOCK_ARCHIVES' $checked{'BLOCK_ARCHIVES'}{'on'} /></td>
4302 <td>&nbsp;</td>
4303 <td>&nbsp;</td>
4304 </tr>
4305 </table>
4306 <hr size='1'>
4307 <table width='100%'>
4308 <tr>
4309 <td colspan='4'><b>$Lang::tr{'urlfilter local file redirection'}</b></td>
4310 </tr>
4311 <tr>
4312 <td width='25%' class='base'>$Lang::tr{'urlfilter enable rewrite rules'}:</td>
4313 <td width='12%'><input type='checkbox' name='ENABLE_REWRITE' $checked{'ENABLE_REWRITE'}{'on'} /></td>
4314 <td>&nbsp;</td>
4315 <td>&nbsp;</td>
4316 </tr>
4317 <tr>
4318 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter manage repository'}'></td>
4319 <td>&nbsp;</td>
4320 <td>&nbsp;</td>
4321 <td>&nbsp;</td>
4322 </tr>
4323 </table>
4324 <hr size='1'>
4325 <table width='100%'>
4326 <tr>
4327 <td colspan='2'><b>$Lang::tr{'urlfilter network access control'}</b></td>
4328 <td>&nbsp;</td>
4329 <td>&nbsp;</td>
4330 </tr>
4331 <tr>
4332 <td class='base'>$Lang::tr{'urlfilter unfiltered clients'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
4333 <td><input type='text' name='UNFILTERED_CLIENTS' value='$filtersettings{'UNFILTERED_CLIENTS'}' size='30' /></td>
4334 <td class='base'>$Lang::tr{'urlfilter banned clients'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
4335 <td><input type='text' name='BANNED_CLIENTS' value='$filtersettings{'BANNED_CLIENTS'}' size='30' /></td>
4336 </tr>
4337 </table>
4338 <hr size='1'>
4339 <table width='100%'>
4340 <tr>
4341 <td colspan='4'><b>$Lang::tr{'urlfilter timebased access control'}</b></td>
4342 </tr>
4343 <tr>
4344 <td width='25%'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter set time constraints'}'></td>
4345 <td width='25%'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter set user quota'}'></td>
4346 <td>&nbsp;</td>
4347 <td>&nbsp;</td>
4348 </tr>
4349 </table>
4350 <hr size='1'>
4351 <table width='100%'>
4352 <tr>
4353 <td colspan='4'><b>$Lang::tr{'urlfilter block settings'}</b></td>
4354 </tr>
4355 <tr>
4356 <td width='25%' class='base'>$Lang::tr{'urlfilter show category'}:</td>
4357 <td width='12%'><input type='checkbox' name='SHOW_CATEGORY' $checked{'SHOW_CATEGORY'}{'on'} /></td>
4358 <td width='25%' class='base'>$Lang::tr{'urlfilter redirectpage'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
4359 <td><input type='text' name='REDIRECT_PAGE' value='$filtersettings{'REDIRECT_PAGE'}' size='40' /></td>
4360 </tr>
4361 <tr>
4362 <td class='base'>$Lang::tr{'urlfilter show url'}:</td>
4363 <td><input type='checkbox' name='SHOW_URL' $checked{'SHOW_URL'}{'on'} /></td>
4364 <td class='base'>$Lang::tr{'urlfilter msg text 1'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
4365 <td><input type='text' name='MSG_TEXT_1' value='$filtersettings{'MSG_TEXT_1'}' size='40' /></td>
4366 </tr>
4367 <tr>
4368 <td class='base'>$Lang::tr{'urlfilter show ip'}:</td>
4369 <td><input type='checkbox' name='SHOW_IP' $checked{'SHOW_IP'}{'on'} /></td>
4370 <td class='base'>$Lang::tr{'urlfilter msg text 2'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
4371 <td><input type='text' name='MSG_TEXT_2' value='$filtersettings{'MSG_TEXT_2'}' size='40' /></td>
4372 </tr>
4373 <tr>
4374 <td class='base'>$Lang::tr{'urlfilter show dnserror'}:</td>
4375 <td><input type='checkbox' name='ENABLE_DNSERROR' $checked{'ENABLE_DNSERROR'}{'on'} /></td>
4376 <td class='base'>$Lang::tr{'urlfilter msg text 3'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
4377 <td><input type='text' name='MSG_TEXT_3' value='$filtersettings{'MSG_TEXT_3'}' size='40' /></td>
4378 </tr>
4379 <tr>
4380 <td class='base'>$Lang::tr{'urlfilter enable jpeg'}:</td>
4381 <td><input type='checkbox' name='ENABLE_JPEG' $checked{'ENABLE_JPEG'}{'on'} /></td>
4382 <td>&nbsp;</td>
4383 <td>&nbsp;</td>
4384 </tr>
4385 </table>
4386 <table width='100%'>
4387 <tr>
4388 <td class='base'><b>$Lang::tr{'urlfilter background image'}</b></td>
4389 </tr>
4390 <tr>
4391 <td><br>$Lang::tr{'urlfilter background text'}:</td>
4392 </tr>
4393 <tr>
4394 <td><input type='file' name='BACKGROUND' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload background'}' /></td>
4395 </tr>
4396 </table>
4397 <hr size='1'>
4398 <table width='100%'>
4399 <tr>
4400 <td colspan='4'><b>$Lang::tr{'urlfilter advanced settings'}</b></td>
4401 </tr>
4402 <tr>
4403 <td width='25%' class='base'>$Lang::tr{'urlfilter enable expression lists'}:</td>
4404 <td width='12%'><input type='checkbox' name='ENABLE_EXPR_LISTS' $checked{'ENABLE_EXPR_LISTS'}{'on'} /></td>
4405 <td width='25%' class='base'>$Lang::tr{'urlfilter enable log'}:</td>
4406 <td><input type='checkbox' name='ENABLE_LOG' $checked{'ENABLE_LOG'}{'on'} /></td>
4407 </tr>
4408 <tr>
4409 <td class='base'>$Lang::tr{'urlfilter safesearch'}:</td>
4410 <td><input type='checkbox' name='ENABLE_SAFESEARCH' $checked{'ENABLE_SAFESEARCH'}{'on'} /></td>
4411 <td class='base'>$Lang::tr{'urlfilter username log'}:</td>
4412 <td><input type='checkbox' name='ENABLE_USERNAME_LOG' $checked{'ENABLE_USERNAME_LOG'}{'on'} /></td>
4413 </tr>
4414 <tr>
4415 <td class='base'>$Lang::tr{'urlfilter empty ads'}:</td>
4416 <td><input type='checkbox' name='ENABLE_EMPTY_ADS' $checked{'ENABLE_EMPTY_ADS'}{'on'} /></td>
4417 <td class='base'>$Lang::tr{'urlfilter category log'}:</td>
4418 <td><input type='checkbox' name='ENABLE_CATEGORY_LOG' $checked{'ENABLE_CATEGORY_LOG'}{'on'} /></td>
4419 </tr>
4420 <tr>
4421 <td class='base'>$Lang::tr{'urlfilter block ip'}:</td>
4422 <td><input type='checkbox' name='BLOCK_IP_ADDR' $checked{'BLOCK_IP_ADDR'}{'on'} /></td>
4423 <td class='base'>$Lang::tr{'urlfilter children'}:</td>
4424 <td><input type='text' name='CHILDREN' value='$filtersettings{'CHILDREN'}' size='5' /></td>
4425 </tr>
4426 <tr>
4427 <td class='base'>$Lang::tr{'urlfilter block all'}:</td>
4428 <td><input type='checkbox' name='BLOCK_ALL' $checked{'BLOCK_ALL'}{'on'} /></td>
4429 <td class='base'>$Lang::tr{'urlfilter whitelist always allowed'}:</td>
4430 <td><input type='checkbox' name='ENABLE_GLOBAL_WHITELIST' $checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} /></td>
4431 </tr>
4432 </table>
4433 <hr size='1'>
4434 <table width='100%'>
4435 <tr>
4436 <td>
4437 <img src='/blob.gif' align='top' alt='*' />&nbsp;
4438 <font class='base'>$Lang::tr{'this field may be blank'}</font>
4439 </td>
4440 <td align='right'>
4441 <sup><small><a href='http://www.urlfilter.net' target='_blank'>URL filter</a></small></sup>
4442 </td>
4443 </tr>
4444 </table>
4445 <table width='100%'>
4446 <tr>
4447 <td>&nbsp;</td>
4448 <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
4449 <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter save and restart'}' /></td>
4450 <td>&nbsp;</td>
4451 </tr>
4452 </table>
4453 END
4454 ;
4455
4456 &Header::closebox();
4457
4458 print "</form>\n";
4459
4460 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
4461
4462 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter maintenance'}:");
4463
4464 print <<END
4465 <table width='100%'>
4466 <tr>
4467 <td class='base'><b>$Lang::tr{'urlfilter blacklist update'}</b></td>
4468 </tr>
4469 <tr>
4470 <td>$Lang::tr{'urlfilter upload information'}<p>$Lang::tr{'urlfilter upload text'}:</td>
4471 </tr>
4472 <tr>
4473 <td><input type='file' name='UPDATEFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload blacklist'}' /></td>
4474 </tr>
4475 </table>
4476
4477 <hr size='1'>
4478
4479 <table width='100%'>
4480 <tr>
4481 <td colspan='2' class='base'><b>$Lang::tr{'urlfilter automatic blacklist update'}</b>
4482 END
4483 ;
4484 if (-e "$updflagfile")
4485 {
4486 $blacklistage = int(-M "$updflagfile");
4487 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>";
4488 }
4489
4490 $updatesettings{'UPDATE_SCHEDULE'} = 'monthly';
4491 $updatesettings{'CUSTOM_UPDATE_URL'} = '';
4492
4493 if (-e "$updconffile") { &General::readhash("$updconffile", \%updatesettings); }
4494
4495 $checked{'ENABLE_AUTOUPDATE'}{'off'} = '';
4496 $checked{'ENABLE_AUTOUPDATE'}{'on'} = '';
4497 $checked{'ENABLE_AUTOUPDATE'}{$updatesettings{'ENABLE_AUTOUPDATE'}} = "checked='checked'";
4498
4499 $selected{'UPDATE_SCHEDULE'}{$updatesettings{'UPDATE_SCHEDULE'}} = "selected='selected'";
4500
4501 $selected{'UPDATE_SOURCE'}{$updatesettings{'UPDATE_SOURCE'}} = "selected='selected'";
4502
4503 print <<END
4504 </td>
4505 </tr>
4506 <tr>
4507 <td width='25%' class='base'>$Lang::tr{'urlfilter enable automatic blacklist update'}:</td>
4508 <td width='75%' class='base'><input type='checkbox' name='ENABLE_AUTOUPDATE' $checked{'ENABLE_AUTOUPDATE'}{'on'} /></td>
4509 </tr>
4510 <tr>
4511 <td class='base'>$Lang::tr{'urlfilter automatic update schedule'}:</td>
4512 <td class='base'>
4513 <select name='UPDATE_SCHEDULE'>
4514 <option value='daily' $selected{'UPDATE_SCHEDULE'}{'daily'}>$Lang::tr{'urlfilter daily'}</option>
4515 <option value='weekly' $selected{'UPDATE_SCHEDULE'}{'weekly'}>$Lang::tr{'urlfilter weekly'}</option>
4516 <option value='monthly' $selected{'UPDATE_SCHEDULE'}{'monthly'}>$Lang::tr{'urlfilter monthly'}</option>
4517 </select>
4518 </td>
4519 </tr>
4520 <tr>
4521 <td class='base'>$Lang::tr{'urlfilter select source'}:</td>
4522 <td class='base' colspan='2'>
4523 <select name='UPDATE_SOURCE'>
4524 END
4525 ;
4526
4527 foreach (@source_urllist) {
4528 chomp;
4529 $source_name = substr($_,0,rindex($_,","));
4530 $source_url = substr($_,index($_,",")+1);
4531 print "\t<option value='$source_url' $selected{'UPDATE_SOURCE'}{$source_url}>$source_name</option>\n";
4532 }
4533
4534 print <<END
4535 <option value='custom' $selected{'UPDATE_SOURCE'}{'custom'}>$Lang::tr{'urlfilter custom url'}</option>
4536 </select>
4537 </td>
4538 </tr>
4539 <tr>
4540 <td>$Lang::tr{'urlfilter custom url'}:</td>
4541 <td><input type='text' name='CUSTOM_UPDATE_URL' value='$updatesettings{'CUSTOM_UPDATE_URL'}' size='72' /></td>
4542 </tr>
4543 </table>
4544 <table width='100%'>
4545 <tr>
4546 <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>
4547 </tr>
4548 </table>
4549
4550 <hr size='1'>
4551
4552 <table width='100%'>
4553 <tr>
4554 <td class='base'><b>$Lang::tr{'urlfilter blacklist editor'}</b></td>
4555 </tr>
4556 <tr>
4557 <td>$Lang::tr{'urlfilter blacklist editor info'}</td>
4558 </tr>
4559 <tr>
4560 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter blacklist editor'}' /></td>
4561 </tr>
4562 </table>
4563
4564 <hr size='1'>
4565
4566 <table width='100%'>
4567 <tr>
4568 <td colspan='4' class='base'><b>$Lang::tr{'urlfilter backup settings'}</b></td>
4569 </tr>
4570 <tr>
4571 <td width='25%' class='base'>$Lang::tr{'urlfilter enable full backup'}:</td>
4572 <td width='12%' class='base'><input type='checkbox' name='ENABLE_FULLBACKUP' $checked{'ENABLE_FULLBACKUP'}{'on'} /></td>
4573 <td>&nbsp;</td>
4574 <td>&nbsp;</td>
4575 </tr>
4576 <tr>
4577 <td colspan='4' class='base'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter backup'}' /></td>
4578 </tr>
4579 </table>
4580
4581 <hr size='1'>
4582
4583 <table width='100%'>
4584 <tr>
4585 <td class='base'><b>$Lang::tr{'urlfilter restore settings'}</b></td>
4586 </tr>
4587 <tr>
4588 <td>$Lang::tr{'urlfilter restore text'}:</td>
4589 </tr>
4590 <tr>
4591 <td><input type='file' name='UPDATEFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter restore'}' /></td>
4592 </tr>
4593 </table>
4594 </form>
4595 END
4596 ;
4597
4598 &Header::closebox();
4599
4600 } else {
4601
4602 #==========================================================
4603 #
4604 # Section: Manage Repository
4605 #
4606 #==========================================================
4607
4608 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
4609
4610 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter manage local file repository'}:");
4611 print <<END
4612 <table width='100%'>
4613 <tr>
4614 <td>$Lang::tr{'urlfilter repository information'}<br><br></td>
4615 </tr>
4616 <tr>
4617 <td>$Lang::tr{'urlfilter upload file text'}:</td>
4618 </tr>
4619 <tr>
4620 <td><input type='file' name='UPLOADFILE' size='50' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload file'}' /></td>
4621 </tr>
4622 <tr>
4623 <td><br><b>$Lang::tr{'urlfilter upload file information 1'}:</b> $Lang::tr{'urlfilter upload file information 2'}</td>
4624 </tr>
4625 </table>
4626 <hr size='1'>
4627 <table width='100%'>
4628 <tr>
4629 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
4630 </tr>
4631 </table>
4632 </form>
4633 END
4634 ;
4635
4636 &Header::closebox();
4637
4638 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter current files'}: </b>[$repository]");
4639
4640 @repositorylist = <$repository/*>;
4641
4642 undef @repositoryfiles;
4643 foreach (@repositorylist)
4644 {
4645 if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); }
4646 }
4647
4648 if (@repositoryfiles)
4649 {
4650 print <<END
4651 <table width='100%'>
4652 <tr>
4653 <td align='center'><b>$Lang::tr{'urlfilter filename'}</b></td>
4654 <td width='15%' align='center'><b>$Lang::tr{'urlfilter filesize'}</b></td>
4655 <td width='10%'></td>
4656 </tr>
4657 END
4658 ;
4659 $id = 0;
4660 foreach $line (@repositoryfiles)
4661 {
4662 $id++;
4663 if ($id % 2) {
4664 print "<tr bgcolor='$Header::table1colour'>\n"; }
4665 else {
4666 print "<tr bgcolor='$Header::table2colour'>\n"; }
4667 $filesize = (-s "$repository/$line");
4668 1 while $filesize =~ s/^(-?\d+)(\d{3})/$1.$2/;
4669
4670 print <<END
4671 <td>&nbsp; &nbsp;$line</td>
4672 <td align='right'>$filesize&nbsp; &nbsp;</td>
4673
4674 <td align='center'>
4675 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
4676 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
4677 <input type='hidden' name='ID' value='$line' />
4678 <input type='hidden' name='ACTION' value='$Lang::tr{'urlfilter remove file'}' />
4679 </form>
4680 </td>
4681
4682 </tr>
4683 END
4684 ;
4685 }
4686
4687 print <<END
4688 </table>
4689 <table>
4690 <tr>
4691 </tr>
4692 </table>
4693 <table>
4694 <tr>
4695 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
4696 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
4697 <td class='base'>$Lang::tr{'remove'}</td>
4698 </tr>
4699 </table>
4700 END
4701 ;
4702 } else {
4703
4704 print "<i>$Lang::tr{'urlfilter empty repository'}</i>\n";
4705 }
4706
4707 &Header::closebox();
4708
4709 }
4710
4711 } elsif ($tcsettings{'TCMODE'}) {
4712
4713 #==========================================================
4714 #
4715 # Section: Set Time Constraints
4716 #
4717 #==========================================================
4718
4719 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
4720
4721 $buttontext = $Lang::tr{'urlfilter add rule'};
4722 if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) {
4723 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit time constraint rule'}.':');
4724 $buttontext = $Lang::tr{'urlfilter update rule'};
4725 } else {
4726 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new time constraint rule'}.':');
4727 }
4728 print <<END
4729
4730 <table width='100%'>
4731 <tr>
4732 <td width='2%'>$Lang::tr{'urlfilter constraint definition'}</td>
4733 <td width='1%'>&nbsp;&nbsp;</td>
4734 <td width='2%' align='center'>$Lang::tr{'urlfilter monday'}</td>
4735 <td width='2%' align='center'>$Lang::tr{'urlfilter tuesday'}</td>
4736 <td width='2%' align='center'>$Lang::tr{'urlfilter wednesday'}</td>
4737 <td width='2%' align='center'>$Lang::tr{'urlfilter thursday'}</td>
4738 <td width='2%' align='center'>$Lang::tr{'urlfilter friday'}</td>
4739 <td width='2%' align='center'>$Lang::tr{'urlfilter saturday'}</td>
4740 <td width='2%' align='center'>$Lang::tr{'urlfilter sunday'}</td>
4741 <td width='1%'>&nbsp;&nbsp;</td>
4742 <td width='7%' colspan=3>$Lang::tr{'urlfilter from'}</td>
4743 <td width='1%'>&nbsp;</td>
4744 <td width='7%' colspan=3>$Lang::tr{'urlfilter to'}</td>
4745 <td>&nbsp;</td>
4746 </tr>
4747 <tr>
4748 <td class='base'>
4749 <select name='DEFINITION'>
4750 <option value='within' $selected{'DEFINITION'}{'within'}>$Lang::tr{'urlfilter constraint within'}</option>
4751 <option value='outside' $selected{'DEFINITION'}{'outside'}>$Lang::tr{'urlfilter constraint outside'}</option>
4752 </select>
4753 </td>
4754 <td>&nbsp;</td>
4755 <td class='base'><input type='checkbox' name='MON' $checked{'MON'}{'on'} /></td>
4756 <td class='base'><input type='checkbox' name='TUE' $checked{'TUE'}{'on'} /></td>
4757 <td class='base'><input type='checkbox' name='WED' $checked{'WED'}{'on'} /></td>
4758 <td class='base'><input type='checkbox' name='THU' $checked{'THU'}{'on'} /></td>
4759 <td class='base'><input type='checkbox' name='FRI' $checked{'FRI'}{'on'} /></td>
4760 <td class='base'><input type='checkbox' name='SAT' $checked{'SAT'}{'on'} /></td>
4761 <td class='base'><input type='checkbox' name='SUN' $checked{'SUN'}{'on'} /></td>
4762 <td>&nbsp;</td>
4763 <td class='base'>
4764 <select name='FROM_HOUR'>
4765 END
4766 ;
4767 for ($i=0;$i<=24;$i++) {
4768 $_ = sprintf("%02s",$i);
4769 print "<option $selected{'FROM_HOUR'}{$_}>$_</option>\n";
4770 }
4771 print <<END
4772 </select>
4773 </td>
4774 <td>:</td>
4775 <td class='base'>
4776 <select name='FROM_MINUTE'>
4777 END
4778 ;
4779 for ($i=0;$i<=45;$i+=15) {
4780 $_ = sprintf("%02s",$i);
4781 print "<option $selected{'FROM_MINUTE'}{$_}>$_</option>\n";
4782 }
4783 print <<END
4784 </select>
4785 <td> - </td>
4786 </td>
4787 <td class='base'>
4788 <select name='TO_HOUR'>
4789 END
4790 ;
4791 for ($i=0;$i<=24;$i++) {
4792 $_ = sprintf("%02s",$i);
4793 print "<option $selected{'TO_HOUR'}{$_}>$_</option>\n";
4794 }
4795 print <<END
4796 </select>
4797 </td>
4798 <td>:</td>
4799 <td class='base'>
4800 <select name='TO_MINUTE'>
4801 END
4802 ;
4803 for ($i=0;$i<=45;$i+=15) {
4804 $_ = sprintf("%02s",$i);
4805 print "<option $selected{'TO_MINUTE'}{$_}>$_</option>\n";
4806 }
4807 print <<END
4808 </select>
4809 </td>
4810 <td>&nbsp;</td>
4811 </tr>
4812 </table>
4813
4814 <br>
4815
4816 <table width='100%'>
4817 <tr>
4818 <td width='5%'>$Lang::tr{'urlfilter source'}</td>
4819 <td width='1%'>&nbsp;&nbsp;</td>
4820 <td width='5%'>$Lang::tr{'urlfilter dst'}&nbsp;<img src='/blob.gif' alt='*'><img src='/blob.gif' alt='*'></td>
4821 <td width='1%'>&nbsp;&nbsp;</td>
4822 <td width='5%'>$Lang::tr{'urlfilter access'}</td>
4823 <td>&nbsp;</td>
4824 </tr>
4825 <tr>
4826 <td valign='top'><input type='text' name='SRC' value='$tcsettings{'SRC'}' size='32' /></td>
4827 <td>&nbsp;</td>
4828 <td class='base' rowspan='3' valign='top'>
4829 <select name='DST' size='4' multiple>
4830 <option value='any' $selected{'DST'}{'any'} = "selected='selected'">$Lang::tr{'urlfilter category all'}</option>
4831 <option value='in-addr' $selected{'DST'}{'in-addr'} = "selected='selected'">in-addr</option>
4832 END
4833 ;
4834
4835 &readblockcategories;
4836 foreach (@categories)
4837 {
4838 print "<option value='$_' $selected{'DST'}{$_}>$_</option>\n";
4839 }
4840
4841 print <<END
4842 <option value='files' $selected{'DST'}{'files'} = "selected='selected'">files</option>
4843 <option value='custom-blocked' $selected{'DST'}{'custom-blocked'} = "selected='selected'">custom-blocked</option>
4844 <option value='custom-expressions' $selected{'DST'}{'custom-expressions'} = "selected='selected'">custom-expressions</option>
4845 </select>
4846 </td>
4847 <td>&nbsp;</td>
4848 <td class='base' valign='top'>
4849 <select name='ACCESS'>
4850 <option value='block' $selected{'ACCESS'}{'block'}>$Lang::tr{'urlfilter mode block'}</option>
4851 <option value='allow' $selected{'ACCESS'}{'allow'}>$Lang::tr{'urlfilter mode allow'}</option>
4852 </select>
4853 </td>
4854 <td>&nbsp;</td>
4855 </tr>
4856 <tr>
4857 <td>$Lang::tr{'remark'}&nbsp;<img src='/blob.gif' alt='*'></td>
4858 <td>&nbsp;</td>
4859 <td>&nbsp;</td>
4860 <td>&nbsp;</td>
4861 <td>&nbsp;</td>
4862 </tr>
4863 <tr>
4864 <td><input type='text' name='COMMENT' value='$tcsettings{'COMMENT'}' size='32' /></td>
4865 <td>&nbsp;</td>
4866 <td>&nbsp;</td>
4867 <td>&nbsp;</td>
4868 <td>&nbsp;</td>
4869 </tr>
4870 </table>
4871
4872 <table width='100%'>
4873 <tr>
4874 <td class='base'>$Lang::tr{'urlfilter enabled'}<input type='checkbox' name='ENABLERULE' $checked{'ENABLERULE'}{'on'} /></td>
4875 </tr>
4876 </table>
4877
4878 <p>
4879
4880 <table width='50%'>
4881 <tr>
4882 <td><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /></td>
4883 <td><input type='hidden' name='MODE' value='TIMECONSTRAINT' /></td>
4884 <td><input type='submit' name='SUBMIT' value='$buttontext' /></td>
4885 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
4886 <td>&nbsp;</td>
4887 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
4888 </tr>
4889 </table>
4890 <p>
4891 <table width='100%'>
4892 <tr>
4893 <td width='1%' align='right'> <img src='/blob.gif' align='top' alt='*' />&nbsp;</td>
4894 <td><font class='base'>$Lang::tr{'this field may be blank'}</font></td>
4895 </tr>
4896 <tr>
4897 <td width='1%' align='right'><img src='/blob.gif' align='top' alt='*' /><img src='/blob.gif' align='top' alt='*' />&nbsp;</td>
4898 <td><font class='base'>$Lang::tr{'urlfilter select multi'}</font></td>
4899 </tr>
4900 </table>
4901 END
4902 ;
4903
4904 if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) {
4905 print "<input type='hidden' name='EDITING' value='$tcsettings{'ID'}' />\n";
4906 } else {
4907 print "<input type='hidden' name='EDITING' value='no' />\n";
4908 }
4909
4910 &Header::closebox();
4911 print "</form>\n";
4912
4913 &Header::openbox('100%', 'left', $Lang::tr{'current rules'});
4914 print <<END
4915 <table width='100%'>
4916 <tr>
4917 <td width='5%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter constraint definition'}</b></td>
4918 <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter time space'}</b></td>
4919 <td width='15%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter src'}</b></td>
4920 <td width='5%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter dst'}</b></td>
4921 <td width='10%' class='boldbase' colspan='4' align='center'>&nbsp;</td>
4922 </tr>
4923 END
4924 ;
4925
4926 if ($tcsettings{'ACTION'} ne '' or $changed ne 'no')
4927 {
4928 open(FILE, $tcfile);
4929 @tclist = <FILE>;
4930 close(FILE);
4931 }
4932
4933 $id = 0;
4934 foreach $line (@tclist)
4935 {
4936 $id++;
4937 chomp($line);
4938 @temp = split(/\,/,$line);
4939 if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) {
4940 print "<tr bgcolor='$Header::colouryellow'>\n"; }
4941 elsif ($id % 2) {
4942 print "<tr bgcolor='$Header::table1colour'>\n"; }
4943 else {
4944 print "<tr bgcolor='$Header::table2colour'>\n"; }
4945 if ($temp[0] eq 'within') { $temp[0]=$Lang::tr{'urlfilter constraint within'}; } else { $temp[0]=$Lang::tr{'urlfilter constraint outside'}; }
4946 if ($temp[13] eq 'any') { $temp[13]=$Lang::tr{'urlfilter category all'}; }
4947 if ($temp[15] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};}
4948 else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; }
4949 if ($temp[14] eq 'block') { $led='led-red.gif'; $ldesc=$Lang::tr{'urlfilter block access'};}
4950 else { $led='led-green.gif'; $ldesc=$Lang::tr{'urlfilter allow access'}; }
4951
4952 undef $time;
4953 if ($temp[1] eq 'on') { $time.=$Lang::tr{'urlfilter mon'}; } else { $time.='='; }
4954 if ($temp[2] eq 'on') { $time.=$Lang::tr{'urlfilter tue'}; } else { $time.='='; }
4955 if ($temp[3] eq 'on') { $time.=$Lang::tr{'urlfilter wed'}; } else { $time.='='; }
4956 if ($temp[4] eq 'on') { $time.=$Lang::tr{'urlfilter thu'}; } else { $time.='='; }
4957 if ($temp[5] eq 'on') { $time.=$Lang::tr{'urlfilter fri'}; } else { $time.='='; }
4958 if ($temp[6] eq 'on') { $time.=$Lang::tr{'urlfilter sat'}; } else { $time.='='; }
4959 if ($temp[7] eq 'on') { $time.=$Lang::tr{'urlfilter sun'}; } else { $time.='='; }
4960 $time=$time.' &nbsp; '.$temp[8].':'.$temp[9].' to '.$temp[10].':'.$temp[11];
4961
4962 print <<END
4963 <td align='center'>$temp[0]</td>
4964 <td align='center' nowrap>$time</td>
4965 <td align='center'>$temp[12]</td>
4966 <td align='center'>$temp[13]</td>
4967 <td align='center'><image src='/images/urlfilter/$led' alt='$ldesc'></td>
4968
4969 <td align='center'>
4970 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
4971 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' title='$gdesc' alt='$gdesc' />
4972 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
4973 <input type='hidden' name='ID' value='$id' />
4974 <input type='hidden' name='ACTIVE' value='$toggle' />
4975 <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
4976 </form>
4977 </td>
4978
4979 <td align='center'>
4980 <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>
4981 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' title='$Lang::tr{'edit'}' alt='$Lang::tr{'edit'}' />
4982 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
4983 <input type='hidden' name='ID' value='$id' />
4984 <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
4985 </form>
4986 </td>
4987
4988 <td align='center'>
4989 <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>
4990 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
4991 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
4992 <input type='hidden' name='ID' value='$id' />
4993 <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
4994 </form>
4995 </td>
4996
4997 </tr>
4998 END
4999 ;
5000 if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) {
5001 print "<tr bgcolor='$Header::colouryellow'>\n"; }
5002 elsif ($id % 2) {
5003 print "<tr bgcolor='$Header::table1colour'>\n"; }
5004 else {
5005 print "<tr bgcolor='$Header::table2colour'>\n"; }
5006 print <<END
5007 <td align='center' colspan='4'>$temp[16]
5008 </td>
5009 <td align='center' colspan='4'>
5010 </td>
5011 </tr>
5012 END
5013 ;
5014 }
5015
5016 print "</table>\n";
5017
5018 # If the time constraint file contains entries, print entries and action icons
5019 if (! -z "$tcfile") {
5020 print <<END
5021
5022 <table>
5023 <tr>
5024 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
5025 <td>&nbsp; &nbsp; <img src='/images/urlfilter/led-green.gif' alt='$Lang::tr{'urlfilter allow access'}' /></td>
5026 <td class='base'>$Lang::tr{'urlfilter allow'}</td>
5027 <td>&nbsp; &nbsp; <img src='/images/urlfilter/led-red.gif' alt='$Lang::tr{'urlfilter block access'}' /></td>
5028 <td class='base'>$Lang::tr{'urlfilter block'}</td>
5029 <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
5030 <td class='base'>$Lang::tr{'click to disable'}</td>
5031 <td>&nbsp; &nbsp; <img src='/images/off.gif' alt='$Lang::tr{'click to enable'}' /></td>
5032 <td class='base'>$Lang::tr{'click to enable'}</td>
5033 <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
5034 <td class='base'>$Lang::tr{'edit'}</td>
5035 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
5036 <td class='base'>$Lang::tr{'remove'}</td>
5037 </tr>
5038 </table>
5039 END
5040 ;
5041 }
5042
5043 &Header::closebox();
5044
5045 } elsif ($uqsettings{'UQMODE'}) {
5046
5047 #==========================================================
5048 #
5049 # Section: Set User Quota
5050 #
5051 #==========================================================
5052
5053 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
5054
5055 $buttontext = $Lang::tr{'urlfilter add rule'};
5056 if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) {
5057 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit user quota rule'}.':');
5058 $buttontext = $Lang::tr{'urlfilter update rule'};
5059 } else {
5060 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new user quota rule'}.':');
5061 }
5062 print <<END
5063
5064 <table width='100%'>
5065 <tr>
5066 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
5067 </tr>
5068 <tr>
5069 <td class='base'>$Lang::tr{'urlfilter user time quota'}:</td>
5070 <td><input type='text' name='TIME_QUOTA' value='$uqsettings{'TIME_QUOTA'}' size='5' /></td>
5071 <td colspan='2' rowspan= '5' valign='top' class='base'>
5072 <table cellpadding='0' cellspacing='0'>
5073 <tr>
5074 <!-- intentionally left empty -->
5075 </tr>
5076 <tr>
5077 <td>$Lang::tr{'urlfilter assigned quota users'}:</td>
5078 </tr>
5079 <tr>
5080 <!-- intentionally left empty -->
5081 </tr>
5082 <tr>
5083 <!-- intentionally left empty -->
5084 </tr>
5085 <tr>
5086 <td><textarea name='QUOTA_USERS' cols='32' rows='6' wrap='off'>
5087 END
5088 ;
5089
5090 $uqsettings{'QUOTA_USERS'} =~ s/\|/\n/g;
5091 print $uqsettings{'QUOTA_USERS'};
5092
5093 print <<END
5094 </textarea></td>
5095 </tr>
5096 </table>
5097 </td>
5098 </tr>
5099 <tr>
5100 <td class='base'>$Lang::tr{'urlfilter activity detection'}:</td>
5101 <td class='base'><select name='SPORADIC'>
5102 <option value='0' $selected{'SPORADIC'}{'0'}>$Lang::tr{'urlfilter disabled'}</option>
5103 <option value='300' $selected{'SPORADIC'}{'300'}>5 $Lang::tr{'urlfilter minutes'}</option>
5104 <option value='900' $selected{'SPORADIC'}{'900'}>15 $Lang::tr{'urlfilter minutes'}</option>
5105 </select></td>
5106 </tr>
5107 <tr>
5108 <td class='base'>$Lang::tr{'urlfilter renewal period'}:</td>
5109 <td class='base'><select name='RENEWAL'>
5110 <option value='hourly' $selected{'RENEWAL'}{'hourly'}>$Lang::tr{'urlfilter hourly'}</option>
5111 <option value='daily' $selected{'RENEWAL'}{'daily'}>$Lang::tr{'urlfilter daily'}</option>
5112 <option value='weekly' $selected{'RENEWAL'}{'weekly'}>$Lang::tr{'urlfilter weekly'}</option>
5113 </select></td>
5114 </tr>
5115 <tr>
5116 <td colspan='2'>&nbsp;</td>
5117 </tr>
5118 <tr>
5119 <td class='base'>$Lang::tr{'urlfilter enabled'}</td>
5120 <td class='base'><input type='checkbox' name='ENABLEQUOTA' $checked{'ENABLEQUOTA'}{'on'} /></td>
5121 </tr>
5122
5123 </table>
5124 <p>
5125
5126 <table width='50%'>
5127 <tr>
5128 <td><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /></td>
5129 <td><input type='hidden' name='MODE' value='USERQUOTA' /></td>
5130 <td><input type='submit' name='SUBMIT' value='$buttontext' /></td>
5131 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
5132 <td>&nbsp;</td>
5133 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
5134 </tr>
5135 </table>
5136
5137 <p>
5138 END
5139 ;
5140
5141 if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) {
5142 print "<input type='hidden' name='EDITING' value='$uqsettings{'ID'}' />\n";
5143 } else {
5144 print "<input type='hidden' name='EDITING' value='no' />\n";
5145 }
5146
5147 &Header::closebox();
5148 print "</form>\n";
5149
5150 &Header::openbox('100%', 'left', $Lang::tr{'current rules'});
5151 print <<END
5152 <table width='100%'>
5153 <tr>
5154 <td width='15%' class='boldbase' align='center'><b><nobr>$Lang::tr{'urlfilter time quota'}</nobr></b></td>
5155 <td width='15%' class='boldbase' align='center'><b><nobr>$Lang::tr{'urlfilter activity detection'}</nobr></b></td>
5156 <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter renewal'}</b></td>
5157 <td class='boldbase' align='center'><b>$Lang::tr{'urlfilter assigned users'}</b></td>
5158 <td width='20%' class='boldbase' colspan='4' align='center'>&nbsp;</td>
5159 </tr>
5160 END
5161 ;
5162
5163 if ($uqsettings{'ACTION'} ne '' or $changed ne 'no')
5164 {
5165 open(FILE, $uqfile);
5166 @uqlist = <FILE>;
5167 close(FILE);
5168 }
5169
5170 $id = 0;
5171 foreach $line (@uqlist)
5172 {
5173 $id++;
5174 chomp($line);
5175 @temp = split(/\,/,$line);
5176 if($uqsettings{'ACTION'} eq $Lang::tr{'edit'} && $uqsettings{'ID'} eq $id) {
5177 print "<tr bgcolor='$Header::colouryellow'>\n"; }
5178 elsif ($id % 2) {
5179 print "<tr bgcolor='$Header::table1colour'>\n"; }
5180 else {
5181 print "<tr bgcolor='$Header::table2colour'>\n"; }
5182 if ($temp[4] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};}
5183 else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; }
5184
5185 $temp[5] = $temp[1];
5186 if ($temp[1] eq '0') { $temp[5] = $Lang::tr{'urlfilter disabled'} } else { $temp[5] = ($temp[5]/60).' '.$Lang::tr{'urlfilter minutes'} }
5187 $_ = $temp[3]; s/\|/, /g; $temp[6] = $_;
5188
5189 print <<END
5190 <td align='center'>$temp[0] $Lang::tr{'urlfilter minutes'}</td>
5191 <td align='center'>$temp[5]</td>
5192 <td align='center'>$Lang::tr{'urlfilter '.$temp[2]}</td>
5193 <td align='center'>$temp[6]</td>
5194
5195 <td align='center'>
5196 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
5197 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' title='$gdesc' alt='$gdesc' />
5198 <input type='hidden' name='MODE' value='USERQUOTA' />
5199 <input type='hidden' name='ID' value='$id' />
5200 <input type='hidden' name='ACTIVE' value='$toggle' />
5201 <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
5202 </form>
5203 </td>
5204
5205 <td align='center'>
5206 <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>
5207 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' title='$Lang::tr{'edit'}' alt='$Lang::tr{'edit'}' />
5208 <input type='hidden' name='MODE' value='USERQUOTA' />
5209 <input type='hidden' name='ID' value='$id' />
5210 <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
5211 </form>
5212 </td>
5213
5214 <td align='center'>
5215 <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>
5216 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
5217 <input type='hidden' name='MODE' value='USERQUOTA' />
5218 <input type='hidden' name='ID' value='$id' />
5219 <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
5220 </form>
5221 </td>
5222
5223 </tr>
5224 END
5225 ;
5226 }
5227
5228 print "</table>\n";
5229
5230 # If the user quota file contains entries, print entries and action icons
5231 if (! -z "$uqfile") {
5232 print <<END
5233
5234 <table>
5235 <tr>
5236 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
5237 <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
5238 <td class='base'>$Lang::tr{'click to disable'}</td>
5239 <td>&nbsp; &nbsp; <img src='/images/off.gif' alt='$Lang::tr{'click to enable'}' /></td>
5240 <td class='base'>$Lang::tr{'click to enable'}</td>
5241 <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
5242 <td class='base'>$Lang::tr{'edit'}</td>
5243 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
5244 <td class='base'>$Lang::tr{'remove'}</td>
5245 </tr>
5246 </table>
5247 END
5248 ;
5249 }
5250
5251 &Header::closebox();
5252
5253 } else {
5254
5255 #==========================================================
5256 #
5257 # Section: Blacklist editor
5258 #
5259 #==========================================================
5260
5261 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
5262
5263 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter urlfilter blacklist editor'}.':');
5264
5265 print <<END
5266
5267 <table width='100%'>
5268 <tr>
5269 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
5270 </tr>
5271 <tr>
5272 <td class='base'><b>$Lang::tr{'urlfilter blacklist name'}</b></td>
5273 </tr>
5274 <tr>
5275 <td class='base'>$Lang::tr{'urlfilter blacklist category name'}:</td>
5276 <td><input type='text' name='BE_NAME' value='$besettings{'BE_NAME'}' size='12' /></td>
5277 </tr>
5278 </table>
5279 <hr size='1'>
5280 <table width='100%'>
5281 <tr>
5282 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='20%'></td>
5283 </tr>
5284 <tr>
5285 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter edit domains urls expressions'}</b></td>
5286 </tr>
5287 <tr>
5288 <td colspan='2'>$Lang::tr{'urlfilter domains'}</td>
5289 <td colspan='2'>$Lang::tr{'urlfilter urls'}</td>
5290 </tr>
5291 <tr>
5292 <td colspan='2'><textarea name='BE_DOMAINS' cols='38' rows='10' wrap='off'>
5293 END
5294 ;
5295
5296 print $besettings{'BE_DOMAINS'};
5297
5298 print <<END
5299 </textarea></td>
5300 <td colspan='2'><textarea name='BE_URLS' cols='38' rows='10' wrap='off'>
5301 END
5302 ;
5303
5304 print $besettings{'BE_URLS'};
5305
5306 print <<END
5307 </textarea></td>
5308 </tr>
5309 <tr>
5310 <td colspan='4'>$Lang::tr{'urlfilter expressions'}</td>
5311 </tr>
5312 <tr>
5313 <td colspan='4'><textarea name='BE_EXPRESSIONS' cols='80' rows='3' wrap='off'>
5314 END
5315 ;
5316
5317 print $besettings{'BE_EXPRESSIONS'};
5318
5319 print <<END
5320 </textarea></td>
5321 </tr>
5322 </table>
5323 <hr size='1'>
5324 <table width='100%'>
5325 <tr>
5326 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter load blacklist'}</b></td>
5327 </tr>
5328 <tr>
5329 <td width='25%' class='base'>$Lang::tr{'urlfilter select blacklist'}:</td>
5330 <td width='20%' class='base'>
5331 <select name='BE_BLACKLIST'>
5332 END
5333 ;
5334
5335 &readblockcategories;
5336 foreach (@categories)
5337 {
5338 print "<option value='$_' $selected{'BE_BLACKLIST'}{$_}>$_</option>\n";
5339 }
5340
5341 print <<END
5342 </select>
5343 </td>
5344 <td>&nbsp;</td>
5345 <td>&nbsp;</td>
5346 <tr>
5347 <td colpsan='4'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter load blacklist'}' /></td>
5348 </tr>
5349 </tr>
5350 </table>
5351 <hr size='1'>
5352 <table width='100%'>
5353 <tr>
5354 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter import blacklist'}</b></td>
5355 </tr>
5356 <tr>
5357 <td colspan='4'>$Lang::tr{'urlfilter import text'}:</td>
5358 </tr>
5359 <tr>
5360 <td nowrap><input type='file' name='IMPORTFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter import blacklist'}' /></td>
5361 <td><input type='hidden' name='MODE' value='BLACKLIST_EDITOR' /></td>
5362 </tr>
5363 </table>
5364 <hr size='1'>
5365 <table width='100%'>
5366 <tr>
5367 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter export blacklist'}</b></td>
5368 </tr>
5369 <tr>
5370 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter export blacklist'}' /></td>
5371 </tr>
5372 </table>
5373 <hr size='1'>
5374 <table width='100%'>
5375 <tr>
5376 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter install blacklist'}</b></td>
5377 </tr>
5378 <tr>
5379 <td width='25%' class='base'>$Lang::tr{'urlfilter dont restart urlfilter'}:</td>
5380 <td width='20%' class='base'><input type='checkbox' name='NORESTART' $checked{'NORESTART'}{'on'} /></td>
5381 <td>&nbsp;</td>
5382 <td>&nbsp;</td>
5383 </tr>
5384 <tr>
5385 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter install blacklist'}' /></td>
5386 </tr>
5387 <tr>
5388 <td class='base' colspan='4'><br>$Lang::tr{'urlfilter install information'}</td>
5389 </tr>
5390 </table>
5391 <hr size='1'>
5392 <table width='20%'>
5393 <tr>
5394 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
5395 <td>&nbsp;</td>
5396 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
5397 </tr>
5398 </table>
5399
5400 END
5401 ;
5402
5403 &Header::closebox();
5404 print "</form>\n";
5405
5406 }
5407
5408 &Header::closebigbox();
5409
5410 &Header::closepage();
5411
5412 # -------------------------------------------------------------------
5413
5414 sub savesettings
5415 {
5416 &writeconfigfile;
5417
5418 delete $filtersettings{'CUSTOM_BLACK_DOMAINS'};
5419 delete $filtersettings{'CUSTOM_BLACK_URLS'};
5420 delete $filtersettings{'CUSTOM_WHITE_DOMAINS'};
5421 delete $filtersettings{'CUSTOM_WHITE_URLS'};
5422 delete $filtersettings{'CUSTOM_EXPRESSIONS'};
5423 delete $filtersettings{'BACKGROUND'};
5424 delete $filtersettings{'UPDATEFILE'};
5425
5426 &General::writehash("${General::swroot}/urlfilter/settings", \%filtersettings);
5427 }
5428
5429 # -------------------------------------------------------------------
5430
5431 sub readblockcategories
5432 {
5433 undef(@categories);
5434 foreach $blacklist (<$dbdir/*>) {
5435 if (-d $blacklist) {
5436 $lastslashpos = rindex($blacklist,"/");
5437 if ($lastslashpos > -1) {
5438 $section = substr($blacklist,$lastslashpos+1);
5439 } else {
5440 $section = $blacklist;
5441 }
5442 if (!($section eq 'custom')) { push(@categories,$section) };
5443 }
5444 }
5445
5446 @filtergroups = @categories;
5447 foreach (@filtergroups) {
5448 tr/a-z/A-Z/;
5449 $_ = "FILTER_".$_;
5450 }
5451 }
5452
5453 # -------------------------------------------------------------------
5454
5455 sub readcustomlists
5456 {
5457 if (-e "$dbdir/custom/blocked/domains") {
5458 open(FILE,"$dbdir/custom/blocked/domains");
5459 delete $filtersettings{'CUSTOM_BLACK_DOMAINS'};
5460 while (<FILE>) { $filtersettings{'CUSTOM_BLACK_DOMAINS'} .= $_ };
5461 close(FILE);
5462 }
5463
5464 if (-e "$dbdir/custom/blocked/urls") {
5465 open(FILE,"$dbdir/custom/blocked/urls");
5466 delete $filtersettings{'CUSTOM_BLACK_URLS'};
5467 while (<FILE>) { $filtersettings{'CUSTOM_BLACK_URLS'} .= $_ };
5468 close(FILE);
5469 }
5470
5471 if (-e "$dbdir/custom/blocked/expressions") {
5472 open(FILE,"$dbdir/custom/blocked/expressions");
5473 delete $filtersettings{'CUSTOM_EXPRESSIONS'};
5474 while (<FILE>) { $filtersettings{'CUSTOM_EXPRESSIONS'} .= $_ };
5475 close(FILE);
5476 }
5477
5478 if (-e "$dbdir/custom/allowed/domains") {
5479 open(FILE,"$dbdir/custom/allowed/domains");
5480 delete $filtersettings{'CUSTOM_WHITE_DOMAINS'};
5481 while (<FILE>) { $filtersettings{'CUSTOM_WHITE_DOMAINS'} .= $_ };
5482 close(FILE);
5483 }
5484 if (-e "$dbdir/custom/allowed/urls") {
5485 open(FILE,"$dbdir/custom/allowed/urls");
5486 delete $filtersettings{'CUSTOM_WHITE_URLS'};
5487 while (<FILE>) { $filtersettings{'CUSTOM_WHITE_URLS'} .= $_ };
5488 close(FILE);
5489 }
5490 }
5491
5492 # -------------------------------------------------------------------
5493
5494 sub aggregatedconstraints
5495 {
5496 my $aggregated;
5497 my @old;
5498 my @new;
5499 my @tmp1;
5500 my @tmp2;
5501 my $x;
5502
5503 if (-e $tcfile)
5504 {
5505 open(TC, $tcfile);
5506 @old = <TC>;
5507 close(TC);
5508
5509 while (@old > 0)
5510 {
5511 $aggregated = 0;
5512 $x = shift(@old);
5513 chomp($x);
5514 @tmp1 = split(/\,/,$x);
5515 $tmp1[16] = '';
5516 foreach (@new)
5517 {
5518 @tmp2 = split(/\,/);
5519 if ($tmp2[15] eq 'on')
5520 {
5521 if (($tmp1[0] eq $tmp2[0]) && ($tmp1[12] eq $tmp2[12]) && ($tmp1[13] eq $tmp2[13]) && ($tmp1[14] eq $tmp2[14]))
5522 {
5523 $aggregated = 1;
5524 $tmp2[16] .= " weekly ";
5525 if ($tmp1[1] eq 'on') { $tmp2[16] .= "m"; }
5526 if ($tmp1[2] eq 'on') { $tmp2[16] .= "t"; }
5527 if ($tmp1[3] eq 'on') { $tmp2[16] .= "w"; }
5528 if ($tmp1[4] eq 'on') { $tmp2[16] .= "h"; }
5529 if ($tmp1[5] eq 'on') { $tmp2[16] .= "f"; }
5530 if ($tmp1[6] eq 'on') { $tmp2[16] .= "a"; }
5531 if ($tmp1[7] eq 'on') { $tmp2[16] .= "s"; }
5532 $tmp2[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n";
5533 $_ = join(",",@tmp2);
5534 }
5535
5536 }
5537 }
5538 if (!$aggregated)
5539 {
5540 $tmp1[16] .= " weekly ";
5541 if ($tmp1[1] eq 'on') { $tmp1[16] .= "m"; }
5542 if ($tmp1[2] eq 'on') { $tmp1[16] .= "t"; }
5543 if ($tmp1[3] eq 'on') { $tmp1[16] .= "w"; }
5544 if ($tmp1[4] eq 'on') { $tmp1[16] .= "h"; }
5545 if ($tmp1[5] eq 'on') { $tmp1[16] .= "f"; }
5546 if ($tmp1[6] eq 'on') { $tmp1[16] .= "a"; }
5547 if ($tmp1[7] eq 'on') { $tmp1[16] .= "s"; }
5548 $tmp1[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n";
5549 $x = join(",",@tmp1);
5550 push(@new,$x);
5551 }
5552 }
5553 }
5554
5555 return @new;
5556
5557 }
5558
5559 # -------------------------------------------------------------------
5560
5561 sub writeconfigfile
5562 {
5563 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\)\$";
5564 my $audiovideo = "\\.\(aiff|asf|avi|dif|divx|mov|movie|mp3|mpe?g?|mpv2|ogg|ra?m|snd|qt|wav|wmf|wmv\)\$";
5565 my $archives = "\\.\(bin|bz2|cab|cdr|dmg|gz|hqx|rar|smi|sit|sea|tar|tgz|zip\)\$";
5566
5567 my $ident = " anonymous";
5568
5569 my $defaultrule='';
5570 my $tcrule='';
5571 my $redirect='';
5572 my $qredirect='';
5573
5574 my $idx;
5575
5576 my @ec=();
5577 my @tc=();
5578 my @uq=();
5579
5580 if (!(-d "$dbdir/custom")) { mkdir("$dbdir/custom") }
5581 if (!(-d "$dbdir/custom/blocked")) { mkdir("$dbdir/custom/blocked") }
5582 if (!(-d "$dbdir/custom/allowed")) { mkdir("$dbdir/custom/allowed") }
5583
5584 open(FILE, ">/$dbdir/custom/blocked/domains");
5585 print FILE $filtersettings{'CUSTOM_BLACK_DOMAINS'};
5586 close(FILE);
5587 open(FILE, ">/$dbdir/custom/blocked/urls");
5588 print FILE $filtersettings{'CUSTOM_BLACK_URLS'};
5589 close(FILE);
5590 open(FILE, ">/$dbdir/custom/blocked/expressions");
5591 print FILE $filtersettings{'CUSTOM_EXPRESSIONS'};
5592 close(FILE);
5593 open(FILE, ">/$dbdir/custom/blocked/files");
5594 if ($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') { print FILE "$executables\n"; }
5595 if ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') { print FILE "$audiovideo\n"; }
5596 if ($filtersettings{'BLOCK_ARCHIVES'} eq 'on') { print FILE "$archives\n"; }
5597 close(FILE);
5598 open(FILE, ">/$dbdir/custom/allowed/domains");
5599 print FILE $filtersettings{'CUSTOM_WHITE_DOMAINS'};
5600 close(FILE);
5601 open(FILE, ">/$dbdir/custom/allowed/urls");
5602 print FILE $filtersettings{'CUSTOM_WHITE_URLS'};
5603 close(FILE);
5604
5605 if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { $ident = ""; }
5606
5607 if ($filtersettings{'REDIRECT_PAGE'} eq '')
5608 {
5609 if (($filtersettings{'SHOW_CATEGORY'} eq 'on') || ($filtersettings{'SHOW_URL'} eq 'on') || ($filtersettings{'SHOW_IP'} eq 'on')) {
5610 if ($filtersettings{'SHOW_CATEGORY'} eq 'on') { $redirect .= "&category=%t"; }
5611 if ($filtersettings{'SHOW_URL'} eq 'on') { $redirect .= "&url=%u"; }
5612 if ($filtersettings{'SHOW_IP'} eq 'on') { $redirect .= "&ip=%a"; }
5613 $redirect =~ s/^&/?/;
5614 $redirect = "http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi".$redirect;
5615 } else {
5616 $redirect="http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi";
5617 }
5618 } else { $redirect=$filtersettings{'REDIRECT_PAGE'}; }
5619
5620 if ($filtersettings{'ENABLE_DNSERROR'} eq 'on') { $redirect = "302:http://0.0.0.0"; }
5621
5622 undef $defaultrule;
5623
5624 if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on')
5625 {
5626 $defaultrule .= "custom-allowed ";
5627 }
5628 if ($filtersettings{'BLOCK_ALL'} eq 'on')
5629 {
5630 $defaultrule .= "none";
5631 }
5632 else
5633 {
5634 if ($filtersettings{'BLOCK_IP_ADDR'} eq 'on')
5635 {
5636 $defaultrule .= "!in-addr ";
5637 }
5638 for ($i=0; $i<=@filtergroups; $i++) {
5639 if ($filtersettings{@filtergroups[$i]} eq 'on')
5640 {
5641 $defaultrule .= "!@categories[$i] ";
5642 }
5643 }
5644 if ($filtersettings{'ENABLE_CUSTOM_BLACKLIST'} eq 'on')
5645 {
5646 $defaultrule .= "!custom-blocked ";
5647 }
5648 if ($filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} eq 'on')
5649 {
5650 $defaultrule .= "!custom-expressions ";
5651 }
5652 if (($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') ||
5653 ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') ||
5654 ($filtersettings{'BLOCK_ARCHIVES'} eq 'on'))
5655 {
5656 $defaultrule .= "!files ";
5657 }
5658 $defaultrule .= "any";
5659 }
5660
5661 open(FILE, ">${General::swroot}/urlfilter/squidGuard.conf") or die "Unable to write squidGuard.conf file";
5662 flock(FILE, 2);
5663
5664 print FILE "logdir /var/log/squidGuard\n";
5665 print FILE "dbhome $dbdir\n\n";
5666
5667 undef @repositoryfiles;
5668 if ($filtersettings{'ENABLE_REWRITE'} eq 'on')
5669 {
5670 @repositorylist = <$repository/*>;
5671 foreach (@repositorylist)
5672 {
5673 if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); }
5674 }
5675 }
5676
5677 if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on'))
5678 {
5679 print FILE "rewrite rew-rule-0 {\n";
5680
5681 if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles))
5682 {
5683 print FILE " # rewrite localfiles\n";
5684 foreach (@repositoryfiles)
5685 {
5686 print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n";
5687 }
5688 }
5689
5690 if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')
5691 {
5692 print FILE " # rewrite safesearch\n";
5693 print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)(\\bsafe=\\w+)(.*)\@\\1\\3safe=strict\\5\@i\n";
5694 print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)\@\\1safe=strict\\\&\\3\@i\n";
5695 print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W)(.*)(\\bvm=\\w+)(.*)\@\\1\\2vm=r\\4\@i\n";
5696 print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W.*)\@\\1\\\&vm=r\@i\n";
5697 print FILE " s@(.*\\Walltheweb\\.com/customize\\?)(.*)(\\bcopt_offensive=\\w+)(.*)\@\\1\\2copt_offensive=on\\4\@i\n";
5698 }
5699
5700 print FILE "}\n\n";
5701
5702 if ((!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) && ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) {
5703 print FILE "rewrite rew-rule-1 {\n";
5704 if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles))
5705 {
5706 print FILE " # rewrite localfiles\n";
5707 foreach (@repositoryfiles)
5708 {
5709 print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n";
5710 }
5711 } else {
5712 print FILE " # rewrite nothing\n";
5713 }
5714 print FILE "}\n\n";
5715 }
5716 }
5717
5718 if (-e $uqfile)
5719 {
5720 open(UQ, $uqfile);
5721 @uqlist = <UQ>;
5722 close(UQ);
5723
5724 if (@uqlist > 0)
5725 {
5726 $idx=0;
5727 foreach (@uqlist)
5728 {
5729 chomp;
5730 @uq = split(/\,/);
5731 if ($uq[4] eq 'on')
5732 {
5733 $idx++;
5734 $uq[0] = $uq[0] * 60;
5735 if ($uq[1] eq '0') {
5736 if ($uq[2] eq 'hourly') { $uq[1] = 3600 }
5737 if ($uq[2] eq 'daily') { $uq[1] = 86400 }
5738 if ($uq[2] eq 'weekly') { $uq[1] = 604800 }
5739 }
5740 $uq[3] =~ s/\|/ /g;
5741 print FILE "src quota-$idx {\n";
5742 print FILE " user $uq[3]\n";
5743 print FILE " userquota $uq[0] $uq[1] $uq[2]\n";
5744 print FILE "}\n\n";
5745 }
5746 }
5747
5748 }
5749 }
5750
5751 @tclist = &aggregatedconstraints;
5752
5753 if (@tclist > 0)
5754 {
5755 $idx=0;
5756 foreach (@tclist)
5757 {
5758 chomp;
5759 @tc = split(/\,/);
5760 if ($tc[15] eq 'on')
5761 {
5762 $idx++;
5763 print FILE "src network-$idx {\n";
5764 print FILE " ip $tc[12]\n";
5765 print FILE "}\n\n";
5766 }
5767 }
5768
5769 $idx=0;
5770 foreach (@tclist)
5771 {
5772 chomp;
5773 @tc = split(/\,/);
5774 if ($tc[15] eq 'on')
5775 {
5776 $idx++;
5777 print FILE "time constraint-$idx {\n";
5778 print FILE "$tc[16]\n";
5779 print FILE "}\n\n";
5780 }
5781 }
5782 }
5783
5784 if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) {
5785 print FILE "src unfiltered {\n";
5786 print FILE " ip $filtersettings{'UNFILTERED_CLIENTS'}\n";
5787 print FILE "}\n\n";
5788 }
5789 if (!($filtersettings{'BANNED_CLIENTS'} eq '')) {
5790 print FILE "src banned {\n";
5791 print FILE " ip $filtersettings{'BANNED_CLIENTS'}\n";
5792 print FILE "}\n\n";
5793 }
5794
5795 foreach $category (@categories) {
5796 print FILE "dest $category {\n";
5797 if (-e "$dbdir/$category/domains") {
5798 print FILE " domainlist $category\/domains\n";
5799 }
5800 if (-e "$dbdir/$category/urls") {
5801 print FILE " urllist $category\/urls\n";
5802 }
5803 if ((-e "$dbdir/$category/expressions") && ($filtersettings{'ENABLE_EXPR_LISTS'} eq 'on')) {
5804 print FILE " expressionlist $category\/expressions\n";
5805 }
5806 if (($category eq 'ads') && ($filtersettings{'ENABLE_EMPTY_ADS'} eq 'on'))
5807 {
5808 print FILE " redirect http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/images/urlfilter/1x1.gif\n";
5809 }
5810 if ($filtersettings{'ENABLE_LOG'} eq 'on')
5811 {
5812 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
5813 {
5814 print FILE " logfile $ident $category.log\n";
5815 } else {
5816 print FILE " logfile $ident urlfilter.log\n";
5817 }
5818 }
5819 print FILE "}\n\n";
5820 }
5821
5822 print FILE "dest files {\n";
5823 print FILE " expressionlist custom\/blocked\/files\n";
5824 if ($filtersettings{'ENABLE_LOG'} eq 'on')
5825 {
5826 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
5827 {
5828 print FILE " logfile $ident files.log\n";
5829 } else {
5830 print FILE " logfile $ident urlfilter.log\n";
5831 }
5832 }
5833 print FILE "}\n\n";
5834
5835 print FILE "dest custom-allowed {\n";
5836 print FILE " domainlist custom\/allowed\/domains\n";
5837 print FILE " urllist custom\/allowed\/urls\n";
5838 print FILE "}\n\n";
5839
5840 print FILE "dest custom-blocked {\n";
5841 print FILE " domainlist custom\/blocked\/domains\n";
5842 print FILE " urllist custom\/blocked\/urls\n";
5843 if ($filtersettings{'ENABLE_LOG'} eq 'on')
5844 {
5845 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
5846 {
5847 print FILE " logfile $ident custom.log\n";
5848 } else {
5849 print FILE " logfile $ident urlfilter.log\n";
5850 }
5851 }
5852 print FILE "}\n\n";
5853
5854 print FILE "dest custom-expressions {\n";
5855 print FILE " expressionlist custom\/blocked\/expressions\n";
5856 if ($filtersettings{'ENABLE_LOG'} eq 'on')
5857 {
5858 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
5859 {
5860 print FILE " logfile $ident custom.log\n";
5861 } else {
5862 print FILE " logfile $ident urlfilter.log\n";
5863 }
5864 }
5865 print FILE "}\n\n";
5866
5867 print FILE "acl {\n";
5868 if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) {
5869 print FILE " unfiltered {\n";
5870 print FILE " pass all\n";
5871 if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')
5872 {
5873 print FILE " rewrite rew-rule-1\n";
5874 }
5875 print FILE " }\n\n";
5876 }
5877 if (!($filtersettings{'BANNED_CLIENTS'} eq '')) {
5878 print FILE " banned {\n";
5879 print FILE " pass ";
5880 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
5881 {
5882 print FILE "custom-allowed ";
5883 }
5884 print FILE "none\n";
5885 print FILE " }\n\n";
5886 }
5887
5888 if (-s $uqfile)
5889 {
5890 open(UQ, $uqfile);
5891 @uqlist = <UQ>;
5892 close(UQ);
5893
5894 $idx=0;
5895 foreach (@uqlist)
5896 {
5897 chomp;
5898 @uq = split(/\,/);
5899 if ($uq[4] eq 'on')
5900 {
5901 $idx++;
5902 $qredirect = $redirect;
5903 $qredirect =~ s/\%t/\%q\%20-\%20\%i/;
5904 print FILE " quota-$idx {\n";
5905 print FILE " pass ";
5906 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
5907 {
5908 print FILE "custom-allowed ";
5909 }
5910 print FILE "none\n";
5911 unless ($redirect eq $qredirect) { print FILE " redirect $qredirect\n"; }
5912 print FILE " }\n\n";
5913 }
5914 }
5915 }
5916
5917 if (@tclist > 0)
5918 {
5919 $idx=0;
5920 foreach (@tclist)
5921 {
5922 chomp;
5923 @tc = split(/\,/);
5924 @ec = split(/\|/,$tc[13]);
5925 if ($tc[15] eq 'on')
5926 {
5927 $idx++;
5928 print FILE " network-$idx $tc[0] constraint-$idx {\n";
5929 print FILE " pass ";
5930
5931 if ($filtersettings{'BLOCK_ALL'} eq 'on')
5932 {
5933 if ($tc[14] eq 'block')
5934 {
5935 if ((@ec == 1) && ($ec[0] eq 'any')) {
5936 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
5937 {
5938 print FILE "custom-allowed ";
5939 }
5940 print FILE "none";
5941 } else {
5942 print FILE $defaultrule;
5943 }
5944 } else {
5945 foreach (@ec)
5946 {
5947 print FILE "$_ ";
5948 }
5949 print FILE $defaultrule unless ((@ec == 1) && ($ec[0] eq 'any'));
5950 }
5951 } else {
5952 if ($tc[14] eq 'block')
5953 {
5954 $tcrule = $defaultrule;
5955 if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') {
5956 $tcrule =~ s/custom-allowed //;
5957 print FILE "custom-allowed " unless ((@ec == 1) && ($ec[0] eq 'any') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'off'));
5958 }
5959 if ((@ec == 1) && ($ec[0] eq 'any')) {
5960 print FILE "none";
5961 } else {
5962 foreach (@ec)
5963 {
5964 print FILE "!$_ " unless (index($defaultrule,"!".$_." ") ge 0);
5965 }
5966 }
5967 print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any'));
5968 } else {
5969 $tcrule = $defaultrule;
5970 foreach (@ec)
5971 {
5972 $tcrule =~ s/!$_ //;
5973 print FILE "$_ " if ($_ eq 'any');
5974 }
5975 print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any'));
5976 }
5977 }
5978
5979 print FILE "\n";
5980
5981 print FILE " }\n\n";
5982 }
5983 }
5984 }
5985
5986 print FILE " default {\n";
5987 print FILE " pass $defaultrule\n";
5988 if (($filtersettings{'ENABLE_LOG'} eq 'on') && ($filtersettings{'BLOCK_ALL'} eq 'on'))
5989 {
5990 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
5991 {
5992 print FILE " logfile".$ident." default.log\n";
5993 } else {
5994 print FILE " logfile".$ident." urlfilter.log\n";
5995 }
5996 }
5997 if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on'))
5998 {
5999 print FILE " rewrite rew-rule-0\n";
6000 }
6001 print FILE " redirect $redirect\n";
6002 print FILE " }\n";
6003 print FILE "}\n";
6004
6005 close FILE;
6006 }
6007
6008 # -------------------------------------------------------------------
6009 #!/usr/bin/perl
6010 #
6011 # SmoothWall CGIs
6012 #
6013 # This code is distributed under the terms of the GPL
6014 #
6015 # (c) written from scratch
6016 #
6017 # $Id: urlfilter.cgi,v 1.7 2006/05/08 00:00:00 marco Exp $
6018 #
6019
6020 use strict;
6021
6022 # enable only the following on debugging purpose
6023 #use warnings;
6024 #use CGI::Carp 'fatalsToBrowser';
6025
6026 use File::Copy;
6027 use IO::Socket;
6028
6029 require '/var/ipfire/general-functions.pl';
6030 require "${General::swroot}/lang.pl";
6031 require "${General::swroot}/header.pl";
6032
6033 my %netsettings=();
6034 my %mainsettings=();
6035 my %proxysettings=();
6036 my %filtersettings=();
6037 my %tcsettings=();
6038 my %uqsettings=();
6039 my %besettings=();
6040 my %updatesettings=();
6041 my %checked=();
6042 my %selected=();
6043 my $id=0;
6044 my $line='';
6045 my $i=0;
6046 my $n=0;
6047 my $time='';
6048 my $filesize;
6049 my $category='';
6050 my $section='';
6051 my $blacklist='';
6052 my $blistbackup='';
6053
6054 my $changed = 'no';
6055 my $tcfile = "${General::swroot}/urlfilter/timeconst";
6056 my $uqfile = "${General::swroot}/urlfilter/userquota";
6057 my $dbdir = "${General::swroot}/urlfilter/blacklists";
6058 my $editdir = "${General::swroot}/urlfilter/editor";
6059 my $repository = "/home/httpd/html/repository";
6060 my $hintcolour = '#FFFFCC';
6061
6062 my $sourceurlfile = "${General::swroot}/urlfilter/autoupdate/autoupdate.urls";
6063 my $updconffile = "${General::swroot}/urlfilter/autoupdate/autoupdate.conf";
6064 my $updflagfile = "${General::swroot}/urlfilter/blacklists/.autoupdate.last";
6065 my $upd_cron_dly = "${General::swroot}/urlfilter/autoupdate/cron.daily";
6066 my $upd_cron_wly = "${General::swroot}/urlfilter/autoupdate/cron.weekly";
6067 my $upd_cron_mly = "${General::swroot}/urlfilter/autoupdate/cron.monthly";
6068
6069 my $errormessage='';
6070 my $updatemessage='';
6071 my $restoremessage='';
6072 my $buttontext='';
6073 my $source_name='';
6074 my $source_url='';
6075 my $blacklistage=0;
6076
6077 my @repositorylist=();
6078 my @repositoryfiles=();
6079 my @categories=();
6080 my @selectedcategories=();
6081 my @filtergroups=();
6082 my @tclist=();
6083 my @uqlist=();
6084 my @source_urllist=();
6085 my @temp=();
6086
6087 my $lastslashpos=0;
6088
6089 my $toggle='';
6090 my $gif='';
6091 my $led='';
6092 my $ldesc='';
6093 my $gdesc='';
6094
6095 if (! -d $dbdir) { mkdir("$dbdir"); }
6096 if (! -e $tcfile) { system("touch $tcfile"); }
6097 if (! -e $uqfile) { system("touch $uqfile"); }
6098 if (! -e $sourceurlfile) { system("touch $sourceurlfile"); }
6099
6100 &General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
6101 &General::readhash("${General::swroot}/main/settings", \%mainsettings);
6102 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
6103
6104 &readblockcategories;
6105
6106 open(FILE, $tcfile);
6107 @tclist = <FILE>;
6108 close(FILE);
6109 open(FILE, $uqfile);
6110 @uqlist = <FILE>;
6111 close(FILE);
6112 open(FILE, $sourceurlfile);
6113 @source_urllist = <FILE>;
6114 close(FILE);
6115
6116 $filtersettings{'ENABLE_CUSTOM_BLACKLIST'} = 'off';
6117 $filtersettings{'ENABLE_CUSTOM_WHITELIST'} = 'off';
6118 $filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} = 'off';
6119 $filtersettings{'BLOCK_EXECUTABLES'} = 'off';
6120 $filtersettings{'BLOCK_AUDIO-VIDEO'} = 'off';
6121 $filtersettings{'BLOCK_ARCHIVES'} = 'off';
6122 $filtersettings{'ENABLE_REWRITE'} = 'off';
6123 $filtersettings{'UNFILTERED_CLIENTS'} = '';
6124 $filtersettings{'BANNED_CLIENTS'} = '';
6125 $filtersettings{'SHOW_CATEGORY'} = 'off';
6126 $filtersettings{'SHOW_URL'} = 'off';
6127 $filtersettings{'SHOW_IP'} = 'off';
6128 $filtersettings{'ENABLE_DNSERROR'} = 'off';
6129 $filtersettings{'ENABLE_JPEG'} = 'off';
6130 $filtersettings{'REDIRECT_PAGE'} = '';
6131 $filtersettings{'MSG_TEXT_1'} = '';
6132 $filtersettings{'MSG_TEXT_2'} = '';
6133 $filtersettings{'MSG_TEXT_3'} = '';
6134 $filtersettings{'ENABLE_EXPR_LISTS'} = 'off';
6135 $filtersettings{'BLOCK_IP_ADDR'} = 'off';
6136 $filtersettings{'BLOCK_ALL'} = 'off';
6137 $filtersettings{'ENABLE_EMPTY_ADS'} = 'off';
6138 $filtersettings{'ENABLE_GLOBAL_WHITELIST'} = 'off';
6139 $filtersettings{'ENABLE_SAFESEARCH'} = 'off';
6140 $filtersettings{'ENABLE_LOG'} = 'off';
6141 $filtersettings{'ENABLE_USERNAME_LOG'} = 'off';
6142 $filtersettings{'ENABLE_CATEGORY_LOG'} = 'off';
6143 $filtersettings{'CHILDREN'} = '5';
6144 $filtersettings{'ENABLE_AUTOUPDATE'} = 'off';
6145
6146 $filtersettings{'ACTION'} = '';
6147 $filtersettings{'VALID'} = '';
6148
6149 &Header::getcgihash(\%filtersettings);
6150 &Header::getcgihash(\%tcsettings);
6151 &Header::getcgihash(\%uqsettings);
6152 &Header::getcgihash(\%besettings);
6153
6154 if (($filtersettings{'ACTION'} eq $Lang::tr{'save'}) ||
6155 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'}) ||
6156 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'}) ||
6157 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'}) ||
6158 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'}) ||
6159 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'}) ||
6160 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'}) ||
6161 ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'}))
6162 {
6163 if (!($filtersettings{'CHILDREN'} =~ /^\d+$/) || ($filtersettings{'CHILDREN'} < 1))
6164 {
6165 $errormessage = $Lang::tr{'urlfilter invalid num of children'};
6166 goto ERROR;
6167 }
6168
6169 if ((!($filtersettings{'REDIRECT_PAGE'} eq '')) && (!($filtersettings{'REDIRECT_PAGE'} =~ /^https?:\/\//)))
6170 {
6171 $filtersettings{'REDIRECT_PAGE'} = "http://".$filtersettings{'REDIRECT_PAGE'};
6172 }
6173
6174 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter remove file'})
6175 {
6176 if (-e "$repository/$filtersettings{'ID'}") { unlink("$repository/$filtersettings{'ID'}"); }
6177 $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'};
6178 }
6179
6180 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload file'})
6181 {
6182 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPLOADFILE'});
6183
6184 $filtersettings{'ACTION'} = $Lang::tr{'urlfilter manage repository'};
6185 $_ = $filtersettings{'UPLOADFILE'};
6186 tr/\\/\//;
6187 $_ = substr($_,rindex($_,"/")+1);
6188 if ($_) {
6189 if (copy($filtersettings{'UPLOADFILE'}, "$repository/$_") != 1)
6190 {
6191 $errormessage = $!;
6192 goto ERROR;
6193 }
6194 }
6195
6196 }
6197
6198 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload background'})
6199 {
6200 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'BACKGROUND'});
6201
6202 if (copy($filtersettings{'BACKGROUND'}, "/home/httpd/html/images/urlfilter/background.jpg") != 1)
6203 {
6204 $errormessage = $!;
6205 goto ERROR;
6206 }
6207 }
6208
6209 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter upload blacklist'})
6210 {
6211 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'});
6212
6213 if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/))
6214 {
6215 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
6216 goto ERROR;
6217 }
6218
6219 if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/blacklists.tar.gz") != 1)
6220 {
6221 $errormessage = $!;
6222 goto ERROR;
6223 }
6224
6225 if (!(-d "${General::swroot}/urlfilter/update")) { mkdir("${General::swroot}/urlfilter/update"); }
6226
6227 my $exitcode = system("/bin/tar --no-same-owner -xzf ${General::swroot}/urlfilter/blacklists.tar.gz -C ${General::swroot}/urlfilter/update");
6228
6229 if ($exitcode > 0)
6230 {
6231 $errormessage = $Lang::tr{'urlfilter tar error'};
6232 } else {
6233
6234 if (-d "${General::swroot}/urlfilter/update/category")
6235 {
6236 system("mv ${General::swroot}/urlfilter/update/category ${General::swroot}/urlfilter/update/blacklists");
6237 }
6238
6239 if (!(-d "${General::swroot}/urlfilter/update/blacklists"))
6240 {
6241 $errormessage = $Lang::tr{'urlfilter invalid content'};
6242 } else {
6243 system("cp -r ${General::swroot}/urlfilter/update/blacklists/* $dbdir");
6244
6245 &readblockcategories;
6246 &readcustomlists;
6247
6248 &writeconfigfile;
6249
6250 $updatemessage = $Lang::tr{'urlfilter upload success'};
6251 system("${General::swroot}/urlfilter/bin/prebuild.pl &");
6252 system("logger -t installpackage[urlfilter] \"URL filter blacklist - Blacklist update from local source completed\"");
6253 }
6254 }
6255 if (-d "${General::swroot}/urlfilter/update") { system("rm -rf ${General::swroot}/urlfilter/update"); }
6256 if (-e "${General::swroot}/urlfilter/blacklists.tar.gz") { unlink("${General::swroot}/urlfilter/blacklists.tar.gz"); }
6257 if ($errormessage) { goto ERROR; }
6258 }
6259
6260 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter backup'})
6261 {
6262 $blistbackup = ($filtersettings{'ENABLE_FULLBACKUP'} eq 'on') ? "blacklists" : "blacklists/custom";
6263 if (system("/bin/tar -C ${General::swroot}/urlfilter -czf ${General::swroot}/urlfilter/backup.tar.gz settings timeconst userquota autoupdate $blistbackup"))
6264 {
6265 $errormessage = $Lang::tr{'urlfilter backup error'};
6266 goto ERROR;
6267 }
6268 else
6269 {
6270 print "Content-type: application/gzip\n";
6271 print "Content-length: ";
6272 print (-s "${General::swroot}/urlfilter/backup.tar.gz");
6273 print "\n";
6274 print "Content-disposition: attachment; filename=urlfilter-backup.tar.gz\n\n";
6275
6276 open (FILE, "${General::swroot}/urlfilter/backup.tar.gz");
6277 while (<FILE>) { print; }
6278 close (FILE);
6279
6280 if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); }
6281 exit;
6282 }
6283 }
6284
6285 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter restore'})
6286 {
6287 &Header::getcgihash(\%filtersettings, {'wantfile' => 1, 'filevar' => 'UPDATEFILE'});
6288
6289 if (!($filtersettings{'UPDATEFILE'} =~ /.tar.gz$/))
6290 {
6291 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
6292 goto ERROR;
6293 }
6294
6295 if (!(-d "${General::swroot}/urlfilter/restore")) { mkdir("${General::swroot}/urlfilter/restore"); }
6296
6297 if (copy($filtersettings{'UPDATEFILE'}, "${General::swroot}/urlfilter/backup.tar.gz") != 1)
6298 {
6299 $errormessage = $!;
6300 }
6301
6302 my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf ${General::swroot}/urlfilter/backup.tar.gz -C ${General::swroot}/urlfilter/restore");
6303 if ($exitcode > 0)
6304 {
6305 $errormessage = $Lang::tr{'urlfilter tar error'};
6306 } else {
6307 if (!(-e "${General::swroot}/urlfilter/restore/settings"))
6308 {
6309 $errormessage = $Lang::tr{'urlfilter invalid restore file'};
6310 } else {
6311 system("cp -rp ${General::swroot}/urlfilter/restore/* ${General::swroot}/urlfilter/");
6312 &readblockcategories;
6313 &readcustomlists;
6314 &writeconfigfile;
6315
6316 $restoremessage = $Lang::tr{'urlfilter restore success'};
6317 }
6318 }
6319
6320 if (-e "${General::swroot}/urlfilter/backup.tar.gz") { unlink("${General::swroot}/urlfilter/backup.tar.gz"); }
6321 if (-d "${General::swroot}/urlfilter/restore") { system("rm -rf ${General::swroot}/urlfilter/restore"); }
6322 if ($errormessage) { goto ERROR; }
6323 }
6324
6325 if ($filtersettings{'ACTION'} eq $Lang::tr{'save'})
6326 {
6327 $filtersettings{'VALID'} = 'yes';
6328 &savesettings;
6329 }
6330
6331 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save and restart'})
6332 {
6333 if (!(-e "${General::swroot}/proxy/enable"))
6334 {
6335 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
6336 goto ERROR;
6337 }
6338 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
6339 {
6340 $errormessage = $Lang::tr{'urlfilter not enabled'};
6341 goto ERROR;
6342 }
6343
6344 $filtersettings{'VALID'} = 'yes';
6345 &savesettings;
6346
6347 system("chown -R nobody.nobody $dbdir");
6348
6349 if (-e "$dbdir/custom/allowed/domains.db") { unlink("$dbdir/custom/allowed/domains.db"); }
6350 if (-e "$dbdir/custom/allowed/urls.db") { unlink("$dbdir/custom/allowed/urls.db"); }
6351 if (-e "$dbdir/custom/blocked/domains.db") { unlink("$dbdir/custom/blocked/domains.db"); }
6352 if (-e "$dbdir/custom/blocked/urls.db") { unlink("$dbdir/custom/blocked/urls.db"); }
6353
6354 foreach (<$dbdir/*>)
6355 {
6356 if (-d $_){ system("chmod 644 $_/*"); }
6357 if (-d $_){ system("chmod 666 $_/*.db"); }
6358 }
6359 if (-d "$dbdir/custom/allowed")
6360 {
6361 system("chmod 755 $dbdir/custom/allowed");
6362 system("chmod 644 $dbdir/custom/allowed/*");
6363 }
6364 if (-d "$dbdir/custom/blocked")
6365 {
6366 system("chmod 755 $dbdir/custom/blocked");
6367 system("chmod 644 $dbdir/custom/blocked/*");
6368 }
6369
6370 system('/usr/local/bin/restartsquid');
6371 }
6372
6373 ERROR:
6374
6375 if ($errormessage) { $filtersettings{'VALID'} = 'no'; }
6376
6377 }
6378
6379 if ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter set time constraints'}) { $tcsettings{'TCMODE'} = 'on'}
6380
6381 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'add'}))
6382 {
6383 $tcsettings{'TCMODE'}='on';
6384
6385 if (!$tcsettings{'DST'})
6386 {
6387 $errormessage=$Lang::tr{'urlfilter dst error'};
6388 }
6389
6390 if (!$tcsettings{'SRC'})
6391 {
6392 $errormessage=$Lang::tr{'urlfilter src error'};
6393 }
6394
6395 if (!($tcsettings{'TO_HOUR'}.$tcsettings{'TO_MINUTE'} gt $tcsettings{'FROM_HOUR'}.$tcsettings{'FROM_MINUTE'}))
6396 {
6397 $errormessage=$Lang::tr{'urlfilter timespace error'};
6398 }
6399
6400 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')))
6401 {
6402 $errormessage=$Lang::tr{'urlfilter weekday error'};
6403 }
6404
6405 if (!$errormessage)
6406 {
6407 if ($tcsettings{'DST'} =~ /^any/) { $tcsettings{'DST'} = 'any'; }
6408 if ($tcsettings{'ENABLERULE'} eq 'on') { $tcsettings{'ACTIVE'} = $tcsettings{'ENABLERULE'}; } else { $tcsettings{'ACTIVE'} = 'off'}
6409
6410 $tcsettings{'ENABLERULE'} = 'on';
6411 if($tcsettings{'EDITING'} eq 'no') {
6412 open(FILE,">>$tcfile");
6413 flock FILE, 2;
6414 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";
6415 } else {
6416 open(FILE, ">$tcfile");
6417 flock FILE, 2;
6418 $id = 0;
6419 foreach $line (@tclist)
6420 {
6421 $id++;
6422 if ($tcsettings{'EDITING'} eq $id) {
6423 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";
6424 } else { print FILE "$line"; }
6425 }
6426 }
6427 close(FILE);
6428 undef %tcsettings;
6429 $tcsettings{'CHANGED'}='yes';
6430 $tcsettings{'TCMODE'}='on';
6431 $changed = 'yes';
6432 } else {
6433 if ($tcsettings{'EDITING'} ne 'no')
6434 {
6435 $tcsettings{'ACTION'} = $Lang::tr{'edit'};
6436 $tcsettings{'ID'} = $tcsettings{'EDITING'};
6437 }
6438 }
6439 }
6440
6441 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'remove'}))
6442 {
6443 $id = 0;
6444 open(FILE, ">$tcfile");
6445 flock FILE, 2;
6446 foreach $line (@tclist)
6447 {
6448 $id++;
6449 unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; }
6450 }
6451 close(FILE);
6452 $tcsettings{'CHANGED'}='yes';
6453 $tcsettings{'TCMODE'}='on';
6454 }
6455
6456 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'}))
6457 {
6458 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
6459 {
6460 $errormessage = $Lang::tr{'urlfilter not enabled'};
6461 }
6462 if (!(-e "${General::swroot}/proxy/enable"))
6463 {
6464 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
6465 }
6466
6467 if (!$errormessage) { system('/usr/local/bin/restartsquid'); }
6468 $tcsettings{'TCMODE'}='on';
6469 }
6470
6471 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'}))
6472 {
6473 open(FILE, ">$tcfile");
6474 flock FILE, 2;
6475 $id = 0;
6476 foreach $line (@tclist)
6477 {
6478 $id++;
6479 unless ($tcsettings{'ID'} eq $id) { print FILE "$line"; }
6480 else
6481 {
6482 chomp($line);
6483 @temp = split(/\,/,$line);
6484 if ($temp[15] eq 'on') { $temp[15] = 'off'; } else { $temp[15] = 'on' }
6485 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";
6486 }
6487 }
6488 close(FILE);
6489 $tcsettings{'CHANGED'}='yes';
6490 $tcsettings{'TCMODE'}='on';
6491 }
6492
6493 if (!$errormessage) {
6494 $tcsettings{'ENABLERULE'}='on';
6495 $tcsettings{'TO_HOUR'}='24';
6496 }
6497
6498 if (($tcsettings{'MODE'} eq 'TIMECONSTRAINT') && ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage))
6499 {
6500 $id = 0;
6501 foreach $line (@tclist)
6502 {
6503 $id++;
6504 if ($tcsettings{'ID'} eq $id)
6505 {
6506 chomp($line);
6507 @temp = split(/\,/,$line);
6508 $tcsettings{'DEFINITION'} = $temp[0];
6509 $tcsettings{'MON'} = $temp[1];
6510 $tcsettings{'TUE'} = $temp[2];
6511 $tcsettings{'WED'} = $temp[3];
6512 $tcsettings{'THU'} = $temp[4];
6513 $tcsettings{'FRI'} = $temp[5];
6514 $tcsettings{'SAT'} = $temp[6];
6515 $tcsettings{'SUN'} = $temp[7];
6516 $tcsettings{'FROM_HOUR'} = $temp[8];
6517 $tcsettings{'FROM_MINUTE'} = $temp[9];
6518 $tcsettings{'TO_HOUR'} = $temp[10];
6519 $tcsettings{'TO_MINUTE'} = $temp[11];
6520 $tcsettings{'SRC'} = $temp[12];
6521 $tcsettings{'DST'} = $temp[13];
6522 $tcsettings{'ACCESS'} = $temp[14];
6523 $tcsettings{'ENABLERULE'} = $temp[15];
6524 $tcsettings{'COMMENT'} = $temp[16];
6525 }
6526 }
6527 $tcsettings{'TCMODE'}='on';
6528 }
6529
6530 if ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter set user quota'}) { $uqsettings{'UQMODE'} = 'on'}
6531
6532 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'add'}))
6533 {
6534 $uqsettings{'UQMODE'}='on';
6535
6536 if ((!($uqsettings{'TIME_QUOTA'} =~ /^\d+/)) || ($uqsettings{'TIME_QUOTA'} < '1'))
6537 {
6538 $errormessage=$Lang::tr{'urlfilter quota time error'};
6539 }
6540
6541 @temp = split(/\n/,$uqsettings{'QUOTA_USERS'});
6542 undef $uqsettings{'QUOTA_USERS'};
6543 foreach (@temp)
6544 {
6545 s/^\s+//g; s/\s+$//g;
6546 if ($_) { $uqsettings{'QUOTA_USERS'} .= $_."\n"; }
6547 }
6548
6549 if ($uqsettings{'QUOTA_USERS'} eq '')
6550 {
6551 $errormessage=$Lang::tr{'urlfilter quota user error'};
6552 }
6553
6554 $_ = $uqsettings{'QUOTA_USERS'};
6555 chomp; s/\n/|/g;
6556 my $quota_users = $_;
6557
6558 if ($uqsettings{'QUOTA_USERS'} =~ /\\/)
6559 {
6560 $errormessage=$Lang::tr{'urlfilter invalid user error'};
6561 }
6562
6563 if (!$errormessage) {
6564 if ($uqsettings{'ENABLEQUOTA'} eq 'on') { $uqsettings{'ACTIVE'} = $uqsettings{'ENABLEQUOTA'}; } else { $uqsettings{'ACTIVE'} = 'off'}
6565
6566 $uqsettings{'ENABLERULE'} = 'on';
6567 if($uqsettings{'EDITING'} eq 'no') {
6568 open(FILE,">>$uqfile");
6569 flock FILE, 2;
6570 print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n";
6571 } else {
6572 open(FILE, ">$uqfile");
6573 flock FILE, 2;
6574 $id = 0;
6575 foreach $line (@uqlist)
6576 {
6577 $id++;
6578 if ($uqsettings{'EDITING'} eq $id) {
6579 print FILE "$uqsettings{'TIME_QUOTA'},$uqsettings{'SPORADIC'},$uqsettings{'RENEWAL'},$quota_users,$uqsettings{'ACTIVE'}\n";
6580 } else { print FILE "$line"; }
6581 }
6582 }
6583 close(FILE);
6584 undef %uqsettings;
6585 $uqsettings{'CHANGED'}='yes';
6586 $uqsettings{'MODE'}='USERQUOTA';
6587 $uqsettings{'UQMODE'}='on';
6588 $changed = 'yes';
6589 } else {
6590 if ($uqsettings{'EDITING'} ne 'no')
6591 {
6592 $uqsettings{'ACTION'} = $Lang::tr{'edit'};
6593 $uqsettings{'ID'} = $uqsettings{'EDITING'};
6594 }
6595 }
6596 }
6597
6598 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'remove'}))
6599 {
6600 $id = 0;
6601 open(FILE, ">$uqfile");
6602 flock FILE, 2;
6603 foreach $line (@uqlist)
6604 {
6605 $id++;
6606 unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; }
6607 }
6608 close(FILE);
6609 $uqsettings{'CHANGED'}='yes';
6610 $uqsettings{'UQMODE'}='on';
6611 }
6612
6613 if (!$errormessage) {
6614 $uqsettings{'ENABLEQUOTA'}='on';
6615 }
6616
6617 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) && (!$errormessage))
6618 {
6619 $id = 0;
6620 foreach $line (@uqlist)
6621 {
6622 $id++;
6623 if ($uqsettings{'ID'} eq $id)
6624 {
6625 chomp($line);
6626 @temp = split(/\,/,$line);
6627 $uqsettings{'TIME_QUOTA'} = $temp[0];
6628 $uqsettings{'SPORADIC'} = $temp[1];
6629 $uqsettings{'RENEWAL'} = $temp[2];
6630 $uqsettings{'QUOTA_USERS'} = $temp[3];
6631 $uqsettings{'ENABLEQUOTA'} = $temp[4];
6632 }
6633 }
6634 $uqsettings{'UQMODE'}='on';
6635 }
6636
6637 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'toggle enable disable'}))
6638 {
6639 open(FILE, ">$uqfile");
6640 flock FILE, 2;
6641 $id = 0;
6642 foreach $line (@uqlist)
6643 {
6644 $id++;
6645 unless ($uqsettings{'ID'} eq $id) { print FILE "$line"; }
6646 else
6647 {
6648 chomp($line);
6649 @temp = split(/\,/,$line);
6650 if ($temp[4] eq 'on') { $temp[4] = 'off'; } else { $temp[4] = 'on' }
6651 print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4]\n";
6652 }
6653 }
6654 close(FILE);
6655 $uqsettings{'CHANGED'}='yes';
6656 $uqsettings{'UQMODE'}='on';
6657 }
6658
6659 if (($uqsettings{'MODE'} eq 'USERQUOTA') && ($uqsettings{'ACTION'} eq $Lang::tr{'urlfilter restart'}))
6660 {
6661 if (!($proxysettings{'ENABLE_FILTER'} eq 'on'))
6662 {
6663 $errormessage = $Lang::tr{'urlfilter not enabled'};
6664 }
6665 if (!(-e "${General::swroot}/proxy/enable"))
6666 {
6667 $errormessage = $Lang::tr{'urlfilter web proxy service required'};
6668 }
6669
6670 if (!$errormessage) { system('/usr/local/bin/restartsquid'); }
6671 $uqsettings{'UQMODE'}='on';
6672 }
6673
6674 if ($besettings{'ACTION'} eq $Lang::tr{'urlfilter blacklist editor'}) { $besettings{'BEMODE'} = 'on'; }
6675
6676 if ($besettings{'MODE'} eq 'BLACKLIST_EDITOR')
6677 {
6678 @temp = split(/\n/,$besettings{'BE_DOMAINS'});
6679 undef $besettings{'BE_DOMAINS'};
6680 foreach (@temp)
6681 {
6682 s/^\s+//g; s/\s+$//g;
6683 if ($_) { $besettings{'BE_DOMAINS'} .= $_."\n"; }
6684 }
6685 chomp($besettings{'BE_DOMAINS'});
6686 @temp = split(/\n/,$besettings{'BE_URLS'});
6687 undef $besettings{'BE_URLS'};
6688 foreach (@temp)
6689 {
6690 s/^\s+//g; s/\s+$//g;
6691 if ($_) { $besettings{'BE_URLS'} .= $_."\n"; }
6692 }
6693 chomp($besettings{'BE_URLS'});
6694 @temp = split(/\n/,$besettings{'BE_EXPRESSIONS'});
6695 undef $besettings{'BE_EXPRESSIONS'};
6696 foreach (@temp)
6697 {
6698 s/^\s+//g; s/\s+$//g;
6699 if ($_) { $besettings{'BE_EXPRESSIONS'} .= $_."\n"; }
6700 }
6701 chomp($besettings{'BE_EXPRESSIONS'});
6702 }
6703
6704 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter load blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
6705 {
6706 $besettings{'BEMODE'} = 'on';
6707
6708 $besettings{'BE_NAME'} = $besettings{'BE_BLACKLIST'};
6709
6710 delete $besettings{'BE_DOMAINS'};
6711 delete $besettings{'BE_URLS'};
6712 delete $besettings{'BE_EXPRESSIONS'};
6713
6714 if (-e "$dbdir/$besettings{'BE_NAME'}/domains")
6715 {
6716 open(FILE, "$dbdir/$besettings{'BE_NAME'}/domains");
6717 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } };
6718 close FILE;
6719 chomp($besettings{'BE_DOMAINS'});
6720 }
6721 if (-e "$dbdir/$besettings{'BE_NAME'}/urls")
6722 {
6723 open(FILE, "$dbdir/$besettings{'BE_NAME'}/urls");
6724 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } };
6725 close FILE;
6726 chomp($besettings{'BE_URLS'});
6727 }
6728 if (-e "$dbdir/$besettings{'BE_NAME'}/expressions")
6729 {
6730 open(FILE, "$dbdir/$besettings{'BE_NAME'}/expressions");
6731 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } };
6732 close FILE;
6733 chomp($besettings{'BE_EXPRESSIONS'});
6734 }
6735 }
6736
6737 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter import blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
6738 {
6739 $besettings{'BEMODE'} = 'on';
6740
6741 &Header::getcgihash(\%besettings, {'wantfile' => 1, 'filevar' => 'IMPORTFILE'});
6742
6743 if (!($besettings{'IMPORTFILE'} =~ /.tar.gz$/))
6744 {
6745 $errormessage = $Lang::tr{'urlfilter wrong filetype'};
6746 } else {
6747 if (!-d "$editdir") { mkdir("$editdir"); }
6748
6749 if (copy($besettings{'IMPORTFILE'}, "$editdir/blacklist.tar.gz") != 1)
6750 {
6751 $errormessage = $!;
6752 } else {
6753
6754 my $exitcode = system("/bin/tar --no-same-owner --preserve-permissions -xzf $editdir/blacklist.tar.gz -C $editdir");
6755 if ($exitcode > 0)
6756 {
6757 $errormessage = $Lang::tr{'urlfilter tar error'};
6758 } else {
6759 $i = 0;
6760 foreach (<$editdir/blacklists/*>)
6761 {
6762 if (-d)
6763 {
6764 $i++;
6765 $besettings{'BE_NAME'} = substr($_, rindex($_,"/")+1);
6766 }
6767 }
6768
6769 if (!($i == 1))
6770 {
6771 $errormessage = $Lang::tr{'urlfilter invalid import file'};
6772 } else {
6773 delete $besettings{'BE_DOMAINS'};
6774 delete $besettings{'BE_URLS'};
6775 delete $besettings{'BE_EXPRESSIONS'};
6776
6777 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/domains")
6778 {
6779 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/domains");
6780 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_DOMAINS'} .= $_ } };
6781 close FILE;
6782 chomp($besettings{'BE_DOMAINS'});
6783 }
6784 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/urls")
6785 {
6786 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/urls");
6787 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_URLS'} .= $_ } };
6788 close FILE;
6789 chomp($besettings{'BE_URLS'});
6790 }
6791 if (-e "$editdir/blacklists/$besettings{'BE_NAME'}/expressions")
6792 {
6793 open(FILE, "$editdir/blacklists/$besettings{'BE_NAME'}/expressions");
6794 while (<FILE>) { unless ($_ eq '\n') { $besettings{'BE_EXPRESSIONS'} .= $_ } };
6795 close FILE;
6796 chomp($besettings{'BE_EXPRESSIONS'});
6797 }
6798 }
6799 }
6800
6801 if (-d $editdir) { system("rm -rf $editdir"); }
6802
6803 }
6804 }
6805 }
6806
6807 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter export blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
6808 {
6809 $besettings{'BEMODE'} = 'on';
6810
6811 if ($besettings{'BE_NAME'} eq '')
6812 {
6813 $errormessage = $Lang::tr{'urlfilter category name error'};
6814 } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) {
6815
6816 $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_;
6817
6818 if (!(-d "$editdir")) { mkdir("$editdir"); }
6819 if (!(-d "$editdir/blacklists")) { mkdir("$editdir/blacklists"); }
6820 if (!(-d "$editdir/blacklists/$besettings{'BE_NAME'}")) { mkdir("$editdir/blacklists/$besettings{'BE_NAME'}"); }
6821
6822 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/domains");
6823 flock FILE, 2;
6824 print FILE "$besettings{'BE_DOMAINS'}\n";
6825 close FILE;
6826 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/urls");
6827 flock FILE, 2;
6828 print FILE "$besettings{'BE_URLS'}\n";
6829 close FILE;
6830 open(FILE, ">$editdir/blacklists/$besettings{'BE_NAME'}/expressions");
6831 flock FILE, 2;
6832 print FILE "$besettings{'BE_EXPRESSIONS'}\n";
6833 close FILE;
6834
6835 if (system("/bin/tar -C $editdir -czf $editdir/$besettings{'BE_NAME'}.tar.gz blacklists"))
6836 {
6837 $errormessage = $Lang::tr{'urlfilter export error'};
6838 }
6839 else
6840 {
6841 print "Content-type: application/gzip\n";
6842 print "Content-length: ";
6843 print (-s "$editdir/$besettings{'BE_NAME'}.tar.gz");
6844 print "\n";
6845 print "Content-disposition: attachment; filename=$besettings{'BE_NAME'}.tar.gz\n\n";
6846
6847 open (FILE, "$editdir/$besettings{'BE_NAME'}.tar.gz");
6848 while (<FILE>) { print; }
6849 close (FILE);
6850
6851 if (-d $editdir) { system("rm -rf $editdir"); }
6852 exit;
6853 }
6854 } else {
6855 $errormessage = $Lang::tr{'urlfilter category data error'};
6856 }
6857 }
6858
6859 if (($besettings{'ACTION'} eq $Lang::tr{'urlfilter install blacklist'}) && ($besettings{'MODE'} = 'BLACKLIST_EDITOR'))
6860 {
6861 $besettings{'BEMODE'} = 'on';
6862
6863 if ($besettings{'BE_NAME'} eq '')
6864 {
6865 $errormessage = $Lang::tr{'urlfilter category name error'};
6866 } elsif ($besettings{'BE_DOMAINS'} || $besettings{'BE_URLS'} || $besettings{'BE_EXPRESSIONS'}) {
6867
6868 $_ = $besettings{'BE_NAME'}; tr/A-Z/a-z/; $besettings{'BE_NAME'} = $_;
6869
6870 if (!-d "$editdir") { mkdir("$editdir"); }
6871
6872 if (!-d "$dbdir/$besettings{'BE_NAME'}") { mkdir("$dbdir/$besettings{'BE_NAME'}"); }
6873
6874 if (-e "$dbdir/$besettings{'BE_NAME'}/domains") { unlink("$dbdir/$besettings{'BE_NAME'}/domains"); }
6875 if ($besettings{'BE_DOMAINS'})
6876 {
6877 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/domains");
6878 flock FILE, 2;
6879 print FILE "$besettings{'BE_DOMAINS'}\n";
6880 close FILE;
6881 }
6882 if (-e "$dbdir/$besettings{'BE_NAME'}/urls") { unlink("$dbdir/$besettings{'BE_NAME'}/urls"); }
6883 if ($besettings{'BE_URLS'})
6884 {
6885 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/urls");
6886 flock FILE, 2;
6887 print FILE "$besettings{'BE_URLS'}\n";
6888 close FILE;
6889 }
6890 if (-e "$dbdir/$besettings{'BE_NAME'}/expressions") { unlink("$dbdir/$besettings{'BE_NAME'}/expressions"); }
6891 if ($besettings{'BE_EXPRESSIONS'})
6892 {
6893 open(FILE, ">$dbdir/$besettings{'BE_NAME'}/expressions");
6894 flock FILE, 2;
6895 print FILE "$besettings{'BE_EXPRESSIONS'}\n";
6896 close FILE;
6897 }
6898
6899 open(FILE, ">$editdir/install.conf");
6900 flock FILE, 2;
6901 print FILE "logdir /var/log/squidGuard\n";
6902 print FILE "dbhome $dbdir/$besettings{'BE_NAME'}\n\n";
6903 print FILE "dest $besettings{'BE_NAME'} {\n";
6904 if ($besettings{'BE_DOMAINS'}) { print FILE " domainlist domains\n"; }
6905 if ($besettings{'BE_URLS'}) { print FILE " urllist urls\n"; }
6906 if ($besettings{'BE_EXPRESSIONS'}) { print FILE " expressions expressions\n"; }
6907 print FILE "}\n\n";
6908 print FILE "acl {\n";
6909 print FILE " default {\n";
6910 print FILE " pass none\n";
6911 print FILE " }\n";
6912 print FILE "}\n";
6913 close FILE;
6914
6915 system("rm -f $dbdir/$besettings{'BE_NAME'}/*.db");
6916 system("/usr/sbin/squidGuard -c $editdir/install.conf -C all");
6917 system("chmod a+w $dbdir/$besettings{'BE_NAME'}/*.db");
6918
6919 &readblockcategories;
6920 &readcustomlists;
6921
6922 &writeconfigfile;
6923
6924 system('/usr/local/bin/restartsquid') unless ($besettings{'NORESTART'} eq 'on');
6925
6926 if (-d $editdir) { system("rm -rf $editdir"); }
6927 } else {
6928 $errormessage = $Lang::tr{'urlfilter category data error'};
6929 }
6930 }
6931
6932 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter save schedule'})
6933 {
6934 if (($filtersettings{'UPDATE_SOURCE'} eq 'custom') && ($filtersettings{'CUSTOM_UPDATE_URL'} eq ''))
6935 {
6936 $errormessage = $Lang::tr{'urlfilter custom url required'};
6937 } else {
6938 open (FILE, ">$updconffile");
6939 print FILE "ENABLE_AUTOUPDATE=$filtersettings{'ENABLE_AUTOUPDATE'}\n";
6940 print FILE "UPDATE_SCHEDULE=$filtersettings{'UPDATE_SCHEDULE'}\n";
6941 print FILE "UPDATE_SOURCE=$filtersettings{'UPDATE_SOURCE'}\n";
6942 print FILE "CUSTOM_UPDATE_URL=$filtersettings{'CUSTOM_UPDATE_URL'}\n";
6943 close FILE;
6944
6945 if (-e $upd_cron_dly) { unlink($upd_cron_dly); }
6946 if (-e $upd_cron_wly) { unlink($upd_cron_wly); }
6947 if (-e $upd_cron_mly) { unlink($upd_cron_mly); }
6948
6949 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'daily'))
6950 {
6951 symlink("../bin/autoupdate.pl",$upd_cron_dly)
6952 } else {
6953 symlink("/bin/false",$upd_cron_dly)
6954 }
6955
6956 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'weekly'))
6957 {
6958 symlink("../bin/autoupdate.pl",$upd_cron_wly)
6959 } else {
6960 symlink("/bin/false",$upd_cron_wly)
6961 }
6962
6963 if (($filtersettings{'ENABLE_AUTOUPDATE'} eq 'on') && ($filtersettings{'UPDATE_SCHEDULE'} eq 'monthly'))
6964 {
6965 symlink("../bin/autoupdate.pl",$upd_cron_mly)
6966 } else {
6967 symlink("/bin/false",$upd_cron_mly)
6968 }
6969 }
6970 }
6971
6972 if ($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter update now'})
6973 {
6974 if ($filtersettings{'UPDATE_SOURCE'} eq 'custom')
6975 {
6976 if ($filtersettings{'CUSTOM_UPDATE_URL'} eq '')
6977 {
6978 $errormessage = $Lang::tr{'urlfilter custom url required'};
6979 } else {
6980 system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'CUSTOM_UPDATE_URL'} &");
6981 }
6982 } else {
6983 system("${General::swroot}/urlfilter/bin/autoupdate.pl $filtersettings{'UPDATE_SOURCE'} &");
6984 }
6985 }
6986
6987
6988 if (-e "${General::swroot}/urlfilter/settings") { &General::readhash("${General::swroot}/urlfilter/settings", \%filtersettings); }
6989
6990 &readcustomlists;
6991
6992 $checked{'ENABLE_CUSTOM_BLACKLIST'}{'off'} = '';
6993 $checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} = '';
6994 $checked{'ENABLE_CUSTOM_BLACKLIST'}{$filtersettings{'ENABLE_CUSTOM_BLACKLIST'}} = "checked='checked'";
6995 $checked{'ENABLE_CUSTOM_WHITELIST'}{'off'} = '';
6996 $checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} = '';
6997 $checked{'ENABLE_CUSTOM_WHITELIST'}{$filtersettings{'ENABLE_CUSTOM_WHITELIST'}} = "checked='checked'";
6998 $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'off'} = '';
6999 $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} = '';
7000 $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{$filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'}} = "checked='checked'";
7001 $checked{'BLOCK_EXECUTABLES'}{'off'} = '';
7002 $checked{'BLOCK_EXECUTABLES'}{'on'} = '';
7003 $checked{'BLOCK_EXECUTABLES'}{$filtersettings{'BLOCK_EXECUTABLES'}} = "checked='checked'";
7004 $checked{'BLOCK_AUDIO-VIDEO'}{'off'} = '';
7005 $checked{'BLOCK_AUDIO-VIDEO'}{'on'} = '';
7006 $checked{'BLOCK_AUDIO-VIDEO'}{$filtersettings{'BLOCK_AUDIO-VIDEO'}} = "checked='checked'";
7007 $checked{'BLOCK_ARCHIVES'}{'off'} = '';
7008 $checked{'BLOCK_ARCHIVES'}{'on'} = '';
7009 $checked{'BLOCK_ARCHIVES'}{$filtersettings{'BLOCK_ARCHIVES'}} = "checked='checked'";
7010 $checked{'ENABLE_REWRITE'}{'off'} = '';
7011 $checked{'ENABLE_REWRITE'}{'on'} = '';
7012 $checked{'ENABLE_REWRITE'}{$filtersettings{'ENABLE_REWRITE'}} = "checked='checked'";
7013 $checked{'SHOW_CATEGORY'}{'off'} = '';
7014 $checked{'SHOW_CATEGORY'}{'on'} = '';
7015 $checked{'SHOW_CATEGORY'}{$filtersettings{'SHOW_CATEGORY'}} = "checked='checked'";
7016 $checked{'SHOW_URL'}{'off'} = '';
7017 $checked{'SHOW_URL'}{'on'} = '';
7018 $checked{'SHOW_URL'}{$filtersettings{'SHOW_URL'}} = "checked='checked'";
7019 $checked{'SHOW_IP'}{'off'} = '';
7020 $checked{'SHOW_IP'}{'on'} = '';
7021 $checked{'SHOW_IP'}{$filtersettings{'SHOW_IP'}} = "checked='checked'";
7022 $checked{'ENABLE_DNSERROR'}{'off'} = '';
7023 $checked{'ENABLE_DNSERROR'}{'on'} = '';
7024 $checked{'ENABLE_DNSERROR'}{$filtersettings{'ENABLE_DNSERROR'}} = "checked='checked'";
7025 $checked{'ENABLE_JPEG'}{'off'} = '';
7026 $checked{'ENABLE_JPEG'}{'on'} = '';
7027 $checked{'ENABLE_JPEG'}{$filtersettings{'ENABLE_JPEG'}} = "checked='checked'";
7028 $checked{'ENABLE_EXPR_LISTS'}{'off'} = '';
7029 $checked{'ENABLE_EXPR_LISTS'}{'on'} = '';
7030 $checked{'ENABLE_EXPR_LISTS'}{$filtersettings{'ENABLE_EXPR_LISTS'}} = "checked='checked'";
7031 $checked{'BLOCK_IP_ADDR'}{'off'} = '';
7032 $checked{'BLOCK_IP_ADDR'}{'on'} = '';
7033 $checked{'BLOCK_IP_ADDR'}{$filtersettings{'BLOCK_IP_ADDR'}} = "checked='checked'";
7034 $checked{'BLOCK_ALL'}{'off'} = '';
7035 $checked{'BLOCK_ALL'}{'on'} = '';
7036 $checked{'BLOCK_ALL'}{$filtersettings{'BLOCK_ALL'}} = "checked='checked'";
7037 $checked{'ENABLE_EMPTY_ADS'}{'off'} = '';
7038 $checked{'ENABLE_EMPTY_ADS'}{'on'} = '';
7039 $checked{'ENABLE_EMPTY_ADS'}{$filtersettings{'ENABLE_EMPTY_ADS'}} = "checked='checked'";
7040 $checked{'ENABLE_GLOBAL_WHITELIST'}{'off'} = '';
7041 $checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} = '';
7042 $checked{'ENABLE_GLOBAL_WHITELIST'}{$filtersettings{'ENABLE_GLOBAL_WHITELIST'}} = "checked='checked'";
7043 $checked{'ENABLE_SAFESEARCH'}{'off'} = '';
7044 $checked{'ENABLE_SAFESEARCH'}{'on'} = '';
7045 $checked{'ENABLE_SAFESEARCH'}{$filtersettings{'ENABLE_SAFESEARCH'}} = "checked='checked'";
7046 $checked{'ENABLE_LOG'}{'off'} = '';
7047 $checked{'ENABLE_LOG'}{'on'} = '';
7048 $checked{'ENABLE_LOG'}{$filtersettings{'ENABLE_LOG'}} = "checked='checked'";
7049 $checked{'ENABLE_USERNAME_LOG'}{'off'} = '';
7050 $checked{'ENABLE_USERNAME_LOG'}{'on'} = '';
7051 $checked{'ENABLE_USERNAME_LOG'}{$filtersettings{'ENABLE_USERNAME_LOG'}} = "checked='checked'";
7052 $checked{'ENABLE_CATEGORY_LOG'}{'off'} = '';
7053 $checked{'ENABLE_CATEGORY_LOG'}{'on'} = '';
7054 $checked{'ENABLE_CATEGORY_LOG'}{$filtersettings{'ENABLE_CATEGORY_LOG'}} = "checked='checked'";
7055
7056 foreach $category (@filtergroups) {
7057 $checked{$category}{'off'} = '';
7058 $checked{$category}{'on'} = '';
7059 $checked{$category}{$filtersettings{$category}} = "checked='checked'";
7060 }
7061
7062 $selected{'DEFINITION'}{$tcsettings{'DEFINITION'}} = "selected='selected'";
7063 $selected{'FROM_HOUR'}{$tcsettings{'FROM_HOUR'}} = "selected='selected'";
7064 $selected{'FROM_MINUTE'}{$tcsettings{'FROM_MINUTE'}} = "selected='selected'";
7065 $selected{'TO_HOUR'}{$tcsettings{'TO_HOUR'}} = "selected='selected'";
7066 $selected{'TO_MINUTE'}{$tcsettings{'TO_MINUTE'}} = "selected='selected'";
7067
7068 @selectedcategories = split(/\|/,$tcsettings{'DST'});
7069 foreach (@selectedcategories)
7070 {
7071 $selected{'DST'}{$_} = "selected='selected'";
7072 }
7073
7074 $selected{'ACCESS'}{$tcsettings{'ACCESS'}} = "selected='selected'";
7075
7076 $checked{'ENABLERULE'}{'off'} = '';
7077 $checked{'ENABLERULE'}{'on'} = '';
7078 $checked{'ENABLERULE'}{$tcsettings{'ENABLERULE'}} = "checked='checked'";
7079 $checked{'MON'}{'off'} = '';
7080 $checked{'MON'}{'on'} = '';
7081 $checked{'MON'}{$tcsettings{'MON'}} = "checked='checked'";
7082 $checked{'TUE'}{'off'} = '';
7083 $checked{'TUE'}{'on'} = '';
7084 $checked{'TUE'}{$tcsettings{'TUE'}} = "checked='checked'";
7085 $checked{'WED'}{'off'} = '';
7086 $checked{'WED'}{'on'} = '';
7087 $checked{'WED'}{$tcsettings{'WED'}} = "checked='checked'";
7088 $checked{'THU'}{'off'} = '';
7089 $checked{'THU'}{'on'} = '';
7090 $checked{'THU'}{$tcsettings{'THU'}} = "checked='checked'";
7091 $checked{'FRI'}{'off'} = '';
7092 $checked{'FRI'}{'on'} = '';
7093 $checked{'FRI'}{$tcsettings{'FRI'}} = "checked='checked'";
7094 $checked{'SAT'}{'off'} = '';
7095 $checked{'SAT'}{'on'} = '';
7096 $checked{'SAT'}{$tcsettings{'SAT'}} = "checked='checked'";
7097 $checked{'SUN'}{'off'} = '';
7098 $checked{'SUN'}{'on'} = '';
7099 $checked{'SUN'}{$tcsettings{'SUN'}} = "checked='checked'";
7100
7101 $selected{'SPORADIC'}{$uqsettings{'SPORADIC'}} = "selected='selected'";
7102 $selected{'RENEWAL'} {$uqsettings{'RENEWAL'}} = "selected='selected'";
7103
7104 $checked{'ENABLEQUOTA'}{'off'} = '';
7105 $checked{'ENABLEQUOTA'}{'on'} = '';
7106 $checked{'ENABLEQUOTA'}{$uqsettings{'ENABLEQUOTA'}} = "checked='checked'";
7107
7108 $selected{'BE_BLACKLIST'}{$besettings{'BE_BLACKLIST'}} = "selected='selected'";
7109
7110
7111 &Header::showhttpheaders();
7112
7113 &Header::openpage($Lang::tr{'urlfilter configuration'}, 1, '');
7114
7115 &Header::openbigbox('100%', 'left', '', $errormessage);
7116
7117 if ($errormessage) {
7118 &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
7119 print "<font class='base'>$errormessage&nbsp;</font>\n";
7120 &Header::closebox();
7121 } elsif (($tcsettings{'CHANGED'} eq 'yes') || ($uqsettings{'CHANGED'} eq 'yes') ) {
7122 &writeconfigfile;
7123 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
7124 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restart notification'}:");
7125 print "<class name='base'>$Lang::tr{'urlfilter restart message'}\n";
7126 if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "<p><class name='base'>$Lang::tr{'urlfilter quota restart message'}\n"; }
7127 print "</class>\n";
7128 print "<p><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter restart'}' />";
7129 if ($tcsettings{'MODE'} eq 'TIMECONSTRAINT') { print "<input type='hidden' name='MODE' value='TIMECONSTRAINT' />"; }
7130 if ($uqsettings{'MODE'} eq 'USERQUOTA') { print "<input type='hidden' name='MODE' value='USERQUOTA' />"; }
7131 &Header::closebox();
7132 print "</form>\n";
7133 }
7134
7135 if ($restoremessage) {
7136 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter restore results'}:");
7137 print "<class name='base'>$restoremessage\n";
7138 print "&nbsp;</class>\n";
7139 &Header::closebox();
7140 }
7141
7142 if ((!$tcsettings{'TCMODE'}) && (!$uqsettings{'UQMODE'}) && (!$besettings{'BEMODE'})) {
7143
7144 if (!($filtersettings{'ACTION'} eq $Lang::tr{'urlfilter manage repository'})) {
7145
7146 #==========================================================
7147 #
7148 # Section: Main Configuration
7149 #
7150 #==========================================================
7151
7152 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
7153
7154 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter filter settings'}:");
7155 print <<END
7156 <table width='100%'>
7157 <tr>
7158 <td colspan='4'><b>$Lang::tr{'urlfilter block categories'}</b></td>
7159 </tr>
7160 END
7161 ;
7162
7163 if (@categories == 0) {
7164 print <<END
7165 <tr>
7166 <td><i>$Lang::tr{'urlfilter no categories'}</i></td>
7167 <td>&nbsp;</td>
7168 <td>&nbsp;</td>
7169 <td>&nbsp;</td>
7170 </tr>
7171
7172 END
7173 ;
7174 }
7175
7176 for ($n=0; $n<=@categories; $n = $n + $i) {
7177 for ($i=0; $i<=3; $i++) {
7178 if ($i eq 0) { print "<tr>\n"; }
7179 if (($n+$i) < @categories) {
7180 print "<td width='15%'>@categories[$n+$i]:<\/td>\n";
7181 print "<td width='10%'><input type='checkbox' name=@filtergroups[$n+$i] $checked{@filtergroups[$n+$i]}{'on'} /></td>\n";
7182 }
7183 if ($i eq 3) { print "<\/tr>\n"; }
7184 }
7185 }
7186
7187 print <<END
7188 </table>
7189 <hr size='1'>
7190 <table width='100%'>
7191 <tr>
7192 <td><b>$Lang::tr{'urlfilter custom blacklist'}</b></td>
7193 <td>&nbsp;</td>
7194 <td>&nbsp;</td>
7195 <td>&nbsp;</td>
7196 </tr>
7197 <tr>
7198 <td colspan='2'>$Lang::tr{'urlfilter blocked domains'}&nbsp;<img src='/blob.gif' alt='*' /></td>
7199 <td colspan='2'>$Lang::tr{'urlfilter blocked urls'}&nbsp;<img src='/blob.gif' alt='*' /></td>
7200 </tr>
7201 <tr>
7202 <td colspan='2' width='50%'><textarea name='CUSTOM_BLACK_DOMAINS' cols='32' rows='6' wrap='off'>
7203 END
7204 ;
7205
7206 print $filtersettings{'CUSTOM_BLACK_DOMAINS'};
7207
7208 print <<END
7209 </textarea></td>
7210 <td colspan='2' width='50%'><textarea name='CUSTOM_BLACK_URLS' cols='32' rows='6' wrap='off'>
7211 END
7212 ;
7213
7214 print $filtersettings{'CUSTOM_BLACK_URLS'};
7215
7216 print <<END
7217 </textarea></td>
7218 </tr>
7219 </table>
7220 <table width='100%'>
7221 <tr>
7222 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom blacklist'}:</td>
7223 <td><input type='checkbox' name='ENABLE_CUSTOM_BLACKLIST' $checked{'ENABLE_CUSTOM_BLACKLIST'}{'on'} /></td>
7224 <td>&nbsp;</td>
7225 <td>&nbsp;</td>
7226 </tr>
7227 </table>
7228 <hr size='1'>
7229 <table width='100%'>
7230 <tr>
7231 <td><b>$Lang::tr{'urlfilter custom whitelist'}</b></td>
7232 <td>&nbsp;</td>
7233 <td>&nbsp;</td>
7234 <td>&nbsp;</td>
7235 </tr>
7236 <tr>
7237 <td colspan='2'>$Lang::tr{'urlfilter allowed domains'}&nbsp;<img src='/blob.gif' alt='*' /></td>
7238 <td colspan='2'>$Lang::tr{'urlfilter allowed urls'}&nbsp;<img src='/blob.gif' alt='*' /></td>
7239 </tr>
7240 <tr>
7241 <td colspan='2' width='50%'><textarea name='CUSTOM_WHITE_DOMAINS' cols='32' rows='6' wrap='off'>
7242 END
7243 ;
7244
7245 print $filtersettings{'CUSTOM_WHITE_DOMAINS'};
7246
7247 print <<END
7248 </textarea></td>
7249 <td colspan='2' width='50%'><textarea name='CUSTOM_WHITE_URLS' cols='32' rows='6' wrap='off'>
7250 END
7251 ;
7252
7253 print $filtersettings{'CUSTOM_WHITE_URLS'};
7254
7255 print <<END
7256 </textarea></td>
7257 </tr>
7258 </table>
7259 <table width='100%'>
7260 <tr>
7261 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom whitelist'}:</td>
7262 <td><input type='checkbox' name='ENABLE_CUSTOM_WHITELIST' $checked{'ENABLE_CUSTOM_WHITELIST'}{'on'} /></td>
7263 <td>&nbsp;</td>
7264 <td>&nbsp;</td>
7265 </tr>
7266 </table>
7267 <hr size='1'>
7268 <table width='100%'>
7269 <tr>
7270 <td colspan='4'><b>$Lang::tr{'urlfilter custom expression list'}</b></td>
7271 </tr>
7272 <tr>
7273 <td colspan='4'>$Lang::tr{'urlfilter blocked expressions'}&nbsp;<img src='/blob.gif' alt='*' /></td>
7274 </tr>
7275 <tr>
7276 <td colspan='4'><textarea name='CUSTOM_EXPRESSIONS' cols='70' rows='3' wrap='off'>
7277 END
7278 ;
7279
7280 print $filtersettings{'CUSTOM_EXPRESSIONS'};
7281
7282 print <<END
7283 </textarea></td>
7284 </tr>
7285 <tr>
7286 <td class='base' width='25%'>$Lang::tr{'urlfilter enable custom expression list'}:</td>
7287 <td><input type='checkbox' name='ENABLE_CUSTOM_EXPRESSIONS' $checked{'ENABLE_CUSTOM_EXPRESSIONS'}{'on'} /></td>
7288 <td>&nbsp;</td>
7289 <td>&nbsp;</td>
7290 </tr>
7291 </table>
7292 <hr size='1'>
7293 <table width='100%'>
7294 <tr>
7295 <td colspan='4'><b>$Lang::tr{'urlfilter file ext block'}</b></td>
7296 </tr>
7297 <tr>
7298 <td width='25%' class='base'>$Lang::tr{'urlfilter block executables'}:</td>
7299 <td width='12%'><input type='checkbox' name='BLOCK_EXECUTABLES' $checked{'BLOCK_EXECUTABLES'}{'on'} /></td>
7300 <td width='25%' class='base'>$Lang::tr{'urlfilter block audio-video'}:</td>
7301 <td><input type='checkbox' name='BLOCK_AUDIO-VIDEO' $checked{'BLOCK_AUDIO-VIDEO'}{'on'} /></td>
7302 </tr>
7303 <tr>
7304 <td class='base'>$Lang::tr{'urlfilter block archives'}:</td>
7305 <td><input type='checkbox' name='BLOCK_ARCHIVES' $checked{'BLOCK_ARCHIVES'}{'on'} /></td>
7306 <td>&nbsp;</td>
7307 <td>&nbsp;</td>
7308 </tr>
7309 </table>
7310 <hr size='1'>
7311 <table width='100%'>
7312 <tr>
7313 <td colspan='4'><b>$Lang::tr{'urlfilter local file redirection'}</b></td>
7314 </tr>
7315 <tr>
7316 <td width='25%' class='base'>$Lang::tr{'urlfilter enable rewrite rules'}:</td>
7317 <td width='12%'><input type='checkbox' name='ENABLE_REWRITE' $checked{'ENABLE_REWRITE'}{'on'} /></td>
7318 <td>&nbsp;</td>
7319 <td>&nbsp;</td>
7320 </tr>
7321 <tr>
7322 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter manage repository'}'></td>
7323 <td>&nbsp;</td>
7324 <td>&nbsp;</td>
7325 <td>&nbsp;</td>
7326 </tr>
7327 </table>
7328 <hr size='1'>
7329 <table width='100%'>
7330 <tr>
7331 <td colspan='2'><b>$Lang::tr{'urlfilter network access control'}</b></td>
7332 <td>&nbsp;</td>
7333 <td>&nbsp;</td>
7334 </tr>
7335 <tr>
7336 <td class='base'>$Lang::tr{'urlfilter unfiltered clients'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
7337 <td><input type='text' name='UNFILTERED_CLIENTS' value='$filtersettings{'UNFILTERED_CLIENTS'}' size='30' /></td>
7338 <td class='base'>$Lang::tr{'urlfilter banned clients'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
7339 <td><input type='text' name='BANNED_CLIENTS' value='$filtersettings{'BANNED_CLIENTS'}' size='30' /></td>
7340 </tr>
7341 </table>
7342 <hr size='1'>
7343 <table width='100%'>
7344 <tr>
7345 <td colspan='4'><b>$Lang::tr{'urlfilter timebased access control'}</b></td>
7346 </tr>
7347 <tr>
7348 <td width='25%'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter set time constraints'}'></td>
7349 <td width='25%'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter set user quota'}'></td>
7350 <td>&nbsp;</td>
7351 <td>&nbsp;</td>
7352 </tr>
7353 </table>
7354 <hr size='1'>
7355 <table width='100%'>
7356 <tr>
7357 <td colspan='4'><b>$Lang::tr{'urlfilter block settings'}</b></td>
7358 </tr>
7359 <tr>
7360 <td width='25%' class='base'>$Lang::tr{'urlfilter show category'}:</td>
7361 <td width='12%'><input type='checkbox' name='SHOW_CATEGORY' $checked{'SHOW_CATEGORY'}{'on'} /></td>
7362 <td width='25%' class='base'>$Lang::tr{'urlfilter redirectpage'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
7363 <td><input type='text' name='REDIRECT_PAGE' value='$filtersettings{'REDIRECT_PAGE'}' size='40' /></td>
7364 </tr>
7365 <tr>
7366 <td class='base'>$Lang::tr{'urlfilter show url'}:</td>
7367 <td><input type='checkbox' name='SHOW_URL' $checked{'SHOW_URL'}{'on'} /></td>
7368 <td class='base'>$Lang::tr{'urlfilter msg text 1'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
7369 <td><input type='text' name='MSG_TEXT_1' value='$filtersettings{'MSG_TEXT_1'}' size='40' /></td>
7370 </tr>
7371 <tr>
7372 <td class='base'>$Lang::tr{'urlfilter show ip'}:</td>
7373 <td><input type='checkbox' name='SHOW_IP' $checked{'SHOW_IP'}{'on'} /></td>
7374 <td class='base'>$Lang::tr{'urlfilter msg text 2'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
7375 <td><input type='text' name='MSG_TEXT_2' value='$filtersettings{'MSG_TEXT_2'}' size='40' /></td>
7376 </tr>
7377 <tr>
7378 <td class='base'>$Lang::tr{'urlfilter show dnserror'}:</td>
7379 <td><input type='checkbox' name='ENABLE_DNSERROR' $checked{'ENABLE_DNSERROR'}{'on'} /></td>
7380 <td class='base'>$Lang::tr{'urlfilter msg text 3'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
7381 <td><input type='text' name='MSG_TEXT_3' value='$filtersettings{'MSG_TEXT_3'}' size='40' /></td>
7382 </tr>
7383 <tr>
7384 <td class='base'>$Lang::tr{'urlfilter enable jpeg'}:</td>
7385 <td><input type='checkbox' name='ENABLE_JPEG' $checked{'ENABLE_JPEG'}{'on'} /></td>
7386 <td>&nbsp;</td>
7387 <td>&nbsp;</td>
7388 </tr>
7389 </table>
7390 <table width='100%'>
7391 <tr>
7392 <td class='base'><b>$Lang::tr{'urlfilter background image'}</b></td>
7393 </tr>
7394 <tr>
7395 <td><br>$Lang::tr{'urlfilter background text'}:</td>
7396 </tr>
7397 <tr>
7398 <td><input type='file' name='BACKGROUND' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload background'}' /></td>
7399 </tr>
7400 </table>
7401 <hr size='1'>
7402 <table width='100%'>
7403 <tr>
7404 <td colspan='4'><b>$Lang::tr{'urlfilter advanced settings'}</b></td>
7405 </tr>
7406 <tr>
7407 <td width='25%' class='base'>$Lang::tr{'urlfilter enable expression lists'}:</td>
7408 <td width='12%'><input type='checkbox' name='ENABLE_EXPR_LISTS' $checked{'ENABLE_EXPR_LISTS'}{'on'} /></td>
7409 <td width='25%' class='base'>$Lang::tr{'urlfilter enable log'}:</td>
7410 <td><input type='checkbox' name='ENABLE_LOG' $checked{'ENABLE_LOG'}{'on'} /></td>
7411 </tr>
7412 <tr>
7413 <td class='base'>$Lang::tr{'urlfilter safesearch'}:</td>
7414 <td><input type='checkbox' name='ENABLE_SAFESEARCH' $checked{'ENABLE_SAFESEARCH'}{'on'} /></td>
7415 <td class='base'>$Lang::tr{'urlfilter username log'}:</td>
7416 <td><input type='checkbox' name='ENABLE_USERNAME_LOG' $checked{'ENABLE_USERNAME_LOG'}{'on'} /></td>
7417 </tr>
7418 <tr>
7419 <td class='base'>$Lang::tr{'urlfilter empty ads'}:</td>
7420 <td><input type='checkbox' name='ENABLE_EMPTY_ADS' $checked{'ENABLE_EMPTY_ADS'}{'on'} /></td>
7421 <td class='base'>$Lang::tr{'urlfilter category log'}:</td>
7422 <td><input type='checkbox' name='ENABLE_CATEGORY_LOG' $checked{'ENABLE_CATEGORY_LOG'}{'on'} /></td>
7423 </tr>
7424 <tr>
7425 <td class='base'>$Lang::tr{'urlfilter block ip'}:</td>
7426 <td><input type='checkbox' name='BLOCK_IP_ADDR' $checked{'BLOCK_IP_ADDR'}{'on'} /></td>
7427 <td class='base'>$Lang::tr{'urlfilter children'}:</td>
7428 <td><input type='text' name='CHILDREN' value='$filtersettings{'CHILDREN'}' size='5' /></td>
7429 </tr>
7430 <tr>
7431 <td class='base'>$Lang::tr{'urlfilter block all'}:</td>
7432 <td><input type='checkbox' name='BLOCK_ALL' $checked{'BLOCK_ALL'}{'on'} /></td>
7433 <td class='base'>$Lang::tr{'urlfilter whitelist always allowed'}:</td>
7434 <td><input type='checkbox' name='ENABLE_GLOBAL_WHITELIST' $checked{'ENABLE_GLOBAL_WHITELIST'}{'on'} /></td>
7435 </tr>
7436 </table>
7437 <hr size='1'>
7438 <table width='100%'>
7439 <tr>
7440 <td>
7441 <img src='/blob.gif' align='top' alt='*' />&nbsp;
7442 <font class='base'>$Lang::tr{'this field may be blank'}</font>
7443 </td>
7444 <td align='right'>
7445 <sup><small><a href='http://www.urlfilter.net' target='_blank'>URL filter</a></small></sup>
7446 </td>
7447 </tr>
7448 </table>
7449 <table width='100%'>
7450 <tr>
7451 <td>&nbsp;</td>
7452 <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
7453 <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter save and restart'}' /></td>
7454 <td>&nbsp;</td>
7455 </tr>
7456 </table>
7457 END
7458 ;
7459
7460 &Header::closebox();
7461
7462 print "</form>\n";
7463
7464 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
7465
7466 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter maintenance'}:");
7467
7468 print <<END
7469 <table width='100%'>
7470 <tr>
7471 <td class='base'><b>$Lang::tr{'urlfilter blacklist update'}</b></td>
7472 </tr>
7473 <tr>
7474 <td>$Lang::tr{'urlfilter upload information'}<p>$Lang::tr{'urlfilter upload text'}:</td>
7475 </tr>
7476 <tr>
7477 <td><input type='file' name='UPDATEFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload blacklist'}' /></td>
7478 </tr>
7479 </table>
7480
7481 <hr size='1'>
7482
7483 <table width='100%'>
7484 <tr>
7485 <td colspan='2' class='base'><b>$Lang::tr{'urlfilter automatic blacklist update'}</b>
7486 END
7487 ;
7488 if (-e "$updflagfile")
7489 {
7490 $blacklistage = int(-M "$updflagfile");
7491 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>";
7492 }
7493
7494 $updatesettings{'UPDATE_SCHEDULE'} = 'monthly';
7495 $updatesettings{'CUSTOM_UPDATE_URL'} = '';
7496
7497 if (-e "$updconffile") { &General::readhash("$updconffile", \%updatesettings); }
7498
7499 $checked{'ENABLE_AUTOUPDATE'}{'off'} = '';
7500 $checked{'ENABLE_AUTOUPDATE'}{'on'} = '';
7501 $checked{'ENABLE_AUTOUPDATE'}{$updatesettings{'ENABLE_AUTOUPDATE'}} = "checked='checked'";
7502
7503 $selected{'UPDATE_SCHEDULE'}{$updatesettings{'UPDATE_SCHEDULE'}} = "selected='selected'";
7504
7505 $selected{'UPDATE_SOURCE'}{$updatesettings{'UPDATE_SOURCE'}} = "selected='selected'";
7506
7507 print <<END
7508 </td>
7509 </tr>
7510 <tr>
7511 <td width='25%' class='base'>$Lang::tr{'urlfilter enable automatic blacklist update'}:</td>
7512 <td width='75%' class='base'><input type='checkbox' name='ENABLE_AUTOUPDATE' $checked{'ENABLE_AUTOUPDATE'}{'on'} /></td>
7513 </tr>
7514 <tr>
7515 <td class='base'>$Lang::tr{'urlfilter automatic update schedule'}:</td>
7516 <td class='base'>
7517 <select name='UPDATE_SCHEDULE'>
7518 <option value='daily' $selected{'UPDATE_SCHEDULE'}{'daily'}>$Lang::tr{'urlfilter daily'}</option>
7519 <option value='weekly' $selected{'UPDATE_SCHEDULE'}{'weekly'}>$Lang::tr{'urlfilter weekly'}</option>
7520 <option value='monthly' $selected{'UPDATE_SCHEDULE'}{'monthly'}>$Lang::tr{'urlfilter monthly'}</option>
7521 </select>
7522 </td>
7523 </tr>
7524 <tr>
7525 <td class='base'>$Lang::tr{'urlfilter select source'}:</td>
7526 <td class='base' colspan='2'>
7527 <select name='UPDATE_SOURCE'>
7528 END
7529 ;
7530
7531 foreach (@source_urllist) {
7532 chomp;
7533 $source_name = substr($_,0,rindex($_,","));
7534 $source_url = substr($_,index($_,",")+1);
7535 print "\t<option value='$source_url' $selected{'UPDATE_SOURCE'}{$source_url}>$source_name</option>\n";
7536 }
7537
7538 print <<END
7539 <option value='custom' $selected{'UPDATE_SOURCE'}{'custom'}>$Lang::tr{'urlfilter custom url'}</option>
7540 </select>
7541 </td>
7542 </tr>
7543 <tr>
7544 <td>$Lang::tr{'urlfilter custom url'}:</td>
7545 <td><input type='text' name='CUSTOM_UPDATE_URL' value='$updatesettings{'CUSTOM_UPDATE_URL'}' size='72' /></td>
7546 </tr>
7547 </table>
7548 <table width='100%'>
7549 <tr>
7550 <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>
7551 </tr>
7552 </table>
7553
7554 <hr size='1'>
7555
7556 <table width='100%'>
7557 <tr>
7558 <td class='base'><b>$Lang::tr{'urlfilter blacklist editor'}</b></td>
7559 </tr>
7560 <tr>
7561 <td>$Lang::tr{'urlfilter blacklist editor info'}</td>
7562 </tr>
7563 <tr>
7564 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter blacklist editor'}' /></td>
7565 </tr>
7566 </table>
7567
7568 <hr size='1'>
7569
7570 <table width='100%'>
7571 <tr>
7572 <td colspan='4' class='base'><b>$Lang::tr{'urlfilter backup settings'}</b></td>
7573 </tr>
7574 <tr>
7575 <td width='25%' class='base'>$Lang::tr{'urlfilter enable full backup'}:</td>
7576 <td width='12%' class='base'><input type='checkbox' name='ENABLE_FULLBACKUP' $checked{'ENABLE_FULLBACKUP'}{'on'} /></td>
7577 <td>&nbsp;</td>
7578 <td>&nbsp;</td>
7579 </tr>
7580 <tr>
7581 <td colspan='4' class='base'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter backup'}' /></td>
7582 </tr>
7583 </table>
7584
7585 <hr size='1'>
7586
7587 <table width='100%'>
7588 <tr>
7589 <td class='base'><b>$Lang::tr{'urlfilter restore settings'}</b></td>
7590 </tr>
7591 <tr>
7592 <td>$Lang::tr{'urlfilter restore text'}:</td>
7593 </tr>
7594 <tr>
7595 <td><input type='file' name='UPDATEFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter restore'}' /></td>
7596 </tr>
7597 </table>
7598 </form>
7599 END
7600 ;
7601
7602 &Header::closebox();
7603
7604 } else {
7605
7606 #==========================================================
7607 #
7608 # Section: Manage Repository
7609 #
7610 #==========================================================
7611
7612 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
7613
7614 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter manage local file repository'}:");
7615 print <<END
7616 <table width='100%'>
7617 <tr>
7618 <td>$Lang::tr{'urlfilter repository information'}<br><br></td>
7619 </tr>
7620 <tr>
7621 <td>$Lang::tr{'urlfilter upload file text'}:</td>
7622 </tr>
7623 <tr>
7624 <td><input type='file' name='UPLOADFILE' size='50' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter upload file'}' /></td>
7625 </tr>
7626 <tr>
7627 <td><br><b>$Lang::tr{'urlfilter upload file information 1'}:</b> $Lang::tr{'urlfilter upload file information 2'}</td>
7628 </tr>
7629 </table>
7630 <hr size='1'>
7631 <table width='100%'>
7632 <tr>
7633 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
7634 </tr>
7635 </table>
7636 </form>
7637 END
7638 ;
7639
7640 &Header::closebox();
7641
7642 &Header::openbox('100%', 'left', "$Lang::tr{'urlfilter current files'}: </b>[$repository]");
7643
7644 @repositorylist = <$repository/*>;
7645
7646 undef @repositoryfiles;
7647 foreach (@repositorylist)
7648 {
7649 if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); }
7650 }
7651
7652 if (@repositoryfiles)
7653 {
7654 print <<END
7655 <table width='100%'>
7656 <tr>
7657 <td align='center'><b>$Lang::tr{'urlfilter filename'}</b></td>
7658 <td width='15%' align='center'><b>$Lang::tr{'urlfilter filesize'}</b></td>
7659 <td width='10%'></td>
7660 </tr>
7661 END
7662 ;
7663 $id = 0;
7664 foreach $line (@repositoryfiles)
7665 {
7666 $id++;
7667 if ($id % 2) {
7668 print "<tr bgcolor='$Header::table1colour'>\n"; }
7669 else {
7670 print "<tr bgcolor='$Header::table2colour'>\n"; }
7671 $filesize = (-s "$repository/$line");
7672 1 while $filesize =~ s/^(-?\d+)(\d{3})/$1.$2/;
7673
7674 print <<END
7675 <td>&nbsp; &nbsp;$line</td>
7676 <td align='right'>$filesize&nbsp; &nbsp;</td>
7677
7678 <td align='center'>
7679 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
7680 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
7681 <input type='hidden' name='ID' value='$line' />
7682 <input type='hidden' name='ACTION' value='$Lang::tr{'urlfilter remove file'}' />
7683 </form>
7684 </td>
7685
7686 </tr>
7687 END
7688 ;
7689 }
7690
7691 print <<END
7692 </table>
7693 <table>
7694 <tr>
7695 </tr>
7696 </table>
7697 <table>
7698 <tr>
7699 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
7700 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
7701 <td class='base'>$Lang::tr{'remove'}</td>
7702 </tr>
7703 </table>
7704 END
7705 ;
7706 } else {
7707
7708 print "<i>$Lang::tr{'urlfilter empty repository'}</i>\n";
7709 }
7710
7711 &Header::closebox();
7712
7713 }
7714
7715 } elsif ($tcsettings{'TCMODE'}) {
7716
7717 #==========================================================
7718 #
7719 # Section: Set Time Constraints
7720 #
7721 #==========================================================
7722
7723 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
7724
7725 $buttontext = $Lang::tr{'urlfilter add rule'};
7726 if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) {
7727 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit time constraint rule'}.':');
7728 $buttontext = $Lang::tr{'urlfilter update rule'};
7729 } else {
7730 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new time constraint rule'}.':');
7731 }
7732 print <<END
7733
7734 <table width='100%'>
7735 <tr>
7736 <td width='2%'>$Lang::tr{'urlfilter constraint definition'}</td>
7737 <td width='1%'>&nbsp;&nbsp;</td>
7738 <td width='2%' align='center'>$Lang::tr{'urlfilter monday'}</td>
7739 <td width='2%' align='center'>$Lang::tr{'urlfilter tuesday'}</td>
7740 <td width='2%' align='center'>$Lang::tr{'urlfilter wednesday'}</td>
7741 <td width='2%' align='center'>$Lang::tr{'urlfilter thursday'}</td>
7742 <td width='2%' align='center'>$Lang::tr{'urlfilter friday'}</td>
7743 <td width='2%' align='center'>$Lang::tr{'urlfilter saturday'}</td>
7744 <td width='2%' align='center'>$Lang::tr{'urlfilter sunday'}</td>
7745 <td width='1%'>&nbsp;&nbsp;</td>
7746 <td width='7%' colspan=3>$Lang::tr{'urlfilter from'}</td>
7747 <td width='1%'>&nbsp;</td>
7748 <td width='7%' colspan=3>$Lang::tr{'urlfilter to'}</td>
7749 <td>&nbsp;</td>
7750 </tr>
7751 <tr>
7752 <td class='base'>
7753 <select name='DEFINITION'>
7754 <option value='within' $selected{'DEFINITION'}{'within'}>$Lang::tr{'urlfilter constraint within'}</option>
7755 <option value='outside' $selected{'DEFINITION'}{'outside'}>$Lang::tr{'urlfilter constraint outside'}</option>
7756 </select>
7757 </td>
7758 <td>&nbsp;</td>
7759 <td class='base'><input type='checkbox' name='MON' $checked{'MON'}{'on'} /></td>
7760 <td class='base'><input type='checkbox' name='TUE' $checked{'TUE'}{'on'} /></td>
7761 <td class='base'><input type='checkbox' name='WED' $checked{'WED'}{'on'} /></td>
7762 <td class='base'><input type='checkbox' name='THU' $checked{'THU'}{'on'} /></td>
7763 <td class='base'><input type='checkbox' name='FRI' $checked{'FRI'}{'on'} /></td>
7764 <td class='base'><input type='checkbox' name='SAT' $checked{'SAT'}{'on'} /></td>
7765 <td class='base'><input type='checkbox' name='SUN' $checked{'SUN'}{'on'} /></td>
7766 <td>&nbsp;</td>
7767 <td class='base'>
7768 <select name='FROM_HOUR'>
7769 END
7770 ;
7771 for ($i=0;$i<=24;$i++) {
7772 $_ = sprintf("%02s",$i);
7773 print "<option $selected{'FROM_HOUR'}{$_}>$_</option>\n";
7774 }
7775 print <<END
7776 </select>
7777 </td>
7778 <td>:</td>
7779 <td class='base'>
7780 <select name='FROM_MINUTE'>
7781 END
7782 ;
7783 for ($i=0;$i<=45;$i+=15) {
7784 $_ = sprintf("%02s",$i);
7785 print "<option $selected{'FROM_MINUTE'}{$_}>$_</option>\n";
7786 }
7787 print <<END
7788 </select>
7789 <td> - </td>
7790 </td>
7791 <td class='base'>
7792 <select name='TO_HOUR'>
7793 END
7794 ;
7795 for ($i=0;$i<=24;$i++) {
7796 $_ = sprintf("%02s",$i);
7797 print "<option $selected{'TO_HOUR'}{$_}>$_</option>\n";
7798 }
7799 print <<END
7800 </select>
7801 </td>
7802 <td>:</td>
7803 <td class='base'>
7804 <select name='TO_MINUTE'>
7805 END
7806 ;
7807 for ($i=0;$i<=45;$i+=15) {
7808 $_ = sprintf("%02s",$i);
7809 print "<option $selected{'TO_MINUTE'}{$_}>$_</option>\n";
7810 }
7811 print <<END
7812 </select>
7813 </td>
7814 <td>&nbsp;</td>
7815 </tr>
7816 </table>
7817
7818 <br>
7819
7820 <table width='100%'>
7821 <tr>
7822 <td width='5%'>$Lang::tr{'urlfilter source'}</td>
7823 <td width='1%'>&nbsp;&nbsp;</td>
7824 <td width='5%'>$Lang::tr{'urlfilter dst'}&nbsp;<img src='/blob.gif' alt='*'><img src='/blob.gif' alt='*'></td>
7825 <td width='1%'>&nbsp;&nbsp;</td>
7826 <td width='5%'>$Lang::tr{'urlfilter access'}</td>
7827 <td>&nbsp;</td>
7828 </tr>
7829 <tr>
7830 <td valign='top'><input type='text' name='SRC' value='$tcsettings{'SRC'}' size='32' /></td>
7831 <td>&nbsp;</td>
7832 <td class='base' rowspan='3' valign='top'>
7833 <select name='DST' size='4' multiple>
7834 <option value='any' $selected{'DST'}{'any'} = "selected='selected'">$Lang::tr{'urlfilter category all'}</option>
7835 <option value='in-addr' $selected{'DST'}{'in-addr'} = "selected='selected'">in-addr</option>
7836 END
7837 ;
7838
7839 &readblockcategories;
7840 foreach (@categories)
7841 {
7842 print "<option value='$_' $selected{'DST'}{$_}>$_</option>\n";
7843 }
7844
7845 print <<END
7846 <option value='files' $selected{'DST'}{'files'} = "selected='selected'">files</option>
7847 <option value='custom-blocked' $selected{'DST'}{'custom-blocked'} = "selected='selected'">custom-blocked</option>
7848 <option value='custom-expressions' $selected{'DST'}{'custom-expressions'} = "selected='selected'">custom-expressions</option>
7849 </select>
7850 </td>
7851 <td>&nbsp;</td>
7852 <td class='base' valign='top'>
7853 <select name='ACCESS'>
7854 <option value='block' $selected{'ACCESS'}{'block'}>$Lang::tr{'urlfilter mode block'}</option>
7855 <option value='allow' $selected{'ACCESS'}{'allow'}>$Lang::tr{'urlfilter mode allow'}</option>
7856 </select>
7857 </td>
7858 <td>&nbsp;</td>
7859 </tr>
7860 <tr>
7861 <td>$Lang::tr{'remark'}&nbsp;<img src='/blob.gif' alt='*'></td>
7862 <td>&nbsp;</td>
7863 <td>&nbsp;</td>
7864 <td>&nbsp;</td>
7865 <td>&nbsp;</td>
7866 </tr>
7867 <tr>
7868 <td><input type='text' name='COMMENT' value='$tcsettings{'COMMENT'}' size='32' /></td>
7869 <td>&nbsp;</td>
7870 <td>&nbsp;</td>
7871 <td>&nbsp;</td>
7872 <td>&nbsp;</td>
7873 </tr>
7874 </table>
7875
7876 <table width='100%'>
7877 <tr>
7878 <td class='base'>$Lang::tr{'urlfilter enabled'}<input type='checkbox' name='ENABLERULE' $checked{'ENABLERULE'}{'on'} /></td>
7879 </tr>
7880 </table>
7881
7882 <p>
7883
7884 <table width='50%'>
7885 <tr>
7886 <td><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /></td>
7887 <td><input type='hidden' name='MODE' value='TIMECONSTRAINT' /></td>
7888 <td><input type='submit' name='SUBMIT' value='$buttontext' /></td>
7889 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
7890 <td>&nbsp;</td>
7891 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
7892 </tr>
7893 </table>
7894 <p>
7895 <table width='100%'>
7896 <tr>
7897 <td width='1%' align='right'> <img src='/blob.gif' align='top' alt='*' />&nbsp;</td>
7898 <td><font class='base'>$Lang::tr{'this field may be blank'}</font></td>
7899 </tr>
7900 <tr>
7901 <td width='1%' align='right'><img src='/blob.gif' align='top' alt='*' /><img src='/blob.gif' align='top' alt='*' />&nbsp;</td>
7902 <td><font class='base'>$Lang::tr{'urlfilter select multi'}</font></td>
7903 </tr>
7904 </table>
7905 END
7906 ;
7907
7908 if ($tcsettings{'ACTION'} eq $Lang::tr{'edit'}) {
7909 print "<input type='hidden' name='EDITING' value='$tcsettings{'ID'}' />\n";
7910 } else {
7911 print "<input type='hidden' name='EDITING' value='no' />\n";
7912 }
7913
7914 &Header::closebox();
7915 print "</form>\n";
7916
7917 &Header::openbox('100%', 'left', $Lang::tr{'current rules'});
7918 print <<END
7919 <table width='100%'>
7920 <tr>
7921 <td width='5%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter constraint definition'}</b></td>
7922 <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter time space'}</b></td>
7923 <td width='15%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter src'}</b></td>
7924 <td width='5%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter dst'}</b></td>
7925 <td width='10%' class='boldbase' colspan='4' align='center'>&nbsp;</td>
7926 </tr>
7927 END
7928 ;
7929
7930 if ($tcsettings{'ACTION'} ne '' or $changed ne 'no')
7931 {
7932 open(FILE, $tcfile);
7933 @tclist = <FILE>;
7934 close(FILE);
7935 }
7936
7937 $id = 0;
7938 foreach $line (@tclist)
7939 {
7940 $id++;
7941 chomp($line);
7942 @temp = split(/\,/,$line);
7943 if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) {
7944 print "<tr bgcolor='$Header::colouryellow'>\n"; }
7945 elsif ($id % 2) {
7946 print "<tr bgcolor='$Header::table1colour'>\n"; }
7947 else {
7948 print "<tr bgcolor='$Header::table2colour'>\n"; }
7949 if ($temp[0] eq 'within') { $temp[0]=$Lang::tr{'urlfilter constraint within'}; } else { $temp[0]=$Lang::tr{'urlfilter constraint outside'}; }
7950 if ($temp[13] eq 'any') { $temp[13]=$Lang::tr{'urlfilter category all'}; }
7951 if ($temp[15] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};}
7952 else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; }
7953 if ($temp[14] eq 'block') { $led='led-red.gif'; $ldesc=$Lang::tr{'urlfilter block access'};}
7954 else { $led='led-green.gif'; $ldesc=$Lang::tr{'urlfilter allow access'}; }
7955
7956 undef $time;
7957 if ($temp[1] eq 'on') { $time.=$Lang::tr{'urlfilter mon'}; } else { $time.='='; }
7958 if ($temp[2] eq 'on') { $time.=$Lang::tr{'urlfilter tue'}; } else { $time.='='; }
7959 if ($temp[3] eq 'on') { $time.=$Lang::tr{'urlfilter wed'}; } else { $time.='='; }
7960 if ($temp[4] eq 'on') { $time.=$Lang::tr{'urlfilter thu'}; } else { $time.='='; }
7961 if ($temp[5] eq 'on') { $time.=$Lang::tr{'urlfilter fri'}; } else { $time.='='; }
7962 if ($temp[6] eq 'on') { $time.=$Lang::tr{'urlfilter sat'}; } else { $time.='='; }
7963 if ($temp[7] eq 'on') { $time.=$Lang::tr{'urlfilter sun'}; } else { $time.='='; }
7964 $time=$time.' &nbsp; '.$temp[8].':'.$temp[9].' to '.$temp[10].':'.$temp[11];
7965
7966 print <<END
7967 <td align='center'>$temp[0]</td>
7968 <td align='center' nowrap>$time</td>
7969 <td align='center'>$temp[12]</td>
7970 <td align='center'>$temp[13]</td>
7971 <td align='center'><image src='/images/urlfilter/$led' alt='$ldesc'></td>
7972
7973 <td align='center'>
7974 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
7975 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' title='$gdesc' alt='$gdesc' />
7976 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
7977 <input type='hidden' name='ID' value='$id' />
7978 <input type='hidden' name='ACTIVE' value='$toggle' />
7979 <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
7980 </form>
7981 </td>
7982
7983 <td align='center'>
7984 <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>
7985 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' title='$Lang::tr{'edit'}' alt='$Lang::tr{'edit'}' />
7986 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
7987 <input type='hidden' name='ID' value='$id' />
7988 <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
7989 </form>
7990 </td>
7991
7992 <td align='center'>
7993 <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>
7994 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
7995 <input type='hidden' name='MODE' value='TIMECONSTRAINT' />
7996 <input type='hidden' name='ID' value='$id' />
7997 <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
7998 </form>
7999 </td>
8000
8001 </tr>
8002 END
8003 ;
8004 if($tcsettings{'ACTION'} eq $Lang::tr{'edit'} && $tcsettings{'ID'} eq $id) {
8005 print "<tr bgcolor='$Header::colouryellow'>\n"; }
8006 elsif ($id % 2) {
8007 print "<tr bgcolor='$Header::table1colour'>\n"; }
8008 else {
8009 print "<tr bgcolor='$Header::table2colour'>\n"; }
8010 print <<END
8011 <td align='center' colspan='4'>$temp[16]
8012 </td>
8013 <td align='center' colspan='4'>
8014 </td>
8015 </tr>
8016 END
8017 ;
8018 }
8019
8020 print "</table>\n";
8021
8022 # If the time constraint file contains entries, print entries and action icons
8023 if (! -z "$tcfile") {
8024 print <<END
8025
8026 <table>
8027 <tr>
8028 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
8029 <td>&nbsp; &nbsp; <img src='/images/urlfilter/led-green.gif' alt='$Lang::tr{'urlfilter allow access'}' /></td>
8030 <td class='base'>$Lang::tr{'urlfilter allow'}</td>
8031 <td>&nbsp; &nbsp; <img src='/images/urlfilter/led-red.gif' alt='$Lang::tr{'urlfilter block access'}' /></td>
8032 <td class='base'>$Lang::tr{'urlfilter block'}</td>
8033 <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
8034 <td class='base'>$Lang::tr{'click to disable'}</td>
8035 <td>&nbsp; &nbsp; <img src='/images/off.gif' alt='$Lang::tr{'click to enable'}' /></td>
8036 <td class='base'>$Lang::tr{'click to enable'}</td>
8037 <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
8038 <td class='base'>$Lang::tr{'edit'}</td>
8039 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
8040 <td class='base'>$Lang::tr{'remove'}</td>
8041 </tr>
8042 </table>
8043 END
8044 ;
8045 }
8046
8047 &Header::closebox();
8048
8049 } elsif ($uqsettings{'UQMODE'}) {
8050
8051 #==========================================================
8052 #
8053 # Section: Set User Quota
8054 #
8055 #==========================================================
8056
8057 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'>\n";
8058
8059 $buttontext = $Lang::tr{'urlfilter add rule'};
8060 if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) {
8061 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter edit user quota rule'}.':');
8062 $buttontext = $Lang::tr{'urlfilter update rule'};
8063 } else {
8064 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter add new user quota rule'}.':');
8065 }
8066 print <<END
8067
8068 <table width='100%'>
8069 <tr>
8070 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
8071 </tr>
8072 <tr>
8073 <td class='base'>$Lang::tr{'urlfilter user time quota'}:</td>
8074 <td><input type='text' name='TIME_QUOTA' value='$uqsettings{'TIME_QUOTA'}' size='5' /></td>
8075 <td colspan='2' rowspan= '5' valign='top' class='base'>
8076 <table cellpadding='0' cellspacing='0'>
8077 <tr>
8078 <!-- intentionally left empty -->
8079 </tr>
8080 <tr>
8081 <td>$Lang::tr{'urlfilter assigned quota users'}:</td>
8082 </tr>
8083 <tr>
8084 <!-- intentionally left empty -->
8085 </tr>
8086 <tr>
8087 <!-- intentionally left empty -->
8088 </tr>
8089 <tr>
8090 <td><textarea name='QUOTA_USERS' cols='32' rows='6' wrap='off'>
8091 END
8092 ;
8093
8094 $uqsettings{'QUOTA_USERS'} =~ s/\|/\n/g;
8095 print $uqsettings{'QUOTA_USERS'};
8096
8097 print <<END
8098 </textarea></td>
8099 </tr>
8100 </table>
8101 </td>
8102 </tr>
8103 <tr>
8104 <td class='base'>$Lang::tr{'urlfilter activity detection'}:</td>
8105 <td class='base'><select name='SPORADIC'>
8106 <option value='0' $selected{'SPORADIC'}{'0'}>$Lang::tr{'urlfilter disabled'}</option>
8107 <option value='300' $selected{'SPORADIC'}{'300'}>5 $Lang::tr{'urlfilter minutes'}</option>
8108 <option value='900' $selected{'SPORADIC'}{'900'}>15 $Lang::tr{'urlfilter minutes'}</option>
8109 </select></td>
8110 </tr>
8111 <tr>
8112 <td class='base'>$Lang::tr{'urlfilter renewal period'}:</td>
8113 <td class='base'><select name='RENEWAL'>
8114 <option value='hourly' $selected{'RENEWAL'}{'hourly'}>$Lang::tr{'urlfilter hourly'}</option>
8115 <option value='daily' $selected{'RENEWAL'}{'daily'}>$Lang::tr{'urlfilter daily'}</option>
8116 <option value='weekly' $selected{'RENEWAL'}{'weekly'}>$Lang::tr{'urlfilter weekly'}</option>
8117 </select></td>
8118 </tr>
8119 <tr>
8120 <td colspan='2'>&nbsp;</td>
8121 </tr>
8122 <tr>
8123 <td class='base'>$Lang::tr{'urlfilter enabled'}</td>
8124 <td class='base'><input type='checkbox' name='ENABLEQUOTA' $checked{'ENABLEQUOTA'}{'on'} /></td>
8125 </tr>
8126
8127 </table>
8128 <p>
8129
8130 <table width='50%'>
8131 <tr>
8132 <td><input type='hidden' name='ACTION' value='$Lang::tr{'add'}' /></td>
8133 <td><input type='hidden' name='MODE' value='USERQUOTA' /></td>
8134 <td><input type='submit' name='SUBMIT' value='$buttontext' /></td>
8135 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
8136 <td>&nbsp;</td>
8137 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
8138 </tr>
8139 </table>
8140
8141 <p>
8142 END
8143 ;
8144
8145 if ($uqsettings{'ACTION'} eq $Lang::tr{'edit'}) {
8146 print "<input type='hidden' name='EDITING' value='$uqsettings{'ID'}' />\n";
8147 } else {
8148 print "<input type='hidden' name='EDITING' value='no' />\n";
8149 }
8150
8151 &Header::closebox();
8152 print "</form>\n";
8153
8154 &Header::openbox('100%', 'left', $Lang::tr{'current rules'});
8155 print <<END
8156 <table width='100%'>
8157 <tr>
8158 <td width='15%' class='boldbase' align='center'><b><nobr>$Lang::tr{'urlfilter time quota'}</nobr></b></td>
8159 <td width='15%' class='boldbase' align='center'><b><nobr>$Lang::tr{'urlfilter activity detection'}</nobr></b></td>
8160 <td width='10%' class='boldbase' align='center'><b>$Lang::tr{'urlfilter renewal'}</b></td>
8161 <td class='boldbase' align='center'><b>$Lang::tr{'urlfilter assigned users'}</b></td>
8162 <td width='20%' class='boldbase' colspan='4' align='center'>&nbsp;</td>
8163 </tr>
8164 END
8165 ;
8166
8167 if ($uqsettings{'ACTION'} ne '' or $changed ne 'no')
8168 {
8169 open(FILE, $uqfile);
8170 @uqlist = <FILE>;
8171 close(FILE);
8172 }
8173
8174 $id = 0;
8175 foreach $line (@uqlist)
8176 {
8177 $id++;
8178 chomp($line);
8179 @temp = split(/\,/,$line);
8180 if($uqsettings{'ACTION'} eq $Lang::tr{'edit'} && $uqsettings{'ID'} eq $id) {
8181 print "<tr bgcolor='$Header::colouryellow'>\n"; }
8182 elsif ($id % 2) {
8183 print "<tr bgcolor='$Header::table1colour'>\n"; }
8184 else {
8185 print "<tr bgcolor='$Header::table2colour'>\n"; }
8186 if ($temp[4] eq 'on') { $gif='on.gif'; $toggle='off'; $gdesc=$Lang::tr{'click to disable'};}
8187 else { $gif='off.gif'; $toggle='on'; $gdesc=$Lang::tr{'click to enable'}; }
8188
8189 $temp[5] = $temp[1];
8190 if ($temp[1] eq '0') { $temp[5] = $Lang::tr{'urlfilter disabled'} } else { $temp[5] = ($temp[5]/60).' '.$Lang::tr{'urlfilter minutes'} }
8191 $_ = $temp[3]; s/\|/, /g; $temp[6] = $_;
8192
8193 print <<END
8194 <td align='center'>$temp[0] $Lang::tr{'urlfilter minutes'}</td>
8195 <td align='center'>$temp[5]</td>
8196 <td align='center'>$Lang::tr{'urlfilter '.$temp[2]}</td>
8197 <td align='center'>$temp[6]</td>
8198
8199 <td align='center'>
8200 <form method='post' name='frma$id' action='$ENV{'SCRIPT_NAME'}'>
8201 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' title='$gdesc' alt='$gdesc' />
8202 <input type='hidden' name='MODE' value='USERQUOTA' />
8203 <input type='hidden' name='ID' value='$id' />
8204 <input type='hidden' name='ACTIVE' value='$toggle' />
8205 <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}' />
8206 </form>
8207 </td>
8208
8209 <td align='center'>
8210 <form method='post' name='frmb$id' action='$ENV{'SCRIPT_NAME'}'>
8211 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' title='$Lang::tr{'edit'}' alt='$Lang::tr{'edit'}' />
8212 <input type='hidden' name='MODE' value='USERQUOTA' />
8213 <input type='hidden' name='ID' value='$id' />
8214 <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}' />
8215 </form>
8216 </td>
8217
8218 <td align='center'>
8219 <form method='post' name='frmc$id' action='$ENV{'SCRIPT_NAME'}'>
8220 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' title='$Lang::tr{'remove'}' alt='$Lang::tr{'remove'}' />
8221 <input type='hidden' name='MODE' value='USERQUOTA' />
8222 <input type='hidden' name='ID' value='$id' />
8223 <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}' />
8224 </form>
8225 </td>
8226
8227 </tr>
8228 END
8229 ;
8230 }
8231
8232 print "</table>\n";
8233
8234 # If the user quota file contains entries, print entries and action icons
8235 if (! -z "$uqfile") {
8236 print <<END
8237
8238 <table>
8239 <tr>
8240 <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
8241 <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
8242 <td class='base'>$Lang::tr{'click to disable'}</td>
8243 <td>&nbsp; &nbsp; <img src='/images/off.gif' alt='$Lang::tr{'click to enable'}' /></td>
8244 <td class='base'>$Lang::tr{'click to enable'}</td>
8245 <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
8246 <td class='base'>$Lang::tr{'edit'}</td>
8247 <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
8248 <td class='base'>$Lang::tr{'remove'}</td>
8249 </tr>
8250 </table>
8251 END
8252 ;
8253 }
8254
8255 &Header::closebox();
8256
8257 } else {
8258
8259 #==========================================================
8260 #
8261 # Section: Blacklist editor
8262 #
8263 #==========================================================
8264
8265 print "<form method='post' action='$ENV{'SCRIPT_NAME'}' enctype='multipart/form-data'>\n";
8266
8267 &Header::openbox('100%', 'left', $Lang::tr{'urlfilter urlfilter blacklist editor'}.':');
8268
8269 print <<END
8270
8271 <table width='100%'>
8272 <tr>
8273 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
8274 </tr>
8275 <tr>
8276 <td class='base'><b>$Lang::tr{'urlfilter blacklist name'}</b></td>
8277 </tr>
8278 <tr>
8279 <td class='base'>$Lang::tr{'urlfilter blacklist category name'}:</td>
8280 <td><input type='text' name='BE_NAME' value='$besettings{'BE_NAME'}' size='12' /></td>
8281 </tr>
8282 </table>
8283 <hr size='1'>
8284 <table width='100%'>
8285 <tr>
8286 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='20%'></td>
8287 </tr>
8288 <tr>
8289 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter edit domains urls expressions'}</b></td>
8290 </tr>
8291 <tr>
8292 <td colspan='2'>$Lang::tr{'urlfilter domains'}</td>
8293 <td colspan='2'>$Lang::tr{'urlfilter urls'}</td>
8294 </tr>
8295 <tr>
8296 <td colspan='2'><textarea name='BE_DOMAINS' cols='38' rows='10' wrap='off'>
8297 END
8298 ;
8299
8300 print $besettings{'BE_DOMAINS'};
8301
8302 print <<END
8303 </textarea></td>
8304 <td colspan='2'><textarea name='BE_URLS' cols='38' rows='10' wrap='off'>
8305 END
8306 ;
8307
8308 print $besettings{'BE_URLS'};
8309
8310 print <<END
8311 </textarea></td>
8312 </tr>
8313 <tr>
8314 <td colspan='4'>$Lang::tr{'urlfilter expressions'}</td>
8315 </tr>
8316 <tr>
8317 <td colspan='4'><textarea name='BE_EXPRESSIONS' cols='80' rows='3' wrap='off'>
8318 END
8319 ;
8320
8321 print $besettings{'BE_EXPRESSIONS'};
8322
8323 print <<END
8324 </textarea></td>
8325 </tr>
8326 </table>
8327 <hr size='1'>
8328 <table width='100%'>
8329 <tr>
8330 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter load blacklist'}</b></td>
8331 </tr>
8332 <tr>
8333 <td width='25%' class='base'>$Lang::tr{'urlfilter select blacklist'}:</td>
8334 <td width='20%' class='base'>
8335 <select name='BE_BLACKLIST'>
8336 END
8337 ;
8338
8339 &readblockcategories;
8340 foreach (@categories)
8341 {
8342 print "<option value='$_' $selected{'BE_BLACKLIST'}{$_}>$_</option>\n";
8343 }
8344
8345 print <<END
8346 </select>
8347 </td>
8348 <td>&nbsp;</td>
8349 <td>&nbsp;</td>
8350 <tr>
8351 <td colpsan='4'><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter load blacklist'}' /></td>
8352 </tr>
8353 </tr>
8354 </table>
8355 <hr size='1'>
8356 <table width='100%'>
8357 <tr>
8358 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter import blacklist'}</b></td>
8359 </tr>
8360 <tr>
8361 <td colspan='4'>$Lang::tr{'urlfilter import text'}:</td>
8362 </tr>
8363 <tr>
8364 <td nowrap><input type='file' name='IMPORTFILE' size='40' /> &nbsp; <input type='submit' name='ACTION' value='$Lang::tr{'urlfilter import blacklist'}' /></td>
8365 <td><input type='hidden' name='MODE' value='BLACKLIST_EDITOR' /></td>
8366 </tr>
8367 </table>
8368 <hr size='1'>
8369 <table width='100%'>
8370 <tr>
8371 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter export blacklist'}</b></td>
8372 </tr>
8373 <tr>
8374 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter export blacklist'}' /></td>
8375 </tr>
8376 </table>
8377 <hr size='1'>
8378 <table width='100%'>
8379 <tr>
8380 <td class='base' colspan='4'><b>$Lang::tr{'urlfilter install blacklist'}</b></td>
8381 </tr>
8382 <tr>
8383 <td width='25%' class='base'>$Lang::tr{'urlfilter dont restart urlfilter'}:</td>
8384 <td width='20%' class='base'><input type='checkbox' name='NORESTART' $checked{'NORESTART'}{'on'} /></td>
8385 <td>&nbsp;</td>
8386 <td>&nbsp;</td>
8387 </tr>
8388 <tr>
8389 <td><input type='submit' name='ACTION' value='$Lang::tr{'urlfilter install blacklist'}' /></td>
8390 </tr>
8391 <tr>
8392 <td class='base' colspan='4'><br>$Lang::tr{'urlfilter install information'}</td>
8393 </tr>
8394 </table>
8395 <hr size='1'>
8396 <table width='20%'>
8397 <tr>
8398 <td><input type='reset' name='ACTION' value='$Lang::tr{'urlfilter reset'}' /></td>
8399 <td>&nbsp;</td>
8400 <td><input type='button' name='return2main' value='$Lang::tr{'urlfilter back to main page'}' onClick='self.location.href="$ENV{'SCRIPT_NAME'}"'></td>
8401 </tr>
8402 </table>
8403
8404 END
8405 ;
8406
8407 &Header::closebox();
8408 print "</form>\n";
8409
8410 }
8411
8412 &Header::closebigbox();
8413
8414 &Header::closepage();
8415
8416 # -------------------------------------------------------------------
8417
8418 sub savesettings
8419 {
8420 &writeconfigfile;
8421
8422 delete $filtersettings{'CUSTOM_BLACK_DOMAINS'};
8423 delete $filtersettings{'CUSTOM_BLACK_URLS'};
8424 delete $filtersettings{'CUSTOM_WHITE_DOMAINS'};
8425 delete $filtersettings{'CUSTOM_WHITE_URLS'};
8426 delete $filtersettings{'CUSTOM_EXPRESSIONS'};
8427 delete $filtersettings{'BACKGROUND'};
8428 delete $filtersettings{'UPDATEFILE'};
8429
8430 &General::writehash("${General::swroot}/urlfilter/settings", \%filtersettings);
8431 }
8432
8433 # -------------------------------------------------------------------
8434
8435 sub readblockcategories
8436 {
8437 undef(@categories);
8438 foreach $blacklist (<$dbdir/*>) {
8439 if (-d $blacklist) {
8440 $lastslashpos = rindex($blacklist,"/");
8441 if ($lastslashpos > -1) {
8442 $section = substr($blacklist,$lastslashpos+1);
8443 } else {
8444 $section = $blacklist;
8445 }
8446 if (!($section eq 'custom')) { push(@categories,$section) };
8447 }
8448 }
8449
8450 @filtergroups = @categories;
8451 foreach (@filtergroups) {
8452 tr/a-z/A-Z/;
8453 $_ = "FILTER_".$_;
8454 }
8455 }
8456
8457 # -------------------------------------------------------------------
8458
8459 sub readcustomlists
8460 {
8461 if (-e "$dbdir/custom/blocked/domains") {
8462 open(FILE,"$dbdir/custom/blocked/domains");
8463 delete $filtersettings{'CUSTOM_BLACK_DOMAINS'};
8464 while (<FILE>) { $filtersettings{'CUSTOM_BLACK_DOMAINS'} .= $_ };
8465 close(FILE);
8466 }
8467
8468 if (-e "$dbdir/custom/blocked/urls") {
8469 open(FILE,"$dbdir/custom/blocked/urls");
8470 delete $filtersettings{'CUSTOM_BLACK_URLS'};
8471 while (<FILE>) { $filtersettings{'CUSTOM_BLACK_URLS'} .= $_ };
8472 close(FILE);
8473 }
8474
8475 if (-e "$dbdir/custom/blocked/expressions") {
8476 open(FILE,"$dbdir/custom/blocked/expressions");
8477 delete $filtersettings{'CUSTOM_EXPRESSIONS'};
8478 while (<FILE>) { $filtersettings{'CUSTOM_EXPRESSIONS'} .= $_ };
8479 close(FILE);
8480 }
8481
8482 if (-e "$dbdir/custom/allowed/domains") {
8483 open(FILE,"$dbdir/custom/allowed/domains");
8484 delete $filtersettings{'CUSTOM_WHITE_DOMAINS'};
8485 while (<FILE>) { $filtersettings{'CUSTOM_WHITE_DOMAINS'} .= $_ };
8486 close(FILE);
8487 }
8488 if (-e "$dbdir/custom/allowed/urls") {
8489 open(FILE,"$dbdir/custom/allowed/urls");
8490 delete $filtersettings{'CUSTOM_WHITE_URLS'};
8491 while (<FILE>) { $filtersettings{'CUSTOM_WHITE_URLS'} .= $_ };
8492 close(FILE);
8493 }
8494 }
8495
8496 # -------------------------------------------------------------------
8497
8498 sub aggregatedconstraints
8499 {
8500 my $aggregated;
8501 my @old;
8502 my @new;
8503 my @tmp1;
8504 my @tmp2;
8505 my $x;
8506
8507 if (-e $tcfile)
8508 {
8509 open(TC, $tcfile);
8510 @old = <TC>;
8511 close(TC);
8512
8513 while (@old > 0)
8514 {
8515 $aggregated = 0;
8516 $x = shift(@old);
8517 chomp($x);
8518 @tmp1 = split(/\,/,$x);
8519 $tmp1[16] = '';
8520 foreach (@new)
8521 {
8522 @tmp2 = split(/\,/);
8523 if ($tmp2[15] eq 'on')
8524 {
8525 if (($tmp1[0] eq $tmp2[0]) && ($tmp1[12] eq $tmp2[12]) && ($tmp1[13] eq $tmp2[13]) && ($tmp1[14] eq $tmp2[14]))
8526 {
8527 $aggregated = 1;
8528 $tmp2[16] .= " weekly ";
8529 if ($tmp1[1] eq 'on') { $tmp2[16] .= "m"; }
8530 if ($tmp1[2] eq 'on') { $tmp2[16] .= "t"; }
8531 if ($tmp1[3] eq 'on') { $tmp2[16] .= "w"; }
8532 if ($tmp1[4] eq 'on') { $tmp2[16] .= "h"; }
8533 if ($tmp1[5] eq 'on') { $tmp2[16] .= "f"; }
8534 if ($tmp1[6] eq 'on') { $tmp2[16] .= "a"; }
8535 if ($tmp1[7] eq 'on') { $tmp2[16] .= "s"; }
8536 $tmp2[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n";
8537 $_ = join(",",@tmp2);
8538 }
8539
8540 }
8541 }
8542 if (!$aggregated)
8543 {
8544 $tmp1[16] .= " weekly ";
8545 if ($tmp1[1] eq 'on') { $tmp1[16] .= "m"; }
8546 if ($tmp1[2] eq 'on') { $tmp1[16] .= "t"; }
8547 if ($tmp1[3] eq 'on') { $tmp1[16] .= "w"; }
8548 if ($tmp1[4] eq 'on') { $tmp1[16] .= "h"; }
8549 if ($tmp1[5] eq 'on') { $tmp1[16] .= "f"; }
8550 if ($tmp1[6] eq 'on') { $tmp1[16] .= "a"; }
8551 if ($tmp1[7] eq 'on') { $tmp1[16] .= "s"; }
8552 $tmp1[16] .= " $tmp1[8]:$tmp1[9]-$tmp1[10]:$tmp1[11]\n";
8553 $x = join(",",@tmp1);
8554 push(@new,$x);
8555 }
8556 }
8557 }
8558
8559 return @new;
8560
8561 }
8562
8563 # -------------------------------------------------------------------
8564
8565 sub writeconfigfile
8566 {
8567 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\)\$";
8568 my $audiovideo = "\\.\(aiff|asf|avi|dif|divx|mov|movie|mp3|mpe?g?|mpv2|ogg|ra?m|snd|qt|wav|wmf|wmv\)\$";
8569 my $archives = "\\.\(bin|bz2|cab|cdr|dmg|gz|hqx|rar|smi|sit|sea|tar|tgz|zip\)\$";
8570
8571 my $ident = " anonymous";
8572
8573 my $defaultrule='';
8574 my $tcrule='';
8575 my $redirect='';
8576 my $qredirect='';
8577
8578 my $idx;
8579
8580 my @ec=();
8581 my @tc=();
8582 my @uq=();
8583
8584 if (!(-d "$dbdir/custom")) { mkdir("$dbdir/custom") }
8585 if (!(-d "$dbdir/custom/blocked")) { mkdir("$dbdir/custom/blocked") }
8586 if (!(-d "$dbdir/custom/allowed")) { mkdir("$dbdir/custom/allowed") }
8587
8588 open(FILE, ">/$dbdir/custom/blocked/domains");
8589 print FILE $filtersettings{'CUSTOM_BLACK_DOMAINS'};
8590 close(FILE);
8591 open(FILE, ">/$dbdir/custom/blocked/urls");
8592 print FILE $filtersettings{'CUSTOM_BLACK_URLS'};
8593 close(FILE);
8594 open(FILE, ">/$dbdir/custom/blocked/expressions");
8595 print FILE $filtersettings{'CUSTOM_EXPRESSIONS'};
8596 close(FILE);
8597 open(FILE, ">/$dbdir/custom/blocked/files");
8598 if ($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') { print FILE "$executables\n"; }
8599 if ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') { print FILE "$audiovideo\n"; }
8600 if ($filtersettings{'BLOCK_ARCHIVES'} eq 'on') { print FILE "$archives\n"; }
8601 close(FILE);
8602 open(FILE, ">/$dbdir/custom/allowed/domains");
8603 print FILE $filtersettings{'CUSTOM_WHITE_DOMAINS'};
8604 close(FILE);
8605 open(FILE, ">/$dbdir/custom/allowed/urls");
8606 print FILE $filtersettings{'CUSTOM_WHITE_URLS'};
8607 close(FILE);
8608
8609 if ($filtersettings{'ENABLE_USERNAME_LOG'} eq 'on') { $ident = ""; }
8610
8611 if ($filtersettings{'REDIRECT_PAGE'} eq '')
8612 {
8613 if (($filtersettings{'SHOW_CATEGORY'} eq 'on') || ($filtersettings{'SHOW_URL'} eq 'on') || ($filtersettings{'SHOW_IP'} eq 'on')) {
8614 if ($filtersettings{'SHOW_CATEGORY'} eq 'on') { $redirect .= "&category=%t"; }
8615 if ($filtersettings{'SHOW_URL'} eq 'on') { $redirect .= "&url=%u"; }
8616 if ($filtersettings{'SHOW_IP'} eq 'on') { $redirect .= "&ip=%a"; }
8617 $redirect =~ s/^&/?/;
8618 $redirect = "http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi".$redirect;
8619 } else {
8620 $redirect="http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/redirect.cgi";
8621 }
8622 } else { $redirect=$filtersettings{'REDIRECT_PAGE'}; }
8623
8624 if ($filtersettings{'ENABLE_DNSERROR'} eq 'on') { $redirect = "302:http://0.0.0.0"; }
8625
8626 undef $defaultrule;
8627
8628 if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on')
8629 {
8630 $defaultrule .= "custom-allowed ";
8631 }
8632 if ($filtersettings{'BLOCK_ALL'} eq 'on')
8633 {
8634 $defaultrule .= "none";
8635 }
8636 else
8637 {
8638 if ($filtersettings{'BLOCK_IP_ADDR'} eq 'on')
8639 {
8640 $defaultrule .= "!in-addr ";
8641 }
8642 for ($i=0; $i<=@filtergroups; $i++) {
8643 if ($filtersettings{@filtergroups[$i]} eq 'on')
8644 {
8645 $defaultrule .= "!@categories[$i] ";
8646 }
8647 }
8648 if ($filtersettings{'ENABLE_CUSTOM_BLACKLIST'} eq 'on')
8649 {
8650 $defaultrule .= "!custom-blocked ";
8651 }
8652 if ($filtersettings{'ENABLE_CUSTOM_EXPRESSIONS'} eq 'on')
8653 {
8654 $defaultrule .= "!custom-expressions ";
8655 }
8656 if (($filtersettings{'BLOCK_EXECUTABLES'} eq 'on') ||
8657 ($filtersettings{'BLOCK_AUDIO-VIDEO'} eq 'on') ||
8658 ($filtersettings{'BLOCK_ARCHIVES'} eq 'on'))
8659 {
8660 $defaultrule .= "!files ";
8661 }
8662 $defaultrule .= "any";
8663 }
8664
8665 open(FILE, ">${General::swroot}/urlfilter/squidGuard.conf") or die "Unable to write squidGuard.conf file";
8666 flock(FILE, 2);
8667
8668 print FILE "logdir /var/log/squidGuard\n";
8669 print FILE "dbhome $dbdir\n\n";
8670
8671 undef @repositoryfiles;
8672 if ($filtersettings{'ENABLE_REWRITE'} eq 'on')
8673 {
8674 @repositorylist = <$repository/*>;
8675 foreach (@repositorylist)
8676 {
8677 if (!-d) { push(@repositoryfiles,substr($_,rindex($_,"/")+1)); }
8678 }
8679 }
8680
8681 if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on'))
8682 {
8683 print FILE "rewrite rew-rule-0 {\n";
8684
8685 if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles))
8686 {
8687 print FILE " # rewrite localfiles\n";
8688 foreach (@repositoryfiles)
8689 {
8690 print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n";
8691 }
8692 }
8693
8694 if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')
8695 {
8696 print FILE " # rewrite safesearch\n";
8697 print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)(\\bsafe=\\w+)(.*)\@\\1\\3safe=strict\\5\@i\n";
8698 print FILE " s@(.*\\Wgoogle\\.\\w+/(webhp|search|imghp|images|grphp|groups|frghp|froogle)\\?)(.*)\@\\1safe=strict\\\&\\3\@i\n";
8699 print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W)(.*)(\\bvm=\\w+)(.*)\@\\1\\2vm=r\\4\@i\n";
8700 print FILE " s@(.*\\Wsearch\\.yahoo\\.\\w+/search\\W.*)\@\\1\\\&vm=r\@i\n";
8701 print FILE " s@(.*\\Walltheweb\\.com/customize\\?)(.*)(\\bcopt_offensive=\\w+)(.*)\@\\1\\2copt_offensive=on\\4\@i\n";
8702 }
8703
8704 print FILE "}\n\n";
8705
8706 if ((!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) && ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')) {
8707 print FILE "rewrite rew-rule-1 {\n";
8708 if (($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles))
8709 {
8710 print FILE " # rewrite localfiles\n";
8711 foreach (@repositoryfiles)
8712 {
8713 print FILE " s@.*/$_\$\@http://$netsettings{'GREEN_ADDRESS'}:81/repository/$_\@i\n";
8714 }
8715 } else {
8716 print FILE " # rewrite nothing\n";
8717 }
8718 print FILE "}\n\n";
8719 }
8720 }
8721
8722 if (-e $uqfile)
8723 {
8724 open(UQ, $uqfile);
8725 @uqlist = <UQ>;
8726 close(UQ);
8727
8728 if (@uqlist > 0)
8729 {
8730 $idx=0;
8731 foreach (@uqlist)
8732 {
8733 chomp;
8734 @uq = split(/\,/);
8735 if ($uq[4] eq 'on')
8736 {
8737 $idx++;
8738 $uq[0] = $uq[0] * 60;
8739 if ($uq[1] eq '0') {
8740 if ($uq[2] eq 'hourly') { $uq[1] = 3600 }
8741 if ($uq[2] eq 'daily') { $uq[1] = 86400 }
8742 if ($uq[2] eq 'weekly') { $uq[1] = 604800 }
8743 }
8744 $uq[3] =~ s/\|/ /g;
8745 print FILE "src quota-$idx {\n";
8746 print FILE " user $uq[3]\n";
8747 print FILE " userquota $uq[0] $uq[1] $uq[2]\n";
8748 print FILE "}\n\n";
8749 }
8750 }
8751
8752 }
8753 }
8754
8755 @tclist = &aggregatedconstraints;
8756
8757 if (@tclist > 0)
8758 {
8759 $idx=0;
8760 foreach (@tclist)
8761 {
8762 chomp;
8763 @tc = split(/\,/);
8764 if ($tc[15] eq 'on')
8765 {
8766 $idx++;
8767 print FILE "src network-$idx {\n";
8768 print FILE " ip $tc[12]\n";
8769 print FILE "}\n\n";
8770 }
8771 }
8772
8773 $idx=0;
8774 foreach (@tclist)
8775 {
8776 chomp;
8777 @tc = split(/\,/);
8778 if ($tc[15] eq 'on')
8779 {
8780 $idx++;
8781 print FILE "time constraint-$idx {\n";
8782 print FILE "$tc[16]\n";
8783 print FILE "}\n\n";
8784 }
8785 }
8786 }
8787
8788 if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) {
8789 print FILE "src unfiltered {\n";
8790 print FILE " ip $filtersettings{'UNFILTERED_CLIENTS'}\n";
8791 print FILE "}\n\n";
8792 }
8793 if (!($filtersettings{'BANNED_CLIENTS'} eq '')) {
8794 print FILE "src banned {\n";
8795 print FILE " ip $filtersettings{'BANNED_CLIENTS'}\n";
8796 print FILE "}\n\n";
8797 }
8798
8799 foreach $category (@categories) {
8800 print FILE "dest $category {\n";
8801 if (-e "$dbdir/$category/domains") {
8802 print FILE " domainlist $category\/domains\n";
8803 }
8804 if (-e "$dbdir/$category/urls") {
8805 print FILE " urllist $category\/urls\n";
8806 }
8807 if ((-e "$dbdir/$category/expressions") && ($filtersettings{'ENABLE_EXPR_LISTS'} eq 'on')) {
8808 print FILE " expressionlist $category\/expressions\n";
8809 }
8810 if (($category eq 'ads') && ($filtersettings{'ENABLE_EMPTY_ADS'} eq 'on'))
8811 {
8812 print FILE " redirect http:\/\/$netsettings{'GREEN_ADDRESS'}:81\/images/urlfilter/1x1.gif\n";
8813 }
8814 if ($filtersettings{'ENABLE_LOG'} eq 'on')
8815 {
8816 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
8817 {
8818 print FILE " logfile $ident $category.log\n";
8819 } else {
8820 print FILE " logfile $ident urlfilter.log\n";
8821 }
8822 }
8823 print FILE "}\n\n";
8824 }
8825
8826 print FILE "dest files {\n";
8827 print FILE " expressionlist custom\/blocked\/files\n";
8828 if ($filtersettings{'ENABLE_LOG'} eq 'on')
8829 {
8830 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
8831 {
8832 print FILE " logfile $ident files.log\n";
8833 } else {
8834 print FILE " logfile $ident urlfilter.log\n";
8835 }
8836 }
8837 print FILE "}\n\n";
8838
8839 print FILE "dest custom-allowed {\n";
8840 print FILE " domainlist custom\/allowed\/domains\n";
8841 print FILE " urllist custom\/allowed\/urls\n";
8842 print FILE "}\n\n";
8843
8844 print FILE "dest custom-blocked {\n";
8845 print FILE " domainlist custom\/blocked\/domains\n";
8846 print FILE " urllist custom\/blocked\/urls\n";
8847 if ($filtersettings{'ENABLE_LOG'} eq 'on')
8848 {
8849 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
8850 {
8851 print FILE " logfile $ident custom.log\n";
8852 } else {
8853 print FILE " logfile $ident urlfilter.log\n";
8854 }
8855 }
8856 print FILE "}\n\n";
8857
8858 print FILE "dest custom-expressions {\n";
8859 print FILE " expressionlist custom\/blocked\/expressions\n";
8860 if ($filtersettings{'ENABLE_LOG'} eq 'on')
8861 {
8862 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
8863 {
8864 print FILE " logfile $ident custom.log\n";
8865 } else {
8866 print FILE " logfile $ident urlfilter.log\n";
8867 }
8868 }
8869 print FILE "}\n\n";
8870
8871 print FILE "acl {\n";
8872 if (!($filtersettings{'UNFILTERED_CLIENTS'} eq '')) {
8873 print FILE " unfiltered {\n";
8874 print FILE " pass all\n";
8875 if ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on')
8876 {
8877 print FILE " rewrite rew-rule-1\n";
8878 }
8879 print FILE " }\n\n";
8880 }
8881 if (!($filtersettings{'BANNED_CLIENTS'} eq '')) {
8882 print FILE " banned {\n";
8883 print FILE " pass ";
8884 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
8885 {
8886 print FILE "custom-allowed ";
8887 }
8888 print FILE "none\n";
8889 print FILE " }\n\n";
8890 }
8891
8892 if (-s $uqfile)
8893 {
8894 open(UQ, $uqfile);
8895 @uqlist = <UQ>;
8896 close(UQ);
8897
8898 $idx=0;
8899 foreach (@uqlist)
8900 {
8901 chomp;
8902 @uq = split(/\,/);
8903 if ($uq[4] eq 'on')
8904 {
8905 $idx++;
8906 $qredirect = $redirect;
8907 $qredirect =~ s/\%t/\%q\%20-\%20\%i/;
8908 print FILE " quota-$idx {\n";
8909 print FILE " pass ";
8910 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
8911 {
8912 print FILE "custom-allowed ";
8913 }
8914 print FILE "none\n";
8915 unless ($redirect eq $qredirect) { print FILE " redirect $qredirect\n"; }
8916 print FILE " }\n\n";
8917 }
8918 }
8919 }
8920
8921 if (@tclist > 0)
8922 {
8923 $idx=0;
8924 foreach (@tclist)
8925 {
8926 chomp;
8927 @tc = split(/\,/);
8928 @ec = split(/\|/,$tc[13]);
8929 if ($tc[15] eq 'on')
8930 {
8931 $idx++;
8932 print FILE " network-$idx $tc[0] constraint-$idx {\n";
8933 print FILE " pass ";
8934
8935 if ($filtersettings{'BLOCK_ALL'} eq 'on')
8936 {
8937 if ($tc[14] eq 'block')
8938 {
8939 if ((@ec == 1) && ($ec[0] eq 'any')) {
8940 if (($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'on'))
8941 {
8942 print FILE "custom-allowed ";
8943 }
8944 print FILE "none";
8945 } else {
8946 print FILE $defaultrule;
8947 }
8948 } else {
8949 foreach (@ec)
8950 {
8951 print FILE "$_ ";
8952 }
8953 print FILE $defaultrule unless ((@ec == 1) && ($ec[0] eq 'any'));
8954 }
8955 } else {
8956 if ($tc[14] eq 'block')
8957 {
8958 $tcrule = $defaultrule;
8959 if ($filtersettings{'ENABLE_CUSTOM_WHITELIST'} eq 'on') {
8960 $tcrule =~ s/custom-allowed //;
8961 print FILE "custom-allowed " unless ((@ec == 1) && ($ec[0] eq 'any') && ($filtersettings{'ENABLE_GLOBAL_WHITELIST'} eq 'off'));
8962 }
8963 if ((@ec == 1) && ($ec[0] eq 'any')) {
8964 print FILE "none";
8965 } else {
8966 foreach (@ec)
8967 {
8968 print FILE "!$_ " unless (index($defaultrule,"!".$_." ") ge 0);
8969 }
8970 }
8971 print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any'));
8972 } else {
8973 $tcrule = $defaultrule;
8974 foreach (@ec)
8975 {
8976 $tcrule =~ s/!$_ //;
8977 print FILE "$_ " if ($_ eq 'any');
8978 }
8979 print FILE $tcrule unless ((@ec == 1) && ($ec[0] eq 'any'));
8980 }
8981 }
8982
8983 print FILE "\n";
8984
8985 print FILE " }\n\n";
8986 }
8987 }
8988 }
8989
8990 print FILE " default {\n";
8991 print FILE " pass $defaultrule\n";
8992 if (($filtersettings{'ENABLE_LOG'} eq 'on') && ($filtersettings{'BLOCK_ALL'} eq 'on'))
8993 {
8994 if ($filtersettings{'ENABLE_CATEGORY_LOG'} eq 'on')
8995 {
8996 print FILE " logfile".$ident." default.log\n";
8997 } else {
8998 print FILE " logfile".$ident." urlfilter.log\n";
8999 }
9000 }
9001 if ((($filtersettings{'ENABLE_REWRITE'} eq 'on') && (@repositoryfiles)) || ($filtersettings{'ENABLE_SAFESEARCH'} eq 'on'))
9002 {
9003 print FILE " rewrite rew-rule-0\n";
9004 }
9005 print FILE " redirect $redirect\n";
9006 print FILE " }\n";
9007 print FILE "}\n";
9008
9009 close FILE;
9010 }
9011
9012 # -------------------------------------------------------------------