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