Handle hostnames with upper-case letters
[webmin.git] / mailboxes / delete_mail.cgi
1 #!/usr/local/bin/perl
2 # delete_mail.cgi
3 # Delete, mark, move or copy multiple messages
4
5 require './mailboxes-lib.pl';
6 &ReadParse();
7 &can_user($in{'user'}) || &error($text{'mail_ecannot'});
8 @delete = sort { $a <=> $b } split(/\0/, $in{'d'});
9 @folders = &list_user_folders($in{'user'});
10 $folder = $folders[$in{'folder'}];
11
12 if ($in{'mark1'} || $in{'mark2'}) {
13         # Marking emails with some status
14         @delete || &error($text{'delete_emnone'});
15         @mail = &mailbox_list_mails($delete[0], $delete[@delete-1], $folder);
16         dbmopen(%read, "$module_config_directory/$in{'user'}.read", 0600);
17         local $m = $in{'mark1'} ? $in{'mode1'} : $in{'mode2'};
18         foreach $d (@delete) {
19                 local $hid = $mail[$d]->{'header'}->{'message-id'};
20                 if ($m) {
21                         $read{$hid} = $m;
22                         }
23                 else {
24                         delete($read{$hid});
25                         }
26                 }
27         dbmclose(%read);
28         $perpage = $folder->{'perpage'} || $config{'perpage'};
29         &redirect("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}");
30         }
31 elsif ($in{'move1'} || $in{'move2'}) {
32         # Moving mails to some other user's inbox
33         &check_modification($folder);
34         @delete || &error($text{'delete_emovenone'});
35         $muser = $in{'move1'} ? $in{'mfolder1'} : $in{'mfolder2'};
36         &can_user($muser) || &error($text{'delete_emovecannot'});
37         @mfolders = &list_user_folders($muser);
38         @mfolders || &error($text{'delete_emoveuser'});
39
40         @mail = &mailbox_list_mails($delete[0], $delete[@delete-1], $folder);
41         foreach $d (@delete) {
42                 $mail[$d] || &error($text{'mail_eexists'});
43                 push(@movemail, $mail[$d]);
44                 }
45         &lock_folder($folder);
46         &lock_folder($mfolder);
47         &mailbox_move_mail($folder, $mfolders[0], @movemail);
48         &unlock_folder($mfolder);
49         &unlock_folder($folder);
50         &webmin_log("movemail", undef, undef, { 'from' => $folder->{'file'},
51                                                 'to' => $mfolders[0]->{'file'},
52                                                 'count' => scalar(@delete) } );
53         &redirect("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}");
54         }
55 elsif ($in{'copy1'} || $in{'copy2'}) {
56         # Copying mails to some other folder
57         @delete || &error($text{'delete_ecopynone'});
58         $cuser = $in{'copy1'} ? $in{'mfolder1'} : $in{'mfolder2'};
59         &can_user($cuser) || &error($text{'delete_ecopycannot'});
60         @cfolders = &list_user_folders($cuser);
61         @cfolders || &error($text{'delete_ecopyuser'});
62
63         @mail = &mailbox_list_mails($delete[0], $delete[@delete-1], $folder);
64         foreach $d (@delete) {
65                 $mail[$d] || &error($text{'mail_eexists'});
66                 push(@copymail, $mail[$d]);
67                 }
68         &lock_folder($cfolder);
69         &mailbox_copy_mail($folder, $cfolders[0], @copymail);
70         &unlock_folder($cfolder);
71         &webmin_log("copymail", undef, undef, { 'from' => $folder->{'file'},
72                                                 'to' => $cfolders[0]->{'file'},
73                                                 'count' => scalar(@delete) } );
74         &redirect("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}");
75         }
76 elsif ($in{'forward'}) {
77         # Forwarding selected mails .. redirect
78         @delete || &error($text{'delete_efnone'});
79         &redirect("reply_mail.cgi?folder=$in{'folder'}&user=$in{'user'}&".
80                   join("&", map { "mailforward=$_" } @delete));
81         }
82 elsif ($in{'new'}) {
83         # Need to redirect to compose form
84         &redirect("reply_mail.cgi?new=1&folder=$in{'folder'}&user=$in{'user'}");
85         }
86 elsif ($in{'black'} || $in{'white'}) {
87         # Deny or allow all senders
88         $dir = $in{'black'} ? "blacklist_from" : "whitelist_from";
89         @delete || &error($text{'delete_ebnone'});
90         @mail = &mailbox_list_mails($delete[0], $delete[@delete-1], $folder);
91         foreach $d (@delete) {
92                 push(@addrs, map { $_->[0] } &split_addresses($mail[$d]->{'header'}->{'from'}));
93                 }
94         &foreign_require("spam", "spam-lib.pl");
95         local $conf = &spam::get_config();
96         local @from = map { @{$_->{'words'}} }
97                           &spam::find($dir, $conf);
98         local %already = map { $_, 1 } @from;
99         @newaddrs = grep { !$already{$_} } &unique(@addrs);
100         push(@from, @newaddrs);
101         &spam::save_directives($conf, $dir, \@from, 1);
102         &flush_file_lines();
103         &redirect("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}");
104         }
105 elsif ($in{'razor'} || $in{'ham'}) {
106         # Report as ham or spam all messages, and show output to the user
107         @delete || &error($in{'razor'} ? $text{'delete_ebnone'}
108                                        : $text{'delete_ehnone'});
109
110         &ui_print_header(undef, $in{'razor'} ? $text{'razor_title'}
111                                              : $text{'razor_title2'}, "");
112         if ($in{'razor'}) {
113                 print "<b>$text{'razor_report2'}</b>\n";
114                 }
115         else {
116                 print "<b>$text{'razor_report3'}</b>\n";
117                 }
118         print "<pre>";
119
120         # Write all messages to a temp file
121         @mail = &mailbox_list_mails($delete[0], $delete[@delete-1], $folder);
122         $temp = &transname();
123         $cmd = $in{'razor'} ? &spam_report_cmd() : &ham_report_cmd();
124         foreach $d (@delete) {
125                 $mail[$d] || &error($text{'mail_eexists'});
126                 &send_mail($mail[$d], $temp);
127                 push(@delmail, $mail[$d]);
128                 }
129
130         # Call reporting command on them
131         &open_execute_command(OUT, "$cmd <$temp 2>&1", 1);
132         local $error;
133         while(<OUT>) {
134                 print &html_escape($_);
135                 $error++ if (/failed/i);
136                 }
137         close(OUT);
138         unlink($temp);
139         print "</pre>\n";
140         if ($? || $error) {
141                 print "<b>$text{'razor_err'}</b><p>\n";
142                 }
143         else {
144                 if ($config{'spam_del'} && $in{'razor'}) {
145                         # Delete spam too
146                         &lock_folder($folder);
147                         &mailbox_delete_mail($folder, @delmail);
148                         &unlock_folder($folder);
149                         print "<b>$text{'razor_deleted'}</b><p>\n";
150                         }
151                 else {
152                         print "<b>$text{'razor_done'}</b><p>\n";
153                         }
154                 print "<script>\n";
155                 print "window.location = 'list_mail.cgi?folder=$in{'folder'}&user=$in{'user'}';\n";
156                 print "</script>\n";
157                 }
158         &ui_print_footer("list_mail.cgi?folder=$in{'folder'}&user=$in{'user'}", $text{'mail_return'}, "", $text{'index_return'});
159         }
160 elsif ($in{'delete'} || $in{'deleteall'}) {
161         # Just deleting emails
162         &check_modification($folder);
163         @delete || $in{'deleteall'} || &error($text{'delete_enone'});
164         if (!$in{'confirm'} && &need_delete_warn($folder)) {
165                 # Need to ask for confirmation before deleting
166                 &ui_print_header(undef, $text{'confirm_title'}, "");
167
168                 print &ui_confirmation_form("delete_mail.cgi",
169                         ($in{'deleteall'} ? &text('confirm_warnall') :
170                                 &text('confirm_warn', scalar(@delete)))."<br>".
171                         ($config{'delete_warn'} ne 'y' ?
172                                 $text{'confirm_warn2'} :
173                                 $text{'confirm_warn4'}),
174                         [ &inputs_to_hiddens(\%in) ],
175                         [ [ 'confirm', $text{'confirm_ok'} ] ],
176                         );
177                 
178                 &ui_print_footer("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}", $text{'mail_return'});
179                 }
180         else {
181                 # Go ahead and delete
182                 &lock_folder($folder);
183                 if ($in{'deleteall'}) {
184                         # Clear the whole folder
185                         $delcount = &mailbox_folder_size($folder);
186                         &mailbox_empty_folder($folder);
187                         }
188                 else {
189                         # Just delete selected messages
190                         @mail = &mailbox_list_mails($delete[0],
191                                                     $delete[@delete-1],
192                                                     $folder);
193                         foreach $d (@delete) {
194                                 $mail[$d] || &error($text{'mail_eexists'});
195                                 push(@delmail, $mail[$d]);
196                                 }
197                         &mailbox_delete_mail($folder, @delmail);
198                         $delcount = scalar(@delmail);
199                         }
200                 &unlock_folder($folder);
201                 &webmin_log("delmail", undef, undef,
202                             { 'from' => $folder->{'file'},
203                               'all' => $in{'deleteall'},
204                               'count' => $delcount } );
205                 &redirect("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}");
206                 }
207         }
208 &pop3_logout_all();