From a79e5f14c1097e2ea2e84a5c0ef913fd502e40ec Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 04 Feb 2010 09:34:19 -0500
Subject: [PATCH] - Fix sorting by date of messages without date header on servers without SORT (#1486286)

---
 CHANGELOG            |    1 +
 program/lib/imap.inc |   28 +++++++++++++++++++---------
 2 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 5a8d3a4..ba2f0e9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Fix sorting by date of messages without date header on servers without SORT (#1486286)
 - Fix inconsistency when not using default table names (#1486467)
 - Fix folder rename/delete buttons do not appear on creation of first folder (#1486468)
 - Fix character set conversion fails on systems where iconv doesn't accept //IGNORE (#1486375)
diff --git a/program/lib/imap.inc b/program/lib/imap.inc
index 61d49b4..7607a1c 100644
--- a/program/lib/imap.inc
+++ b/program/lib/imap.inc
@@ -951,7 +951,9 @@
 	$key     = 'fhi0';
 	$deleted = $skip_deleted ? ' FLAGS' : '';
 
-	if ($mode == 1)
+	if ($mode == 1 && $index_field == 'DATE')
+		$request = " FETCH $message_set (INTERNALDATE BODY.PEEK[HEADER.FIELDS (DATE)]$deleted)";
+	else if ($mode == 1)
 		$request = " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)]$deleted)";
 	else if ($mode == 2) {
 		if ($index_field == 'SIZE')
@@ -987,15 +989,23 @@
 				}
 			}
 
-			if ($mode == 1) {
-				if (preg_match('/BODY\[HEADER\.FIELDS \("?(DATE|FROM|REPLY-TO|SENDER|TO|SUBJECT)"?\)\] (.*)/', $line, $matches)) {
-					$value = preg_replace(array('/^"*[a-z]+:/i', '/\s+$/sm'), array('', ''), $matches[2]);
+			if ($mode == 1 && $index_field == 'DATE') {
+				if (preg_match('/BODY\[HEADER\.FIELDS \("*DATE"*\)\] (.*)/', $line, $matches)) {
+					$value = preg_replace(array('/^"*[a-z]+:/i'), '', $matches[1]);
 					$value = trim($value);
-					if ($index_field == 'DATE') {
-						$result[$id] = iil_StrToTime($value);
-					} else {
-						$result[$id] = $value;
-					}
+					$result[$id] = iil_StrToTime($value);
+				}
+				// non-existent/empty Date: header, use INTERNALDATE
+				if (empty($result[$id])) {
+					if (preg_match('/INTERNALDATE "([^"]+)"/', $line, $matches))
+						$result[$id] = iil_StrToTime($matches[1]);
+					else
+						$result[$id] = 0;
+				}
+			} else if ($mode == 1) {
+				if (preg_match('/BODY\[HEADER\.FIELDS \("?(FROM|REPLY-TO|SENDER|TO|SUBJECT)"?\)\] (.*)/', $line, $matches)) {
+					$value = preg_replace(array('/^"*[a-z]+:/i', '/\s+$/sm'), array('', ''), $matches[2]);
+					$result[$id] = trim($value);
 				} else {
 					$result[$id] = '';
 				}

--
Gitblit v1.9.1