Handle hostnames with upper-case letters
[webmin.git] / tcpwrappers / save_rule.cgi
1 #!/usr/local/bin/perl
2 # Create, update or delete a rule
3
4 require './tcpwrappers-lib.pl';
5 &ReadParse();
6 &error_setup($text{'save_errtitle'});
7 $type = $in{'allow'} ? 'allow' : 'deny';
8 $file = $config{'hosts_'.$type};
9 @rules = &list_rules($file);
10
11 if (!$in{'new'}) {
12     ($rule) = grep { $_->{'id'} == $in{'id'} } @rules;
13     $rule || &error($text{'edit_eid'});
14 }
15         
16 &lock_file($file);
17 if ($in{'delete'}) {
18     # Delete one rule
19     &delete_rule($file, $rule);
20     goto ALLDONE;
21 } else {
22     # Check input
23     &error($text{'save_eservice'}) if ($in{'service_custom'} && $in{'service_custom'} !~ /^[\w\d\s\-\/\.,]+$/);
24     &error($text{'save_eservice'}) if ($in{'service_except_custom'} && $in{'service_except_custom'} !~ /^[\w\d\s\-\/\.,]+$/);
25
26     &error($text{'save_ehost'}) if ($in{'host_text_def'} == 0 && $in{'host_text'} !~ /^[\w\d\s\-\/\@\.,]+$/);
27     &error($text{'save_ehost'}) if ($in{'host_except'} && $in{'host_except'} !~ /^[\w\d\s\-\/\@\.,]+$/);
28
29     for (my $i = 0; $i <= $in{'cmd_count'}; $i++) {
30         &error($text{'save_ecmd'}) if ($in{'cmd_'.$i} && $in{'cmd_'.$i} !~ /^[\w\d\s\-\/\@\%\|\(\)\'\"\&\.,]+$/);
31     }
32 }
33
34 # Build rule record
35 if ($in{'service_custom'}) {
36     $service = $in{'service_custom'};
37     if ($in{'service_except_custom'}) {
38         $service .= " EXCEPT ".$in{'service_except_custom'};
39     }
40 } else {
41     # listed from (x)inetd
42     $service = join(",", split /\0/, $in{'service'});
43     if ($in{'service_except'}) {
44         $service .= " EXCEPT ".join(",", split /\0/, $in{'service_except'});
45     }
46 }
47
48 $host = $in{'host_text_def'} ? $in{'host_select'} : $in{'host_text'};
49 if ($in{'host_except'}) {
50     $host .= " EXCEPT ".$in{'host_except'};
51 }
52
53 $cmd = '';
54 for (my $i = 0; $i <= $in{'cmd_count'}; $i++) {
55     next unless ($in{'cmd_'.$i});
56     $cmd .= $cmd ? " : " : '';
57     $cmd .= $in{'cmd_directive_'.$i} ne 'none' ? $in{'cmd_directive_'.$i}.' ' : '';
58     $cmd .= $in{'cmd_'.$i};
59 }
60
61 my %newrule = ( 'service' => $service,
62                 'host' => $host,
63                 'cmd' => $cmd
64                 );
65
66 # Save to file
67 if ($in{'new'}) {
68     &create_rule($file, \%newrule);
69 } else {
70     &modify_rule($file, $rule, \%newrule);
71 }
72
73 ALLDONE:
74 &unlock_file($file);
75 &webmin_log($in{'new'} ? "create" : $in{'delete'} ? "delete" : "modify", "rule", $rule->{'id'});
76 &redirect("index.cgi?type=$type");
77