This is an automated email from the ASF dual-hosted git repository.
hqtran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
The following commit(s) were added to refs/heads/master by this push:
new 68dadcca33 JAMES-3171 - JMAP - Mailbox/get - Fix missing MailboxDelete
right in response for shared mailbox (#2640)
68dadcca33 is described below
commit 68dadcca33cfe17919e3358ee62d4af449b18989
Author: vttran <[email protected]>
AuthorDate: Thu Feb 20 10:45:29 2025 +0700
JAMES-3171 - JMAP - Mailbox/get - Fix missing MailboxDelete right in
response for shared mailbox (#2640)
---
.../contract/MailboxGetMethodContract.scala | 72 ++++++++++++++++++++++
.../contract/MailboxSetMethodContract.scala | 4 +-
.../apache/james/jmap/mail/MailboxFactory.scala | 2 +-
.../scala/org/apache/james/jmap/mail/Rights.scala | 3 +-
.../org/apache/james/jmap/mail/RightsTest.scala | 4 +-
5 files changed, 79 insertions(+), 6 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/MailboxGetMethodContract.scala
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxGetMethodContract.scala
index 4b92d4bb47..f378f52c7b 100644
---
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxGetMethodContract.scala
+++
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxGetMethodContract.scala
@@ -812,6 +812,78 @@ trait MailboxGetMethodContract {
.body(s"$FIRST_MAILBOX.rights['$targetUser2']", contains(LOOKUP, READ))
}
+ @Test
+ def getMailboxesShouldReturnDeleteMailboxRight(server: GuiceJamesServer):
Unit = {
+ val targetUser2: String = "touser2@" + DOMAIN.asString
+ val mailboxName: String = "myMailbox"
+ val mailboxId: String = server.getProbe(classOf[MailboxProbeImpl])
+ .createMailbox(MailboxPath.forUser(BOB, mailboxName))
+ .serialize
+ server.getProbe(classOf[ACLProbeImpl])
+ .replaceRights(MailboxPath.forUser(BOB, mailboxName), targetUser2, new
MailboxACL.Rfc4314Rights(Right.Read, Right.Lookup, Right.DeleteMailbox))
+
+ val response: String = `given`
+ .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
+ .body(s"""{
+ | "using": [
+ | "urn:ietf:params:jmap:core",
+ | "urn:ietf:params:jmap:mail",
+ | "urn:apache:james:params:jmap:mail:shares"],
+ | "methodCalls": [[
+ | "Mailbox/get",
+ | {
+ | "accountId":
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "ids": ["${mailboxId}"]
+ | },
+ | "c1"]]
+ |}""".stripMargin)
+ .when
+ .post
+ .`then`
+ .statusCode(SC_OK)
+ .extract
+ .body
+ .asString
+
+ assertThatJson(response)
+ .withOptions(Option.IGNORING_ARRAY_ORDER)
+ .inPath("methodResponses[0][1].list[0].rights")
+ .isEqualTo("""{ "[email protected]": [ "l", "r", "x" ] }""")
+ }
+
+ @Test
+ def myRightsShouldReturnCorrectMayDeleteWhenHasRightInSharedMailbox(server:
GuiceJamesServer): Unit = {
+ val sharedMailboxName = "AndreShared"
+ val andreMailboxPath = MailboxPath.forUser(ANDRE, sharedMailboxName)
+ val andreMailboxId: String = server.getProbe(classOf[MailboxProbeImpl])
+ .createMailbox(andreMailboxPath)
+ .serialize
+
+ server.getProbe(classOf[ACLProbeImpl])
+ .replaceRights(andreMailboxPath, BOB.asString, new
MailboxACL.Rfc4314Rights(Right.Lookup, Right.DeleteMailbox))
+
+ `given`
+ .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
+ .body(s"""{
+ | "using": [
+ | "urn:ietf:params:jmap:core",
+ | "urn:ietf:params:jmap:mail",
+ | "urn:apache:james:params:jmap:mail:shares"],
+ | "methodCalls": [[
+ | "Mailbox/get",
+ | {
+ | "accountId":
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "ids": ["${andreMailboxId}"]
+ | },
+ | "c1"]]
+ |}""".stripMargin)
+ .when
+ .post
+ .`then`
+ .statusCode(SC_OK)
+ .body("methodResponses[0][1].list[0].myRights.mayDelete", equalTo(true))
+ }
+
@Test
@Tag(CategoryTags.BASIC_FEATURE)
def getMailboxesShouldReturnDelegatedNamespaceWhenSharedMailbox(server:
GuiceJamesServer): Unit = {
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 7277fc2f98..2e92c93fd1 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
@@ -6525,7 +6525,7 @@ trait MailboxSetMethodContract {
| "accountId":
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
| "update": {
| "${mailboxId.serialize}": {
- | "sharedWith/${ANDRE.asString()}": ["x"]
+ | "sharedWith/${ANDRE.asString()}": ["y"]
| }
| }
| },
@@ -6561,7 +6561,7 @@ trait MailboxSetMethodContract {
| "notUpdated": {
| "${mailboxId.serialize}": {
| "type": "invalidArguments",
- | "description": "Specified value do not match
the expected JSON format: List(((0),List(JsonValidationError(List(Unknown right
'x'),List()))))",
+ | "description": "Specified value do not match
the expected JSON format: List(((0),List(JsonValidationError(List(Unknown right
'y'),List()))))",
| "properties": [
| "sharedWith/[email protected]"
| ]
diff --git
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala
index 7c28dd9d09..1ec73d5b77 100644
---
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala
+++
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala
@@ -112,7 +112,7 @@ class MailboxFactory @Inject() (mailboxManager:
MailboxManager,
maySetKeywords = MaySetKeywords(rights.contains(Right.Write)),
mayCreateChild = MayCreateChild(false),
mayRename = MayRename(false),
- mayDelete = MayDelete(false),
+ mayDelete = MayDelete(rights.contains(Right.DeleteMailbox)),
maySubmit = MaySubmit(false))
}
diff --git
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Rights.scala
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Rights.scala
index 4473fbb1f6..888cca1395 100644
---
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Rights.scala
+++
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Rights.scala
@@ -67,8 +67,9 @@ object Right {
val DeleteMessages = Right(JavaRight.DeleteMessages)
val Write = Right(JavaRight.Write)
val Post = Right(JavaRight.Post)
+ val DeleteMailbox = Right(JavaRight.DeleteMailbox)
- private val allRights = Seq(Administer, Expunge, Insert, Lookup, Read, Seen,
DeleteMessages, Write, Post)
+ private val allRights = Seq(Administer, Expunge, Insert, Lookup, Read, Seen,
DeleteMessages, Write, Post, DeleteMailbox)
def forRight(right: JavaRight): Option[Right] =
allRights.find(_.right.equals(right))
diff --git
a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/mail/RightsTest.scala
b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/mail/RightsTest.scala
index c6f6d594b1..33562f7ceb 100644
---
a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/mail/RightsTest.scala
+++
b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/mail/RightsTest.scala
@@ -19,7 +19,7 @@
package org.apache.james.jmap.mail
-import org.apache.james.core.Username
+import org.apache.james.jmap.mail.Right.DeleteMailbox
import org.apache.james.mailbox.model.MailboxACL.{EntryKey, Rfc4314Rights =>
JavaRfc4314Rights, Right => JavaRight}
import org.apache.james.mailbox.model.{MailboxACL => JavaMailboxACL}
import org.scalatest.matchers.must.Matchers
@@ -85,7 +85,7 @@ class RightsTest extends AnyWordSpec with Matchers {
val acl = new JavaMailboxACL(Map(
USER_ENTRYKEY ->
JavaRfc4314Rights.fromSerializedRfc4314Rights("aetxk")).asJava)
- Rights.fromACL(MailboxACL.fromJava(acl)) must
be(Rights.of(USER_ENTRYKEY, Seq(Right.Administer, Right.Expunge,
Right.DeleteMessages)))
+ Rights.fromACL(MailboxACL.fromJava(acl)) must
be(Rights.of(USER_ENTRYKEY, Seq(Right.Administer, Right.Expunge,
Right.DeleteMessages, Right.DeleteMailbox)))
}
}
"To ACL" should {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]