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 506563908bd4c62b4468065455278efd7b13ca0f
Author: RĂ©mi Kowalski <[email protected]>
AuthorDate: Thu Sep 24 14:50:45 2020 +0200

    JAMES-3387 validate accountId form mailbox/query
---
 .../contract/MailboxQueryMethodContract.scala      | 40 ++++++++++++++++++++++
 .../org/apache/james/jmap/mail/MailboxQuery.scala  |  3 +-
 .../james/jmap/method/MailboxQueryMethod.scala     | 33 +++++++++---------
 3 files changed, 58 insertions(+), 18 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/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 fe714be..76a6ec2 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
@@ -48,6 +48,46 @@ trait MailboxQueryMethodContract {
   }
 
   @Test
+  def mailboxQueryShouldFailWhenWrongAccountId(server: GuiceJamesServer): Unit 
= {
+    val request =
+      s"""{
+         |  "using": [
+         |    "urn:ietf:params:jmap:core",
+         |    "urn:ietf:params:jmap:mail"],
+         |  "methodCalls": [[
+         |    "Mailbox/query",
+         |    {
+         |      "accountId": "unknownAccountId",
+         |      "filter": {"role":"Inbox"}
+         |    },
+         |    "c1"]]
+         |}""".stripMargin
+
+    val response =  `given`
+      .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
+      .body(request)
+    .when
+      .post
+    .`then`
+      .log().ifValidationFails()
+      .statusCode(SC_OK)
+      .contentType(JSON)
+      .extract
+      .body
+      .asString
+
+    assertThatJson(response).isEqualTo(
+      """{
+        |  "sessionState": "75128aab4b1b",
+        |  "methodResponses": [
+        |    ["error", {
+        |      "type": "accountNotFound"
+        |    }, "c1"]
+        |  ]
+        |}""".stripMargin)
+  }
+
+  @Test
   def roleShouldAllowToRetrieveTheInbox(server: GuiceJamesServer): Unit = {
     val mailboxId: MailboxId = server.getProbe(classOf[MailboxProbeImpl])
       .createMailbox(MailboxPath.forUser(BOB, "INBOX"))
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 6d74b49..00b44e9 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
@@ -19,13 +19,14 @@
 
 package org.apache.james.jmap.mail
 
+import org.apache.james.jmap.method.WithAccountId
 import org.apache.james.jmap.model.Limit.Limit
 import org.apache.james.jmap.model.Position.Position
 import org.apache.james.jmap.model.{AccountId, CanCalculateChanges, Position, 
QueryState}
 import org.apache.james.mailbox.Role
 import org.apache.james.mailbox.model.MailboxId
 
-case class MailboxQueryRequest(accountId: AccountId, filter: MailboxFilter)
+case class MailboxQueryRequest(accountId: AccountId, filter: MailboxFilter) 
extends WithAccountId
 
 case class MailboxFilter(role: Role)
 
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxQueryMethod.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxQueryMethod.scala
index ea0200b..8070ab7 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxQueryMethod.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxQueryMethod.scala
@@ -27,33 +27,32 @@ import 
org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier
 import org.apache.james.jmap.model.DefaultCapabilities.{CORE_CAPABILITY, 
MAIL_CAPABILITY}
 import org.apache.james.jmap.model.Invocation.{Arguments, MethodName}
 import org.apache.james.jmap.model._
-import org.apache.james.jmap.routes.ProcessingContext
 import org.apache.james.mailbox.{MailboxSession, SystemMailboxesProvider}
 import org.apache.james.metrics.api.MetricFactory
-import org.reactivestreams.Publisher
 import play.api.libs.json.{JsError, JsSuccess}
 import reactor.core.scala.publisher.{SFlux, SMono}
 import reactor.core.scheduler.Schedulers
 
 class MailboxQueryMethod @Inject()(systemMailboxesProvider: 
SystemMailboxesProvider,
-                                   metricFactory: MetricFactory,
-                                   val sessionSupplier: SessionSupplier) 
extends Method {
+                                   val metricFactory: MetricFactory,
+                                   val sessionSupplier: SessionSupplier) 
extends MethodRequiringAccountId[MailboxQueryRequest] {
   override val methodName = MethodName("Mailbox/query")
   override val requiredCapabilities: Capabilities = 
Capabilities(CORE_CAPABILITY, MAIL_CAPABILITY)
 
-  override def process(capabilities: Set[CapabilityIdentifier], invocation: 
InvocationWithContext, mailboxSession: MailboxSession): 
Publisher[InvocationWithContext] =
-    metricFactory.decoratePublisherWithTimerMetricLogP99(JMAP_RFC8621_PREFIX + 
methodName.value,
-      asMailboxQueryRequest(invocation.invocation.arguments)
-        .flatMap(processRequest(mailboxSession, invocation.invocation, _))
-        .onErrorResume {
-          case e: IllegalArgumentException => SMono.just(
-            Invocation.error(
-              errorCode = ErrorCode.InvalidArguments,
-              description = e.getMessage,
-              methodCallId = invocation.invocation.methodCallId))
-          case e: Throwable => SMono.raiseError(e)
-        }
-        .map(invocationResult => InvocationWithContext(invocationResult, 
invocation.processingContext)))
+  override def doProcess(capabilities: Set[CapabilityIdentifier], invocation: 
InvocationWithContext, mailboxSession: MailboxSession, request: 
MailboxQueryRequest): SMono[InvocationWithContext] = {
+    processRequest(mailboxSession, invocation.invocation, request)
+      .onErrorResume {
+      case e: IllegalArgumentException => SMono.just(
+        Invocation.error(
+          errorCode = ErrorCode.InvalidArguments,
+          description = e.getMessage,
+          methodCallId = invocation.invocation.methodCallId))
+      case e: Throwable => SMono.raiseError(e)
+    }
+      .map(invocationResult => InvocationWithContext(invocationResult, 
invocation.processingContext))
+  }
+
+  override def getRequest(mailboxSession: MailboxSession, invocation: 
Invocation): SMono[MailboxQueryRequest] = 
asMailboxQueryRequest(invocation.arguments)
 
   private def processRequest(mailboxSession: MailboxSession, invocation: 
Invocation, request: MailboxQueryRequest): SMono[Invocation] = {
     
SFlux.fromPublisher(systemMailboxesProvider.getMailboxByRole(request.filter.role,
 mailboxSession.getUser))


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

Reply via email to