This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 7c9a5651e954006f8bd6ef34e3170ba4449d5045 Author: Benoit Tellier <[email protected]> AuthorDate: Mon Sep 28 11:16:15 2020 +0700 JAMES-3377 Email/query: search by cc --- .../contract/EmailQueryMethodContract.scala | 153 ++++++++++++++++++++- .../james/jmap/utils/search/MailboxFilter.scala | 2 +- 2 files changed, 153 insertions(+), 2 deletions(-) diff --git a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala index ad26606..50a4a8c 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala @@ -45,6 +45,7 @@ import org.apache.james.mailbox.model.MailboxACL.Right import org.apache.james.mailbox.model.MailboxPath.inbox import org.apache.james.mailbox.model.{MailboxACL, MailboxPath, MessageId} import org.apache.james.mime4j.dom.Message +import org.apache.james.mime4j.field.address.DefaultAddressParser import org.apache.james.mime4j.message.DefaultMessageWriter import org.apache.james.modules.{ACLProbeImpl, MailboxProbeImpl} import org.apache.james.utils.DataProbeImpl @@ -1603,7 +1604,6 @@ trait EmailQueryMethodContract { "someInThreadHaveKeyword", "noneInThreadHaveKeyword", "text", - "cc", "bcc", "subject", "body" @@ -3705,6 +3705,157 @@ trait EmailQueryMethodContract { } } + @Test + def ccShouldFilterResultsWhenAddress(server: GuiceJamesServer): Unit = { + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) + def messageBuilder = Message.Builder + .of + .setSubject("test") + .setBody("testmail", StandardCharsets.UTF_8) + val messageId1 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder + .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]")) + .build)) + .getMessageId + val messageId2 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder + .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]")) + .build)) + .getMessageId + val messageId3 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder + .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]")) + .build)) + .getMessageId + val messageId4 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder + .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"), + DefaultAddressParser.DEFAULT.parseMailbox("[email protected]")) + .build)) + .getMessageId + val messageId5 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder.build)) + .getMessageId + val messageId6 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder + .setCc(DefaultAddressParser.DEFAULT.parseMailbox("\"User\" <[email protected]>")) + .build)) + .getMessageId + val messageId7 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder + .setCc(DefaultAddressParser.DEFAULT.parseMailbox("\"[email protected]\" <[email protected]>")) + .build)) + .getMessageId + + val request = + s"""{ + | "using": [ + | "urn:ietf:params:jmap:core", + | "urn:ietf:params:jmap:mail"], + | "methodCalls": [[ + | "Email/query", + | { + | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + | "filter" : { + | "cc": "[email protected]" + | } + | }, + | "c1"]] + |}""".stripMargin + + awaitAtMostTenSeconds.untilAsserted { () => + val response = `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(request) + .when + .post + .`then` + .statusCode(SC_OK) + .contentType(JSON) + .extract + .body + .asString + + assertThatJson(response) + .withOptions(new Options(IGNORING_ARRAY_ORDER)) + .inPath("$.methodResponses[0][1].ids") + .isEqualTo(s"""["${messageId7.serialize}", "${messageId6.serialize}", "${messageId4.serialize}", "${messageId1.serialize}"]""") + } + } + + @Test + def ccShouldFilterResultsWhenNotAnAddress(server: GuiceJamesServer): Unit = { + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) + def messageBuilder = Message.Builder + .of + .setSubject("test") + .setBody("testmail", StandardCharsets.UTF_8) + val messageId1 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder + .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]")) + .build)) + .getMessageId + val messageId2 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder + .setCc(DefaultAddressParser.DEFAULT.parseMailbox("\"Display\" <[email protected]>")) + .build)) + .getMessageId + val messageId3 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder + .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]")) + .build)) + .getMessageId + val messageId4 = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.builder().build( + messageBuilder.build)) + .getMessageId + + val request = + s"""{ + | "using": [ + | "urn:ietf:params:jmap:core", + | "urn:ietf:params:jmap:mail"], + | "methodCalls": [[ + | "Email/query", + | { + | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + | "filter" : { + | "cc": "Display" + | } + | }, + | "c1"]] + |}""".stripMargin + + awaitAtMostTenSeconds.untilAsserted { () => + val response = `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(request) + .when + .post + .`then` + .statusCode(SC_OK) + .contentType(JSON) + .extract + .body + .asString + + assertThatJson(response) + .withOptions(new Options(IGNORING_ARRAY_ORDER)) + .inPath("$.methodResponses[0][1].ids") + .isEqualTo(s"""["${messageId2.serialize}", "${messageId3.serialize}"]""") + } + } + @ParameterizedTest @MethodSource(value = Array("jmapSystemKeywords")) def listMailsNotBySystemKeywordShouldReturnOnlyMailsWithoutThisSystemKeyword(keywordFlag: Flags, keywordName: String, server: GuiceJamesServer): Unit = { diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala index 17f81bd..25753d1 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala @@ -199,7 +199,7 @@ object MailboxFilter { case object Cc extends QueryFilter { override def toQuery(builder: SearchQuery.Builder, request: EmailQueryRequest): Either[UnsupportedFilterException, SearchQuery.Builder] = request.filter.flatMap(_.cc) match { - case Some(_) => Left(UnsupportedFilterException("cc")) + case Some(cc) => Right(builder.andCriteria(SearchQuery.address(AddressType.Cc, cc.value))) case None => Right(builder) } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
