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]
