Handle hostnames with upper-case letters
[webmin.git] / spam / setup.cgi
1 #!/usr/local/bin/perl
2 # setup.cgi
3 # Actually setup SpamAssassin for the user or globally
4
5 require './spam-lib.pl';
6 &error_setup($text{'setup_err'});
7 &can_use_check("setup");
8 &ReadParse();
9
10 # Validate inputs
11 $type = undef;
12 if ($in{'to'} == 0) {
13         $file = "/dev/null";
14         }
15 elsif ($in{'to'} == 1) {
16         $in{'mbox'} =~ /^\S+$/ || &error($text{'setup_efile'});
17         $file = $in{'mbox'};
18         }
19 elsif ($in{'to'} == 2) {
20         $in{'maildir'} =~ /^\S+$/ || &error($text{'setup_emaildir'});
21         $file = "$in{'maildir'}/";
22         }
23 elsif ($in{'to'} == 3) {
24         $in{'mhdir'} =~ /^\S+$/ || &error($text{'setup_emhdir'});
25         $file = "$in{'mhdir'}/.";
26         }
27 elsif ($in{'to'} == 4) {
28         $file = "\$DEFAULT";
29         }
30 elsif ($in{'to'} == 5) {
31         $in{'email'} =~ /^\S+$/ || &error($text{'setup_eemail'});
32         $file = $in{'email'};
33         $type = "!";
34         }
35
36 if ($module_info{'usermin'} && $file !~ /^\//) {
37         # Create parent directory if needed
38         if ($file =~ /^(\S+)\/([^\/]+)(\/(\.)?)?$/ &&
39             !-d "$remote_user_info[7]/$1") {
40                 &system_logged("mkdir -p '$remote_user_info[7]/$1'");
41                 }
42         }
43
44 # Add template procmail rules
45 &foreign_require("procmail", "procmail-lib.pl");
46 @pmrc = &get_procmailrc();
47 if (!-s $pmrc[0] && $config{'extra_procmail'}) {
48         &open_tempfile(PMRC, ">$pmrc[0]");
49         &print_tempfile(PMRC, map { "$_\n" } split(/\t/, $config{'extra_procmail'}));
50         &close_tempfile(PMRC);
51         }
52
53 # Add new Procmail directives at the top of config file
54 $pmrc = $pmrc[$#pmrc];
55 @recipes = &procmail::parse_procmail_file($pmrc);
56 if ($in{'drop'}) {
57         # Environment variable to drop privileges
58         $recipe0 = { 'name' => 'DROPPRIVS',
59                      'value' => 'yes' };
60         }
61 if ($config{'call_spam'} || !$module_info{'usermin'}) {
62         # Recipe to call spamassassin
63         $recipe1 = { 'flags' => [ 'f', 'w' ],
64                      'conds' => [ ],
65                      'type' => '|',
66                      'action' => &get_procmail_command() };
67         }
68 if ($file) {
69         # Recipe to perform actual filtering to a file
70         $recipe2 = { 'flags' => [ ],
71                      'conds' => [ [ '', '^X-Spam-Status: Yes' ] ],
72                      'type' => $type,
73                      'action' => $file };
74         }
75 &lock_file($pmrc);
76 if (@recipes) {
77         # Insert at start of file
78         &procmail::create_recipe_before($recipe0, $recipes[0], $pmrc)
79                 if ($recipe0);
80         &procmail::create_recipe_before($recipe1, $recipes[0], $pmrc)
81                 if ($recipe1);
82         &procmail::create_recipe_before($recipe2, $recipes[0], $pmrc)
83                 if ($recipe2);
84         }
85 else {
86         # Just add to file
87         &procmail::create_recipe($recipe0, $pmrc) if ($recipe0);
88         &procmail::create_recipe($recipe1, $pmrc) if ($recipe1);
89         &procmail::create_recipe($recipe2, $pmrc) if ($recipe2);
90         }
91 chmod(0644, $pmrc);
92 &unlock_file($pmrc);
93
94 if ($module_info{'usermin'} && $file ne "/dev/null") {
95         # Remember spam mail file
96         $userconfig{'spam_file'} = $file;
97         &write_file("$user_module_config_directory/config", \%userconfig);
98         }
99
100 # All done!
101 &webmin_log("setup");
102 &redirect("");
103