php IHDR w Q )Ba pHYs sRGB gAMA a IDATxMk\U s&uo,mD )Xw+e?tw.oWp;QHZnw`gaiJ9̟灙a=nl[ ʨ G;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ y H@E7j 1j+OFRg}ܫ;@Ea~ j`u'o> j- $_q?qS XzG'ay
files >> /usr/libexec/usermin/mailbox/ |
files >> //usr/libexec/usermin/mailbox/mail_search.cgi |
#!/usr/bin/perl # mail_search.cgi # Find mail messages matching some pattern require './mailbox-lib.pl'; &ReadParse(); $limit = { }; if (!$in{'status_def'} && defined($in{'status'})) { $statusmsg = &text('search_withstatus', $text{'view_mark'.$in{'status'}}); } if ($in{'simple'}) { # Make sure a search was entered $in{'search'} || &error($text{'search_ematch'}); if ($userconfig{'search_latest'}) { $limit->{'latest'} = $userconfig{'search_latest'}; } } elsif ($in{'spam'}) { # Make sure a spam score was entered $in{'score'} =~ /^\d+$/ || &error($text{'search_escore'}); } else { # Validate search fields for($i=0; defined($in{"field_$i"}); $i++) { if ($in{"field_$i"}) { $in{"what_$i"} || &error(&text('search_ewhat', $i+1)); $neg = $in{"neg_$i"} ? "!" : ""; push(@fields, [ $neg.$in{"field_$i"}, $in{"what_$i"}, $in{"re_$i"} ]); } } @fields || $statusmsg || &error($text{'search_enone'}); if (!defined($in{'limit'})) { if ($userconfig{'search_latest'}) { $limit = { 'latest' => $userconfig{'search_latest'} }; } } elsif (!$in{'limit_def'}) { $in{'limit'} =~ /^\d+$/ || &error($text{'search_elatest'}); $limit->{'latest'} = $in{'limit'}; } } if ($limit && $limit->{'latest'}) { $limitmsg = &text('search_limit', $limit->{'latest'}); } @folders = &list_folders(); if ($in{'lastfolder'}) { $fid = &get_last_folder_id(); if ($fid) { $folder = &find_named_folder($fid, \@folders); if ($folder) { $in{'folder'} = $folder->{'index'}; } } } if ($in{'id'}) { $folder = &find_named_folder($in{'id'}, \@folders); $folder || &error("Failed to find folder $in{'id'}"); $in{'folder'} = $folder->{'index'}; } elsif ($in{'folder'} >= 0) { $folder = $folders[$in{'folder'}]; } if ($folder && $folder->{'id'} eq $search_folder_id) { # Cannot search searchs! &error($text{'search_eself'}); } if ($in{'simple'}) { # Just search by Subject and From (or To) in one folder ($mode, $words) = &parse_boolean($in{'search'}); local $who = $folder->{'sent'} ? 'to' : 'from'; if ($mode == 0) { # Search was like 'foo' or 'foo bar' # Can just do a single 'or' search @searchlist = map { ( [ 'subject', $_ ], [ $who, $_ ] ) } @$words; @rv = &mailbox_search_mail(\@searchlist, 0, $folder, $limit, 1); } elsif ($mode == 1) { # Search was like 'foo and bar' # Need to do two 'and' searches and combine @searchlist1 = map { ( [ 'subject', $_ ] ) } @$words; @rv1 = &mailbox_search_mail(\@searchlist1, 1, $folder, $limit, 1); @searchlist2 = map { ( [ $who, $_ ] ) } @$words; @rv2 = &mailbox_search_mail(\@searchlist2, 1, $folder, $limit, 1); @rv = @rv1; %gotid = map { $_->{'id'}, 1 } @rv; foreach $mail (@rv2) { push(@rv, $mail) if (!$gotid{$mail->{'id'}}); } } else { &error($text{'search_eboolean'}); } foreach $mail (@rv) { $mail->{'folder'} = $folder; } if ($statusmsg) { @rv = &filter_by_status(\@rv, $in{'status'}); } $msg = &text('search_msg2', "<i>".$in{'search'}."</i>"); } elsif ($in{'spam'}) { # Search by spam score, using X-Spam-Level header $stars = "*" x $in{'score'}; @rv = &mailbox_search_mail([ [ "x-spam-level", $stars ] ], 0, $folder, $limit, 1); foreach $mail (@rv) { $mail->{'folder'} = $folder; } $msg = &text('search_msg5', $in{'score'}); } else { # Complex search, perhaps over multiple folders! if ($in{'folder'} == -2) { # All local folders, except composite and virtual @sfolders = grep { !$_->{'remote'} && $_->{'type'} != 5 && $_->{'type'} != 6 } @folders; $multi_folder = 1; } elsif ($in{'folder'} == -1) { # All folders, except composite and virtual @sfolders = grep { $_->{'type'} != 5 && $_->{'type'} != 6 } @folders; $multi_folder = 1; } else { @sfolders = ( $folder ); } foreach $sf (@sfolders) { local @frv = &mailbox_search_mail(\@fields, $in{'and'}, $sf, $limit, 1); foreach $mail (@frv) { $mail->{'folder'} = $sf; } if ($in{'attach'}) { # Limit to those with an attachment @attach = &mail_has_attachments(\@frv, $sf); @newfrv = ( ); for($i=0; $i<@frv; $i++) { push(@newfrv, $frv[$i]) if ($attach[$i]); } @frv = @newfrv; } push(@rv, @frv); } if ($statusmsg) { # Limit by status (read, unread, special) @rv = &filter_by_status(\@rv, $in{'status'}); } if (@fields == 1) { $stext = $fields[0]->[1]; $stext =~ s/^(\.\*|\^)//; $stext =~ s/(\.\*|\$)$//; $msg = &text('search_msg6', "<i>".$stext."</i>", "<i>".$fields[0]->[0]."</i>"); } else { $msg = $text{'search_msg4'}; } } $msg .= " $limitmsg" if ($limitmsg); $msg .= " $statusmsg" if ($statusmsg); # Create a virtual folder for the search results if ($in{'dest_def'} || !defined($in{'dest'})) { # Use the default search results folder ($virt) = grep { $_->{'type'} == 6 && $_->{'id'} == 1 } @folders; if (!$virt) { $virt = { 'id' => $search_folder_id, 'type' => 6, }; } $virt->{'name'} = $text{'search_title'}; } else { # Create a new virtual folder $in{'dest'} || &error($text{'search_edest'}); $virt = { 'type' => 6, 'name' => $in{'dest'} }; } $virt->{'delete'} = 1; $virt->{'members'} = [ map { [ $_->{'folder'}, $_->{'id'} ] } @rv ]; $virt->{'msg'} = $msg; if ($folder) { # Use same From/To display mode as original folder $virt->{'show_to'} = $folder->{'show_to'}; $virt->{'show_from'} = $folder->{'show_from'}; $virt->{'spam'} = $folder->{'spam'}; $virt->{'sent'} = $folder->{'sent'}; $virt->{'drafts'} = $folder->{'drafts'}; } else { # Use default From/To mode delete($virt->{'show_to'}); delete($virt->{'show_from'}); delete($virt->{'spam'}); delete($virt->{'sent'}); delete($virt->{'drafts'}); } &delete_new_sort_index($virt); &save_folder($virt, $virt); # Redirect to it &redirect("index.cgi?id=$virt->{'id'}&refresh=2"); &pop3_logout_all();y~or5J={Eeu磝Qk ᯘG{?+]ן?wM3X^歌>{7پK>on\jy Rg/=fOroNVv~Y+ NGuÝHWyw[eQʨSb> >}Gmx[o[<{Ϯ_qFvM IENDB`