X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Fimap_messages.php;h=05fc99d74f3e0278c1d24ba526569d6649cafd89;hp=b4c62084f841376c4528462398419c5cd9f601f5;hb=4ae9beb7abe3443809f17e80bf10399bf21c430c;hpb=628dba17ca643fd316ab6f1a1800ce8cc300f3fd diff --git a/functions/imap_messages.php b/functions/imap_messages.php index b4c62084..05fc99d7 100755 --- a/functions/imap_messages.php +++ b/functions/imap_messages.php @@ -6,7 +6,7 @@ * This implements functions that manipulate messages * NOTE: Quite a few functions in this file are obsolete * - * @copyright © 1999-2005 The SquirrelMail Project Team + * @copyright © 1999-2006 The SquirrelMail Project Team * @license http://opensource.org/licenses/gpl-license.php GNU Public License * @version $Id$ * @package squirrelmail @@ -39,9 +39,14 @@ function sqimap_msgs_list_copy($imap_stream, $id, $mailbox, $handle_errors = tru * @param string $id The list of messages to move * @param string $mailbox The destination to move to * @param bool $handle_errors Show error messages in case of a NO, BAD or BYE response + * @param string $source_mailbox (since 1.5.1) name of source mailbox. It is used to + * validate that target mailbox != source mailbox. * @return bool If the move completed without errors */ -function sqimap_msgs_list_move($imap_stream, $id, $mailbox, $handle_errors = true) { +function sqimap_msgs_list_move($imap_stream, $id, $mailbox, $handle_errors = true, $source_mailbox = false) { + if ($source_mailbox!==false && $source_mailbox==$mailbox) { + return false; + } $msgs_id = sqimap_message_list_squisher($id); if (sqimap_msgs_list_copy ($imap_stream, $id, $mailbox, $handle_errors)) { return sqimap_toggle_flag($imap_stream, $id, '\\Deleted', true, true); @@ -157,11 +162,20 @@ function sqimap_get_sort_order($imap_stream, $sSortField, $reverse, $search='ALL } $query = "SORT ($sSortField) ".strtoupper($default_charset)." $search"; // FIX ME sqimap_run_command should return the parsed data accessible by $aDATA['SORT'] - $aData = sqimap_run_command ($imap_stream, $query, false, $response, $message, TRUE); + // use sqimap_run_command_list in case of unsollicited responses. If we don't we could loose the SORT response + $aData = sqimap_run_command_list ($imap_stream, $query, false, $response, $message, TRUE); /* fallback to default charset */ - if ($response == 'NO' && strpos($message,'[BADCHARSET]') !== false) { - $query = "SORT ($sSortField) US-ASCII $search"; - $aData = sqimap_run_command ($imap_stream, $query, true, $response, $message, TRUE); + if ($response == 'NO') { + if (strpos($message,'[BADCHARSET]') !== false || + strpos($message,'Unrecognized character set') !== false) { + sqm_trigger_imap_error('SQM_IMAP_BADCHARSET',$query, $response, $message); + $query = "SORT ($sSortField) US-ASCII $search"; + $aData = sqimap_run_command_list ($imap_stream, $query, true, $response, $message, TRUE); + } else { + sqm_trigger_imap_error('SQM_IMAP_ERROR',$query, $response, $message); + } + } else if ($response == 'BAD') { + sqm_trigger_imap_error('SQM_IMAP_NO_SORT',$query, $response, $message); } } @@ -175,7 +189,7 @@ function sqimap_get_sort_order($imap_stream, $sSortField, $reverse, $search='ALL /** * Parses a UID list returned on a SORT or SEARCH request - * @param array $aData imap response + * @param array $aData imap response (retrieved from sqimap_run_command_list) * @param string $sCommand issued imap command (SEARCH or SORT) * @return array $aUid uid list */ @@ -183,8 +197,10 @@ function parseUidList($aData,$sCommand) { $aUid = array(); if (isset($aData) && count($aData)) { for ($i=0,$iCnt=count($aData);$i<$iCnt;++$i) { - if (preg_match("/^\* $sCommand (.+)$/", $aData[$i], $aMatch)) { - $aUid += preg_split("/ /", trim($aMatch[1])); + for ($j=0,$jCnt=count($aData[$i]);$j<$jCnt;++$j) { + if (preg_match("/^\* $sCommand (.+)$/", $aData[$i][$j], $aMatch)) { + $aUid += preg_split("/ /", trim($aMatch[1])); + } } } } @@ -419,11 +435,21 @@ function get_thread_sort($imap_stream, $search='ALL') { } $query = "THREAD $sort_type ".strtoupper($default_charset)." $search"; + // TODO use sqimap_run_command_list as we do in get_server_sort() $thread_test = sqimap_run_command ($imap_stream, $query, false, $response, $message, TRUE); /* fallback to default charset */ - if ($response == 'NO' && strpos($message,'[BADCHARSET]') !== false) { - $query = "THREAD $sort_type US-ASCII $search"; - $thread_test = sqimap_run_command ($imap_stream, $query, true, $response, $message, TRUE); + + if ($response == 'NO') { + if (strpos($message,'[BADCHARSET]') !== false || + strpos($message,'Unrecognized character set') !== false) { + sqm_trigger_imap_error('SQM_IMAP_BADCHARSET',$query, $response, $message); + $query = "THREAD $sort_type US-ASCII $search"; + $thread_test = sqimap_run_command ($imap_stream, $query, true, $response, $message, TRUE); + } else { + sqm_trigger_imap_error('SQM_IMAP_ERROR',$query, $response, $message); + } + } elseif ($response == 'BAD') { + sqm_trigger_imap_error('SQM_IMAP_NO_THREAD',$query, $response, $message); } if (isset($thread_test[0])) { for ($i=0,$iCnt=count($thread_test);$i<$iCnt;++$i) { @@ -436,7 +462,7 @@ function get_thread_sort($imap_stream, $search='ALL') { $thread_list = ""; } if (!preg_match("/OK/", $response)) { - $server_sort_array = 'no'; + $server_sort_array = false; return $server_sort_array; } if (isset($thread_list)) {