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 63667e42115119aaaaa7148956e22aa26fdfbd80 Author: duc91 <[email protected]> AuthorDate: Tue Sep 29 18:01:12 2020 +0700 JAMES-3391 Implement for bodyFiltering --- .../contract/EmailQueryMethodContract.scala | 245 ++------------------- .../james/jmap/utils/search/MailboxFilter.scala | 10 +- 2 files changed, 23 insertions(+), 232 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 fdd2d2a..750eab4 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 @@ -592,13 +592,13 @@ trait EmailQueryMethodContract { } } - def bodyFilterTextShouldSupportContainsOnBodyOrAttachmentsContentOrAttachmentsFileNameWhenBody(server: GuiceJamesServer): Unit = { + def bodyFilterShouldMatchTextPlainOnBody(server: GuiceJamesServer): Unit = { val message: Message = simpleMessage("this message body are uniqueeee") val mailboxPath = MailboxPath.inbox(BOB) server.getProbe(classOf[MailboxProbeImpl]).createMailbox(mailboxPath) val requestDate = Date.from(ZonedDateTime.now().minusDays(1).toInstant) val messageId1: MessageId = sendMessageToBobInbox(server, message, requestDate) - server.getProbe(classOf[MailboxProbeImpl]) + val messageId2: MessageId = server.getProbe(classOf[MailboxProbeImpl]) .appendMessage(BOB.asString, mailboxPath, AppendCommand.from( ClassLoader.getSystemResourceAsStream("eml/multipart_simple.eml"))) .getMessageId @@ -632,27 +632,14 @@ trait EmailQueryMethodContract { .body .asString - assertThatJson(response).isEqualTo( - s"""{ - | "sessionState": "75128aab4b1b", - | "methodResponses": [[ - | "Email/query", - | { - | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", - | "queryState": "${generateQueryState(messageId1)}", - | "canCalculateChanges": false, - | "position": 0, - | "limit": 256, - | "ids": ["${messageId1.serialize}"] - | }, - | "c1" - | ]] - |}""".stripMargin) + assertThatJson(response) + .inPath("$.methodResponses[0][1].ids") + .isEqualTo(s"""["${messageId1.serialize}"]}""") } } @Test - def bodyFilterTextShouldSupportContainsOnBodyOrAttachmentsContentOrAttachmentsFileNameWhenAttachmentsContent(server: GuiceJamesServer): Unit = { + def bodyFilterShouldMatchTextPlainOnAttachmentsContent(server: GuiceJamesServer): Unit = { val message: Message = simpleMessage("this message body are uniqueeee") val mailboxPath = MailboxPath.inbox(BOB) server.getProbe(classOf[MailboxProbeImpl]).createMailbox(mailboxPath) @@ -692,27 +679,14 @@ trait EmailQueryMethodContract { .body .asString - assertThatJson(response).isEqualTo( - s"""{ - | "sessionState": "75128aab4b1b", - | "methodResponses": [[ - | "Email/query", - | { - | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", - | "queryState": "${generateQueryState(messageId2)}", - | "canCalculateChanges": false, - | "position": 0, - | "limit": 256, - | "ids": ["${messageId2.serialize}"] - | }, - | "c1" - | ]] - |}""".stripMargin) + assertThatJson(response) + .inPath("$.methodResponses[0][1].ids") + .isEqualTo(s"""["${messageId2.serialize}"]}""") } } @Test - def bodyFilterTextShouldSupportContainsOnBodyOrAttachmentsContentOrAttachmentsFileNameWhenAttachmentsFileName(server: GuiceJamesServer): Unit = { + def bodyFilterShouldMatchTextPlainOnAttachmentsFileName(server: GuiceJamesServer): Unit = { val message: Message = simpleMessage("this message body are uniqueeee") val mailboxPath = MailboxPath.inbox(BOB) server.getProbe(classOf[MailboxProbeImpl]).createMailbox(mailboxPath) @@ -752,197 +726,10 @@ trait EmailQueryMethodContract { .body .asString - assertThatJson(response).isEqualTo( - s"""{ - | "sessionState": "75128aab4b1b", - | "methodResponses": [[ - | "Email/query", - | { - | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", - | "queryState": "${generateQueryState(messageId2)}", - | "canCalculateChanges": false, - | "position": 0, - | "limit": 256, - | "ids": ["${messageId2.serialize}"] - | }, - | "c1" - | ]] - |}""".stripMargin) - } - } - - @Test - def bodyMessageShouldSupportContains(server: GuiceJamesServer): Unit = { - val message: Message = buildTestMessage - val mailboxPath = MailboxPath.inbox(BOB) - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(mailboxPath) - val requestDate = Date.from(ZonedDateTime.now().minusDays(1).toInstant) - val messageId1: MessageId = sendMessageToBobInbox(server, message, requestDate) - val messageId2: MessageId = server.getProbe(classOf[MailboxProbeImpl]) - .appendMessage(BOB.asString, mailboxPath, AppendCommand.from(message)) - .getMessageId - - val request = - s"""{ - | "using": [ - | "urn:ietf:params:jmap:core", - | "urn:ietf:params:jmap:mail"], - | "methodCalls": [[ - | "Email/query", - | { - | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", - | "filter": { - | "body":"test" - | } - | }, - | "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).isEqualTo( - s"""{ - | "sessionState": "75128aab4b1b", - | "methodResponses": [[ - | "Email/query", - | { - | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", - | "queryState": "${generateQueryState(messageId2, messageId1)}", - | "canCalculateChanges": false, - | "position": 0, - | "limit": 256, - | "ids": ["${messageId2.serialize}", "${messageId1.serialize}"] - | }, - | "c1" - | ]] - |}""".stripMargin) - } - } - - @Test - def attachmentsContentShouldSupportContains(server: GuiceJamesServer): Unit = { - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) - val requestDate = Date.from(ZonedDateTime.now().minusDays(1).toInstant) - sendMessageToBobInbox(server, buildTestMessage, requestDate) - val messageId2: MessageId = server.getProbe(classOf[MailboxProbeImpl]) - .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.from( - ClassLoader.getSystemResourceAsStream("eml/multipart_simple.eml"))) - .getMessageId - - val request = - s"""{ - | "using": [ - | "urn:ietf:params:jmap:core", - | "urn:ietf:params:jmap:mail"], - | "methodCalls": [[ - | "Email/query", - | { - | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", - | "filter": { - | "body":"RSA PRIVATE" - | } - | }, - | "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).isEqualTo( - s"""{ - | "sessionState": "75128aab4b1b", - | "methodResponses": [[ - | "Email/query", - | { - | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", - | "queryState": "${generateQueryState(messageId2)}", - | "canCalculateChanges": false, - | "position": 0, - | "limit": 256, - | "ids": ["${messageId2.serialize}"] - | }, - | "c1" - | ]] - |}""".stripMargin) - } - } - - @Test - def attachmentFileNameShouldSupportContains(server: GuiceJamesServer): Unit = { - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) - val requestDate = Date.from(ZonedDateTime.now().minusDays(1).toInstant) - sendMessageToBobInbox(server, buildTestMessage, requestDate) - val messageId2: MessageId = server.getProbe(classOf[MailboxProbeImpl]) - .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.from( - ClassLoader.getSystemResourceAsStream("eml/multipart_simple.eml"))) - .getMessageId - - val request = - s"""{ - | "using": [ - | "urn:ietf:params:jmap:core", - | "urn:ietf:params:jmap:mail"], - | "methodCalls": [[ - | "Email/query", - | { - | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", - | "filter": { - | "body":"text2" - | } - | }, - | "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).isEqualTo( - s"""{ - | "sessionState": "75128aab4b1b", - | "methodResponses": [[ - | "Email/query", - | { - | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", - | "queryState": "${generateQueryState(messageId2)}", - | "canCalculateChanges": false, - | "position": 0, - | "limit": 256, - | "ids": ["${messageId2.serialize}"] - | }, - | "c1" - | ]] - |}""".stripMargin) + assertThatJson(response) + .inPath("$.methodResponses[0][1].ids") + .isEqualTo( + s"""["${messageId2.serialize}"]""") } } @@ -1120,7 +907,6 @@ trait EmailQueryMethodContract { .setSubject("test") .setBody("testmail", StandardCharsets.UTF_8) .build)) - .getMessageId val request = @@ -2339,8 +2125,7 @@ trait EmailQueryMethodContract { @ValueSource(strings = Array( "allInThreadHaveKeyword", "someInThreadHaveKeyword", - "noneInThreadHaveKeyword", - "body" + "noneInThreadHaveKeyword" )) def listMailsShouldReturnUnsupportedFilterWhenValidButUnsupported(unsupportedFilter: String): Unit = { val request = 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 6142886..c0580ed 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 @@ -27,7 +27,7 @@ import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier import org.apache.james.mailbox.MailboxSession import org.apache.james.mailbox.model.MultimailboxesSearchQuery.{AccessibleNamespace, Namespace, PersonalNamespace} import org.apache.james.mailbox.model.SearchQuery.DateResolution.Second -import org.apache.james.mailbox.model.SearchQuery.{AddressType, DateComparator, DateOperator, DateResolution, InternalDateCriterion} +import org.apache.james.mailbox.model.SearchQuery.{Criterion, AddressType, DateComparator, DateOperator, DateResolution, InternalDateCriterion} import org.apache.james.mailbox.model.{MultimailboxesSearchQuery, SearchQuery} import scala.jdk.CollectionConverters._ @@ -237,7 +237,13 @@ object MailboxFilter { case object Body extends QueryFilter { override def toQuery(builder: SearchQuery.Builder, request: EmailQueryRequest): Either[UnsupportedFilterException, SearchQuery.Builder] = request.filter.flatMap(_.body) match { - case Some(_) => Left(UnsupportedFilterException("body")) + case Some(text) => + val bodyFilterOr: List[Criterion] = List( + SearchQuery.attachmentContains(text.value), + SearchQuery.bodyContains(text.value), + SearchQuery.attachmentFileName(text.value)) + + Right(builder.andCriteria(SearchQuery.or(bodyFilterOr.asJava))) case None => Right(builder) } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
