X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fimap_general.php;h=0e11590c37f27238a3178778cdeca6af48d05abe;hb=3fedd15bc50274624eb61e63e0ec707ce09a0c22;hp=5e755b5d2ada1399555777cfafab99d2f12da6d3;hpb=2bd6b4612611df59180e1fb7d8fcb7ddf63c96c8;p=squirrelmail.git diff --git a/functions/imap_general.php b/functions/imap_general.php index 5e755b5d..0e11590c 100755 --- a/functions/imap_general.php +++ b/functions/imap_general.php @@ -3,13 +3,14 @@ /** * imap_general.php * - * Copyright (c) 1999-2003 The SquirrelMail Project Team + * Copyright (c) 1999-2004 The SquirrelMail Project Team * Licensed under the GNU GPL. For full terms see the file COPYING. * * This implements all functions that do general imap functions. * - * $Id$ + * @version $Id$ * @package squirrelmail + * @subpackage imap */ /** Includes.. */ @@ -17,17 +18,15 @@ require_once(SM_PATH . 'functions/page_header.php'); require_once(SM_PATH . 'functions/auth.php'); -global $sqimap_session_id; -$sqimap_session_id = 1; - /** * Generates a new session ID by incrementing the last one used; * this ensures that each command has a unique ID. * @param bool unique_id * @return string IMAP session id of the form 'A000'. */ -function sqimap_session_id($unique_id = false) { - global $data_dir, $username, $sqimap_session_id; +function sqimap_session_id($unique_id = FALSE) { + static $sqimap_session_id = 1; + if (!$unique_id) { return( sprintf("A%03d", $sqimap_session_id++) ); } else { @@ -73,10 +72,15 @@ function sqimap_run_command ($imap_stream, $query, $handle_errors, &$response, $read = sqimap_read_data ($imap_stream, $tag, $handle_errors, $response, $message, $query,$filter,$outputstream,$no_return); + if (empty($read)) { //Imap server dropped its connection + $response = ''; + $message = ''; + return false; + } /* retrieve the response and the message */ $response = $response[$tag]; $message = $message[$tag]; - + if (!empty($read[$tag])) { return $read[$tag][0]; } else { @@ -202,6 +206,7 @@ function sqimap_fread($imap_stream,$iSize,$filter=false, if ($iSize < $iBufferSize) { $iBufferSize = $iSize; } + $iRetrieved = 0; $results = ''; $sRead = $sReadRem = ''; @@ -222,19 +227,10 @@ function sqimap_fread($imap_stream,$iSize,$filter=false, $sRead = $sReadRem . $sRead; $sReadRem = ''; } - if (substr($sRead,-1) !== "\n") { - $i = strrpos($sRead,"\n"); - if ($i !== false && $iRetrieved<$iSize) { - ++$i; - $sReadRem = substr($sRead,$i); - $sRead = substr($sRead,0,$i); - } else if ($iLength && $iRetrieved<$iSize) { // linelength > received buffer - $sReadRem = $sRead; - $sRead = ''; - } - } + if ($filter && $sRead) { - $filter($sRead); + // in case the filter is base64 decoding we return a remainder + $sReadRem = $filter($sRead); } if ($outputstream && $sRead) { if (is_resource($outputstream)) { @@ -252,6 +248,7 @@ function sqimap_fread($imap_stream,$iSize,$filter=false, return $results; } + /** * Obsolete function, inform plugins that use it * @deprecated use sqimap_run_command or sqimap_run_command_list instead @@ -280,11 +277,12 @@ function sqimap_read_data_list($imap_stream, $tag, $handle_errors, * Function to display an error related to an IMAP-query. * @param string title the caption of the error box * @param string query the query that went wrong - * @param string message_title - * @param string message the error message + * @param string message_title optional message title + * @param string message optional error message + * @param string $link an optional link to try again * @return void */ -function sqimap_error_box($title, $query = '', $message_title = '', $message = '') +function sqimap_error_box($title, $query = '', $message_title = '', $message = '', $link = '') { global $color, $squirrelmail_language; @@ -301,6 +299,8 @@ function sqimap_error_box($title, $query = '', $message_title = '', $message = ' if ($message != '') $string .= htmlspecialchars($message); $string .= "
\n"; + if ($link != '') + $string .= $link; error_box($string,$color); } @@ -316,6 +316,7 @@ function sqimap_retrieve_imap_response($imap_stream, $tag, $handle_errors, $read = ''; if (!is_array($message)) $message = array(); if (!is_array($response)) $response = array(); + $aResponse = ''; $resultlist = array(); $data = array(); $read = sqimap_fgets($imap_stream); @@ -469,9 +470,20 @@ function sqimap_retrieve_imap_response($imap_stream, $tag, $handle_errors, /* error processing in case $read is false */ if ($read === false) { - unset($data); - sqimap_error_box(_("ERROR : Connection dropped by imap-server."), $query); - exit; + // try to retrieve an untagged bye respons from the results + $sResponse = array_pop($data); + if ($sResponse !== NULL && strpos($sResponse,'* BYE') !== false) { + if (!$handle_errors) { + $query = ''; + } + sqimap_error_box(_("ERROR : Imap server closed the connection."), $query, _("Server responded:"),$sResponse); + echo ''; + exit; + } else if ($handle_errors) { + unset($data); + sqimap_error_box(_("ERROR : Connection dropped by imap-server."), $query); + exit; + } } /* Set $resultlist array */ @@ -485,7 +497,6 @@ function sqimap_retrieve_imap_response($imap_stream, $tag, $handle_errors, /* Return result or handle errors */ if ($handle_errors == false) { return $aResponse; - return( $resultlist ); //?? Why this? } switch ($response[$tag]) { case 'OK': @@ -557,10 +568,10 @@ function sqimap_read_data ($imap_stream, $tag_uid, $handle_errors, function sqimap_create_stream($server,$port,$tls=false) { global $username, $use_imap_tls; - if ($use_imap_tls == true) { + if ($tls == true) { if ((check_php_version(4,3)) and (extension_loaded('openssl'))) { /* Use TLS by prefixing "tls://" to the hostname */ - $server = 'tls://' . $imap_server_address; + $server = 'tls://' . $server; } else { require_once(SM_PATH . 'functions/display_messages.php'); $string = "Unable to connect to IMAP server!
TLS is enabled, but this " . @@ -764,6 +775,8 @@ function sqimap_capability($imap_stream, $capability='') { for ($i=2; $i < count($c); $i++) { $cap_list = explode('=', $c[$i]); if (isset($cap_list[1])) { + // FIX ME. capabilities can occure multiple times. + // THREAD=REFERENCES THREAD=ORDEREDSUBJECT $sqimap_capabilities[$cap_list[0]] = $cap_list[1]; } else { $sqimap_capabilities[$cap_list[0]] = TRUE; @@ -1026,27 +1039,26 @@ function parseAddress($address, $max=0) { /** * Returns the number of unseen messages in this folder. + * obsoleted by sqimap_status_messages ! */ function sqimap_unseen_messages ($imap_stream, $mailbox) { - $read_ary = sqimap_run_command ($imap_stream, 'STATUS ' . sqimap_encode_mailbox_name($mailbox) . ' (UNSEEN)', false, $result, $message); - $i = 0; - $regs = array(false, false); - while (isset($read_ary[$i])) { - if (ereg("UNSEEN ([0-9]+)", $read_ary[$i], $regs)) { - break; - } - $i++; - } - return $regs[1]; + $aStatus = sqimap_status_messages($imap_stream,$mailbox,array('UNSEEN')); + return $aStatus['UNSEEN']; } /** - * Returns the number of total/unseen/recent messages in this folder + * Returns the status items of a mailbox. + * Default it returns MESSAGES,UNSEEN and RECENT + * Supported status items are MESSAGES, UNSEEN, RECENT, UIDNEXT and UIDVALIDITY */ -function sqimap_status_messages ($imap_stream, $mailbox) { - $read_ary = sqimap_run_command ($imap_stream, 'STATUS ' . sqimap_encode_mailbox_name($mailbox) . ' (MESSAGES UNSEEN RECENT)', false, $result, $message); +function sqimap_status_messages ($imap_stream, $mailbox, + $aStatusItems = array('MESSAGES','UNSEEN','RECENT')) { + + $aStatusItems = implode(' ',$aStatusItems); + $read_ary = sqimap_run_command ($imap_stream, 'STATUS ' . sqimap_encode_mailbox_name($mailbox) . + " ($aStatusItems)", false, $result, $message); $i = 0; - $messages = $unseen = $recent = false; + $messages = $unseen = $recent = $uidnext = $uidvalidity = false; $regs = array(false,false); while (isset($read_ary[$i])) { if (preg_match('/UNSEEN\s+([0-9]+)/i', $read_ary[$i], $regs)) { @@ -1058,9 +1070,19 @@ function sqimap_status_messages ($imap_stream, $mailbox) { if (preg_match('/RECENT\s+([0-9]+)/i', $read_ary[$i], $regs)) { $recent = $regs[1]; } + if (preg_match('/UIDNEXT\s+([0-9]+)/i', $read_ary[$i], $regs)) { + $uidnext = $regs[1]; + } + if (preg_match('/UIDVALIDITY\s+([0-9]+)/i', $read_ary[$i], $regs)) { + $uidvalidity = $regs[1]; + } $i++; } - return array('MESSAGES' => $messages, 'UNSEEN'=>$unseen, 'RECENT' => $recent); + return array('MESSAGES' => $messages, + 'UNSEEN'=>$unseen, + 'RECENT' => $recent, + 'UIDNEXT' => $uidnext, + 'UIDVALIDITY' => $uidvalidity); }