X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Fimap_messages.php;h=cdcb1c208b4caa8bbb2c86e67b9e88c89a1fbb59;hp=709668b1fd14e177213bec6c6f95abda5b277535;hb=2714d4ff9d44c2f27e413f49062247dc25558877;hpb=76f29d495ddfa552201acdeb8ab341160b3f1513 diff --git a/functions/imap_messages.php b/functions/imap_messages.php index 709668b1..cdcb1c20 100755 --- a/functions/imap_messages.php +++ b/functions/imap_messages.php @@ -137,7 +137,7 @@ function sqimap_message_list_squisher($messages_array) { * @param bool $reverse Reverse order search * @return array $id sorted uid list */ -function sqimap_get_sort_order ($imap_stream, $sSortField = 'UID',$reverse) { +function sqimap_get_sort_order ($imap_stream, $sSortField,$reverse) { global $default_charset, $sent_folder; @@ -145,20 +145,6 @@ function sqimap_get_sort_order ($imap_stream, $sSortField = 'UID',$reverse) { $sort_test = array(); $sort_query = ''; - if ($sSortField == 'UID') { - $query = "SEARCH UID 1:*"; - $uids = sqimap_run_command ($imap_stream, $query, true, $response, $message, true); - if (isset($uids[0])) { - if (preg_match("/^\* SEARCH (.+)$/", $uids[0], $regs)) { - $id = preg_split("/ /", trim($regs[1])); - } - } - if (!preg_match("/OK/", $response)) { - $id = false; - } - $id = array_reverse($id); - return $id; - } if ($sSortField) { if ($reverse) { $sSortField = 'REVERSE '.$sSortField; @@ -190,26 +176,14 @@ function sqimap_get_sort_order ($imap_stream, $sSortField = 'UID',$reverse) { * @return array $aUid sorted uid list */ function get_squirrel_sort ($imap_stream, $sSortField, $reverse = false) { - - if ($sSortField == 'UID') { - // FIX ME: this is not needed. Try to find another way to solve this - $query = "SEARCH UID 1:*"; - $uids = sqimap_run_command ($imap_stream, $query, true, $response, $message, true); - if (isset($uids[0])) { - if (preg_match("/^\* SEARCH (.+)$/", $uids[0], $regs)) { - $msgs = preg_split("/ /", trim($regs[1])); - } - } - if (!preg_match("/OK/", $response)) { - $msgs = false; - } - } else if ($sSortField != 'RFC822.SIZE' && $sSortField != 'INTERNALDATE') { + if ($sSortField != 'RFC822.SIZE' && $sSortField != 'INTERNALDATE') { $msgs = sqimap_get_small_header_list($imap_stream, false, '*', - array($sSortField), array('UID')); + array($sSortField), array()); } else { $msgs = sqimap_get_small_header_list($imap_stream, false, '*', - array(), array('UID', $sSortField)); + array(), array($sSortField)); } + $aUid = array(); $walk = false; switch ($sSortField) { // natcasesort section @@ -239,7 +213,7 @@ function get_squirrel_sort ($imap_stream, $sSortField, $reverse = false) { natcasesort($aUid); $aUid = array_keys($aUid); if ($reverse) { - array_reverse($aUid); + $aUid = array_reverse($aUid); } break; // \natcasesort section @@ -254,8 +228,13 @@ function get_squirrel_sort ($imap_stream, $sSortField, $reverse = false) { } // nobreak; case 'RFC822.SIZE': + if(!$walk) { + // redefine $sSortField to maintain the same namespace between + // server-side sorting and squirrelmail sorting + $sSortField = 'SIZE'; + } foreach ($msgs as $item) { - $aUid[$item['ID']] = isset($item['SIZE']) ? $item['SIZE'] : 0; + $aUid[$item['ID']] = (isset($item[$sSortField])) ? $item[$sSortField] : 0; } if ($reverse) { arsort($aUid,SORT_NUMERIC); @@ -550,14 +529,17 @@ function parseArray($read,&$i) { function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, $aHeaderFields = array('Date', 'To', 'Cc', 'From', 'Subject', 'X-Priority', 'Content-Type'), - $aFetchItems = array('FLAGS', 'UID', 'RFC822.SIZE', 'INTERNALDATE')) { - - global $squirrelmail_language, $color, $data_dir, $username, $imap_server_type; - global $allow_server_sort; + $aFetchItems = array('FLAGS', 'RFC822.SIZE', 'INTERNALDATE')) { $messages = array(); $read_list = array(); + if (array_search('UID',$aFetchItems,true) !== false) { + $bUidFetch = false; + } else { + $bUidFetch = true; + } + /* Get the small headers for each message in $msg_list */ if ($show_num != '999999' && $show_num != '*' ) { $msgs_str = sqimap_message_list_squisher($msg_list); @@ -566,8 +548,10 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, * in $msg_list, but IMAP servers are free to return responses in * whatever order they wish... So we need to re-sort manually */ - for ($i = 0; $i < sizeof($msg_list); $i++) { - $messages["$msg_list[$i]"] = array(); + if ($bUidFetch) { + for ($i = 0; $i < sizeof($msg_list); $i++) { + $messages["$msg_list[$i]"] = array(); + } } } else { $msgs_str = '1:*'; @@ -579,10 +563,6 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, * Create the query */ - $internaldate = getPref($data_dir, $username, 'internal_date_sort'); - if (($i = array_search('INTERNALDATE',$aFetchItems,true)) !== false && $internaldate == false) { - unset($aFetchItems[$i]); - } $sFetchItems = ''; $query = "FETCH $msgs_str ("; if (count($aFetchItems)) { @@ -593,7 +573,8 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, $sFetchItems .= ' BODY.PEEK[HEADER.FIELDS ('.$sHeaderFields.')]'; } $query .= trim($sFetchItems) . ')'; - $read_list = sqimap_run_command_list ($imap_stream, $query, true, $response, $message, TRUE); + + $read_list = sqimap_run_command_list ($imap_stream, $query, true, $response, $message, $bUidFetch); $i = 0; foreach ($read_list as $r) { @@ -609,13 +590,8 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, $id = substr($read,2,$i_space-2); $fetch = substr($read,$i_space+1,5); if (!is_numeric($id) && $fetch !== 'FETCH') { - set_up_language($squirrelmail_language); - echo '
' . - _("ERROR : Could not complete request.") . - '
' . - _("Unknown response from IMAP server: ") . ' 1.' . - htmlspecialchars($read) . "

\n"; - break; + $msg['ERROR'] = $read; // htmlspecialchars should be done just before display. this is backend code + break; } $i = strpos($read,'(',$i_space+5); $read = substr($read,$i+1); @@ -664,9 +640,15 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, break 3; } + break; + case 'ENVELOPE': + break; // to be implemented, moving imap code out of the nessages class + sqimap_parse_address($read,$i,$msg); + break; // to be implemented, moving imap code out of the nessages class + case 'BODYSTRUCTURE': break; case 'INTERNALDATE': - $msg['INTERNALDATE'] = parseString($read,$i); + $msg['INTERNALDATE'] = str_replace(' ', ' ',parseString($read,$i)); break; case 'BODY.PEEK[HEADER.FIELDS': case 'BODY[HEADER.FIELDS': @@ -678,6 +660,7 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, /* Now we can make a new header array with */ /* each element representing a headerline */ $hdr = explode("\n" , $hdr); + $aReceived = array(); foreach ($hdr as $line) { $pos = strpos($line, ':'); if ($pos > 0) { @@ -705,11 +688,17 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, $msg['TYPE1'] = 'plain'; } break; + case 'received': + $aReceived[] = $value; + break; default: break; } } } } + if (count($aReceived)) { + $msg['RECEIVED'] = $aReceived; + } break; default: ++$i; @@ -726,6 +715,113 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, return $messages; } +function sqimap_parse_envelope($read, &$i, &$msg) { + $arg_no = 0; + $arg_a = array(); + ++$i; + for ($cnt = strlen($read); ($i < $cnt) && ($read{$i} != ')'); ++$i) { + $char = strtoupper($read{$i}); + switch ($char) { + case '{': + case '"': + $arg_a[] = parseString($read,$i); + ++$arg_no; + break; + case 'N': + /* probably NIL argument */ + if (strtoupper(substr($read, $i, 3)) == 'NIL') { + $arg_a[] = ''; + ++$arg_no; + $i += 2; + } + break; + case '(': + /* Address structure (with group support) + * Note: Group support is useless on SMTP connections + * because the protocol doesn't support it + */ + $addr_a = array(); + $group = ''; + $a=0; + for (; $i < $cnt && $read{$i} != ')'; ++$i) { + if ($read{$i} == '(') { + $addr = sqimap_parse_address($read, $i); + if (($addr[3] == '') && ($addr[2] != '')) { + /* start of group */ + $group = $addr[2]; + $group_addr = $addr; + $j = $a; + } else if ($group && ($addr[3] == '') && ($addr[2] == '')) { + /* end group */ + if ($a == ($j+1)) { /* no group members */ + $group_addr[4] = $group; + $group_addr[2] = ''; + $group_addr[0] = "$group: Undisclosed recipients;"; + $addr_a[] = $group_addr; + $group =''; + } + } else { + $addr[4] = $group; + $addr_a[] = $addr; + } + ++$a; + } + } + $arg_a[] = $addr_a; + break; + default: break; + } + } + + if (count($arg_a) > 9) { + $d = strtr($arg_a[0], array(' ' => ' ')); + $d = explode(' ', $d); + if (!$arg_a[1]) $arg_1[1] = ''; + $msg['DATE'] = $d; /* argument 1: date */ + $msg['SUBJECT'] = $arg_a[1]; /* argument 2: subject */ + $msg['FROM'] = is_array($arg_a[2]) ? $arg_a[2][0] : ''; /* argument 3: from */ + $msg['SENDER'] = is_array($arg_a[3]) ? $arg_a[3][0] : ''; /* argument 4: sender */ + $msg['REPLY-TO'] = is_array($arg_a[4]) ? $arg_a[4][0] : ''; /* argument 5: reply-to */ + $msg['TO'] = $arg_a[5]; /* argument 6: to */ + $msg['CC'] = $arg_a[6]; /* argument 7: cc */ + $msg['BCC'] = $arg_a[7]; /* argument 8: bcc */ + $msg['IN-REPLY-TO'] = $arg_a[8]; /* argument 9: in-reply-to */ + $msg['MESSAGE-ID'] = $arg_a[9]; /* argument 10: message-id */ + } +} + +function sqimap_parse_address($read, &$i) { + $arg_a = array(); + for (; $read{$i} != ')'; ++$i) { + $char = strtoupper($read{$i}); + switch ($char) { + case '{': + case '"': $arg_a[] = parseString($read,$i); break; + case 'n': + case 'N': + if (strtoupper(substr($read, $i, 3)) == 'NIL') { + $arg_a[] = ''; + $i += 2; + } + break; + default: break; + } + } + + if (count($arg_a) == 4) { + return $arg_a; + +// $adr = new AddressStructure(); +// $adr->personal = $arg_a[0]; +// $adr->adl = $arg_a[1]; +// $adr->mailbox = $arg_a[2]; +// $adr->host = $arg_a[3]; + } else { + $adr = ''; + } + return $adr; +} + /** * Returns a message array with all the information about a message. * See the documentation folder for more information about this array.