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 <btell...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org