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