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]

Reply via email to