X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fimap_search.php;h=38832fc1be862cc1af0ec8fc60ea3d7ac8b743cb;hb=1eebcf25072674e039edd33904c6f700441a7722;hp=ba69165aa2916ea317ba42e2e300868de15094b4;hpb=8d93176bdbf9bd77ca0e1a26bcf5d4aee90e2c73;p=squirrelmail.git diff --git a/functions/imap_search.php b/functions/imap_search.php index ba69165a..38832fc1 100644 --- a/functions/imap_search.php +++ b/functions/imap_search.php @@ -3,7 +3,7 @@ /** * imap_search.php * - * Copyright (c) 1999-2002 The SquirrelMail Project Team + * Copyright (c) 1999-2003 The SquirrelMail Project Team * Licensed under the GNU GPL. For full terms see the file COPYING. * * IMAP search routines @@ -11,193 +11,114 @@ * $Id$ */ -require_once('../functions/imap.php'); -require_once('../functions/date.php'); -require_once('../functions/array.php'); -require_once('../functions/mailbox_display.php'); -require_once('../functions/mime.php'); +require_once(SM_PATH . 'functions/imap.php'); +require_once(SM_PATH . 'functions/date.php'); +require_once(SM_PATH . 'functions/mailbox_display.php'); +require_once(SM_PATH . 'functions/mime.php'); -function sqimap_search($imapConnection,$search_where,$search_what,$mailbox,$color, $search_position = '', $search_all, $count_all) { +function sqimap_search($imapConnection, $search_where, $search_what, $mailbox, + $color, $search_position = '', $search_all, $count_all) { - global $msgs, $message_highlight_list, $squirrelmail_language, $languages, $index_order; - global $pos; + global $message_highlight_list, $squirrelmail_language, $languages, + $index_order, $pos, $allow_charset_search, $uid_support, + $imap_server_type; $pos = $search_position; $urlMailbox = urlencode($mailbox); - /* Construct the Search QuERY */ - -# account for multiple search terms - - $multi_search = array (); - $search_what = ereg_replace("[ ]{2,}", ' ', $search_what); - $multi_search = split (' ', $search_what); - if (count($multi_search)==1) { - $search_string = $search_where . ' ' . '"' . $multi_search[0] . '"'; + /* construct the search query, taking multiple search terms into account */ + $multi_search = array(); + $search_what = trim($search_what); + $search_what = ereg_replace('[ ]{2,}', ' ', $search_what); + $multi_search = explode(' ', $search_what); + $search_string = ''; + + /* it seems macosx does not support the prefered search + syntax so we fall back to the older style. This IMAP + server has a problem with multiple search terms. Instead + of returning the messages that match all the terms it + returns the messages that match each term. Could be fixed + on the client side, but should be fixed on the server + as per the RFC */ + + if ($imap_server_type == 'macosx') { + foreach ($multi_search as $multi_search_part) { + if (strtoupper($languages[$squirrelmail_language]['CHARSET']) == 'ISO-2022-JP') { + $multi_search_part = mb_convert_encoding($multi_search_part, 'JIS', 'auto'); + } + $search_string .= $search_where . ' ' .$multi_search_part . ' '; } - else { - $search_string = ''; - $count = count($multi_search); - for ($x=0;$x<$count;$x++) { - $search_string = $search_string . ' ' . $search_where . " " . '"' . $multi_search[$x] . '" '; - } + } + else { + foreach ($multi_search as $multi_search_part) { + if (strtoupper($languages[$squirrelmail_language]['CHARSET']) == 'ISO-2022-JP') { + $multi_search_part = mb_convert_encoding($multi_search_part, 'JIS', 'auto'); + } + $search_string .= $search_where . ' {' . strlen($multi_search_part) + . "}\r\n" . $multi_search_part . ' '; } - $search_string = trim($search_string); + } -# now use $search_string in the imap search + $search_string = trim($search_string); - if (isset($languages[$squirrelmail_language]['CHARSET']) && + /* now use $search_string in the imap search */ + if ($allow_charset_search && isset($languages[$squirrelmail_language]['CHARSET']) && $languages[$squirrelmail_language]['CHARSET']) { - $ss = "SEARCH CHARSET ".$languages[$squirrelmail_language]['CHARSET']." ALL $search_string"; + $ss = "SEARCH CHARSET " + . strtoupper($languages[$squirrelmail_language]['CHARSET']) + . " ALL $search_string"; } else { - $ss .= "SEARCH ALL $search_string\""; + $ss = "SEARCH ALL $search_string"; } - /* Read Data Back From IMAP */ - $readin = sqimap_run_command ($imapConnection, $ss, true, $result, $message); - if (isset($languages[$squirrelmail_language]['CHARSET']) && strtolower($result) == 'no') { - // $ss = "SEARCH CHARSET \"US-ASCII\" ALL $search_where \"$search_what\""; + /* read data back from IMAP */ + $readin = sqimap_run_command($imapConnection, $ss, false, $result, $message, $uid_support); + + /* try US-ASCII charset if search fails */ + if (isset($languages[$squirrelmail_language]['CHARSET']) + && strtolower($result) == 'no') { $ss = "SEARCH CHARSET \"US-ASCII\" ALL $search_string"; - $readin = sqimap_run_command ($imapConnection, $ss, true, $result, $message); + $readin = sqimap_run_command ($imapConnection, $ss, true, + $result, $message); } - unset($messagelist); $msgs=""; $c = 0; - - /* Keep going till we find the SEARCH responce */ - while ($c < count( $readin )) { - - /* Check to see if a SEARCH Responce was recived */ - if (substr($readin[$c],0,9) == "* SEARCH ") - $messagelist = explode(" ",substr($readin[$c],9)); - else if (isset($errors)) - $errors = $errors.$readin[$c]; - else - $errors = $readin[$c]; - $c++; + unset($messagelist); + + /* Keep going till we find the SEARCH response */ + foreach ($readin as $readin_part) { + /* Check to see if a SEARCH response was received */ + if (substr($readin_part, 0, 9) == '* SEARCH ') { + $messagelist = preg_split("/ /", substr($readin_part, 9)); + } else if (isset($errors)) { + $errors = $errors.$readin_part; + } else { + $errors = $readin_part; + } } /* If nothing is found * SEARCH should be the first error else echo errors */ - if (isset($errors) && strstr($errors,"* SEARCH")) { - if ($search_all != "all") { - echo '
' . _("No Messages Found") . '
'; - return; - } - else { - return; - } - } -// else if ($search_all == 'all') { -// return; -// } - else if (isset($errors)) { - echo ""; + if (isset($errors)) { + if (strstr($errors,'* SEARCH')) { + return array(); + } + echo ''; } - /* - HACKED CODED FROM ANOTHER FUNCTION, Could Probably dump this and mondify - exsitising code with a search true/false varible. - */ global $sent_folder; - for ($q = 0; $q < count($messagelist); $q++) { + + $cnt = count($messagelist); + for ($q = 0; $q < $cnt; $q++) { $id[$q] = trim($messagelist[$q]); } $issent = ($mailbox == $sent_folder); - $hdr_list = sqimap_get_small_header_list($imapConnection, $id, $issent); - $flags = sqimap_get_flags_list($imapConnection, $id, $issent); - foreach ($hdr_list as $hdr) { - $from[] = $hdr->from; - $date[] = $hdr->date; - $subject[] = $hdr->subject; - $to[] = $hdr->to; - $priority[] = $hdr->priority; - $cc[] = $hdr->cc; - $size[] = $hdr->size; - $type[] = $hdr->type0; - } - $j = 0; - while ($j < count($messagelist)) { - $date[$j] = str_replace(' ', ' ', $date[$j]); - $tmpdate = explode(" ", trim($date[$j])); - - $messages[$j]["TIME_STAMP"] = getTimeStamp($tmpdate); - $messages[$j]["DATE_STRING"] = getDateString($messages[$j]["TIME_STAMP"]); - $messages[$j]["ID"] = $id[$j]; - $messages[$j]["FROM"] = decodeHeader($from[$j]); - $messages[$j]["FROM-SORT"] = strtolower(sqimap_find_displayable_name(decodeHeader($from[$j]))); - $messages[$j]["SUBJECT"] = decodeHeader($subject[$j]); - $messages[$j]["SUBJECT-SORT"] = strtolower(decodeHeader($subject[$j])); - $messages[$j]["TO"] = decodeHeader($to[$j]); - $messages[$j]["PRIORITY"] = $priority[$j]; - $messages[$j]["CC"] = $cc[$j]; - $messages[$j]["SIZE"] = $size[$j]; - $messages[$j]["TYPE0"] = $type[$j]; - - $num = 0; - while ($num < count($flags[$j])) { - if ($flags[$j][$num] == 'Deleted') { - $messages[$j]['FLAG_DELETED'] = true; - } else if ($flags[$j][$num] == 'Answered') { - $messages[$j]['FLAG_ANSWERED'] = true; - } else if ($flags[$j][$num] == 'Seen') { - $messages[$j]['FLAG_SEEN'] = true; - } else if ($flags[$j][$num] == 'Flagged') { - $messages[$j]['FLAG_FLAGGED'] = true; - } - $num++; - } - $j++; - } + $msgs = fillMessageArray($imapConnection,$id,$cnt); - /* Find and remove the ones that are deleted */ - $i = 0; - $j = 0; - while ($j < count($messagelist)) { - if (isset($messages[$j]["FLAG_DELETED"]) && $messages[$j]["FLAG_DELETED"] == true) { - $j++; - continue; - } - $msgs[$i] = $messages[$j]; - - $i++; - $j++; - } - $numMessages = $i; + return $msgs; +} - /* There's gotta be messages in the array for it to sort them. */ - if (count($messagelist) > 0) { - $j=0; - if (!isset ($msg)) { - $msg = ''; - } - if ($search_all != 'all') { - mail_message_listing_beginning( $imapConnection, - "move_messages.php?msg=$msg&mailbox=$urlMailbox&pos=$pos&where=" . urlencode($search_where) . "&what=".urlencode($search_what), - $mailbox, - -1, - '' . _("Found") . ' ' . count($messagelist) . ' ' . _("messages") . ''. - get_selectall_link($start_msg, $sort)); - } - else { - mail_message_listing_beginning( $imapConnection, - "move_messages.php?msg=$msg&mailbox=$urlMailbox&pos=$pos&where=" . urlencode($search_where) . "&what=".urlencode($search_what), - $mailbox, - -1, - '' . _("Found") . ' ' . count($messagelist) . ' ' . _("messages") . ''); - } - echo "
$mailbox
"; - while ($j < count($msgs)) { - printMessageInfo($imapConnection, $msgs[$j]["ID"], 0, $j, $mailbox, '', 0, $search_where, $search_what); - $j++; - echo ''; - } - echo ''; - $count_all += count($msgs); - } - return $count_all; -} ?>