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 7b951c16dc16bba1bb04c9136c144a360cc19ff1 Author: duc91 <[email protected]> AuthorDate: Mon Oct 5 12:01:02 2020 +0700 JAMES-3401 Handle Deserialize for FilterCondition when passing unsupported filter option on EmailQuery/MailboxQuery --- .../rfc8621/contract/EmailQueryMethodContract.scala | 6 ++++-- .../rfc8621/contract/MailboxQueryMethodContract.scala | 19 ++++++++++++++----- .../apache/james/jmap/json/EmailQuerySerializer.scala | 13 ++++++++++++- .../james/jmap/json/MailboxQuerySerializer.scala | 14 +++++++++++++- .../scala/org/apache/james/jmap/mail/EmailQuery.scala | 7 +++++++ .../org/apache/james/jmap/mail/MailboxQuery.scala | 3 +++ 6 files changed, 53 insertions(+), 9 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 fd75e05..f781e5d 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 @@ -5490,8 +5490,10 @@ trait EmailQueryMethodContract { .inPath("methodResponses[0][1]") .isEqualTo( """{ - | "type":"invalidArguments","description":"{\"errors\":[{\"path\":\"obj.filter\",\"messages\":[\"Unsupported filter\"]}]}"} - """.stripMargin) + | "type": "invalidArguments", + | "description": "{\"errors\":[{\"path\":\"obj.filter\",\"messages\":[\"These '[unsupported_option, role]' was unsupported filter options\"]}]}" + |} + |""".stripMargin) } @Test 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/MailboxQueryMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxQueryMethodContract.scala index ac6599d..68e07f9 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxQueryMethodContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxQueryMethodContract.scala @@ -468,12 +468,21 @@ trait MailboxQueryMethodContract { .body .asString - assertThatJson(response) - .inPath("methodResponses[0][1]") - .isEqualTo( + assertThatJson(response) + .isEqualTo( """{ - | "type":"invalidArguments","description":"{\"errors\":[{\"path\":\"obj.filter\",\"messages\":[\"Unsupported filter\"]}]}"} - """.stripMargin) + | "sessionState": "75128aab4b1b", + | "methodResponses": [ + | [ + | "error", + | { + | "type": "invalidArguments", + | "description": "{\"errors\":[{\"path\":\"obj.filter\",\"messages\":[\"These '[unsupported_option]' was unsupported filter options\"]}]}" + | }, + | "c1" + | ] + | ] + |}""".stripMargin) } @Test diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala index c1f9546..72ad05e 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala @@ -81,7 +81,18 @@ class EmailQuerySerializer @Inject()(mailboxIdFactory: MailboxId.Factory) { case _ => JsError(s"Expecting a JsString to represent a known operator") } - private implicit val filterConditionReads: Reads[FilterCondition] = Json.reads[FilterCondition] + private implicit val filterConditionReads: Reads[FilterCondition] = { + case JsObject(underlying) => { + val unsupported: collection.Set[String] = underlying.keySet.diff(FilterCondition.SUPPORTED) + if (unsupported.nonEmpty) { + JsError(s"These '${unsupported.mkString("[", ", ", "]")}' was unsupported filter options") + } else { + Json.reads[FilterCondition].reads(JsObject(underlying)) + } + } + case jsValue => Json.reads[FilterCondition].reads(jsValue) + } + private implicit val limitUnparsedReads: Reads[LimitUnparsed] = Json.valueReads[LimitUnparsed] private implicit val CanCalculateChangesFormat: Format[CanCalculateChanges] = Json.valueFormat[CanCalculateChanges] diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/MailboxQuerySerializer.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/MailboxQuerySerializer.scala index 79f8eb6..26eb2bb 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/MailboxQuerySerializer.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/MailboxQuerySerializer.scala @@ -40,7 +40,19 @@ object MailboxQuerySerializer { .getOrElse(JsError(s"$value is not a valid role")) case _ => JsError("Expecting a JsString to be representing a role") } - private implicit val filterReads: Reads[MailboxFilter] = Json.reads[MailboxFilter] + + private implicit val filterReads: Reads[MailboxFilter] = { + case JsObject(underlying) => { + val unsupported: collection.Set[String] = underlying.keySet.diff(MailboxFilter.SUPPORTED) + if (unsupported.nonEmpty) { + JsError(s"These '${unsupported.mkString("[", ", ", "]")}' was unsupported filter options") + } else { + Json.reads[MailboxFilter].reads(JsObject(underlying)) + } + } + case jsValue: JsValue => Json.reads[MailboxFilter].reads(jsValue) + } + private implicit val emailQueryRequestReads: Reads[MailboxQueryRequest] = Json.reads[MailboxQueryRequest] private implicit val queryStateWrites: Writes[QueryState] = Json.valueWrites[QueryState] diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala index d19a321..a178a11 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala @@ -55,6 +55,13 @@ sealed trait Header case class HeaderExist(name: String) extends Header case class HeaderContains(name: String, value: String) extends Header +object FilterCondition { + val SUPPORTED: Set[String] = Set("inMailbox", "inMailboxOtherThan", "before", "after", + "hasKeyword", "notKeyword", "minSize", "maxSize", + "hasAttachment", "allInThreadHaveKeyword", "someInThreadHaveKeyword", + "noneInThreadHaveKeyword", "text", "from", "to", + "cc", "bcc", "subject", "header", "body") +} case class FilterCondition(inMailbox: Option[MailboxId], inMailboxOtherThan: Option[Seq[MailboxId]], before: Option[UTCDate], diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxQuery.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxQuery.scala index 00b44e9..f271308 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxQuery.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxQuery.scala @@ -28,6 +28,9 @@ import org.apache.james.mailbox.model.MailboxId case class MailboxQueryRequest(accountId: AccountId, filter: MailboxFilter) extends WithAccountId +object MailboxFilter{ + val SUPPORTED: Set[String] = Set("role") +} case class MailboxFilter(role: Role) case class MailboxQueryResponse(accountId: AccountId, --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
