JAMES-2175 MailboxFactory should add may* properties to mailbox

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/6667c51f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/6667c51f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/6667c51f

Branch: refs/heads/master
Commit: 6667c51fdb2c5a33963aa26e86e507513dedf106
Parents: edca983
Author: benwa <btell...@linagora.com>
Authored: Mon Oct 9 11:17:39 2017 +0700
Committer: benwa <btell...@linagora.com>
Committed: Wed Oct 11 11:09:10 2017 +0700

----------------------------------------------------------------------
 .../integration/GetMailboxesMethodTest.java     | 12 +--
 .../apache/james/jmap/model/MailboxFactory.java | 22 +++--
 .../jmap/model/mailbox/MailboxNamespace.java    |  1 +
 .../apache/james/jmap/model/mailbox/Rights.java |  1 +
 .../james/jmap/model/MailboxFactoryTest.java    | 94 ++++++++++++++++++++
 5 files changed, 119 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/6667c51f/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
index 72797dd..629f0bf 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
@@ -421,12 +421,12 @@ public abstract class GetMailboxesMethodTest {
             .body(FIRST_MAILBOX + ".role", nullValue())
             .body(FIRST_MAILBOX + ".sortOrder", equalTo(1000))
             .body(FIRST_MAILBOX + ".mustBeOnlyMailbox", equalTo(false))
-            .body(FIRST_MAILBOX + ".mayReadItems", equalTo(false))
-            .body(FIRST_MAILBOX + ".mayAddItems", equalTo(false))
-            .body(FIRST_MAILBOX + ".mayRemoveItems", equalTo(false))
-            .body(FIRST_MAILBOX + ".mayCreateChild", equalTo(false))
-            .body(FIRST_MAILBOX + ".mayRename", equalTo(false))
-            .body(FIRST_MAILBOX + ".mayDelete", equalTo(false))
+            .body(FIRST_MAILBOX + ".mayReadItems", equalTo(true))
+            .body(FIRST_MAILBOX + ".mayAddItems", equalTo(true))
+            .body(FIRST_MAILBOX + ".mayRemoveItems", equalTo(true))
+            .body(FIRST_MAILBOX + ".mayCreateChild", equalTo(true))
+            .body(FIRST_MAILBOX + ".mayRename", equalTo(true))
+            .body(FIRST_MAILBOX + ".mayDelete", equalTo(true))
             .body(FIRST_MAILBOX + ".totalMessages", equalTo(1))
             .body(FIRST_MAILBOX + ".unreadMessages", equalTo(1))
             .body(FIRST_MAILBOX + ".unreadThreads", equalTo(0));

http://git-wip-us.apache.org/repos/asf/james-project/blob/6667c51f/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
index c14a9e1..3951d99 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
@@ -100,13 +100,15 @@ public class MailboxFactory {
     private Mailbox fromMessageManager(MessageManager messageManager, 
Optional<List<MailboxMetaData>> userMailboxesMetadata,
                                                  MailboxSession 
mailboxSession) throws MailboxException {
         MailboxPath mailboxPath = messageManager.getMailboxPath();
+        boolean isOwner = isSameUser(mailboxSession, mailboxPath);
         Optional<Role> role = Role.from(mailboxPath.getName());
         MailboxCounters mailboxCounters = 
messageManager.getMailboxCounters(mailboxSession);
         MessageManager.MetaData metaData = 
messageManager.getMetaData(NO_RESET_RECENT, mailboxSession, 
MessageManager.MetaData.FetchGroup.NO_COUNT);
 
-        System.out.println(messageManager.getMailboxPath());
         Rights rights = Rights.fromACL(metaData.getACL())
             
.removeEntriesFor(Username.forMailboxPath(messageManager.getMailboxPath()));
+        Username username = new 
Username(mailboxSession.getUser().getUserName());
+
         return Mailbox.builder()
             .id(messageManager.getId())
             .name(getName(mailboxPath, mailboxSession))
@@ -116,18 +118,28 @@ public class MailboxFactory {
             .totalMessages(mailboxCounters.getCount())
             .sortOrder(SortOrder.getSortOrder(role))
             .sharedWith(rights)
-            .namespace(getNamespace(mailboxPath, mailboxSession))
+            .mayAddItems(rights.mayAddItems(username).orElse(isOwner))
+            .mayCreateChild(rights.mayCreateChild(username).orElse(isOwner))
+            .mayDelete(rights.mayDelete(username).orElse(isOwner))
+            .mayReadItems(rights.mayReadItems(username).orElse(isOwner))
+            .mayRemoveItems(rights.mayRemoveItems(username).orElse(isOwner))
+            .mayRename(rights.mayRename(username).orElse(isOwner))
+            .namespace(getNamespace(mailboxPath, isOwner))
             .build();
     }
 
-    private MailboxNamespace getNamespace(MailboxPath mailboxPath, 
MailboxSession mailboxSession) {
-        String mailboxPathUser = mailboxPath.getUser();
-        if (mailboxSession.getUser().isSameUser(mailboxPathUser)) {
+    private MailboxNamespace getNamespace(MailboxPath mailboxPath, boolean 
isOwner) {
+            String mailboxPathUser = mailboxPath.getUser();
+        if (isOwner) {
             return MailboxNamespace.personal();
         }
         return MailboxNamespace.delegated(mailboxPathUser);
     }
 
+    private boolean isSameUser(MailboxSession mailboxSession, MailboxPath 
mailboxPath) {
+        return mailboxSession.getUser().isSameUser(mailboxPath.getUser());
+    }
+
     @VisibleForTesting String getName(MailboxPath mailboxPath, MailboxSession 
mailboxSession) {
         String name = mailboxPath.getName();
         if (name.contains(String.valueOf(mailboxSession.getPathDelimiter()))) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6667c51f/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxNamespace.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxNamespace.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxNamespace.java
index 51eb756..8c3cfb9 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxNamespace.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxNamespace.java
@@ -39,6 +39,7 @@ public class MailboxNamespace {
             this.type = type;
         }
     }
+
     public static MailboxNamespace delegated(String owner) {
         Preconditions.checkArgument(!StringUtils.isBlank(owner));
         return new MailboxNamespace(Type.Delegated, Optional.of(owner));

http://git-wip-us.apache.org/repos/asf/james-project/blob/6667c51f/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Rights.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Rights.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Rights.java
index 8b1de24..ae76218 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Rights.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Rights.java
@@ -122,6 +122,7 @@ public class Rights {
         public final int hashCode() {
             return Objects.hash(value);
         }
+
     }
 
     public static class Builder {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6667c51f/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
index eea3d30..4d18bdb 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
@@ -206,4 +206,98 @@ public class MailboxFactoryTest {
         assertThat(retrievedMailbox.getNamespace())
             .isEqualTo(MailboxNamespace.delegated(user));
     }
+
+    @Test
+    public void ownerShouldHaveFullRightsViaMayProperties() throws Exception {
+        MailboxPath inbox = MailboxPath.forUser(user, "inbox");
+        Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, 
mailboxSession);
+
+        Mailbox retrievedMailbox = sut.builder()
+            .id(mailboxId.get())
+            .session(mailboxSession)
+            .build()
+            .get();
+
+        softly.assertThat(retrievedMailbox.isMayAddItems()).isTrue();
+        softly.assertThat(retrievedMailbox.isMayCreateChild()).isTrue();
+        softly.assertThat(retrievedMailbox.isMayDelete()).isTrue();
+        softly.assertThat(retrievedMailbox.isMayReadItems()).isTrue();
+        softly.assertThat(retrievedMailbox.isMayRemoveItems()).isTrue();
+        softly.assertThat(retrievedMailbox.isMayRename()).isTrue();
+    }
+
+    @Test
+    public void delegatedUserShouldHaveMayAddItemsWhenAllowedToInsert() throws 
Exception {
+        MailboxPath inbox = MailboxPath.forUser(user, "inbox");
+        Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, 
mailboxSession);
+        mailboxManager.applyRightsCommand(inbox,
+            MailboxACL.command()
+                .forUser(otherUser)
+                .rights(MailboxACL.Right.Insert, MailboxACL.Right.Lookup)
+                .asAddition(),
+            mailboxSession);
+
+        Mailbox retrievedMailbox = sut.builder()
+            .id(mailboxId.get())
+            .session(otherMailboxSession)
+            .build()
+            .get();
+
+        softly.assertThat(retrievedMailbox.isMayAddItems()).isTrue();
+        softly.assertThat(retrievedMailbox.isMayCreateChild()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayDelete()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayReadItems()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayRemoveItems()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayRename()).isFalse();
+    }
+
+    @Test
+    public void delegatedUserShouldHaveMayReadItemsWhenAllowedToRead() throws 
Exception {
+        MailboxPath inbox = MailboxPath.forUser(user, "inbox");
+        Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, 
mailboxSession);
+        mailboxManager.applyRightsCommand(inbox,
+            MailboxACL.command()
+                .forUser(otherUser)
+                .rights(MailboxACL.Right.Read, MailboxACL.Right.Lookup)
+                .asAddition(),
+            mailboxSession);
+
+        Mailbox retrievedMailbox = sut.builder()
+            .id(mailboxId.get())
+            .session(otherMailboxSession)
+            .build()
+            .get();
+
+        softly.assertThat(retrievedMailbox.isMayAddItems()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayCreateChild()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayDelete()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayReadItems()).isTrue();
+        softly.assertThat(retrievedMailbox.isMayRemoveItems()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayRename()).isFalse();
+    }
+
+    @Test
+    public void 
delegatedUserShouldHaveMayRemoveItemsWhenAllowedToRemoveItems() throws 
Exception {
+        MailboxPath inbox = MailboxPath.forUser(user, "inbox");
+        Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, 
mailboxSession);
+        mailboxManager.applyRightsCommand(inbox,
+            MailboxACL.command()
+                .forUser(otherUser)
+                .rights(MailboxACL.Right.DeleteMessages, 
MailboxACL.Right.Lookup)
+                .asAddition(),
+            mailboxSession);
+
+        Mailbox retrievedMailbox = sut.builder()
+            .id(mailboxId.get())
+            .session(otherMailboxSession)
+            .build()
+            .get();
+
+        softly.assertThat(retrievedMailbox.isMayAddItems()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayCreateChild()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayDelete()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayReadItems()).isFalse();
+        softly.assertThat(retrievedMailbox.isMayRemoveItems()).isTrue();
+        softly.assertThat(retrievedMailbox.isMayRename()).isFalse();
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to