You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2017/06/06 02:04:24 UTC

[1/6] james-project git commit: JAMES-1900 HasHeader should support encoded folded values

Repository: james-project
Updated Branches:
  refs/heads/master 173303649 -> 747e67154


JAMES-1900 HasHeader should support encoded folded values


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/4254ac92
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/4254ac92
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/4254ac92

Branch: refs/heads/master
Commit: 4254ac92b6743c252edc5b3aa4e7522b7d6e8aa6
Parents: 1733036
Author: benwa <bt...@linagora.com>
Authored: Fri May 5 10:10:38 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Jun 5 20:23:28 2017 +0700

----------------------------------------------------------------------
 .../james/transport/matchers/HasHeader.java     |  11 +-
 .../james/transport/matchers/HasHeaderTest.java |  29 ++++
 .../src/test/resources/mime/headerFolded.mime   | 154 +++++++++++++++++++
 3 files changed, 193 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/4254ac92/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java
----------------------------------------------------------------------
diff --git a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java
index c8484d9..d982a61 100644
--- a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java
+++ b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java
@@ -20,6 +20,9 @@
 
 package org.apache.james.transport.matchers;
 
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.codec.DecoderUtil;
+import org.apache.james.mime4j.util.MimeUtil;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 import org.apache.mailet.base.GenericMatcher;
@@ -40,6 +43,12 @@ import java.util.StringTokenizer;
  */
 public class HasHeader extends GenericMatcher {
 
+    private static String sanitizeHeaderField(String headerName) {
+        return DecoderUtil.decodeEncodedWords(
+            MimeUtil.unfold(headerName),
+            DecodeMonitor.SILENT);
+    }
+
     private static final String CONDITION_SEPARATOR = "+";
     private static final String HEADER_VALUE_SEPARATOR = "=";
 
@@ -75,7 +84,7 @@ public class HasHeader extends GenericMatcher {
             String[] headerArray = mimeMessage.getHeader(headerName);
             if (headerArray != null && headerArray.length > 0) {
                 for (String value : headerArray) {
-                    if (headerValue.equals(value)) {
+                    if (headerValue.equals(sanitizeHeaderField(value))) {
                         return true;
                     }
                 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/4254ac92/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
----------------------------------------------------------------------
diff --git a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
index 49dfc9b..c6e7af0 100644
--- a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
+++ b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
@@ -33,6 +33,7 @@ import org.apache.mailet.Matcher;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMatcherConfig;
 import org.apache.mailet.base.test.MailUtil;
+import org.apache.mailet.base.test.MimeMessageBuilder;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -131,6 +132,34 @@ public class HasHeaderTest {
     }
 
     @Test
+    public void matchShouldSupportFoldedHeaders() throws Exception {
+        matcher.init(FakeMatcherConfig.builder()
+            .matcherName("HasHeader")
+            .condition("From=aduprat <du...@linagora.com>")
+            .build());
+
+        Mail mail = MailUtil.createMockMail2Recipients(
+            MimeMessageBuilder.mimeMessageFromStream(
+                ClassLoader.getSystemResourceAsStream("mime/headerFolded.mime")));
+
+        assertThat(matcher.match(mail)).containsAll(mail.getRecipients());
+    }
+
+    @Test
+    public void matchShouldSupportEncodedHeaders() throws Exception {
+        matcher.init(FakeMatcherConfig.builder()
+            .matcherName("HasHeader")
+            .condition("To=Benoît TELLIER <te...@linagora.com>")
+            .build());
+
+        Mail mail = MailUtil.createMockMail2Recipients(
+            MimeMessageBuilder.mimeMessageFromStream(
+                ClassLoader.getSystemResourceAsStream("mime/gmail.mime")));
+
+        assertThat(matcher.match(mail)).containsAll(mail.getRecipients());
+    }
+
+    @Test
     public void matchShouldNotMatchMailsWithNoHeaderWhenValueNotSpecified() throws MessagingException {
         matcher.init(FakeMatcherConfig.builder()
                 .matcherName("HasHeader")

http://git-wip-us.apache.org/repos/asf/james-project/blob/4254ac92/mailet/standard/src/test/resources/mime/headerFolded.mime
----------------------------------------------------------------------
diff --git a/mailet/standard/src/test/resources/mime/headerFolded.mime b/mailet/standard/src/test/resources/mime/headerFolded.mime
new file mode 100644
index 0000000..f8f44ce
--- /dev/null
+++ b/mailet/standard/src/test/resources/mime/headerFolded.mime
@@ -0,0 +1,154 @@
+Return-Path: <ad...@linagora.com>
+Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00
+ (CET) (aduprat@linagora.com)
+To: =?UTF-8?Q?Beno=c3=aet_TELLIER?= <te...@linagora.com>
+From: aduprat
+ <du...@linagora.com>
+X-Forwarded-Message-Id: <00...@google.com>
+Message-ID: <f1...@linagora.com>
+Date: Thu, 19 Jan 2017 20:36:37 +0100
+MIME-Version: 1.0
+In-Reply-To: <00...@google.com>
+Content-Type: multipart/mixed;
+ boundary="------------17D96D411CBD55D8239A8C1F"
+
+This is a multi-part message in MIME format.
+--------------17D96D411CBD55D8239A8C1F
+Content-Type: multipart/alternative;
+ boundary="------------64D716A3DDAEC185D3E67448"
+
+
+--------------64D716A3DDAEC185D3E67448
+Content-Type: text/plain; charset=utf-8; format=flowed
+Content-Transfer-Encoding: 8bit
+
+
+
+
+-------- Message transéré --------
+Sujet : 	Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00
+(CET) (duprat@linagora.com)
+Date : 	Thu, 19 Jan 2017 19:18:23 +0000
+De : 	Antoine Duprat <du...@gmail.com>
+Répondre à : 	antduprat@gmail.com
+Pour : 	aduprat@linagora.com
+
+
+
+
+--------------64D716A3DDAEC185D3E67448
+Content-Type: text/html; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+<html>
+  <head>
+
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+  </head>
+  <body bgcolor="#FFFFFF" text="#000000">
+    <p><br>
+    </p>
+    <div class="moz-forward-container"><br>
+      <br>
+      -------- Message transéré --------
+      <table class="moz-email-headers-table" border="0" cellpadding="0"
+        cellspacing="0">
+        <tbody>
+          <tr>
+            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Sujet :
+            </th>
+            <td>Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 -
+              15:00 (CET) (<a class="moz-txt-link-abbreviated" href="mailto:aduprat@linagora.com">aduprat@linagora.com</a>)</td>
+          </tr>
+          <tr>
+            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Date : </th>
+            <td>Thu, 19 Jan 2017 19:18:23 +0000</td>
+          </tr>
+          <tr>
+            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">De : </th>
+            <td>Antoine Duprat <a class="moz-txt-link-rfc2396E" href="mailto:antduprat@gmail.com">&lt;antduprat@gmail.com&gt;</a></td>
+          </tr>
+          <tr>
+            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Répondre
+              Ã Â : </th>
+            <td><a class="moz-txt-link-abbreviated" href="mailto:antduprat@gmail.com">antduprat@gmail.com</a></td>
+          </tr>
+          <tr>
+            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Pour : </th>
+            <td><a class="moz-txt-link-abbreviated" href="mailto:aduprat@linagora.com">aduprat@linagora.com</a></td>
+          </tr>
+        </tbody>
+      </table>
+      <br>
+      <br>
+    </div>
+  </body>
+</html>
+
+--------------64D716A3DDAEC185D3E67448--
+
+--------------17D96D411CBD55D8239A8C1F
+Content-Type: text/calendar;
+ name="Portion de message joint"
+Content-Transfer-Encoding: 8bit
+Content-Disposition: attachment;
+ filename="Portion de message joint"
+
+BEGIN:VCALENDAR
+PRODID:-//Google Inc//Google Calendar 70.9054//EN
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20170120T130000Z
+DTEND:20170120T140000Z
+DTSTAMP:20170119T191823Z
+ORGANIZER;CN=Antoine Duprat:mailto:duprat@gmail.com
+UID:ah86k5m342bmcrbe9khkkhln00@google.com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
+ TRUE;CN=aduprat@linagora.com;X-NUM-GUESTS=0:mailto:duprat@linagora.com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
+ ;CN=Antoine Duprat;X-NUM-GUESTS=0:mailto:duprat@gmail.com
+CREATED:20170119T191823Z
+DESCRIPTION:Affichez votre evenement sur la page https://www.google.com/cal
+ endar/event?action=VIEW&eid=YWg4Nms1bTM0MmJtY3JiZTlraGtraGxuMDAgYWR1cHJhdEB
+ saW5hZ29yYS5jb20&tok=MTkjYW50ZHVwcmF0QGdtYWlsLmNvbTg1OTM5NWM4MGRlYmE1YTI4Nz
+ RjN2UyNjU0M2YyZmQ4NzRkNThhYTQ&ctz=Europe/Paris&hl=fr.
+LAST-MODIFIED:20170119T191823Z
+LOCATION:
+SEQUENCE:0
+STATUS:CONFIRMED
+SUMMARY:
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+
+
+--------------17D96D411CBD55D8239A8C1F
+Content-Type: application/ics;
+ name="invite.ics"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="invite.ics"
+
+QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vR29vZ2xlIEluYy8vR29vZ2xlIENhbGVuZGFy
+IDcwLjkwNTQvL0VODQpWRVJTSU9OOjIuMA0KQ0FMU0NBTEU6R1JFR09SSUFODQpNRVRIT0Q6
+UkVRVUVTVA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMTcwMTIwVDEzMDAwMFoNCkRURU5E
+OjIwMTcwMTIwVDE0MDAwMFoNCkRUU1RBTVA6MjAxNzAxMTlUMTkxODIzWg0KT1JHQU5JWkVS
+O0NOPUFudG9pbmUgRHVwcmF0Om1haWx0bzphbnRkdXByYXRAZ21haWwuY29tDQpVSUQ6YWg4
+Nms1bTM0MmJtY3JiZTlraGtraGxuMDBAZ29vZ2xlLmNvbQ0KQVRURU5ERUU7Q1VUWVBFPUlO
+RElWSURVQUw7Uk9MRT1SRVEtUEFSVElDSVBBTlQ7UEFSVFNUQVQ9TkVFRFMtQUNUSU9OO1JT
+VlA9DQogVFJVRTtDTj1hZHVwcmF0QGxpbmFnb3JhLmNvbTtYLU5VTS1HVUVTVFM9MDptYWls
+dG86YWR1cHJhdEBsaW5hZ29yYS5jb20NCkFUVEVOREVFO0NVVFlQRT1JTkRJVklEVUFMO1JP
+TEU9UkVRLVBBUlRJQ0lQQU5UO1BBUlRTVEFUPUFDQ0VQVEVEO1JTVlA9VFJVRQ0KIDtDTj1B
+bnRvaW5lIER1cHJhdDtYLU5VTS1HVUVTVFM9MDptYWlsdG86YW50ZHVwcmF0QGdtYWlsLmNv
+bQ0KQ1JFQVRFRDoyMDE3MDExOVQxOTE4MjNaDQpERVNDUklQVElPTjpBZmZpY2hleiB2b3Ry
+ZSDDqXbDqW5lbWVudCBzdXIgbGEgcGFnZSBodHRwczovL3d3dy5nb29nbGUuY29tL2NhbA0K
+IGVuZGFyL2V2ZW50P2FjdGlvbj1WSUVXJmVpZD1ZV2c0Tm1zMWJUTTBNbUp0WTNKaVpUbHJh
+R3RyYUd4dU1EQWdZV1IxY0hKaGRFQg0KIHNhVzVoWjI5eVlTNWpiMjAmdG9rPU1Ua2pZVzUw
+WkhWd2NtRjBRR2R0WVdsc0xtTnZiVGcxT1RNNU5XTTRNR1JsWW1FMVlUSTROeg0KIFJqTjJV
+eU5qVTBNMll5Wm1RNE56UmtOVGhoWVRRJmN0ej1FdXJvcGUvUGFyaXMmaGw9ZnIuDQpMQVNU
+LU1PRElGSUVEOjIwMTcwMTE5VDE5MTgyM1oNCkxPQ0FUSU9OOg0KU0VRVUVOQ0U6MA0KU1RB
+VFVTOkNPTkZJUk1FRA0KU1VNTUFSWToNClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkVO
+RDpWQ0FMRU5EQVINCg==
+--------------17D96D411CBD55D8239A8C1F--


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


[3/6] james-project git commit: JAMES-1900 In memory message search should unfold and decode headers

Posted by bt...@apache.org.
JAMES-1900 In memory message search should unfold and decode headers


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/beefb43b
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/beefb43b
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/beefb43b

Branch: refs/heads/master
Commit: beefb43bd3c71701d189e9c70b385394b1f4f680
Parents: bf5a68c
Author: benwa <bt...@linagora.com>
Authored: Fri May 5 10:39:39 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Jun 5 20:24:51 2017 +0700

----------------------------------------------------------------------
 .../james/mailbox/store/search/MessageSearches.java    | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/beefb43b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index 140b34b..7bb255c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -51,6 +51,8 @@ import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.search.comparator.CombinedComparator;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.MimeIOException;
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.codec.DecoderUtil;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.address.Address;
 import org.apache.james.mime4j.dom.address.AddressList;
@@ -67,6 +69,7 @@ import org.apache.james.mime4j.message.DefaultMessageBuilder;
 import org.apache.james.mime4j.message.DefaultMessageWriter;
 import org.apache.james.mime4j.message.HeaderImpl;
 import org.apache.james.mime4j.stream.MimeConfig;
+import org.apache.james.mime4j.util.MimeUtil;
 import org.apache.james.mime4j.utils.search.MessageMatcher;
 
 import com.google.common.base.Function;
@@ -88,6 +91,12 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
         .setMaxLineLen(-1)
         .build();
 
+    private static String sanitizeHeaderField(String headerValue) {
+        return DecoderUtil.decodeEncodedWords(
+            MimeUtil.unfold(headerValue),
+            DecodeMonitor.SILENT);
+    }
+
     private Iterator<MailboxMessage> messages;
     private SearchQuery query;
     private MailboxSession session;
@@ -470,7 +479,7 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
         for (Header header : headers) {
             String name = header.getName();
             if (headerName.equalsIgnoreCase(name)) {
-                String value = header.getValue();
+                String value = sanitizeHeaderField(header.getValue());
                 if (value != null) {
                     if (value.toUpperCase(Locale.US).contains(text)) {
                         result = true;
@@ -520,7 +529,7 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
         for (Header header : headers) {
             String name = header.getName();
             if (headerName.equalsIgnoreCase(name)) {
-                value = header.getValue();
+                value = sanitizeHeaderField(header.getValue());
                 break;
             }
         }


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


[2/6] james-project git commit: JAMES-1900 JSieve header instruction should unfold and decode headers

Posted by bt...@apache.org.
JAMES-1900 JSieve header instruction should unfold and decode headers


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/110db27d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/110db27d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/110db27d

Branch: refs/heads/master
Commit: 110db27d6831b9089cb1237d104c04806e78223d
Parents: beefb43
Author: benwa <bt...@linagora.com>
Authored: Fri May 5 11:05:05 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Jun 5 20:24:51 2017 +0700

----------------------------------------------------------------------
 .../mailets/delivery/SieveIntegrationTest.java  |  20 +++
 .../mailets/src/test/resources/eml/gmail.eml    | 154 +++++++++++++++++++
 .../mailets/delivery/headerEncodedFolded.script |  26 ++++
 server/pom.xml                                  |   2 +-
 4 files changed, 201 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/110db27d/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
index 04a4b6c..8d7c43b 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
@@ -44,6 +44,7 @@ import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 
@@ -264,6 +265,25 @@ public class SieveIntegrationTest {
         assertThat(mail.getAttribute(MailStore.DELIVERY_PATH_PREFIX + LOCAL_PART)).isEqualTo(expressMailboxNameWithSlash(NOT_SELECTED_MAILBOX.getName()));
     }
 
+    @Ignore("Waiting for JAMES-1900 JSieve part to be merged")
+    @Test
+    public void headerInstructionShouldSupportFoldedEncodedHeaders() throws Exception {
+        prepareTestUsingScript("org/apache/james/transport/mailets/delivery/headerEncodedFolded.script");
+
+        FakeMail mail = FakeMail.builder()
+            .mimeMessage(MimeMessageBuilder.mimeMessageFromStream(
+                ClassLoader.getSystemResourceAsStream("eml/gmail.eml")))
+            .state(Mail.DEFAULT)
+            .recipient(new MailAddress(RECEIVER_DOMAIN_COM))
+            .sender(new MailAddress("sender@any.com"))
+            .build();
+        testee.service(mail);
+
+        assertThat(mail.getAttribute(MailStore.DELIVERY_PATH_PREFIX + LOCAL_PART))
+            .isEqualTo(expressMailboxNameWithSlash(SELECTED_MAILBOX.getName()));
+    }
+
+
     @Test
     public void headerScriptShouldWorkIfHeaderIsPresent() throws Exception {
         prepareTestUsingScript("org/apache/james/transport/mailets/delivery/header.script");

http://git-wip-us.apache.org/repos/asf/james-project/blob/110db27d/server/mailet/mailets/src/test/resources/eml/gmail.eml
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/resources/eml/gmail.eml b/server/mailet/mailets/src/test/resources/eml/gmail.eml
new file mode 100644
index 0000000..1b95cba
--- /dev/null
+++ b/server/mailet/mailets/src/test/resources/eml/gmail.eml
@@ -0,0 +1,154 @@
+Return-Path: <ad...@linagora.com>
+Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00
+ (CET) (aduprat@linagora.com)
+To: =?UTF-8?Q?Beno=c3=aet_TELLIER?=
+ <te...@linagora.com>
+From: aduprat <du...@linagora.com>
+X-Forwarded-Message-Id: <00...@google.com>
+Message-ID: <f1...@linagora.com>
+Date: Thu, 19 Jan 2017 20:36:37 +0100
+MIME-Version: 1.0
+In-Reply-To: <00...@google.com>
+Content-Type: multipart/mixed;
+ boundary="------------17D96D411CBD55D8239A8C1F"
+
+This is a multi-part message in MIME format.
+--------------17D96D411CBD55D8239A8C1F
+Content-Type: multipart/alternative;
+ boundary="------------64D716A3DDAEC185D3E67448"
+
+
+--------------64D716A3DDAEC185D3E67448
+Content-Type: text/plain; charset=utf-8; format=flowed
+Content-Transfer-Encoding: 8bit
+
+
+
+
+-------- Message transéré --------
+Sujet : 	Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00
+(CET) (duprat@linagora.com)
+Date : 	Thu, 19 Jan 2017 19:18:23 +0000
+De : 	Antoine Duprat <du...@gmail.com>
+Répondre à : 	antduprat@gmail.com
+Pour : 	aduprat@linagora.com
+
+
+
+
+--------------64D716A3DDAEC185D3E67448
+Content-Type: text/html; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+<html>
+  <head>
+
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+  </head>
+  <body bgcolor="#FFFFFF" text="#000000">
+    <p><br>
+    </p>
+    <div class="moz-forward-container"><br>
+      <br>
+      -------- Message transéré --------
+      <table class="moz-email-headers-table" border="0" cellpadding="0"
+        cellspacing="0">
+        <tbody>
+          <tr>
+            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Sujet :
+            </th>
+            <td>Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 -
+              15:00 (CET) (<a class="moz-txt-link-abbreviated" href="mailto:aduprat@linagora.com">aduprat@linagora.com</a>)</td>
+          </tr>
+          <tr>
+            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Date : </th>
+            <td>Thu, 19 Jan 2017 19:18:23 +0000</td>
+          </tr>
+          <tr>
+            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">De : </th>
+            <td>Antoine Duprat <a class="moz-txt-link-rfc2396E" href="mailto:antduprat@gmail.com">&lt;antduprat@gmail.com&gt;</a></td>
+          </tr>
+          <tr>
+            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Répondre
+              Ã Â : </th>
+            <td><a class="moz-txt-link-abbreviated" href="mailto:antduprat@gmail.com">antduprat@gmail.com</a></td>
+          </tr>
+          <tr>
+            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Pour : </th>
+            <td><a class="moz-txt-link-abbreviated" href="mailto:aduprat@linagora.com">aduprat@linagora.com</a></td>
+          </tr>
+        </tbody>
+      </table>
+      <br>
+      <br>
+    </div>
+  </body>
+</html>
+
+--------------64D716A3DDAEC185D3E67448--
+
+--------------17D96D411CBD55D8239A8C1F
+Content-Type: text/calendar;
+ name="Portion de message joint"
+Content-Transfer-Encoding: 8bit
+Content-Disposition: attachment;
+ filename="Portion de message joint"
+
+BEGIN:VCALENDAR
+PRODID:-//Google Inc//Google Calendar 70.9054//EN
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20170120T130000Z
+DTEND:20170120T140000Z
+DTSTAMP:20170119T191823Z
+ORGANIZER;CN=Antoine Duprat:mailto:duprat@gmail.com
+UID:ah86k5m342bmcrbe9khkkhln00@google.com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
+ TRUE;CN=aduprat@linagora.com;X-NUM-GUESTS=0:mailto:duprat@linagora.com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
+ ;CN=Antoine Duprat;X-NUM-GUESTS=0:mailto:duprat@gmail.com
+CREATED:20170119T191823Z
+DESCRIPTION:Affichez votre evenement sur la page https://www.google.com/cal
+ endar/event?action=VIEW&eid=YWg4Nms1bTM0MmJtY3JiZTlraGtraGxuMDAgYWR1cHJhdEB
+ saW5hZ29yYS5jb20&tok=MTkjYW50ZHVwcmF0QGdtYWlsLmNvbTg1OTM5NWM4MGRlYmE1YTI4Nz
+ RjN2UyNjU0M2YyZmQ4NzRkNThhYTQ&ctz=Europe/Paris&hl=fr.
+LAST-MODIFIED:20170119T191823Z
+LOCATION:
+SEQUENCE:0
+STATUS:CONFIRMED
+SUMMARY:
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+
+
+--------------17D96D411CBD55D8239A8C1F
+Content-Type: application/ics;
+ name="invite.ics"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="invite.ics"
+
+QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vR29vZ2xlIEluYy8vR29vZ2xlIENhbGVuZGFy
+IDcwLjkwNTQvL0VODQpWRVJTSU9OOjIuMA0KQ0FMU0NBTEU6R1JFR09SSUFODQpNRVRIT0Q6
+UkVRVUVTVA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMTcwMTIwVDEzMDAwMFoNCkRURU5E
+OjIwMTcwMTIwVDE0MDAwMFoNCkRUU1RBTVA6MjAxNzAxMTlUMTkxODIzWg0KT1JHQU5JWkVS
+O0NOPUFudG9pbmUgRHVwcmF0Om1haWx0bzphbnRkdXByYXRAZ21haWwuY29tDQpVSUQ6YWg4
+Nms1bTM0MmJtY3JiZTlraGtraGxuMDBAZ29vZ2xlLmNvbQ0KQVRURU5ERUU7Q1VUWVBFPUlO
+RElWSURVQUw7Uk9MRT1SRVEtUEFSVElDSVBBTlQ7UEFSVFNUQVQ9TkVFRFMtQUNUSU9OO1JT
+VlA9DQogVFJVRTtDTj1hZHVwcmF0QGxpbmFnb3JhLmNvbTtYLU5VTS1HVUVTVFM9MDptYWls
+dG86YWR1cHJhdEBsaW5hZ29yYS5jb20NCkFUVEVOREVFO0NVVFlQRT1JTkRJVklEVUFMO1JP
+TEU9UkVRLVBBUlRJQ0lQQU5UO1BBUlRTVEFUPUFDQ0VQVEVEO1JTVlA9VFJVRQ0KIDtDTj1B
+bnRvaW5lIER1cHJhdDtYLU5VTS1HVUVTVFM9MDptYWlsdG86YW50ZHVwcmF0QGdtYWlsLmNv
+bQ0KQ1JFQVRFRDoyMDE3MDExOVQxOTE4MjNaDQpERVNDUklQVElPTjpBZmZpY2hleiB2b3Ry
+ZSDDqXbDqW5lbWVudCBzdXIgbGEgcGFnZSBodHRwczovL3d3dy5nb29nbGUuY29tL2NhbA0K
+IGVuZGFyL2V2ZW50P2FjdGlvbj1WSUVXJmVpZD1ZV2c0Tm1zMWJUTTBNbUp0WTNKaVpUbHJh
+R3RyYUd4dU1EQWdZV1IxY0hKaGRFQg0KIHNhVzVoWjI5eVlTNWpiMjAmdG9rPU1Ua2pZVzUw
+WkhWd2NtRjBRR2R0WVdsc0xtTnZiVGcxT1RNNU5XTTRNR1JsWW1FMVlUSTROeg0KIFJqTjJV
+eU5qVTBNMll5Wm1RNE56UmtOVGhoWVRRJmN0ej1FdXJvcGUvUGFyaXMmaGw9ZnIuDQpMQVNU
+LU1PRElGSUVEOjIwMTcwMTE5VDE5MTgyM1oNCkxPQ0FUSU9OOg0KU0VRVUVOQ0U6MA0KU1RB
+VFVTOkNPTkZJUk1FRA0KU1VNTUFSWToNClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkVO
+RDpWQ0FMRU5EQVINCg==
+--------------17D96D411CBD55D8239A8C1F--

http://git-wip-us.apache.org/repos/asf/james-project/blob/110db27d/server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/headerEncodedFolded.script
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/headerEncodedFolded.script b/server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/headerEncodedFolded.script
new file mode 100644
index 0000000..b9f506d
--- /dev/null
+++ b/server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/headerEncodedFolded.script
@@ -0,0 +1,26 @@
+################################################################
+# Licensed to the Apache Software Foundation (ASF) under one   #
+# or more contributor license agreements.  See the NOTICE file #
+# distributed with this work for additional information        #
+# regarding copyright ownership.  The ASF licenses this file   #
+# to you under the Apache License, Version 2.0 (the            #
+# "License"); you may not use this file except in compliance   #
+# with the License.  You may obtain a copy of the License at   #
+#                                                              #
+#   http://www.apache.org/licenses/LICENSE-2.0                 #
+#                                                              #
+# Unless required by applicable law or agreed to in writing,   #
+# software distributed under the License is distributed on an  #
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       #
+# KIND, either express or implied.  See the License for the    #
+# specific language governing permissions and limitations      #
+# under the License.                                           #
+################################################################
+
+require "fileinto";
+
+if header :contains ["To"] ["Benoît TELLIER <te...@linagora.com>"] {
+    fileinto "INBOX.select";
+} else {
+     fileinto "INBOX.not.selected";
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/110db27d/server/pom.xml
----------------------------------------------------------------------
diff --git a/server/pom.xml b/server/pom.xml
index f2749ee..f9cb099 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -128,7 +128,7 @@
         <javax.activation.groupId>javax.activation</javax.activation.groupId>
         <javax.activation.artifactId>activation</javax.activation.artifactId>
         <jackrabbit.version>2.5.2</jackrabbit.version>
-        <jsieve.version>0.6</jsieve.version>
+        <jsieve.version>0.7-SNAPSHOT</jsieve.version>
         <spring.version>3.2.14.RELEASE</spring.version>
         <geronimo-jms-spec.version>1.1.1</geronimo-jms-spec.version>
         <h2.version>1.3.170</h2.version>


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


[4/6] james-project git commit: JAMES-1900 Headers should be decoded and unfolded

Posted by bt...@apache.org.
JAMES-1900 Headers should be decoded and unfolded


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/bf5a68c0
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/bf5a68c0
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/bf5a68c0

Branch: refs/heads/master
Commit: bf5a68c0d7b7ea2851cd556dd57d88008d9f8628
Parents: 4254ac9
Author: benwa <bt...@linagora.com>
Authored: Fri May 5 10:32:01 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Jun 5 20:24:51 2017 +0700

----------------------------------------------------------------------
 .../apache/james/jmap/model/MessageFactory.java | 13 +++++
 .../james/jmap/model/MessageFactoryTest.java    | 50 ++++++++++++++++++++
 2 files changed, 63 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/bf5a68c0/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
index cbcdbcd..e0eb1c9 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
@@ -21,6 +21,7 @@ package org.apache.james.jmap.model;
 import java.io.IOException;
 import java.io.InputStream;
 import java.time.Instant;
+import java.time.ZoneId;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
@@ -43,11 +44,14 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.codec.DecoderUtil;
 import org.apache.james.mime4j.dom.address.AddressList;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.dom.address.MailboxList;
 import org.apache.james.mime4j.stream.Field;
 import org.apache.james.mime4j.stream.MimeConfig;
+import org.apache.james.mime4j.util.MimeUtil;
 import org.apache.james.util.mime.MessageContentExtractor;
 import org.apache.james.util.mime.MessageContentExtractor.MessageContent;
 
@@ -69,6 +73,14 @@ public class MessageFactory {
         .setMaxLineLen(-1)
         .build();
 
+    private static String sanitizeHeaderField(String headerValue) {
+        return DecoderUtil.decodeEncodedWords(
+            MimeUtil.unfold(headerValue),
+            DecodeMonitor.SILENT);
+    }
+
+    private static final ZoneId UTC_ZONE_ID = ZoneId.of("Z");
+
     private final MessagePreviewGenerator messagePreview;
     private final MessageContentExtractor messageContentExtractor;
     private final HtmlTextExtractor htmlTextExtractor;
@@ -192,6 +204,7 @@ public class MessageFactory {
         Function<Entry<String, Collection<Field>>, String> bodyConcatenator = fieldListEntry -> fieldListEntry.getValue()
                 .stream()
                 .map(Field::getBody)
+                .map(MessageFactory::sanitizeHeaderField)
                 .collect(Collectors.toList())
                 .stream()
                 .collect(Collectors.joining(","));

http://git-wip-us.apache.org/repos/asf/james-project/blob/bf5a68c0/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
index 76e3cd5..5076774 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
@@ -169,6 +169,56 @@ public class MessageFactoryTest {
     }
 
     @Test
+    public void headersShouldBeUnfoldedAndDecoded() throws Exception {
+        String headers = "From: user <us...@domain>\n"
+            + "Subject: test subject\n"
+            + "To: user1 <us...@domain>,\r\n"
+            + " user2 <us...@domain>\n"
+            + "Cc: =?UTF-8?Q?Beno=c3=aet_TELLIER?= <te...@linagora.com>";
+        MetaDataWithContent testMail = MetaDataWithContent.builder()
+            .uid(MessageUid.of(2))
+            .flags(new Flags(Flag.SEEN))
+            .size(headers.length())
+            .internalDate(INTERNAL_DATE)
+            .content(new ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
+            .attachments(ImmutableList.of())
+            .mailboxId(MAILBOX_ID)
+            .messageId(TestMessageId.of(2))
+            .build();
+
+        Emailer user = Emailer.builder().name("user").email("user@domain").build();
+        Emailer user1 = Emailer.builder().name("user1").email("user1@domain").build();
+        Emailer user2 = Emailer.builder().name("user2").email("user2@domain").build();
+        Emailer usercc = Emailer.builder().name("Benoît TELLIER").email("tellier@linagora.com").build();
+        ImmutableMap<String, String> headersMap = ImmutableMap.<String, String>builder()
+            .put("Cc", "Benoît TELLIER <te...@linagora.com>")
+            .put("Subject", "test subject")
+            .put("From", "user <us...@domain>")
+            .put("To", "user1 <us...@domain>, user2 <us...@domain>")
+            .put("Date", "Tue, 14 Jul 2015 12:30:42 +0000")
+            .put("MIME-Version", "1.0")
+            .build();
+        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        Message expected = Message.builder()
+            .id(TestMessageId.of(2))
+            .blobId(BlobId.of("2"))
+            .threadId("2")
+            .mailboxId(MAILBOX_ID)
+            .headers(headersMap)
+            .from(user)
+            .to(ImmutableList.of(user1, user2))
+            .cc(ImmutableList.of(usercc))
+            .subject("test subject")
+            .date(ZONED_DATE)
+            .size(headers.length())
+            .preview("(Empty)")
+            .textBody(Optional.of(""))
+            .htmlBody(Optional.empty())
+            .build();
+        assertThat(testee).isEqualToComparingFieldByField(expected);
+    }
+
+    @Test
     public void textBodyShouldBeSetIntoMessage() throws Exception {
         String headers = "Subject: test subject\n";
         String body = "Mail body";


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


[6/6] james-project git commit: JAMES-1900 Enable header unscrambling testing with JSieve

Posted by bt...@apache.org.
JAMES-1900 Enable header unscrambling testing with JSieve


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/747e6715
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/747e6715
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/747e6715

Branch: refs/heads/master
Commit: 747e671547cdb99b4d26774021b89fc9e4addc8c
Parents: f832b99
Author: benwa <bt...@linagora.com>
Authored: Fri May 5 17:06:49 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Jun 5 21:18:39 2017 +0700

----------------------------------------------------------------------
 .../james/transport/mailets/delivery/SieveIntegrationTest.java    | 2 --
 .../src/main/java/org/apache/james/jmap/model/MessageFactory.java | 2 --
 .../test/java/org/apache/james/jmap/model/MessageFactoryTest.java | 3 +--
 3 files changed, 1 insertion(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/747e6715/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
index 8d7c43b..3d26130 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
@@ -44,7 +44,6 @@ import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 
@@ -265,7 +264,6 @@ public class SieveIntegrationTest {
         assertThat(mail.getAttribute(MailStore.DELIVERY_PATH_PREFIX + LOCAL_PART)).isEqualTo(expressMailboxNameWithSlash(NOT_SELECTED_MAILBOX.getName()));
     }
 
-    @Ignore("Waiting for JAMES-1900 JSieve part to be merged")
     @Test
     public void headerInstructionShouldSupportFoldedEncodedHeaders() throws Exception {
         prepareTestUsingScript("org/apache/james/transport/mailets/delivery/headerEncodedFolded.script");

http://git-wip-us.apache.org/repos/asf/james-project/blob/747e6715/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
index e39e78e..18f4695 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
@@ -71,8 +71,6 @@ public class MessageFactory {
         .setMaxLineLen(-1)
         .build();
 
-    private static final ZoneId UTC_ZONE_ID = ZoneId.of("Z");
-
     private final MessagePreviewGenerator messagePreview;
     private final MessageContentExtractor messageContentExtractor;
     private final HtmlTextExtractor htmlTextExtractor;

http://git-wip-us.apache.org/repos/asf/james-project/blob/747e6715/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
index 5076774..bd08b57 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
@@ -195,7 +195,6 @@ public class MessageFactoryTest {
             .put("Subject", "test subject")
             .put("From", "user <us...@domain>")
             .put("To", "user1 <us...@domain>, user2 <us...@domain>")
-            .put("Date", "Tue, 14 Jul 2015 12:30:42 +0000")
             .put("MIME-Version", "1.0")
             .build();
         Message testee = messageFactory.fromMetaDataWithContent(testMail);
@@ -209,7 +208,7 @@ public class MessageFactoryTest {
             .to(ImmutableList.of(user1, user2))
             .cc(ImmutableList.of(usercc))
             .subject("test subject")
-            .date(ZONED_DATE)
+            .date(Instant.parse("2012-02-03T14:30:42.000Z"))
             .size(headers.length())
             .preview("(Empty)")
             .textBody(Optional.of(""))


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


[5/6] james-project git commit: JAMES-1900 Extract header sanitizing to mime4j

Posted by bt...@apache.org.
JAMES-1900 Extract header sanitizing to mime4j


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f832b99a
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f832b99a
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f832b99a

Branch: refs/heads/master
Commit: f832b99a7253c45716d0f2a64f6e918fb00e3b8d
Parents: 110db27
Author: benwa <bt...@linagora.com>
Authored: Fri May 5 16:56:30 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Mon Jun 5 20:25:21 2017 +0700

----------------------------------------------------------------------
 .../mailbox/elasticsearch/json/HeaderCollection.java    | 10 +---------
 .../james/mailbox/store/search/MessageSearches.java     | 12 ++----------
 .../standard/src/test/resources/mime/headerFolded.mime  |  4 ++--
 .../org/apache/james/jmap/model/MessageFactory.java     | 10 +---------
 4 files changed, 6 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f832b99a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollection.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollection.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollection.java
index eef245c..3db1c9a 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollection.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollection.java
@@ -31,8 +31,6 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.james.mailbox.store.search.SearchUtil;
-import org.apache.james.mime4j.codec.DecodeMonitor;
-import org.apache.james.mime4j.codec.DecoderUtil;
 import org.apache.james.mime4j.dom.address.Address;
 import org.apache.james.mime4j.dom.address.Group;
 import org.apache.james.mime4j.dom.address.Mailbox;
@@ -51,12 +49,6 @@ import com.google.common.collect.Multimap;
 
 public class HeaderCollection {
 
-    private static String sanitizeHeaderField(String headerName) {
-        return DecoderUtil.decodeEncodedWords(
-            MimeUtil.unfold(headerName),
-            DecodeMonitor.SILENT);
-    }
-
     public static class Builder {
 
         // Some sent e-mail have this form : Wed,  3 Jun 2015 09:05:46 +0000 (UTC)
@@ -90,7 +82,7 @@ public class HeaderCollection {
         public Builder add(Field field) {
             Preconditions.checkNotNull(field);
             String headerName = field.getName().toLowerCase(Locale.US);
-            String sanitizedValue = sanitizeHeaderField(field.getBody());
+            String sanitizedValue = MimeUtil.unscrambleHeaderValue(field.getBody());
 
             headers.put(headerName, sanitizedValue);
             handleSpecificHeader(headerName, sanitizedValue);

http://git-wip-us.apache.org/repos/asf/james-project/blob/f832b99a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index 7bb255c..9516717 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -51,8 +51,6 @@ import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.search.comparator.CombinedComparator;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.MimeIOException;
-import org.apache.james.mime4j.codec.DecodeMonitor;
-import org.apache.james.mime4j.codec.DecoderUtil;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.address.Address;
 import org.apache.james.mime4j.dom.address.AddressList;
@@ -91,12 +89,6 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
         .setMaxLineLen(-1)
         .build();
 
-    private static String sanitizeHeaderField(String headerValue) {
-        return DecoderUtil.decodeEncodedWords(
-            MimeUtil.unfold(headerValue),
-            DecodeMonitor.SILENT);
-    }
-
     private Iterator<MailboxMessage> messages;
     private SearchQuery query;
     private MailboxSession session;
@@ -479,7 +471,7 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
         for (Header header : headers) {
             String name = header.getName();
             if (headerName.equalsIgnoreCase(name)) {
-                String value = sanitizeHeaderField(header.getValue());
+                String value = MimeUtil.unscrambleHeaderValue(header.getValue());
                 if (value != null) {
                     if (value.toUpperCase(Locale.US).contains(text)) {
                         result = true;
@@ -529,7 +521,7 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
         for (Header header : headers) {
             String name = header.getName();
             if (headerName.equalsIgnoreCase(name)) {
-                value = sanitizeHeaderField(header.getValue());
+                value = MimeUtil.unscrambleHeaderValue(header.getValue());
                 break;
             }
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f832b99a/mailet/standard/src/test/resources/mime/headerFolded.mime
----------------------------------------------------------------------
diff --git a/mailet/standard/src/test/resources/mime/headerFolded.mime b/mailet/standard/src/test/resources/mime/headerFolded.mime
index f8f44ce..409bb0c 100644
--- a/mailet/standard/src/test/resources/mime/headerFolded.mime
+++ b/mailet/standard/src/test/resources/mime/headerFolded.mime
@@ -1,6 +1,6 @@
-Return-Path: <ad...@linagora.com>
+Return-Path: <du...@linagora.com>
 Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00
- (CET) (aduprat@linagora.com)
+ (CET) (duprat@linagora.com)
 To: =?UTF-8?Q?Beno=c3=aet_TELLIER?= <te...@linagora.com>
 From: aduprat
  <du...@linagora.com>

http://git-wip-us.apache.org/repos/asf/james-project/blob/f832b99a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
index e0eb1c9..e39e78e 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
@@ -44,8 +44,6 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
-import org.apache.james.mime4j.codec.DecodeMonitor;
-import org.apache.james.mime4j.codec.DecoderUtil;
 import org.apache.james.mime4j.dom.address.AddressList;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.dom.address.MailboxList;
@@ -73,12 +71,6 @@ public class MessageFactory {
         .setMaxLineLen(-1)
         .build();
 
-    private static String sanitizeHeaderField(String headerValue) {
-        return DecoderUtil.decodeEncodedWords(
-            MimeUtil.unfold(headerValue),
-            DecodeMonitor.SILENT);
-    }
-
     private static final ZoneId UTC_ZONE_ID = ZoneId.of("Z");
 
     private final MessagePreviewGenerator messagePreview;
@@ -204,7 +196,7 @@ public class MessageFactory {
         Function<Entry<String, Collection<Field>>, String> bodyConcatenator = fieldListEntry -> fieldListEntry.getValue()
                 .stream()
                 .map(Field::getBody)
-                .map(MessageFactory::sanitizeHeaderField)
+                .map(MimeUtil::unscrambleHeaderValue)
                 .collect(Collectors.toList())
                 .stream()
                 .collect(Collectors.joining(","));


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