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 2017/10/11 03:09:33 UTC
[5/7] james-project git commit: JAMES-2179 Filter out owner when
setting and reading sharedWith
JAMES-2179 Filter out owner when setting and reading sharedWith
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/39828ebe
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/39828ebe
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/39828ebe
Branch: refs/heads/master
Commit: 39828ebebc9412cf76c493b9d5802f8b51690009
Parents: 543aebc
Author: benwa <bt...@linagora.com>
Authored: Tue Oct 10 17:39:47 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Oct 11 10:08:49 2017 +0700
----------------------------------------------------------------------
.../james/mailbox/store/probe/ACLProbe.java | 3 ++
.../org/apache/james/modules/ACLProbeImpl.java | 11 +++++++
.../integration/GetMailboxesMethodTest.java | 21 +++++++++++++
.../integration/SetMailboxesMethodTest.java | 33 ++++++++++++++++++++
.../methods/SetMailboxesUpdateProcessor.java | 2 ++
.../apache/james/jmap/model/MailboxFactory.java | 6 +++-
.../apache/james/jmap/model/mailbox/Rights.java | 7 ++++-
7 files changed, 81 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/39828ebe/mailbox/store/src/main/java/org/apache/james/mailbox/store/probe/ACLProbe.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/probe/ACLProbe.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/probe/ACLProbe.java
index 986186e..1c5ba4d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/probe/ACLProbe.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/probe/ACLProbe.java
@@ -20,9 +20,12 @@
package org.apache.james.mailbox.store.probe;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
import org.apache.james.mailbox.model.MailboxPath;
public interface ACLProbe {
void replaceRights(MailboxPath mailboxPath, String targetUser, Rfc4314Rights rights) throws MailboxException;
+
+ MailboxACL retrieveRights(MailboxPath mailboxPath) throws MailboxException;
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/james-project/blob/39828ebe/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
index 0435e37..801ebe7 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
@@ -23,6 +23,7 @@ import javax.inject.Inject;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxACL.ACLCommand;
@@ -32,6 +33,7 @@ import org.apache.james.mailbox.store.probe.ACLProbe;
import org.apache.james.utils.GuiceProbe;
public class ACLProbeImpl implements GuiceProbe, ACLProbe {
+ private static final boolean RESET_RECENT = false;
private final MailboxManager mailboxManager;
@Inject
@@ -46,4 +48,13 @@ public class ACLProbeImpl implements GuiceProbe, ACLProbe {
ACLCommand command = MailboxACL.command().forUser(targetUser).rights(rights).asReplacement();
mailboxManager.applyRightsCommand(mailboxPath, command, mailboxSession);
}
+
+ @Override
+ public MailboxACL retrieveRights(MailboxPath mailboxPath) throws MailboxException {
+ MailboxSession mailboxSession = mailboxManager.createSystemSession(mailboxPath.getUser());
+
+ return mailboxManager.getMailbox(mailboxPath, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/james-project/blob/39828ebe/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 5e5c2cf..0e49be8 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
@@ -272,6 +272,27 @@ public abstract class GetMailboxesMethodTest {
}
@Test
+ public void getMailboxesShouldRemoveOwnerRight() throws Exception {
+ String mailboxName = "myMailbox";
+ String myMailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, alice, mailboxName).serialize();
+ String targetUser1 = "toUser1@domain.com";
+ Mailbox myMailbox = mailboxProbe.getMailbox(MailboxConstants.USER_NAMESPACE, alice, mailboxName);
+ aclProbe.replaceRights(myMailbox.generateAssociatedPath(), alice, new Rfc4314Rights(Right.Read, Right.Administer));
+ aclProbe.replaceRights(myMailbox.generateAssociatedPath(), targetUser1, new Rfc4314Rights(Right.Read, Right.Lookup));
+
+ given()
+ .header("Authorization", accessToken.serialize())
+ .body("[[\"getMailboxes\", {\"ids\": [\"" + myMailboxId + "\"]}, \"#0\"]]")
+ .when()
+ .post("/jmap")
+ .then()
+ .statusCode(200)
+ .body(NAME, equalTo("mailboxes"))
+ .body(FIRST_MAILBOX + ".name", equalTo(mailboxName))
+ .body(FIRST_MAILBOX + ".sharedWith", hasEntry(targetUser1, ImmutableList.of(LOOKUP, READ)));
+ }
+
+ @Test
public void getMailboxShouldReturnEmptySharedWithWhenNoDelegation() throws Exception {
String mailboxName = "myMailbox";
String myMailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, alice, mailboxName).serialize();
http://git-wip-us.apache.org/repos/asf/james-project/blob/39828ebe/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java
index 56fae73..baeac41 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java
@@ -44,11 +44,14 @@ import org.apache.james.GuiceJamesServer;
import org.apache.james.jmap.DefaultMailboxes;
import org.apache.james.jmap.HttpJmapAuthentication;
import org.apache.james.jmap.api.access.AccessToken;
+import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxACL.Right;
import org.apache.james.mailbox.model.MailboxConstants;
import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.probe.MailboxProbe;
+import org.apache.james.modules.ACLProbeImpl;
import org.apache.james.modules.MailboxProbeImpl;
import org.apache.james.probe.DataProbe;
import org.apache.james.utils.DataProbeImpl;
@@ -1467,6 +1470,36 @@ public abstract class SetMailboxesMethodTest {
}
@Test
+ public void updateShouldFilterOwnerACL() throws Exception {
+ String myBox = "myBox";
+ String user2 = "user2";
+ MailboxId mailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, myBox);
+
+ with()
+ .header("Authorization", accessToken.serialize())
+ .body("[" +
+ " [ \"setMailboxes\"," +
+ " {" +
+ " \"update\": {" +
+ " \"" + mailboxId.serialize() + "\" : {" +
+ " \"sharedWith\" : {\"" + username + "\": [\"a\", \"w\"]," +
+ " \"" + user2 + "\": [\"a\", \"w\"]}" +
+ " }" +
+ " }" +
+ " }," +
+ " \"#0\"" +
+ " ]" +
+ "]")
+ .post("/jmap");
+
+ MailboxACL acl = jmapServer.getProbe(ACLProbeImpl.class)
+ .retrieveRights(MailboxPath.forUser(username, myBox));
+
+ assertThat(acl.getEntries())
+ .doesNotContainKeys(MailboxACL.EntryKey.createUserEntryKey(username));
+ }
+
+ @Test
public void setMailboxesShouldUpdateMailboxNameWhenNameUpdateAskedOnExistingMailbox() {
MailboxId mailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "myBox");
String requestBody =
http://git-wip-us.apache.org/repos/asf/james-project/blob/39828ebe/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java
index 673741a..c08f335 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java
@@ -35,6 +35,7 @@ import org.apache.james.jmap.model.SetMailboxesResponse;
import org.apache.james.jmap.model.SetMailboxesResponse.Builder;
import org.apache.james.jmap.model.mailbox.Mailbox;
import org.apache.james.jmap.model.mailbox.MailboxUpdateRequest;
+import org.apache.james.jmap.model.mailbox.Rights.Username;
import org.apache.james.jmap.model.mailbox.Role;
import org.apache.james.jmap.utils.MailboxUtils;
import org.apache.james.mailbox.MailboxManager;
@@ -213,6 +214,7 @@ public class SetMailboxesUpdateProcessor implements SetMailboxesProcessor {
mailboxManager.setRights(originMailboxPath,
updateRequest.getSharedWith()
.get()
+ .removeEntriesFor(Username.forMailboxPath(originMailboxPath))
.toMailboxAcl(),
mailboxSession);
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/39828ebe/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 d6fe155..2c66f03 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
@@ -26,6 +26,7 @@ import javax.inject.Inject;
import org.apache.james.jmap.model.mailbox.Mailbox;
import org.apache.james.jmap.model.mailbox.MailboxNamespace;
import org.apache.james.jmap.model.mailbox.Rights;
+import org.apache.james.jmap.model.mailbox.Rights.Username;
import org.apache.james.jmap.model.mailbox.Role;
import org.apache.james.jmap.model.mailbox.SortOrder;
import org.apache.james.mailbox.MailboxManager;
@@ -103,6 +104,9 @@ public class MailboxFactory {
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()));
return Mailbox.builder()
.id(messageManager.getId())
.name(getName(mailboxPath, mailboxSession))
@@ -111,7 +115,7 @@ public class MailboxFactory {
.unreadMessages(mailboxCounters.getUnseen())
.totalMessages(mailboxCounters.getCount())
.sortOrder(SortOrder.getSortOrder(role))
- .sharedWith(Rights.fromACL(metaData.getACL()))
+ .sharedWith(rights)
.namespace(getNamespace(mailboxPath, mailboxSession))
.build();
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/39828ebe/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 2b15585..7807e14 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
@@ -31,6 +31,7 @@ import org.apache.commons.lang3.tuple.Pair;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxACL.EntryKey;
import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
+import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.util.GuavaUtils;
import org.apache.james.util.OptionalUtils;
import org.slf4j.Logger;
@@ -88,6 +89,10 @@ public class Rights {
}
public static class Username {
+ public static Username forMailboxPath(MailboxPath mailboxPath) {
+ return new Username(mailboxPath.getUser());
+ }
+
private final String value;
public Username(String value) {
@@ -206,7 +211,7 @@ public class Rights {
rights.asMap()
.entrySet()
.stream()
- .filter(entry -> entry.getKey().equals(username))
+ .filter(entry -> !entry.getKey().equals(username))
.flatMap(entry -> entry.getValue()
.stream()
.map(v -> Pair.of(entry.getKey(), v)))
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org