From 11ef977d13ce87390074591b1dded0796ffeefcd Mon Sep 17 00:00:00 2001 From: alecpl Date: Tue, 2 Sep 2008 12:29:31 +0000 Subject: - fixed and re-enabled (RFC3501 [7.1]) CAPABILITY optional response use --- program/lib/imap.inc | 81 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 33 deletions(-) (limited to 'program/lib/imap.inc') diff --git a/program/lib/imap.inc b/program/lib/imap.inc index 7f2315671..9402dfb4f 100644 --- a/program/lib/imap.inc +++ b/program/lib/imap.inc @@ -52,8 +52,6 @@ - $ICL_SSL is not boolean anymore but contains the connection schema (ssl or tls) - Removed some debuggers (echo ...) File altered by Aleksander Machniak - - RFC3501 [7.1] don't call CAPABILITY if was returned in server - optional resposne in iil_Connect() - trim(chop()) replaced by trim() - added iil_Escape() with support for " and \ in folder names - support \ character in username in iil_C_Login() @@ -64,6 +62,8 @@ - code cleanup and identation fixes - removed flush() calls in iil_C_HandlePartBody() to prevent from memory leak (#1485187) - don't return "??" from iil_C_GetQuota() + - RFC3501 [7.1] don't call CAPABILITY if was returned in server + optional resposne in iil_Connect(), added iil_C_GetCapability() ********************************************************/ @@ -126,6 +126,7 @@ class iilConnection var $delimiter; var $capability = array(); var $permanentflags = array(); + var $capability_readed = false; } /** @@ -294,6 +295,40 @@ function iil_Escape($string) return strtr($string, array('"'=>'\\"', '\\' => '\\\\')); } +function iil_C_GetCapability(&$conn, $name) +{ + if (in_array($name, $conn->capability)) { + return $conn->capability[$name]; + } + else if ($conn->capability_readed) { + return false; + } + + // get capabilities (only once) because initial + // optional CAPABILITY response may differ + $conn->capability = array(); + + iil_PutLine($conn->fp, "cp01 CAPABILITY"); + do { + $line = trim(iil_ReadLine($conn->fp, 1024)); + $a = explode(' ', $line); + if ($line[0] == '*') { + while (list($k, $w) = each($a)) { + if ($w != '*' && $w != 'CAPABILITY') + $conn->capability[] = strtoupper($w); + } + } + } while ($a[0] != 'cp01'); + + $conn->capability_readed = true; + + if (in_array($name, $conn->capability)) { + return $conn->capability[$name]; + } + + return false; +} + function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) { $ipad = ''; @@ -398,7 +433,7 @@ function iil_ParseNamespace2($str, &$i, $len=0, $l) { function iil_C_NameSpace(&$conn) { global $my_prefs; - if (!in_array('NAMESPACE', $conn->capability)) { + if (!iil_C_GetCapability($conn, 'NAMESPACE')) { return false; } @@ -516,39 +551,19 @@ function iil_Connect($host, $user, $password) { $line = iil_ReadLine($conn->fp, 1024); // RFC3501 [7.1] optional CAPABILITY response - // commented out, because it's not working always as should -// if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) { -// $conn->capability = explode(' ', $matches[1]); -// } else { - iil_PutLine($conn->fp, "cp01 CAPABILITY"); - do { - $line = trim(iil_ReadLine($conn->fp, 1024)); - - $conn->message .= "$line\n"; - - $a = explode(' ', $line); - if ($line[0] == '*') { - while (list($k, $w) = each($a)) { - if ($w != '*' && $w != 'CAPABILITY') - $conn->capability[] = $w; - } - } - } while ($a[0] != 'cp01'); -// } + if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) { + $conn->capability = explode(' ', strtoupper($matches[1])); + } if (strcasecmp($auth_method, "check") == 0) { //check for supported auth methods - - //default to plain text auth - $auth_method = 'plain'; - - //check for CRAM-MD5 - foreach ($conn->capability as $c) - if (strcasecmp($c, 'AUTH=CRAM_MD5') == 0 || - strcasecmp($c, 'AUTH=CRAM-MD5') == 0) { - $auth_method = 'auth'; - break; - } + if (iil_C_GetCapability($conn, 'AUTH=CRAM-MD5') || iil_C_GetCapability($conn, 'AUTH=CRAM_MD5')) { + $auth_method = 'auth'; + } + else { + //default to plain text auth + $auth_method = 'plain'; + } } if (strcasecmp($auth_method, 'auth') == 0) { -- cgit v1.2.3