You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2020/10/12 07:40:09 UTC

[james-project] 02/12: JAMES-2046 SentDateComparator should fallback to Mimle4J parsers

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 5b06796ad89389877a0cb1cb6071ed2ddb84e75a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sat Oct 10 07:19:01 2020 +0200

    JAMES-2046 SentDateComparator should fallback to Mimle4J parsers
    
    When the date does not match rfc5322
---
 .../mailbox/store/search/comparator/SentDateComparator.java  | 12 ++++++++++--
 .../store/search/comparator/SentDateComparatorTest.java      |  8 ++++++++
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SentDateComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SentDateComparator.java
index 67bab53..cf6db2b 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SentDateComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SentDateComparator.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.store.search.comparator;
 import static org.apache.james.mime4j.codec.DecodeMonitor.SILENT;
 
 import java.time.Instant;
+import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.util.Comparator;
 import java.util.Date;
@@ -31,6 +32,7 @@ import java.util.regex.Pattern;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mime4j.field.DateTimeFieldLenientImpl;
 import org.apache.james.mime4j.stream.RawField;
+import org.apache.james.util.OptionalUtils;
 import org.apache.james.util.date.ImapDateTimeFormatter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,8 +60,14 @@ public class SentDateComparator extends AbstractHeaderComparator {
                 sanitizeDateStringHeaderValue(value),
                 ImapDateTimeFormatter.rfc5322()));
         } catch (Exception e) {
-            LOGGER.info("Can not parse receive date {}", value);
-            return Optional.empty();
+            // Fallback if possible to mime4j parsing - zoneId information is lost
+            return OptionalUtils.executeIfEmpty(
+                Optional.ofNullable(DateTimeFieldLenientImpl.PARSER
+                    .parse(new RawField("Date", value), SILENT))
+                    .flatMap(field -> Optional.ofNullable(field.getDate()))
+                    .map(Date::toInstant)
+                    .map(instant -> ZonedDateTime.ofInstant(instant, ZoneId.of("UTC"))),
+                () -> LOGGER.info("Can not parse receive date {}", value));
         }
     }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/comparator/SentDateComparatorTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/comparator/SentDateComparatorTest.java
index 1d7ec98..041ed0f 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/comparator/SentDateComparatorTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/comparator/SentDateComparatorTest.java
@@ -21,6 +21,8 @@ package org.apache.james.mailbox.store.search.comparator;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.time.ZonedDateTime;
+
 import org.junit.jupiter.api.Test;
 
 class SentDateComparatorTest {
@@ -59,4 +61,10 @@ class SentDateComparatorTest {
         assertThat(SentDateComparator.sanitizeDateStringHeaderValue(""))
             .isEqualTo("");
     }
+
+    @Test
+    void toISODateShouldParseRFC5322InvalidHeader() {
+        assertThat(SentDateComparator.toISODate("Fri,  5 Jun 2020 10:41:00 +0000 (UTC)"))
+            .contains(ZonedDateTime.parse("2020-06-05T10:41Z[UTC]"));
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org