This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 1c6809c87f21612d6a16632bf7093479741a4b4b Author: duc91 <[email protected]> AuthorDate: Wed Aug 12 17:08:08 2020 +0700 JAMES-3354: handle InsufficientRightsException --- .../contract/MailboxSetMethodContract.scala | 67 +++++++++++++++++++++- .../james/jmap/method/MailboxSetMethod.scala | 36 ++++++------ 2 files changed, 84 insertions(+), 19 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/MailboxSetMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxSetMethodContract.scala index 893c111..5f86a34 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxSetMethodContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxSetMethodContract.scala @@ -27,8 +27,9 @@ import org.apache.http.HttpStatus.SC_OK import org.apache.james.GuiceJamesServer import org.apache.james.jmap.http.UserCredential import org.apache.james.jmap.rfc8621.contract.Fixture._ -import org.apache.james.mailbox.model.{MailboxId, MailboxPath} -import org.apache.james.modules.MailboxProbeImpl +import org.apache.james.mailbox.model.MailboxACL.Right +import org.apache.james.mailbox.model.{MailboxACL, MailboxId, MailboxPath} +import org.apache.james.modules.{ACLProbeImpl, MailboxProbeImpl} import org.apache.james.utils.DataProbeImpl import org.assertj.core.api.Assertions import org.junit.jupiter.api.{BeforeEach, Disabled, Test} @@ -606,4 +607,66 @@ trait MailboxSetMethodContract { | "c1"]] |}""".stripMargin) } + + @Test + def mailboxSetShouldNotCreateMailboxWhenMailboxItShared(server: GuiceJamesServer): Unit = { + val path = MailboxPath.forUser(ANDRE, "mailbox") + val mailboxId: MailboxId = server.getProbe(classOf[MailboxProbeImpl]).createMailbox(path) + + server.getProbe(classOf[ACLProbeImpl]) + .replaceRights(path, BOB.asString, new MailboxACL.Rfc4314Rights(Right.Lookup, Right.Read, Right.CreateMailbox)) + val request = + s""" + |{ + | "using": [ "urn:ietf:params:jmap:core", "urn:ietf:params:jmap:mail" ], + | "methodCalls": [ + | [ + | "Mailbox/set", + | { + | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + | "create": { + | "C42": { + | "name": "childMailbox", + | "parentId":"${mailboxId.serialize}" + | } + | } + | }, + | "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( + s"""{ + | "sessionState": "75128aab4b1b", + | "methodResponses": [[ + | "Mailbox/set", + | { + | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + | "newState": "000001", + | "notCreated": { + | "C42": { + | "type": "invalidArguments", + | "description": "Insufficient rights", + | "properties":{"value":["parentId"]} + | } + | } + | }, + | "c1"]] + |}""".stripMargin) + } } diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetMethod.scala index 3ebc3bc..1bee2f9 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetMethod.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetMethod.scala @@ -27,7 +27,7 @@ import org.apache.james.jmap.mail.{IsSubscribed, MailboxCreationRequest, Mailbox import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier import org.apache.james.jmap.model.Invocation.{Arguments, MethodName} import org.apache.james.jmap.model.{Invocation, State} -import org.apache.james.mailbox.exception.{MailboxExistsException, MailboxNameException, MailboxNotFoundException} +import org.apache.james.mailbox.exception.{InsufficientRightsException, MailboxExistsException, MailboxNameException, MailboxNotFoundException} import org.apache.james.mailbox.model.{MailboxId, MailboxPath} import org.apache.james.mailbox.{MailboxManager, MailboxSession} import org.apache.james.metrics.api.MetricFactory @@ -43,36 +43,38 @@ sealed trait CreationResult { } case class CreationSuccess(mailboxCreationId: MailboxCreationId, mailboxId: MailboxId) extends CreationResult + case class CreationFailure(mailboxCreationId: MailboxCreationId, exception: Exception) extends CreationResult { def asMailboxSetError: MailboxSetError = exception match { case e: MailboxNotFoundException => MailboxSetError.invalidArgument(Some(SetErrorDescription(e.getMessage)), Some(Properties(List("parentId")))) case e: MailboxExistsException => MailboxSetError.invalidArgument(Some(SetErrorDescription(e.getMessage)), Some(Properties(List("name")))) case e: MailboxNameException => MailboxSetError.invalidArgument(Some(SetErrorDescription(e.getMessage)), Some(Properties(List("name")))) + case _: InsufficientRightsException => MailboxSetError.invalidArgument(Some(SetErrorDescription("Insufficient rights")), Some(Properties(List("parentId")))) case _ => MailboxSetError.serverFail(Some(SetErrorDescription(exception.getMessage)), None) } } case class CreationResults(created: Seq[CreationResult]) { def retrieveCreated: Map[MailboxCreationId, MailboxId] = created - .flatMap(result => result match { - case success: CreationSuccess => Some((success.mailboxCreationId, success.mailboxId)) - case _ => None - }) - .toSet - .toMap + .flatMap(result => result match { + case success: CreationSuccess => Some(success.mailboxCreationId, success.mailboxId) + case _ => None + }) + .toSet + .toMap def retrieveErrors: Map[MailboxCreationId, MailboxSetError] = created - .flatMap(result => result match { - case failure: CreationFailure => Some((failure.mailboxCreationId, failure.asMailboxSetError)) - case _ => None - }) - .toSet - .toMap + .flatMap(result => result match { + case failure: CreationFailure => Some(failure.mailboxCreationId, failure.asMailboxSetError) + case _ => None + }) + .toSet + .toMap } -class MailboxSetMethod @Inject() (serializer: Serializer, - mailboxManager: MailboxManager, - metricFactory: MetricFactory) extends Method { +class MailboxSetMethod @Inject()(serializer: Serializer, + mailboxManager: MailboxManager, + metricFactory: MetricFactory) extends Method { override val methodName: MethodName = MethodName("Mailbox/set") @@ -80,7 +82,7 @@ class MailboxSetMethod @Inject() (serializer: Serializer, metricFactory.decoratePublisherWithTimerMetricLogP99(JMAP_RFC8621_PREFIX + methodName.value, asMailboxSetRequest(invocation.arguments) .flatMap(mailboxSetRequest => { - val (unparsableCreateRequests, createRequests) = parseCreateRequests(mailboxSetRequest) + val (unparsableCreateRequests, createRequests) = parseCreateRequests(mailboxSetRequest) for { creationResults <- createMailboxes(mailboxSession, createRequests) } yield createResponse(invocation, mailboxSetRequest, unparsableCreateRequests, creationResults) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
