* eMail/egw-pear: fixed problem with unexpected (but valid) multiline response for STATUS commands

This commit is contained in:
Klaus Leithoff 2013-03-04 08:03:52 +00:00
parent e8961f6fd4
commit f50768ec0b

View File

@ -28,7 +28,7 @@ require_once 'Net/Socket.php';
*/
class Net_IMAPProtocol {
/**
* The auth methods this class support
* @var array
@ -72,7 +72,7 @@ class Net_IMAPProtocol {
/**
* The options for SSL/TLS connection
* The options for SSL/TLS connection
* (see documentation for stream_context_create)
* @var array
*/
@ -260,7 +260,7 @@ class Net_IMAPProtocol {
* Sets printed output of errors on or of
*
* @param boolean true or false
*
*
* @return nothing
* @access public
* @since 1.1
@ -406,7 +406,7 @@ class Net_IMAPProtocol {
}
/**
* set the options for a SSL/TLS connection
* set the options for a SSL/TLS connection
* (see documentation for stream_context_create)
*
* @param array $options the options for the SSL/TLS connection
@ -1112,7 +1112,7 @@ class Net_IMAPProtocol {
* Send the STATUS Mailbox Command
*
* @param string $mailbox the mailbox name
* @param mixed $request the request status
* @param mixed $request the request status
* it could be an array or space separated string of
* MESSAGES | RECENT | UIDNEXT
* UIDVALIDITY | UNSEEN
@ -1138,7 +1138,7 @@ class Net_IMAPProtocol {
$this->_prot_error("request '$status_data' is invalid! see RFC 3501!!!!" , __LINE__ , __FILE__);
}
}
// back to space separated string
$request = implode(' ', $request);
@ -1147,7 +1147,7 @@ class Net_IMAPProtocol {
if (!PEAR::isError($ret) && isset($ret['PARSED'])) {
foreach ($ret['PARSED'] as &$parsed)
{
if (!empty($parsed['EXT']))
if (!empty($parsed['EXT']) && $parsed['COMMAND']=='STATUS')
{
if(empty($ret['RESPONSE']['CODE'])) $ret['RESPONSE']['CODE'] ='OK';
$ret['PARSED'] = $parsed['EXT'];
@ -1337,7 +1337,7 @@ class Net_IMAPProtocol {
*/
function cmdSort($sort_cmd)
{
/*
/*
if ($_charset != '' )
$_charset = "[$_charset] ";
$param = sprintf("%s%s",$charset,$search_cmd);
@ -1764,7 +1764,7 @@ class Net_IMAPProtocol {
return new PEAR_Error("This IMAP server does not support ACL's! ");
}
$mailbox_name=$this->_createQuotedString($mailbox_name);
return $this->_genericCommand('DELETEACL', sprintf("%s \"%s\"",$mailbox_name,$user) );
}
@ -2072,7 +2072,7 @@ class Net_IMAPProtocol {
function _createQuotedString($mailbox)
function _createQuotedString($mailbox)
{
$search = array('\\', '"');
$replace = array('\\\\', '\\"');
@ -2422,14 +2422,14 @@ class Net_IMAPProtocol {
#error_log(__METHOD__. $len . "#".$str."\n");
$startingpos = $pos;
if ($str[$pos] !== '"') return false; // start condition failed
$pos++;
$pos++;
$delimCount=0;
while($str[$pos] !== '"' && $pos < $len) {
// this is a fix to stop before the delimiter, in broken string messages containing an odd number of double quotes
// the idea is to check for a stopDelimited followed by eiter a new startDelimiter or an other stopDelimiter
// that allows to have something like '"Name (Nick)" <email>' containing one delimiter
// if you have something like "Name ((something))" we must count the delimiters (and hope that they are not unbalanced too)
// and check if we have a negative amount of delimiters or no delimiters to meet the stop condition, before we run into a closing double quote
// and check if we have a negative amount of delimiters or no delimiters to meet the stop condition, before we run into a closing double quote
if ($str[$pos] === $startDelim) $delimCount++;
if ($str[$pos] === $stopDelim) $delimCount--;
if ($str[$pos] === $stopDelim && ($str[$pos+1] === $startDelim || ($str[$pos+1] === $stopDelim && $delimCount<=0))) {
@ -2898,7 +2898,7 @@ class Net_IMAPProtocol {
$expused = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ );
$expmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ );
return array(); //throw away this information as this info seems quite useless
break;
break;
case "FETCH" :
$this->_parseSpace( $str ,__LINE__ ,__FILE__ );
// Get the parsed pathenthesis
@ -2917,7 +2917,7 @@ class Net_IMAPProtocol {
$this->_parseSpace( $str , __LINE__ , __FILE__ );
$this->_getNextToken($str , $shared, false);
$struct_arr['NAMESPACES']['shared'] = $this->_arrayfy_content($shared);
return array($token=>$struct_arr);
break;
case "CAPABILITY" :
@ -3065,7 +3065,7 @@ class Net_IMAPProtocol {
//$str = " INBOX\r\nA0006 OK Completed\r\n";
$this->_parseSpace($str, __LINE__, __FILE__);
$this->_getNextToken($str, $mailbox);
$arr = array();
while (substr($str, 0, 2) != "\r\n") {
$this->_parseSpace($str, __LINE__, __FILE__);
@ -3202,7 +3202,7 @@ class Net_IMAPProtocol {
// I get the command
$this->_getNextToken($str, $command);
if (($ext_arr = $this->_retrParsedResponse($str, $command, $msg_nro)) == false) {
// if this bogus response cis a FLAGS () or EXPUNGE response
// the ignore it
@ -3298,7 +3298,7 @@ class Net_IMAPProtocol {
if(function_exists('mb_convert_encoding')) {
return mb_convert_encoding($str, "UTF7-IMAP", "ISO-8859-1");
}
$encoded_utf7 = '';
$base64_part = '';
if(is_array($str)){
@ -3432,8 +3432,8 @@ class Net_IMAPProtocol {
}
return true;
}
function _getLineLength($string)
function _getLineLength($string)
{
if (extension_loaded('mbstring')) {
return mb_strlen($string,'latin1');
@ -3442,7 +3442,7 @@ class Net_IMAPProtocol {
}
}
function _getSubstr($string, $start, $length = false)
function _getSubstr($string, $start, $length = false)
{
if (extension_loaded('mbstring')) {
if($length !== false) {