JAMES-2175 MailboxFactory should add may* properties to mailbox
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/6667c51f Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/6667c51f Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/6667c51f Branch: refs/heads/master Commit: 6667c51fdb2c5a33963aa26e86e507513dedf106 Parents: edca983 Author: benwa <btell...@linagora.com> Authored: Mon Oct 9 11:17:39 2017 +0700 Committer: benwa <btell...@linagora.com> Committed: Wed Oct 11 11:09:10 2017 +0700 ---------------------------------------------------------------------- .../integration/GetMailboxesMethodTest.java | 12 +-- .../apache/james/jmap/model/MailboxFactory.java | 22 +++-- .../jmap/model/mailbox/MailboxNamespace.java | 1 + .../apache/james/jmap/model/mailbox/Rights.java | 1 + .../james/jmap/model/MailboxFactoryTest.java | 94 ++++++++++++++++++++ 5 files changed, 119 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/6667c51f/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 72797dd..629f0bf 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 @@ -421,12 +421,12 @@ public abstract class GetMailboxesMethodTest { .body(FIRST_MAILBOX + ".role", nullValue()) .body(FIRST_MAILBOX + ".sortOrder", equalTo(1000)) .body(FIRST_MAILBOX + ".mustBeOnlyMailbox", equalTo(false)) - .body(FIRST_MAILBOX + ".mayReadItems", equalTo(false)) - .body(FIRST_MAILBOX + ".mayAddItems", equalTo(false)) - .body(FIRST_MAILBOX + ".mayRemoveItems", equalTo(false)) - .body(FIRST_MAILBOX + ".mayCreateChild", equalTo(false)) - .body(FIRST_MAILBOX + ".mayRename", equalTo(false)) - .body(FIRST_MAILBOX + ".mayDelete", equalTo(false)) + .body(FIRST_MAILBOX + ".mayReadItems", equalTo(true)) + .body(FIRST_MAILBOX + ".mayAddItems", equalTo(true)) + .body(FIRST_MAILBOX + ".mayRemoveItems", equalTo(true)) + .body(FIRST_MAILBOX + ".mayCreateChild", equalTo(true)) + .body(FIRST_MAILBOX + ".mayRename", equalTo(true)) + .body(FIRST_MAILBOX + ".mayDelete", equalTo(true)) .body(FIRST_MAILBOX + ".totalMessages", equalTo(1)) .body(FIRST_MAILBOX + ".unreadMessages", equalTo(1)) .body(FIRST_MAILBOX + ".unreadThreads", equalTo(0)); http://git-wip-us.apache.org/repos/asf/james-project/blob/6667c51f/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 c14a9e1..3951d99 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 @@ -100,13 +100,15 @@ public class MailboxFactory { private Mailbox fromMessageManager(MessageManager messageManager, Optional<List<MailboxMetaData>> userMailboxesMetadata, MailboxSession mailboxSession) throws MailboxException { MailboxPath mailboxPath = messageManager.getMailboxPath(); + boolean isOwner = isSameUser(mailboxSession, mailboxPath); Optional<Role> role = Role.from(mailboxPath.getName()); 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())); + Username username = new Username(mailboxSession.getUser().getUserName()); + return Mailbox.builder() .id(messageManager.getId()) .name(getName(mailboxPath, mailboxSession)) @@ -116,18 +118,28 @@ public class MailboxFactory { .totalMessages(mailboxCounters.getCount()) .sortOrder(SortOrder.getSortOrder(role)) .sharedWith(rights) - .namespace(getNamespace(mailboxPath, mailboxSession)) + .mayAddItems(rights.mayAddItems(username).orElse(isOwner)) + .mayCreateChild(rights.mayCreateChild(username).orElse(isOwner)) + .mayDelete(rights.mayDelete(username).orElse(isOwner)) + .mayReadItems(rights.mayReadItems(username).orElse(isOwner)) + .mayRemoveItems(rights.mayRemoveItems(username).orElse(isOwner)) + .mayRename(rights.mayRename(username).orElse(isOwner)) + .namespace(getNamespace(mailboxPath, isOwner)) .build(); } - private MailboxNamespace getNamespace(MailboxPath mailboxPath, MailboxSession mailboxSession) { - String mailboxPathUser = mailboxPath.getUser(); - if (mailboxSession.getUser().isSameUser(mailboxPathUser)) { + private MailboxNamespace getNamespace(MailboxPath mailboxPath, boolean isOwner) { + String mailboxPathUser = mailboxPath.getUser(); + if (isOwner) { return MailboxNamespace.personal(); } return MailboxNamespace.delegated(mailboxPathUser); } + private boolean isSameUser(MailboxSession mailboxSession, MailboxPath mailboxPath) { + return mailboxSession.getUser().isSameUser(mailboxPath.getUser()); + } + @VisibleForTesting String getName(MailboxPath mailboxPath, MailboxSession mailboxSession) { String name = mailboxPath.getName(); if (name.contains(String.valueOf(mailboxSession.getPathDelimiter()))) { http://git-wip-us.apache.org/repos/asf/james-project/blob/6667c51f/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxNamespace.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxNamespace.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxNamespace.java index 51eb756..8c3cfb9 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxNamespace.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxNamespace.java @@ -39,6 +39,7 @@ public class MailboxNamespace { this.type = type; } } + public static MailboxNamespace delegated(String owner) { Preconditions.checkArgument(!StringUtils.isBlank(owner)); return new MailboxNamespace(Type.Delegated, Optional.of(owner)); http://git-wip-us.apache.org/repos/asf/james-project/blob/6667c51f/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 8b1de24..ae76218 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 @@ -122,6 +122,7 @@ public class Rights { public final int hashCode() { return Objects.hash(value); } + } public static class Builder { http://git-wip-us.apache.org/repos/asf/james-project/blob/6667c51f/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java index eea3d30..4d18bdb 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java @@ -206,4 +206,98 @@ public class MailboxFactoryTest { assertThat(retrievedMailbox.getNamespace()) .isEqualTo(MailboxNamespace.delegated(user)); } + + @Test + public void ownerShouldHaveFullRightsViaMayProperties() throws Exception { + MailboxPath inbox = MailboxPath.forUser(user, "inbox"); + Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, mailboxSession); + + Mailbox retrievedMailbox = sut.builder() + .id(mailboxId.get()) + .session(mailboxSession) + .build() + .get(); + + softly.assertThat(retrievedMailbox.isMayAddItems()).isTrue(); + softly.assertThat(retrievedMailbox.isMayCreateChild()).isTrue(); + softly.assertThat(retrievedMailbox.isMayDelete()).isTrue(); + softly.assertThat(retrievedMailbox.isMayReadItems()).isTrue(); + softly.assertThat(retrievedMailbox.isMayRemoveItems()).isTrue(); + softly.assertThat(retrievedMailbox.isMayRename()).isTrue(); + } + + @Test + public void delegatedUserShouldHaveMayAddItemsWhenAllowedToInsert() throws Exception { + MailboxPath inbox = MailboxPath.forUser(user, "inbox"); + Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, mailboxSession); + mailboxManager.applyRightsCommand(inbox, + MailboxACL.command() + .forUser(otherUser) + .rights(MailboxACL.Right.Insert, MailboxACL.Right.Lookup) + .asAddition(), + mailboxSession); + + Mailbox retrievedMailbox = sut.builder() + .id(mailboxId.get()) + .session(otherMailboxSession) + .build() + .get(); + + softly.assertThat(retrievedMailbox.isMayAddItems()).isTrue(); + softly.assertThat(retrievedMailbox.isMayCreateChild()).isFalse(); + softly.assertThat(retrievedMailbox.isMayDelete()).isFalse(); + softly.assertThat(retrievedMailbox.isMayReadItems()).isFalse(); + softly.assertThat(retrievedMailbox.isMayRemoveItems()).isFalse(); + softly.assertThat(retrievedMailbox.isMayRename()).isFalse(); + } + + @Test + public void delegatedUserShouldHaveMayReadItemsWhenAllowedToRead() throws Exception { + MailboxPath inbox = MailboxPath.forUser(user, "inbox"); + Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, mailboxSession); + mailboxManager.applyRightsCommand(inbox, + MailboxACL.command() + .forUser(otherUser) + .rights(MailboxACL.Right.Read, MailboxACL.Right.Lookup) + .asAddition(), + mailboxSession); + + Mailbox retrievedMailbox = sut.builder() + .id(mailboxId.get()) + .session(otherMailboxSession) + .build() + .get(); + + softly.assertThat(retrievedMailbox.isMayAddItems()).isFalse(); + softly.assertThat(retrievedMailbox.isMayCreateChild()).isFalse(); + softly.assertThat(retrievedMailbox.isMayDelete()).isFalse(); + softly.assertThat(retrievedMailbox.isMayReadItems()).isTrue(); + softly.assertThat(retrievedMailbox.isMayRemoveItems()).isFalse(); + softly.assertThat(retrievedMailbox.isMayRename()).isFalse(); + } + + @Test + public void delegatedUserShouldHaveMayRemoveItemsWhenAllowedToRemoveItems() throws Exception { + MailboxPath inbox = MailboxPath.forUser(user, "inbox"); + Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, mailboxSession); + mailboxManager.applyRightsCommand(inbox, + MailboxACL.command() + .forUser(otherUser) + .rights(MailboxACL.Right.DeleteMessages, MailboxACL.Right.Lookup) + .asAddition(), + mailboxSession); + + Mailbox retrievedMailbox = sut.builder() + .id(mailboxId.get()) + .session(otherMailboxSession) + .build() + .get(); + + softly.assertThat(retrievedMailbox.isMayAddItems()).isFalse(); + softly.assertThat(retrievedMailbox.isMayCreateChild()).isFalse(); + softly.assertThat(retrievedMailbox.isMayDelete()).isFalse(); + softly.assertThat(retrievedMailbox.isMayReadItems()).isFalse(); + softly.assertThat(retrievedMailbox.isMayRemoveItems()).isTrue(); + softly.assertThat(retrievedMailbox.isMayRename()).isFalse(); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org