From ca4c087f0220de1764f05f6349e3c0200228057c Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Fri, 09 May 2008 04:24:47 -0400
Subject: [PATCH] - Don't call CAPABILITY twice if possible (RFC3501 [7.1])

---
 program/lib/imap.inc |   48 +++++++++++++++++++++++++++++-------------------
 1 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/program/lib/imap.inc b/program/lib/imap.inc
index 918e71a..0d7bc6c 100644
--- a/program/lib/imap.inc
+++ b/program/lib/imap.inc
@@ -51,6 +51,9 @@
 		- Abort do-loop on socket errors (fgets returns false)
 		- $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 twice if possible in iil_Connect()
+		
 
 ********************************************************/
 
@@ -473,7 +476,27 @@
 	}
 
 	$iil_error .= "Socket connection established\r\n";
-	$line       = iil_ReadLine($conn->fp, 300);
+	$line       = iil_ReadLine($conn->fp, 1024);
+
+	// RFC3501 [7.1] optional CAPABILITY response
+	if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) {
+		$conn->capability = explode(' ', $matches[1]);
+	} else {
+		fputs($conn->fp, "cp01 CAPABILITY\r\n");
+		do {
+			$line = trim(chop(iil_ReadLine($conn->fp, 100)));
+
+			$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 (strcasecmp($auth_method, "check") == 0) {
 		//check for supported auth methods
@@ -482,25 +505,12 @@
 		$auth_method = 'plain';
 			
 		//check for CRAM-MD5
-		fputs($conn->fp, "cp01 CAPABILITY\r\n");
-		do {
-		    $line = trim(chop(iil_ReadLine($conn->fp, 100)));
-
-		    $conn->message .= "$line\n";
-
-			$a = explode(' ', $line);
-			if ($line[0] == '*') {
-				while (list($k, $w) = each($a)) {
-				    if ($w != '*' && $w != 'CAPABILITY') {
-    					$conn->capability[] = $w;
-                    }
-					if ((strcasecmp($w, "AUTH=CRAM_MD5") == 0)||
-						(strcasecmp($w, "AUTH=CRAM-MD5") == 0)) {
-					    $auth_method = "auth";
-					}
-				}
+		foreach ($conn->capability as $c)
+			if (strcasecmp($c, 'AUTH=CRAM_MD5') == 0 ||
+				strcasecmp($c, 'AUTH=CRAM-MD5') == 0) {
+				$auth_method = 'auth';
+				break;
 			}
-		} while ($a[0] != 'cp01');
 	}
 
 	if (strcasecmp($auth_method, 'auth') == 0) {

--
Gitblit v1.9.1