summaryrefslogtreecommitdiff
path: root/program/lib
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2008-09-02 12:29:31 +0000
committeralecpl <alec@alec.pl>2008-09-02 12:29:31 +0000
commit11ef977d13ce87390074591b1dded0796ffeefcd (patch)
tree76fbb2b6c470be668a3d1b58a450a087240b9d7a /program/lib
parentade8e117dfbb62f6dbd16b4aca81dfbdbd054579 (diff)
- fixed and re-enabled (RFC3501 [7.1]) CAPABILITY optional response use
Diffstat (limited to 'program/lib')
-rw-r--r--program/lib/imap.inc81
1 files changed, 48 insertions, 33 deletions
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 <alec@alec.pl>
- - 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) {