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


The following commit(s) were added to refs/heads/master by this push:
     new bb01c8a9f2 [FIX] OpenSearch should normalize base subject (#1910)
bb01c8a9f2 is described below

commit bb01c8a9f28933965cbbcafaeb5302fe7bcd393e
Author: Benoit TELLIER <[email protected]>
AuthorDate: Tue Jan 16 10:03:39 2024 +0100

    [FIX] OpenSearch should normalize base subject (#1910)
---
 .../mailbox/opensearch/json/HeaderCollection.java  |  3 +-
 .../opensearch/OpenSearchIntegrationTest.java      | 44 ++++++++++++++++++++++
 .../opensearch/json/HeaderCollectionTest.java      | 10 +++++
 .../src/test/resources/eml/pgpSignedMail.json      |  2 +-
 mailbox/store/src/test/resources/eml/spamMail.json |  2 +-
 .../src/test/resources/eml/spamMailNoHeaders.json  |  2 +-
 6 files changed, 59 insertions(+), 4 deletions(-)

diff --git 
a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/HeaderCollection.java
 
b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/HeaderCollection.java
index d89603397d..ce3d0dfb7e 100644
--- 
a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/HeaderCollection.java
+++ 
b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/HeaderCollection.java
@@ -26,6 +26,7 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 
+import org.apache.james.mailbox.store.search.SearchUtil;
 import org.apache.james.mailbox.store.search.comparator.SentDateComparator;
 import org.apache.james.mime4j.field.address.LenientAddressParser;
 import org.apache.james.mime4j.stream.Field;
@@ -133,7 +134,7 @@ public class HeaderCollection {
                     manageAddressField(headerName, rawHeaderValue);
                     break;
                 case SUBJECT:
-                    subjectSet.add(headerValue);
+                    subjectSet.add(SearchUtil.getBaseSubject(headerValue));
                     break;
                 case DATE:
                     sentDate = SentDateComparator.toISODate(headerValue);
diff --git 
a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchIntegrationTest.java
 
b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchIntegrationTest.java
index 30cd8315d3..8b9170fa17 100644
--- 
a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchIntegrationTest.java
+++ 
b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchIntegrationTest.java
@@ -26,6 +26,7 @@ import static 
org.awaitility.Durations.ONE_HUNDRED_MILLISECONDS;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.time.ZoneId;
+import java.util.Iterator;
 import java.util.List;
 import java.util.UUID;
 
@@ -42,10 +43,14 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
+import org.apache.james.mailbox.model.FetchGroup;
+import org.apache.james.mailbox.model.Header;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.mailbox.model.MessageResult;
+import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.apache.james.mailbox.model.SearchQuery;
 import 
org.apache.james.mailbox.opensearch.events.OpenSearchListeningMessageSearchIndex;
 import org.apache.james.mailbox.opensearch.json.MessageToOpenSearchJson;
@@ -78,6 +83,7 @@ import org.opensearch.client.opensearch.core.GetResponse;
 import org.opensearch.client.opensearch.core.SearchRequest;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.github.fge.lambdas.Throwing;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -568,6 +574,44 @@ class OpenSearchIntegrationTest extends 
AbstractMessageSearchIndexTest {
         
assertThat(Flux.from(messageManager.search(SearchQuery.of(SearchQuery.address(SearchQuery.AddressType.To,
 "domain-test.tld")), session)).toStream())
             .containsOnly(messageId1.getUid());
     }
+    
+    @Test
+    void shouldSortOnBaseSubject() throws Exception {
+        MailboxPath mailboxPath = MailboxPath.forUser(USERNAME, "def");
+        MailboxSession session = MailboxSessionUtil.create(USERNAME);
+        storeMailboxManager.createMailbox(mailboxPath, session);
+        MessageManager messageManager = 
storeMailboxManager.getMailbox(mailboxPath, session);
+
+        ComposedMessageId messageId1 = 
messageManager.appendMessage(messageWithSubject("abc"), session).getId();
+        ComposedMessageId messageId2 = 
messageManager.appendMessage(messageWithSubject("Re: abd"), session).getId();
+        ComposedMessageId messageId3 = 
messageManager.appendMessage(messageWithSubject("Fwd: abe"), session).getId();
+        ComposedMessageId messageId4 = 
messageManager.appendMessage(messageWithSubject("bbc"), session).getId();
+        ComposedMessageId messageId5 = 
messageManager.appendMessage(messageWithSubject("bBc"), session).getId();
+        ComposedMessageId messageId6 = 
messageManager.appendMessage(messageWithSubject("def"), session).getId();
+        ComposedMessageId messageId7 = 
messageManager.appendMessage(messageWithSubject("ABC"), session).getId();
+
+        openSearch.awaitForOpenSearch();
+
+        awaitForOpenSearch(QueryBuilders.matchAll().build()._toQuery(), 20);
+
+        assertThat(Flux.from(
+            messageManager.search(SearchQuery.allSortedWith(new 
SearchQuery.Sort(SearchQuery.Sort.SortClause.BaseSubject)), 
session)).toStream())
+            .containsExactly(messageId1.getUid(),
+                messageId7.getUid(),
+                messageId2.getUid(),
+                messageId3.getUid(),
+                messageId4.getUid(),
+                messageId5.getUid(),
+                messageId6.getUid());
+    }
+
+    private static MessageManager.AppendCommand messageWithSubject(String 
subject) throws IOException {
+        return MessageManager.AppendCommand.builder().build(
+            Message.Builder
+                .of()
+                .setBody("testmail", StandardCharsets.UTF_8)
+                .addField(new RawField("Subject", subject)));
+    }
 
     private void awaitForOpenSearch(Query query, long totalHits) {
         CALMLY_AWAIT.atMost(Durations.TEN_SECONDS)
diff --git 
a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/HeaderCollectionTest.java
 
b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/HeaderCollectionTest.java
index f275579a69..6d235d155d 100644
--- 
a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/HeaderCollectionTest.java
+++ 
b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/HeaderCollectionTest.java
@@ -84,6 +84,16 @@ class HeaderCollectionTest {
                 new EMailer(Optional.empty(), "[email protected]", 
"minet.net"));
     }
 
+    @Test
+    void shouldNormalizeSubject() {
+        HeaderCollection headerCollection = HeaderCollection.builder()
+            .add(new FieldImpl("Subject", "Re: test"))
+            .build();
+
+        assertThat(headerCollection.getSubjectSet())
+            .containsOnly("test");
+    }
+
     @Test
     void displayNamesShouldBeRetreived() {
         HeaderCollection headerCollection = HeaderCollection.builder()
diff --git a/mailbox/store/src/test/resources/eml/pgpSignedMail.json 
b/mailbox/store/src/test/resources/eml/pgpSignedMail.json
index c26fd83b98..139bd3638c 100644
--- a/mailbox/store/src/test/resources/eml/pgpSignedMail.json
+++ b/mailbox/store/src/test/resources/eml/pgpSignedMail.json
@@ -161,7 +161,7 @@
   "cc": [],
   "bcc": [],
   "subject": [
-       "[SECURITY] [DSA 3278-1] libapache-mod-jk security update"
+       "libapache-mod-jk security update"
   ],
   "sentDate": "2015-06-03T19:14:32+0000",
   "attachments": [],
diff --git a/mailbox/store/src/test/resources/eml/spamMail.json 
b/mailbox/store/src/test/resources/eml/spamMail.json
index 93fcb811aa..468665807e 100644
--- a/mailbox/store/src/test/resources/eml/spamMail.json
+++ b/mailbox/store/src/test/resources/eml/spamMail.json
@@ -116,7 +116,7 @@
   "cc": [],
   "bcc": [],
   "subject": [
-       "[root] UNCHECKED contents in mail FROM <[email protected]>"
+       "UNCHECKED contents in mail FROM <[email protected]>"
   ],
   "sentDate": "2015-06-03T09:05:46+0000",
   "attachments": [
diff --git a/mailbox/store/src/test/resources/eml/spamMailNoHeaders.json 
b/mailbox/store/src/test/resources/eml/spamMailNoHeaders.json
index 6a9ca3f2f3..e0717172b3 100644
--- a/mailbox/store/src/test/resources/eml/spamMailNoHeaders.json
+++ b/mailbox/store/src/test/resources/eml/spamMailNoHeaders.json
@@ -29,7 +29,7 @@
   "cc": [],
   "bcc": [],
   "subject": [
-       "[root] UNCHECKED contents in mail FROM <[email protected]>"
+       "UNCHECKED contents in mail FROM <[email protected]>"
   ],
   "sentDate": "2015-06-03T09:05:46+0000",
   "attachments": [],


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to