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 ad...@apache.org on 2017/11/15 08:02:04 UTC
[06/11] james-project git commit: MAILBOX-316 New JMAP listener for
adding lookup right to parent mailbox when child mailbox has 'l' right
MAILBOX-316 New JMAP listener for adding lookup right to parent
mailbox when child mailbox has 'l' right
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/75622f7b
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/75622f7b
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/75622f7b
Branch: refs/heads/master
Commit: 75622f7b13c73b745f8bb812e206d83ce36ed0a2
Parents: ef4b79c
Author: quynhn <qn...@linagora.com>
Authored: Mon Nov 6 16:04:21 2017 +0700
Committer: quynhn <qn...@linagora.com>
Committed: Wed Nov 15 09:33:58 2017 +0700
----------------------------------------------------------------------
.../modules/mailbox/CassandraMailboxModule.java | 4 +
.../modules/mailbox/MemoryMailboxModule.java | 4 +
server/protocols/jmap/pom.xml | 4 +
.../event/PropagateLookupRightListener.java | 128 +++++++
.../event/PropagateLookupRightListenerTest.java | 340 +++++++++++++++++++
5 files changed, 480 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/75622f7b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index 220f351..35e524c 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -28,6 +28,7 @@ import org.apache.james.mailbox.BlobManager;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MessageIdManager;
+import org.apache.james.mailbox.RightManager;
import org.apache.james.mailbox.SubscriptionManager;
import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
@@ -59,6 +60,7 @@ import org.apache.james.mailbox.store.NoMailboxPathLocker;
import org.apache.james.mailbox.store.StoreAttachmentManager;
import org.apache.james.mailbox.store.StoreBlobManager;
import org.apache.james.mailbox.store.StoreMessageIdManager;
+import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
@@ -107,6 +109,7 @@ public class CassandraMailboxModule extends AbstractModule {
bind(CassandraUserMailboxRightsDAO.class).in(Scopes.SINGLETON);
bind(CassandraACLMapper.class).in(Scopes.SINGLETON);
bind(StoreBlobManager.class).in(Scopes.SINGLETON);
+ bind(StoreRightManager.class).in(Scopes.SINGLETON);
bind(BlobManager.class).to(StoreBlobManager.class);
bind(MessageMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
@@ -125,6 +128,7 @@ public class CassandraMailboxModule extends AbstractModule {
bind(MessageId.Factory.class).to(CassandraMessageId.Factory.class);
bind(MessageIdManager.class).to(StoreMessageIdManager.class);
bind(AttachmentManager.class).to(StoreAttachmentManager.class);
+ bind(RightManager.class).to(StoreRightManager.class);
Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
cassandraDataDefinitions.addBinding().to(org.apache.james.mailbox.cassandra.modules.CassandraAclModule.class);
http://git-wip-us.apache.org/repos/asf/james-project/blob/75622f7b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
index 204dbf3..32349e8 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
@@ -28,6 +28,7 @@ import org.apache.james.mailbox.BlobManager;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MessageIdManager;
+import org.apache.james.mailbox.RightManager;
import org.apache.james.mailbox.SubscriptionManager;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.extractor.TextExtractor;
@@ -49,6 +50,7 @@ import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
import org.apache.james.mailbox.store.StoreAttachmentManager;
import org.apache.james.mailbox.store.StoreBlobManager;
import org.apache.james.mailbox.store.StoreMessageIdManager;
+import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.StoreSubscriptionManager;
import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
@@ -99,6 +101,7 @@ public class MemoryMailboxModule extends AbstractModule {
bind(MessageSearchIndex.class).to(SimpleMessageSearchIndex.class);
bind(TextExtractor.class).to(JsoupTextExtractor.class);
+ bind(RightManager.class).to(StoreRightManager.class);
bind(StoreBlobManager.class).in(Scopes.SINGLETON);
bind(InMemoryMailboxSessionMapperFactory.class).in(Scopes.SINGLETON);
@@ -113,6 +116,7 @@ public class MemoryMailboxModule extends AbstractModule {
bind(StoreMessageIdManager.class).in(Scopes.SINGLETON);
bind(MailboxEventDispatcher.class).in(Scopes.SINGLETON);
bind(StoreAttachmentManager.class).in(Scopes.SINGLETON);
+ bind(StoreRightManager.class).in(Scopes.SINGLETON);
Multibinder.newSetBinder(binder(), MailboxManagerDefinition.class)
.addBinding()
http://git-wip-us.apache.org/repos/asf/james-project/blob/75622f7b/server/protocols/jmap/pom.xml
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/pom.xml b/server/protocols/jmap/pom.xml
index 5cebbd0..f03b6e4 100644
--- a/server/protocols/jmap/pom.xml
+++ b/server/protocols/jmap/pom.xml
@@ -45,6 +45,10 @@
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
+ <artifactId>apache-james-mailbox-store</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
<artifactId>apache-james-mailbox-memory</artifactId>
<scope>test</scope>
</dependency>
http://git-wip-us.apache.org/repos/asf/james-project/blob/75622f7b/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
new file mode 100644
index 0000000..fe12d68
--- /dev/null
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
@@ -0,0 +1,128 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.jmap.event;
+
+import java.util.stream.Stream;
+
+import javax.inject.Inject;
+
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.RightManager;
+import org.apache.james.mailbox.acl.ACLDiff;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxACL.Entry;
+import org.apache.james.mailbox.model.MailboxACL.Right;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Throwables;
+
+public class PropagateLookupRightListener implements MailboxListener {
+ private static final Logger LOGGER = LoggerFactory.getLogger(PropagateLookupRightListener.class);
+
+ private final RightManager rightManager;
+
+ @Inject
+ public PropagateLookupRightListener(RightManager rightManager) {
+ this.rightManager = rightManager;
+ }
+
+ @Override
+ public ListenerType getType() {
+ return ListenerType.ONCE;
+ }
+
+ @Override
+ public ExecutionMode getExecutionMode() {
+ return ExecutionMode.SYNCHRONOUS;
+ }
+
+ @Override
+ public void event(Event event) {
+ MailboxSession mailboxSession = event.getSession();
+
+ if (event instanceof MailboxACLUpdated) {
+ MailboxACLUpdated aclUpdateEvent = (MailboxACLUpdated) event;
+
+ updateLookupRightOnParent(mailboxSession, event.getMailboxPath(), aclUpdateEvent.getAclDiff());
+ } else if (event instanceof MailboxRenamed) {
+ MailboxRenamed renamedEvent = (MailboxRenamed) event;
+ updateLookupRightOnParent(mailboxSession, renamedEvent.getNewPath());
+ }
+ }
+
+ private void updateLookupRightOnParent(MailboxSession session, MailboxPath path) {
+ try {
+ MailboxACL acl = rightManager.listRights(path, session);
+ listAncestors(session, path)
+ .forEach(parentMailboxPath ->
+ updateLookupRight(
+ session,
+ parentMailboxPath,
+ acl.getEntries()
+ .entrySet()
+ .stream()
+ .map(entry -> new Entry(entry.getKey(), entry.getValue()))
+ ));
+ } catch (MailboxException e) {
+ Throwables.propagate(e);
+ }
+ }
+
+ private void updateLookupRightOnParent(MailboxSession mailboxSession, MailboxPath mailboxPath, ACLDiff aclDiff) {
+ listAncestors(mailboxSession, mailboxPath)
+ .forEach(path ->
+ updateLookupRight(
+ mailboxSession, path,
+ Stream.concat(aclDiff.addedEntries(), aclDiff.changedEntries())
+ ));
+ }
+
+ private void updateLookupRight(MailboxSession session, MailboxPath mailboxPath, Stream<Entry> entries) {
+ entries
+ .filter(entry -> !entry.getKey().isNegative())
+ .filter(entry -> entry.getValue().contains(Right.Lookup))
+ .forEach(entry -> applyLookupRight(session, mailboxPath, entry));
+ }
+
+ private Stream<MailboxPath> listAncestors(MailboxSession mailboxSession, MailboxPath mailboxPath) {
+ return mailboxPath.getHierarchyLevels(mailboxSession.getPathDelimiter())
+ .stream()
+ .filter(hierarchyMailboxPath -> !hierarchyMailboxPath.equals(mailboxPath));
+ }
+
+ private void applyLookupRight(MailboxSession session, MailboxPath mailboxPath, Entry entry) {
+ try {
+ rightManager.applyRightsCommand(mailboxPath,
+ MailboxACL.command()
+ .rights(Right.Lookup)
+ .key(entry.getKey())
+ .asAddition(),
+ session);
+ } catch (MailboxException e) {
+ LOGGER.error(String.format("Mailbox '%s' does not exist, user '%s' cannot share mailbox",
+ mailboxPath,
+ session.getUser().getUserName()), e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/75622f7b/server/protocols/jmap/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
new file mode 100644
index 0000000..4cf96ad
--- /dev/null
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
@@ -0,0 +1,340 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.jmap.event;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.acl.GroupMembershipResolver;
+import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
+import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
+import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxACL.Entry;
+import org.apache.james.mailbox.model.MailboxACL.EntryKey;
+import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
+import org.apache.james.mailbox.model.MailboxACL.Right;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.apache.james.mailbox.store.StoreRightManager;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PropagateLookupRightListenerTest {
+ private static final boolean RESET_RECENT = false;
+ private static final String OWNER_USER = "user";
+ private static final String SHARED_USER = "sharee";
+ private static final EntryKey SHARED_USER_KEY = EntryKey.createUserEntryKey(SHARED_USER);
+
+ private static final MailboxPath PARENT_MAILBOX = MailboxPath.forUser(OWNER_USER, "shared");
+ private static final MailboxPath CHILD_MAILBOX = MailboxPath.forUser(OWNER_USER, "shared.sub1");
+
+ private static final MailboxPath PARENT_MAILBOX1 = MailboxPath.forUser(OWNER_USER, "shared1");
+ private static final MailboxPath CHILD_MAILBOX1 = MailboxPath.forUser(OWNER_USER, "shared1.sub1");
+
+ private static final MailboxPath GRAND_CHILD_MAILBOX = MailboxPath.forUser(OWNER_USER, "shared.sub1.sub2");
+
+ private StoreRightManager storeRightManager;
+ private StoreMailboxManager storeMailboxManager;
+ private PropagateLookupRightListener testee;
+
+ private MailboxSession mailboxSession = new MockMailboxSession(OWNER_USER);
+
+ private MailboxId parentMailboxId;
+ private MailboxId parentMailboxId1;
+ private MailboxId childMailboxId;
+ private MailboxId childMailboxId1;
+ private MailboxId grandChildMailboxId;
+ private Entry lookupEntry;
+
+ private MailboxSessionMapperFactory mailboxMapper;
+
+ @Before
+ public void setup() throws Exception {
+ GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
+ storeMailboxManager = new InMemoryIntegrationResources()
+ .createMailboxManager(groupMembershipResolver);
+ storeRightManager = storeMailboxManager.getStoreRightManager();
+ mailboxMapper = storeMailboxManager.getMapperFactory();
+
+ testee = new PropagateLookupRightListener(storeRightManager);
+ storeMailboxManager.addGlobalListener(testee, mailboxSession);
+
+ parentMailboxId = storeMailboxManager.createMailbox(PARENT_MAILBOX, mailboxSession).get();
+ parentMailboxId1 = storeMailboxManager.createMailbox(PARENT_MAILBOX1, mailboxSession).get();
+ childMailboxId = storeMailboxManager.createMailbox(CHILD_MAILBOX, mailboxSession).get();
+ childMailboxId1 = storeMailboxManager.createMailbox(CHILD_MAILBOX1, mailboxSession).get();
+ grandChildMailboxId = storeMailboxManager.createMailbox(GRAND_CHILD_MAILBOX, mailboxSession).get();
+
+ lookupEntry = new Entry(SHARED_USER, "l");
+ }
+
+ @Test
+ public void getTypeShouldReturnOnce() throws Exception {
+ assertThat(testee.getType()).isEqualTo(MailboxListener.ListenerType.ONCE);
+ }
+
+ @Test
+ public void getExecutionModeShouldReturnAsynchronous() throws Exception {
+ assertThat(testee.getExecutionMode()).isEqualTo(MailboxListener.ExecutionMode.SYNCHRONOUS);
+ }
+
+ @Test
+ public void eventShouldDoNothingWhenEmptyNewRights() throws Exception {
+ storeRightManager.applyRightsCommand(
+ GRAND_CHILD_MAILBOX,
+ MailboxACL.command()
+ .key(SHARED_USER_KEY)
+ .rights()
+ .asAddition(),
+ mailboxSession);
+
+ MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualACL.getEntries())
+ .doesNotContainKeys(SHARED_USER_KEY);
+ }
+
+ @Test
+ public void eventShouldDoNothingWhenNewACLIsTheSameAsTheOldOne() throws Exception {
+ Mailbox grandChildMailbox = mailboxMapper.getMailboxMapper(mailboxSession).findMailboxById(grandChildMailboxId);
+ mailboxMapper.getMailboxMapper(mailboxSession).setACL(grandChildMailbox, new MailboxACL(
+ new Entry(SHARED_USER_KEY, new Rfc4314Rights(Right.Lookup))));
+
+ storeRightManager.applyRightsCommand(
+ GRAND_CHILD_MAILBOX,
+ MailboxACL.command()
+ .key(SHARED_USER_KEY)
+ .rights(Right.Lookup)
+ .asAddition(),
+ mailboxSession);
+
+ MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualACL.getEntries())
+ .doesNotContainKeys(SHARED_USER_KEY);
+ }
+
+ @Test
+ public void eventShouldUpdateParentWhenMailboxACLAddLookupRight() throws Exception {
+ storeRightManager.applyRightsCommand(
+ GRAND_CHILD_MAILBOX,
+ MailboxACL.command()
+ .key(SHARED_USER_KEY)
+ .rights(Right.Lookup)
+ .asAddition(),
+ mailboxSession);
+
+ MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualACL.getEntries())
+ .hasSize(2)
+ .contains(lookupEntry);
+ }
+
+ @Test
+ public void eventShouldUpdateParentWhenMailboxACLUpdateLookupRight() throws Exception {
+ Mailbox grandChildMailbox = mailboxMapper.getMailboxMapper(mailboxSession).findMailboxById(grandChildMailboxId);
+ mailboxMapper.getMailboxMapper(mailboxSession).setACL(grandChildMailbox, new MailboxACL(
+ new Entry(SHARED_USER_KEY, new Rfc4314Rights(Right.Write))));
+
+ storeRightManager.setRights(
+ GRAND_CHILD_MAILBOX,
+ new MailboxACL(
+ new Entry(SHARED_USER_KEY, new Rfc4314Rights(Right.Lookup))),
+ mailboxSession);
+
+ MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualACL.getEntries())
+ .hasSize(2)
+ .contains(lookupEntry);
+ }
+
+ @Test
+ public void eventShouldUpdateAllParentWhenMailboxACLUpdateLookupRight() throws Exception {
+ Mailbox grandChildMailbox = mailboxMapper.getMailboxMapper(mailboxSession).findMailboxById(grandChildMailboxId);
+ mailboxMapper.getMailboxMapper(mailboxSession).setACL(grandChildMailbox, new MailboxACL(
+ new Entry(SHARED_USER_KEY, new Rfc4314Rights(Right.Write))));
+
+ storeRightManager.setRights(
+ GRAND_CHILD_MAILBOX,
+ new MailboxACL(
+ new Entry(SHARED_USER_KEY, new Rfc4314Rights(Right.Lookup))),
+ mailboxSession);
+
+ MailboxACL actualParentACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ MailboxACL actualChildACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualParentACL.getEntries())
+ .contains(lookupEntry);
+ assertThat(actualChildACL.getEntries())
+ .contains(lookupEntry);
+ }
+
+ @Test
+ public void eventShouldDoNothingWhenMailboxACLRemoveLookupRight() throws Exception {
+ Mailbox grandChildMailbox = mailboxMapper.getMailboxMapper(mailboxSession).findMailboxById(grandChildMailboxId);
+ mailboxMapper.getMailboxMapper(mailboxSession).setACL(grandChildMailbox, new MailboxACL(
+ new Entry(SHARED_USER_KEY, new Rfc4314Rights(Right.Write, Right.Lookup))));
+
+ storeRightManager.applyRightsCommand(
+ GRAND_CHILD_MAILBOX,
+ MailboxACL.command()
+ .key(SHARED_USER_KEY)
+ .rights(Right.Lookup)
+ .asRemoval(),
+ mailboxSession);
+
+ MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualACL.getEntries())
+ .doesNotContainKeys(SHARED_USER_KEY);
+ }
+
+ @Test
+ public void eventShouldDoNothingWhenMailboxACLButNoLookupRight() throws Exception {
+ storeRightManager.applyRightsCommand(
+ GRAND_CHILD_MAILBOX,
+ MailboxACL.command()
+ .key(SHARED_USER_KEY)
+ .rights(Right.Administer)
+ .asAddition(),
+ mailboxSession);
+
+ MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualACL.getEntries())
+ .doesNotContainKeys(SHARED_USER_KEY);
+ }
+
+ @Test
+ public void eventShouldDoNothingWhenMailboxACLUpdatedButNoLookupRight() throws Exception {
+ storeRightManager.applyRightsCommand(
+ GRAND_CHILD_MAILBOX,
+ MailboxACL.command()
+ .key(SHARED_USER_KEY)
+ .rights(Right.Administer)
+ .asReplacement(),
+ mailboxSession);
+
+ MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualACL.getEntries())
+ .doesNotContainKeys(SHARED_USER_KEY);
+ }
+
+ @Test
+ public void eventShouldUpdateNewParentWhenRenameMailboxWhichContainLookupRight() throws Exception {
+ Mailbox childMailbox = mailboxMapper.getMailboxMapper(mailboxSession).findMailboxById(childMailboxId);
+ mailboxMapper.getMailboxMapper(mailboxSession).setACL(childMailbox, new MailboxACL(
+ new Entry(SHARED_USER_KEY, new Rfc4314Rights(Right.Write, Right.Lookup))));
+
+ storeMailboxManager.renameMailbox(CHILD_MAILBOX, MailboxPath.forUser(OWNER_USER, "shared1.sub1New"), mailboxSession);
+
+ MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId1, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualACL.getEntries())
+ .contains(lookupEntry);
+ }
+
+ @Test
+ public void eventShouldNotUpdateNewParentWhenRenameMailboxWhichDoesContainLookupRight() throws Exception {
+ Mailbox childMailbox = mailboxMapper.getMailboxMapper(mailboxSession).findMailboxById(childMailboxId);
+ mailboxMapper.getMailboxMapper(mailboxSession).setACL(childMailbox, new MailboxACL(
+ new Entry(SHARED_USER_KEY, new Rfc4314Rights(Right.Write))));
+
+ storeMailboxManager.renameMailbox(CHILD_MAILBOX, MailboxPath.forUser(OWNER_USER, "shared1.sub1New"), mailboxSession);
+
+ MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId1, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualACL.getEntries())
+ .doesNotContainKeys(SHARED_USER_KEY);
+ }
+
+ @Test
+ public void eventShouldUpdateAllNewParentWhenRenameMailboxWhichContainLookupRight() throws Exception {
+ Mailbox grandChildMailbox = mailboxMapper.getMailboxMapper(mailboxSession).findMailboxById(grandChildMailboxId);
+ mailboxMapper.getMailboxMapper(mailboxSession).setACL(grandChildMailbox, new MailboxACL(
+ new Entry(SHARED_USER_KEY, new Rfc4314Rights(Right.Write, Right.Lookup))));
+
+ storeMailboxManager.renameMailbox(GRAND_CHILD_MAILBOX, MailboxPath.forUser(OWNER_USER, "shared1.sub1.sub2"), mailboxSession);
+
+ MailboxACL parentActualACL = storeMailboxManager.getMailbox(parentMailboxId1, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+ MailboxACL childActualACL = storeMailboxManager.getMailbox(childMailboxId1, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(parentActualACL.getEntries())
+ .contains(lookupEntry);
+ assertThat(childActualACL.getEntries())
+ .contains(lookupEntry);
+ }
+
+ @Test
+ public void eventShouldDoNothingWhenNegativeACLEntry() throws Exception {
+ EntryKey negativeUserKey = EntryKey.createUserEntryKey(SHARED_USER, true);
+ storeRightManager.applyRightsCommand(
+ GRAND_CHILD_MAILBOX,
+ MailboxACL.command()
+ .key(negativeUserKey)
+ .rights(Right.Lookup)
+ .asAddition(),
+ mailboxSession);
+
+ MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
+ .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+ .getACL();
+
+ assertThat(actualACL.getEntries())
+ .hasSize(1)
+ .doesNotContainKeys(negativeUserKey);
+ }
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org