Handle hostnames with upper-case letters
[webmin.git] / mailboxes / mail_search.cgi
1 #!/usr/local/bin/perl
2 # mail_search.cgi
3 # Find mail messages matching some pattern
4
5 require './mailboxes-lib.pl';
6 &ReadParse();
7 &can_user($in{'user'}) || &error($text{'mail_ecannot'});
8 @folders = &list_user_folders($in{'user'});
9 $uuser = &urlize($in{'user'});
10
11 if ($in{'simple'}) {
12         # Make sure a search was entered
13         $in{'search'} || &error($text{'search_ematch'});
14         $ofolder = $folders[$in{'folder'}];
15         }
16 else {
17         # Validate search fields
18         for($i=0; defined($in{"field_$i"}); $i++) {
19                 if ($in{"field_$i"}) {
20                         $in{"what_$i"} || &error(&text('search_ewhat', $i+1));
21                         $neg = $in{"neg_$i"} ? "!" : "";
22                         push(@fields, [ $neg.$in{"field_$i"}, $in{"what_$i"} ]);
23                         }
24                 }
25         @fields || &error($text{'search_enone'});
26         $ofolder = $folders[$in{'ofolder'}];
27         }
28
29 if ($in{'folder'} == -2) {
30         $desc = $text{'search_local'};
31         }
32 elsif ($in{'folder'} == -1) {
33         $desc = $text{'search_all'};
34         }
35 else {
36         $folder = $folders[$in{'folder'}];
37         $desc = &text('mail_for', $folder->{'name'});
38         }
39 &ui_print_header($desc, $text{'search_title'}, "", undef, 0, 0, undef,
40         &folder_link($in{'user'}, $ofolder));
41
42 if ($in{'simple'}) {
43         if ($in{'search'} =~ /^(\S+):\s*(.*)$/) {
44                 # A specific field was entered
45                 local ($field, $what) = ($1, $2);
46                 @searchlist = ( [ $field, $what ] );
47                 @rv = &mailbox_search_mail(\@searchlist, 0, $folder);
48                 print "<p><b>",&text('search_results5', scalar(@rv),
49                             "<tt>$field</tt>", "<tt>$what</tt>")," ..</b><p>\n";
50                 }
51         else {
52                 # Just search by Subject and From in one folder
53                 ($mode, $words) = &parse_boolean($in{'search'});
54                 if ($mode == 0) {
55                         # Can just do a single 'or' search
56                         @searchlist = map { ( [ 'subject', $_ ],
57                                               [ 'from', $_ ] ) } @$words;
58                         @rv = &mailbox_search_mail(\@searchlist, 0, $folder);
59                         }
60                 elsif ($mode == 1) {
61                         # Need to do two 'and' searches and combine
62                         @searchlist1 = map { ( [ 'subject', $_ ] ) } @$words;
63                         @rv1 = &mailbox_search_mail(\@searchlist1, 1, $folder);
64                         @searchlist2 = map { ( [ 'from', $_ ] ) } @$words;
65                         @rv2 = &mailbox_search_mail(\@searchlist2, 1, $folder);
66                         @rv = @rv1;
67                         %gotidx = map { $_->{'idx'}, 1 } @rv;
68                         foreach $mail (@rv2) {
69                                 push(@rv, $mail) if (!$gotidx{$mail->{'idx'}});
70                                 }
71                         }
72                 else {
73                         &error($text{'search_eboolean'});
74                         }
75                 print "<p><b>",&text('search_results2', scalar(@rv),
76                                      "<tt>$in{'search'}</tt>")," ..</b><p>\n";
77                 }
78         foreach $mail (@rv) {
79                 $mail->{'folder'} = $folder;
80                 }
81         }
82 else {
83         # Complex search, perhaps over multiple folders!
84         if ($in{'folder'} == -2) {
85                 @sfolders = grep { !$_->{'remote'} } @folders;
86                 $multi_folder = 1;
87                 }
88         elsif ($in{'folder'} == -1) {
89                 @sfolders = @folders;
90                 $multi_folder = 1;
91                 }
92         else {
93                 @sfolders = ( $folder );
94                 }
95         foreach $sf (@sfolders) {
96                 local @frv = &mailbox_search_mail(\@fields, $in{'and'}, $sf);
97                 foreach $mail (@frv) {
98                         $mail->{'folder'} = $sf;
99                         }
100                 push(@rv, @frv);
101                 }
102         print "<p><b>",&text('search_results4', scalar(@rv))," ..</b><p>\n";
103         }
104 @rv = reverse(@rv);
105
106 # Show list of messages, with form
107 if (@rv) {
108         print &ui_form_start("delete_mail.cgi", "post");
109         print &ui_hidden("user", $in{'user'});
110         print &ui_hidden("folder", $in{'folder'});
111         if ($config{'top_buttons'} && !$multi_folder) {
112                 &show_buttons(1, \@folders, $folder, \@rv, $in{'user'}, 1);
113                 }
114         &show_mail_table(\@rv, $multi_folder ? undef : $ofolder, 0);
115         if (!$multi_folder) {
116                 &show_buttons(2, \@folders, $folder, \@rv, $in{'user'}, 1);
117                 }
118         print &ui_form_end();
119         }
120 else {
121         print "<b>$text{'search_none'}</b> <p>\n";
122         }
123
124 &ui_print_footer($in{'simple'} ? ( ) : ( "search_form.cgi?folder=$in{'folder'}",
125                                 $text{'sform_return'} ),
126         "list_mail.cgi?user=$in{'user'}&folder=$in{'folder'}", $text{'mail_return'},
127         "", $text{'index_return'});
128