Handle hostnames with upper-case letters
[webmin.git] / spam / save_simple.cgi
1 #!/usr/local/bin/perl
2 # Update simple tests
3
4 require './spam-lib.pl';
5 &ReadParse();
6 &set_config_file_in(\%in);
7 &can_use_check("header");
8 $conf = &get_config();
9 &error_setup($text{'simple_err'});
10 &execute_before("simple");
11
12 # Get existing rules
13 @simples = &get_simple_tests($conf);
14 @headers = &find("header", $conf);
15 @bodies = &find("body", $conf);
16 @fulls = &find("full", $conf);
17 @uris = &find("uri", $conf);
18 @scores = &find("score", $conf);
19 @describes = &find("describe", $conf);
20
21 # Parse and validate inputs
22 for($i=0; defined($name = $in{"name_$i"}); $i++) {
23         $simple = $i < @simples ? $simples[$i] : undef;
24         if ($simple) {
25                 # Take out the directives that would be replaced
26                 @headers = grep { $_ ne $simple->{'header_dir'} } @headers;
27                 @bodies = grep { $_ ne $simple->{'body_dir'} } @bodies;
28                 @fulls = grep { $_ ne $simple->{'full_dir'} } @fulls;
29                 @uris = grep { $_ ne $simple->{'uri_dir'} } @uris;
30                 @scores = grep { $_ ne $simple->{'score_dir'} } @scores;
31                 @describes = grep { $_ ne $simple->{'describe_dir'} } @describes;
32                 }
33
34         if ($name) {
35                 $name =~ /^\S+$/ || &error(&text('header_ename', $name));
36                 $donename{$name}++ && &error(&text('header_eclash', $name));
37                 $header = $in{"header_$i"};
38                 $regexp = $in{"regexp_$i"};
39                 $regexp || &error(&text('header_eregexp2', $name));
40                 $flags = $in{"flags_$i"};
41                 $flags =~ /^[a-z]*$/ || &error(&text('header_eflags', $flags));
42                 $score = $in{"score_$i"};
43                 $score eq "" || $score =~ /^\-?\d+(\.\d+)?$/ ||
44                                 $score =~ /^\-?\.\d+$/ ||
45                         &error(&text('score_epoints', $score));
46                 $describe = $in{"describe_$i"};
47
48                 # Update or add the actual directives
49                 if ($header eq "body") {
50                         push(@bodies, { 'name' => 'body',
51                                        'value' => "$name /$regexp/$flags" });
52                         }
53                 elsif ($header eq "full") {
54                         push(@fulls, { 'name' => 'full',
55                                        'value' => "$name /$regexp/$flags" });
56                         }
57                 elsif ($header eq "uri") {
58                         push(@uris, { 'name' => 'uri',
59                                        'value' => "$name /$regexp/$flags" });
60                         }
61                 else {
62                         my $ucheader = ucfirst($header);
63                         push(@headers, { 'name' => 'header',
64                                          'value' => "$name $ucheader =~ /$regexp/$flags" });
65                         }
66
67                 # Update the score and describe
68                 if ($score ne "") {
69                         push(@scores, { 'name' => 'score',
70                                         'value' => "$name $score" });
71                         }
72                 if ($describe ne "") {
73                         push(@describes, { 'name' => 'describe',
74                                            'value' => "$name $describe" });
75                         }
76                 }
77         }
78
79 # Save the directives
80 &lock_spam_files();
81 &save_directives($conf, "header", \@headers, 0);
82 &save_directives($conf, "body", \@bodies, 0);
83 &save_directives($conf, "full", \@fulls, 0);
84 &save_directives($conf, "score", \@scores, 0);
85 &save_directives($conf, "describe", \@describes, 0);
86 &save_directives($conf, "uri", \@uris, 0);
87
88 &flush_file_lines();
89 &unlock_spam_files();
90 &execute_after("header");
91 &webmin_log("header");
92 &redirect($redirect_url);
93