You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/11/18 02:51:10 UTC

[james-project] 36/44: JAMES-2632 MailboxMetaData could "cheaply" incorporate mailbox ACL

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 5861d4d466ee03639e3acabf57d5bd435ac4d0d6
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Oct 16 18:57:17 2019 +0700

    JAMES-2632 MailboxMetaData could "cheaply" incorporate mailbox ACL
---
 .../org/apache/james/mailbox/model/MailboxACL.java |  5 ++++
 .../james/mailbox/model/MailboxMetaData.java       |  9 +++++--
 .../apache/james/mailbox/MailboxManagerTest.java   | 28 ++++++++++++++++++++++
 .../james/mailbox/store/StoreMailboxManager.java   |  8 ++++---
 4 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
index e3f29fb..17378f0 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
@@ -531,6 +531,11 @@ public class MailboxACL {
                 return this;
             }
 
+            public Builder forOwner() {
+                key = OWNER_KEY;
+                return this;
+            }
+
             public Builder key(EntryKey key) {
                 this.key = key;
                 return this;
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxMetaData.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxMetaData.java
index 0ec6c0f..004dfff 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxMetaData.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxMetaData.java
@@ -61,7 +61,7 @@ public class MailboxMetaData implements Comparable<MailboxMetaData> {
     }
 
     public static MailboxMetaData unselectableMailbox(MailboxPath path, MailboxId mailboxId, char delimiter) {
-        return new MailboxMetaData(path, mailboxId, delimiter, Children.CHILDREN_ALLOWED_BUT_UNKNOWN, Selectability.NONE);
+        return new MailboxMetaData(path, mailboxId, delimiter, Children.CHILDREN_ALLOWED_BUT_UNKNOWN, Selectability.NONE, new MailboxACL());
     }
 
     public static  final Comparator<MailboxMetaData> COMPARATOR = Comparator
@@ -73,15 +73,20 @@ public class MailboxMetaData implements Comparable<MailboxMetaData> {
     private final Children inferiors;
     private final Selectability selectability;
     private final MailboxId mailboxId;
+    private final MailboxACL resolvedAcls;
 
-    public MailboxMetaData(MailboxPath path, MailboxId mailboxId, char delimiter, Children inferiors, Selectability selectability) {
+    public MailboxMetaData(MailboxPath path, MailboxId mailboxId, char delimiter, Children inferiors, Selectability selectability, MailboxACL resolvedAcls) {
         this.path = path;
         this.mailboxId = mailboxId;
         this.delimiter = delimiter;
         this.inferiors = inferiors;
         this.selectability = selectability;
+        this.resolvedAcls = resolvedAcls;
     }
 
+    public MailboxACL getResolvedAcls() {
+        return resolvedAcls;
+    }
 
     /**
      * Gets the inferiors status of this mailbox.
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index c3a81a1..5f634be 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -894,6 +894,34 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
         }
 
         @Test
+        void searchShouldReturnACL() throws Exception {
+            assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Namespace));
+            assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.ACL));
+            session = mailboxManager.createSystemSession(USER_1);
+            Optional<MailboxId> inboxId = mailboxManager.createMailbox(MailboxPath.inbox(session), session);
+
+            MailboxACL acl = MailboxACL.EMPTY.apply(MailboxACL.command()
+                .forUser(USER_2)
+                .rights(MailboxACL.Right.Read, MailboxACL.Right.Lookup)
+                .asAddition());
+            mailboxManager.setRights(inboxId.get(), acl, session);
+
+            List<MailboxMetaData> metaDatas = mailboxManager.search(
+                MailboxQuery.privateMailboxesBuilder(session)
+                    .matchesAllMailboxNames()
+                    .build(),
+                session);
+            assertThat(metaDatas)
+                .hasSize(1)
+                .first()
+                .extracting(MailboxMetaData::getResolvedAcls)
+                .isEqualTo(acl.apply(MailboxACL.command()
+                    .forOwner()
+                    .rights(MailboxACL.Rfc4314Rights.allExcept())
+                    .asAddition()));
+        }
+
+        @Test
         void searchShouldNotReturnResultsFromOtherUsers() throws Exception {
             session = mailboxManager.createSystemSession(USER_1);
             MailboxSession session2 = mailboxManager.createSystemSession(USER_2);
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 2f3ae29..e11ab25 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.exception.InsufficientRightsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.extension.PreDeletionHook;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -575,7 +576,7 @@ public class StoreMailboxManager implements MailboxManager {
         return mailboxes
             .stream()
             .filter(mailboxQuery::matches)
-            .map(mailbox -> toMailboxMetadata(session, mailboxes, mailbox))
+            .map(Throwing.<Mailbox, MailboxMetaData>function(mailbox -> toMailboxMetadata(session, mailboxes, mailbox)).sneakyThrow())
             .sorted(MailboxMetaData.COMPARATOR)
             .collect(Guavate.toImmutableList());
     }
@@ -598,13 +599,14 @@ public class StoreMailboxManager implements MailboxManager {
         return mailboxMapper.findNonPersonalMailboxes(session.getUser(), right).stream();
     }
 
-    private MailboxMetaData toMailboxMetadata(MailboxSession session, List<Mailbox> mailboxes, Mailbox mailbox) {
+    private MailboxMetaData toMailboxMetadata(MailboxSession session, List<Mailbox> mailboxes, Mailbox mailbox) throws UnsupportedRightException {
         return new MailboxMetaData(
             mailbox.generateAssociatedPath(),
             mailbox.getMailboxId(),
             getDelimiter(),
             computeChildren(session, mailboxes, mailbox),
-            Selectability.NONE);
+            Selectability.NONE,
+            storeRightManager.getResolvedMailboxACL(mailbox, session));
     }
 
     private MailboxMetaData.Children computeChildren(MailboxSession session, List<Mailbox> potentialChildren, Mailbox mailbox) {


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