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