Handle hostnames with upper-case letters
[webmin.git] / squid / acl.cgi
1 #!/usr/local/bin/perl
2 # acl.cgi
3 # Display a form for editing or creating a new ACL
4
5 require './squid-lib.pl';
6 $access{'actrl'} || &error($text{'eacl_ecannot'});
7 &ReadParse();
8 $conf = &get_config();
9
10 if ($in{'type'}) {
11         &ui_print_header(undef, $text{'acl_header1'}, "", undef, 0, 0, 0, &restart_button());
12         $type = $in{'type'};
13         }
14 else {
15         &ui_print_header(undef, $text{'acl_header2'}, "", undef, 0, 0, 0, &restart_button());
16         @acl = @{$conf->[$in{'index'}]->{'values'}};
17         $type = $acl[1];
18         if (($type eq "external" ||
19              &indexof($type, @caseless_acl_types) >= 0) &&
20             $acl[3] =~ /^"(.*)"$/) {
21                 # Extra parameters come from file
22                 @vals = ( $acl[2] );
23                 $file = $1;
24                 }
25         elsif ($acl[2] =~ /^"(.*)"$/) {
26                 # All values come from a file
27                 $file = $1;
28                 }
29         else {
30                 # All values come from acl parameters
31                 @vals = @acl[2..$#acl];
32                 }
33         if ($file) {
34                 open(FILE, $file);
35                 chop(@newvals = <FILE>);
36                 close(FILE);
37                 push(@vals, @newvals);
38                 }
39         if ($type =~ /^(src|dst|srcdomain|dstdomain|user|myip)$/) {
40                 @vals = sort { $a cmp $b } @vals;
41                 }
42         elsif ($type eq "port") {
43                 @vals = sort { $a <=> $b } @vals;
44                 }
45         @deny = grep { $_->{'values'}->[1] eq $acl[0] }
46                         &find_config("deny_info", $conf);
47         }
48
49 print "<form action=acl_save.cgi method=post enctype=multipart/form-data>\n";
50 if (@acl) {
51         print "<input type=hidden name=index value=$in{'index'}>\n";
52         }
53 if (@deny) {
54         print "<input type=hidden name=dindex value=$deny[0]->{'index'}>\n";
55         }
56 print "<input type=hidden name=type value=$type>\n";
57 print "<table border>\n";
58 print "<tr $tb> <td><b>$acl_types{$type} ACL</b></td> </tr>\n";
59 print "<tr $cb> <td><table>\n";
60
61 print "<tr> <td nowrap><b>$text{'acl_name'}</b></td>\n";
62 print "<td><input name=name size=20 value=\"$acl[0]\"></td>\n";
63
64 if ($type eq "src" || $type eq "dst") {
65         print "<tr> <td colspan=2><table>\n";
66         print "<tr> <td><b>$text{'acl_fromip'}</b></td> ",
67                 "<td><b>$text{'acl_toip'}</b></td>\n";
68         print "     <td><b>$text{'acl_nmask'}</b></td> </tr>\n";
69         for($i=0; $i<=@vals; $i++) {
70                 if ($vals[$i] =~ /^([a-z0-9\.\:]+)-([a-z0-9\.\:]+)\/([\d\.]+)$/) {
71                         $from = $1; $to = $2; $mask = $3;
72                         }
73                 elsif ($vals[$i] =~ /^([a-z0-9\.\:]+)-([a-z0-9\.\:]+)$/) {
74                         $from = $1; $to = $2; $mask = "";
75                         }
76                 elsif ($vals[$i] =~ /^([a-z0-9\.\:]+)\/([\d\.]+)$/) {
77                         $from = $1; $to = ""; $mask = $2;
78                         }
79                 elsif ($vals[$i] =~ /^([a-z0-9\.\:]+)$/) {
80                         $from = $1; $to = ""; $mask = "";
81                         }
82                 else { $from = $to = $mask = ""; }
83                 print "<tr>\n";
84                 print "<td><input name=from_$i size=15 value=\"$from\"></td>\n";
85                 print "<td><input name=to_$i size=15 value=\"$to\"></td>\n";
86                 print "<td><input name=mask_$i size=15 value=\"$mask\"></td>\n";
87                 print "</tr>\n";
88                 }
89         print "</table></td> </tr>\n";
90         }
91 elsif ($type eq "myip") {
92         print "<tr> <td colspan=2><table>\n";
93         print "<tr> <td><b>$text{'acl_ipaddr'}</b></td> ",
94                 "<td><b>$text{'acl_nmask'}</b></td> </tr>\n";
95         for($i=0; $i<=@vals; $i++) {
96                 if ($vals[$i] =~ /^([a-z0-9\.\:]+)\/([\d\.]+)$/) {
97                         $ip = $1; $mask = $2;
98                         }
99                 else { $ip = $mask = ""; }
100                 print "<tr>\n";
101                 print "<td><input name=ip_$i size=15 value=\"$ip\"></td>\n";
102                 print "<td><input name=mask_$i size=15 value=\"$mask\"></td>\n";
103                 print "</tr>\n";
104                 }
105         print "</table></td> </tr>\n";
106         }
107 elsif ($type eq "srcdomain") {
108         print "<tr> <td valign=top><b>$text{'acl_domains'}</b></td>\n";
109         print "<td><textarea name=vals rows=6 cols=40>",join("\n", @vals),
110               "</textarea></td> </tr>\n";
111         }
112 elsif ($type eq "dstdomain") {
113         print "<tr> <td valign=top><b>$text{'acl_domains'}</b></td>\n";
114         print "<td><textarea name=vals rows=6 cols=40>",join("\n", @vals),
115               "</textarea></td> </tr>\n";
116         }
117 elsif ($type eq "time") {
118         local $vals = join(' ', @vals);
119         if ($vals =~ /[A-Z]+/) {
120                 foreach $d (split(//, $vals)) {
121                         $day{$d}++;
122                         }
123                 }
124         if ($vals =~ /(\d+):(\d+)-(\d+):(\d+)/) {
125                 $h1 = $1; $m1 = $2;
126                 $h2 = $3; $m2 = $4;
127                 $hour++;
128                 }
129         print "<tr> <td valign=top><b>$text{'acl_dofw'}</b></td> <td>\n";
130         printf "<input type=radio name=day_def value=1 %s> $text{'acl_all'}\n",
131                 %day ? "" : "checked";
132         printf "<input type=radio name=day_def value=0 %s> $text{'acl_sel'}<br>\n",
133                 %day ? "checked" : "";
134         %day_name = ( 'S', $text{'acl_dsun'}, 
135                       'M', $text{'acl_dmon'}, 
136                       'T', $text{'acl_dtue'},
137                       'W', $text{'acl_dwed'}, 
138                       'H', $text{'acl_dthu'}, 
139                       'F', $text{'acl_dfri'},
140                       'A', $text{'acl_dsat'} );
141         print "<select name=day multiple size=7>\n";
142         foreach $d ('S', 'M', 'T', 'W', 'H', 'F', 'A') {
143                 printf "<option value=$d %s> $day_name{$d}\n",
144                         $day{$d} ? "selected" : "";
145                 }
146         print "</select></td> </tr>\n";
147
148         print "<tr> <td valign=top><b>$text{'acl_hofd'}</b></td> <td>\n";
149         printf "<input type=radio name=hour_def value=1 %s> $text{'acl_all'}\n",
150                 $hour ? "" : "checked";
151         printf "&nbsp;<input type=radio name=hour_def value=0 %s>\n",
152                 $hour ? "checked" : "";
153         print "<input name=h1 size=2 value=\"$h1\">:";
154         print "<input name=m1 size=2 value=\"$m1\"> $text{'acl_to'} ";
155         print "<input name=h2 size=2 value=\"$h2\">:";
156         print "<input name=m2 size=2 value=\"$m2\"></td> </tr>\n";
157         }
158 elsif ($type eq "url_regex") {
159         print "<tr> <td valign=top><b>$text{'acl_regexp'}</b></td>\n";
160         local $caseless;
161         if ($vals[0] eq '-i') {
162                 $caseless++;
163                 shift(@vals);
164                 }
165         printf "<td><input type=checkbox name=caseless value=1 %s> %s<br>\n",
166                 $caseless ? 'checked' : '', $text{'acl_case'};
167         print "<textarea name=vals rows=6 cols=40>",join("\n", @vals),
168               "</textarea></td> </tr>\n";
169         }
170 elsif ($type eq "urlpath_regex") {
171         print "<tr> <td valign=top><b>$text{'acl_regexp'}</b></td>\n";
172         local $caseless;
173         if ($vals[0] eq '-i') {
174                 $caseless++;
175                 shift(@vals);
176                 }
177         printf "<td><input type=checkbox name=caseless value=1 %s> %s<br>\n",
178                 $caseless ? 'checked' : '', $text{'acl_case'};
179         print "<textarea name=vals rows=6 cols=40>",join("\n", @vals),
180               "</textarea></td> </tr>\n";
181         }
182 elsif ($type eq "port") {
183         print "<tr> <td valign=top><b>$text{'acl_tcpports'}</b></td>\n";
184         printf "<td><input name=vals size=30 value=\"%s\"></td> </tr>\n",
185                 join(" ", @vals);
186         }
187 elsif ($type eq "proto") {
188         print "<tr> <td valign=top><b>$text{'acl_urlproto'}</b></td> <td>\n";
189         foreach $p (@vals) { $proto{$p}++; }
190         foreach $p ('http', 'ftp', 'gopher', 'wais', 'cache_object') {
191                 printf "<input type=checkbox name=vals value=$p %s> $p\n",
192                         $proto{$p} ? "checked" : "";
193                 }
194         print "</td> </tr>\n";
195         }
196 elsif ($type eq "method") {
197         print "<tr> <td valign=top><b>$text{'acl_reqmethods'}</b></td> <td>\n";
198         foreach $m (@vals) { $meth{$m}++; }
199         foreach $m ('GET', 'POST', 'HEAD', 'CONNECT', 'PUT', 'DELETE') {
200                 printf "<input type=checkbox name=vals value=$m %s> $m\n",
201                         $meth{$m} ? "checked" : "";
202                 }
203         print "</td> </tr>\n";
204         }
205 elsif ($type eq "browser") {
206         print "<tr> <td valign=top><b>$text{'acl_bregexp'}</b></td>\n";
207         printf "<td><input name=vals size=30 value=\"%s\"></td> </tr>\n",
208                 join(' ', @vals);
209         }
210 elsif ($type eq "user") {
211         print "<tr> <td valign=top><b>$text{'acl_pusers'}</b></td>\n";
212         print "<td><textarea name=vals rows=6 cols=40 wrap>",
213                 join("\n", @vals),"</textarea></td> </tr>\n";
214         }
215 elsif ($type eq "src_as" || $type eq "dst_as") {
216         print "<tr> <td valign=top><b>$text{'acl_asnum'}</b></td>\n";
217         printf "<td><input name=vals size=20 value=\"%s\"></td> </tr>\n",
218                 join(' ', @vals);
219         }
220 elsif ($type eq "proxy_auth" && $squid_version < 2.3) {
221         print "<tr> <td valign=top><b>$text{'acl_rtime'}</b></td>\n";
222         print "<td><input name=vals size=8 value=\"$vals[0]\"></td> </tr>\n";
223         }
224 elsif ($type eq "proxy_auth" && $squid_version >= 2.3) {
225         print "<tr> <td valign=top><b>$text{'acl_eusers'}</b></td>\n";
226         printf "<td><input type=radio name=authall value=1 %s> %s\n",
227                 $vals[0] eq 'REQUIRED' || $in{'type'} ? "checked" : "",
228                 $text{'acl_eusersall'};
229         printf "<input type=radio name=authall value=0 %s> %s<br>\n",
230                 $vals[0] eq 'REQUIRED' || $in{'type'} ? "" : "checked",
231                 $text{'acl_euserssel'};
232         print "<textarea name=vals rows=6 cols=40 wrap>",
233                 $vals[0] eq 'REQUIRED' || $in{'type'} ? "" : join("\n", @vals),
234                 "</textarea></td> </tr>\n";
235         }
236 elsif ($type eq "proxy_auth_regex") {
237         print "<tr> <td valign=top><b>$text{'acl_eusers'}</b></td>\n";
238         local $caseless;
239         if ($vals[0] eq '-i') {
240                 $caseless++;
241                 shift(@vals);
242                 }
243         printf "<td><input type=checkbox name=caseless value=1 %s> %s<br>\n",
244                 $caseless ? 'checked' : '', $text{'acl_case'};
245         print "<textarea name=vals rows=6 cols=40 wrap>",
246                 join("\n", @vals),"</textarea></td> </tr>\n";
247         }
248 elsif ($type eq "srcdom_regex" || $type eq "dstdom_regex") {
249         print "<tr> <td valign=top><b>$text{'acl_regexp'}</b></td>\n";
250         local $caseless;
251         if ($vals[0] eq '-i') {
252                 $caseless++;
253                 shift(@vals);
254                 }
255         printf "<td><input type=checkbox name=caseless value=1 %s> %s<br>\n",
256                 $caseless ? 'checked' : '', $text{'acl_case'};
257         print "<textarea name=vals rows=6 cols=40>",join("\n", @vals),
258               "</textarea></td> </tr>\n";
259         }
260 elsif ($type eq "ident") {
261         print "<tr> <td valign=top><b>$text{'acl_rfcusers'}</b></td>\n";
262         print "<td><textarea name=vals rows=6 cols=40 wrap>",
263                 join(' ', @vals),"</textarea></td> </tr>\n";
264         }
265 elsif ($type eq "ident_regex") {
266         print "<tr> <td valign=top><b>$text{'acl_rfcusersr'}</b></td>\n";
267         local $caseless;
268         if ($vals[0] eq '-i') {
269                 $caseless++;
270                 shift(@vals);
271                 }
272         printf "<td><input type=checkbox name=caseless value=1 %s> %s<br>\n",
273                 $caseless ? 'checked' : '', $text{'acl_case'};
274         print "<textarea name=vals rows=6 cols=40 wrap>",
275                 join("\n", @vals),"</textarea></td> </tr>\n";
276         }
277 elsif ($type eq "maxconn") {
278         print "<tr> <td valign=top><b>$text{'acl_mcr'}</b></td>\n";
279         print "<td><input name=vals size=8 value=\"$vals[0]\"></td> </tr>\n";
280         }
281 elsif ($type eq "max_user_ip") {
282         local $mipstrict;
283         if ($vals[0] eq '-s') {
284                 $mipstrict++;
285                 shift(@vals);
286         }
287         print "<tr><td><b>$text{'acl_mai'}</b></td><td><input name=vals size=8 value=\"$vals[0]\"></td> </tr>\n";
288 #       print "<tr> <td valign=top><b>$text{'acl_extargs'}</b></td>\n";
289         print "<tr><td>$text{'acl_maistrict'}</td>";
290         printf "<td><input type=checkbox name=strict value=1 %s></td></tr>\n",
291                 $mipstrict ? 'checked' : '';
292         print "<tr><td colspan=2>$text{'acl_mairemind'}</td></tr>";
293
294 #       printf "<td><input name=args size=25 value=\"%s\"></td> </tr>\n",
295 #               join(" ", @vals[0]);
296         }
297
298 elsif ($type eq "myport") {
299         print "<tr> <td valign=top><b>$text{'acl_psp'}</b></td>\n";
300         print "<td><input name=vals size=8 value=\"$vals[0]\"></td> </tr>\n";
301         }
302 elsif ($type eq "snmp_community") {
303         print "<tr> <td valign=top><b>$text{'acl_scs'}</b></td>\n";
304         print "<td><input name=vals size=15 value=\"$vals[0]\"></td> </tr>\n";
305         }
306 elsif ($type eq "req_mime_type") {
307         print "<tr> <td valign=top><b>$text{'acl_rmt'}</b></td>\n";
308         print "<td><input name=vals size=15 value=\"$vals[0]\"></td> </tr>\n";
309         }
310 elsif ($type eq "rep_mime_type") {
311         print "<tr> <td valign=top><b>$text{'acl_rpmt'}</b></td>\n";
312         print "<td><input name=vals size=15 value=\"$vals[0]\"></td> </tr>\n";
313         }
314 elsif ($type eq "arp") {
315         print "<tr> <td valign=top><b>$text{'acl_arp'}</b></td>\n";
316         print "<td><textarea name=vals rows=6 cols=40>",join("\n", @vals),
317               "</textarea></td> </tr>\n";
318         }
319 elsif ($type eq "external") {
320         print "<tr> <td valign=top><b>$text{'acl_extclass'}</b></td>\n";
321         print "<td><select name=class>\n";
322         foreach $c (&find_config("external_acl_type", $conf)) {
323                 printf "<option %s>%s\n",
324                         $c->{'values'}->[0] eq $vals[0] ? "selected" : "",
325                         $c->{'values'}->[0];
326                 }
327         print "</select></td> </tr>\n";
328         print "<tr> <td valign=top><b>$text{'acl_extargs'}</b></td>\n";
329         printf "<td><input name=args size=25 value=\"%s\"></td> </tr>\n",
330                 join(" ", @vals[1..$#vals]);
331         }
332
333 # Show URL to redirect on failure
334 print "<tr> <td><b>$text{'acl_failurl'}</b></td>\n";
335 printf "<td><input name=deny size=35 value=\"%s\"></td> </tr>\n",
336         @deny ? $deny[0]->{'values'}->[0] : "";
337
338 # Show file in which ACL is stored
339 print "<tr> <td><b>$text{'acl_file'}</b></td>\n";
340 print "<td>",&ui_opt_textbox("file", $file, 40, $text{'acl_nofile'},
341                              $text{'acl_infile'})," ",
342              &file_chooser_button("file"),"</td> </tr>\n";
343
344 if ($in{'type'}) {
345         print "<tr> <td></td>\n";
346         print "<td>",&ui_checkbox("keep", 1, $text{'acl_keep'}, 0),"</td> </tr>\n";
347         }
348
349 print "</table></td></tr></table>\n";
350 print "<input type=submit value=$text{'acl_buttsave'}>\n";
351 if (!$in{'type'}) { print "<input type=submit value=$text{'acl_buttdel'} name=delete>\n"; }
352 print "</form>\n";
353
354 &ui_print_footer("edit_acl.cgi?mode=acls", $text{'acl_return'},
355                  "", $text{'index_return'});
356