From 2f2318817e609625bbd59548381c11641b4c1100 Mon Sep 17 00:00:00 2001 From: benwa Date: Fri, 10 Apr 2015 17:37:03 +0200 Subject: [PATCH] MAILBOX-223 Update API so that ACL operation are accessed threw the MailboxManager MAILBOX-223 Remove MaildirMailbox ; use SimpleMailbox Bean instead. --- .../org/apache/james/mailbox/MailboxManager.java | 63 ++++++++++++++++++++ .../org/apache/james/mailbox/MessageManager.java | 57 ------------------ .../org/apache/james/mailbox/model/MailboxACL.java | 18 ++++++ .../james/mailbox/model/SimpleMailboxACL.java | 62 +++++++++++++++++++- .../mailbox/caching/CachingMailboxMapper.java | 6 ++ .../cassandra/mail/CassandraMailboxMapper.java | 5 ++ .../mailbox/hbase/mail/HBaseMailboxMapper.java | 6 ++ .../james/mailbox/jcr/mail/JCRMailboxMapper.java | 7 ++- .../james/mailbox/jpa/mail/JPAMailboxMapper.java | 6 ++ .../apache/james/mailbox/maildir/MaildirStore.java | 6 +- .../mailbox/maildir/mail/MaildirMailboxMapper.java | 10 ++++ .../mailbox/maildir/mail/model/MaildirMailbox.java | 41 ------------- .../inmemory/mail/InMemoryMailboxMapper.java | 7 ++- .../james/mailbox/store/GroupFolderResolver.java | 37 ++++++++++++ .../james/mailbox/store/StoreMailboxManager.java | 44 ++++++++++++++ .../james/mailbox/store/StoreMessageManager.java | 67 +--------------------- .../james/mailbox/store/mail/MailboxMapper.java | 11 +++- 17 files changed, 285 insertions(+), 168 deletions(-) delete mode 100644 maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java create mode 100644 store/src/main/java/org/apache/james/mailbox/store/GroupFolderResolver.java diff --git a/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/api/src/main/java/org/apache/james/mailbox/MailboxManager.java index d375023..3a49df9 100644 --- a/api/src/main/java/org/apache/james/mailbox/MailboxManager.java +++ b/api/src/main/java/org/apache/james/mailbox/MailboxManager.java @@ -25,10 +25,13 @@ import org.apache.james.mailbox.exception.BadCredentialsException; 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.model.MailboxACL; import org.apache.james.mailbox.model.MailboxMetaData; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MailboxQuery; import org.apache.james.mailbox.model.MessageRange; +import org.apache.james.mailbox.model.SimpleMailboxACL; import org.slf4j.Logger; /** @@ -249,6 +252,66 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport { void logout(MailboxSession session, boolean force) throws MailboxException; /** + * Tells whether the given {@link MailboxSession}'s user has the given + * {@link MailboxACL.MailboxACLRight} for this {@link MessageManager}'s mailbox. + * + * @param session MailboxSession of the user we want to check + * @param right Right we want to check. + * @param session Session of the user we want to check this right against. + * @return true if the given {@link MailboxSession}'s user has the given + * {@link MailboxACL.MailboxACLRight} for this {@link MessageManager}'s + * mailbox; false otherwise. + * @throws MailboxException + */ + public boolean hasRight(MailboxPath mailboxPath, MailboxACL.MailboxACLRight right, MailboxSession session) throws MailboxException; + + /** + * Returns the rights applicable to the user who has sent the current + * request on the mailbox designated by this mailboxPath. + * + * @param mailboxPath Path of the mailbox you want to get your rights on. + * @param session The session used to determine the user we should retrieve the rights of. + * @return the rights applicable to the user who has sent the request, + * returns {@link SimpleMailboxACL#NO_RIGHTS} if + * {@code session.getUser()} is null. + * @throws UnsupportedRightException + */ + public abstract MailboxACL.MailboxACLRights myRights(MailboxPath mailboxPath, MailboxSession session) throws MailboxException; + + /** + * Computes a result suitable for the LISTRIGHTS IMAP command. The result is + * computed for this mailbox and the given {@code identifier}. + * + * From RFC 4314 section 3.7: + * The first element of the resulting array contains the (possibly empty) + * set of rights the identifier will always be granted in the mailbox. + * Following this are zero or more right sets the identifier can be granted + * in the mailbox. Rights mentioned in the same set are tied together. The + * server MUST either grant all tied rights to the identifier in the mailbox + * or grant none. + * + * The same right MUST NOT be listed more than once in the LISTRIGHTS + * command. + * + * @param mailboxPath Path of the mailbox you want to get the rights list. + * @param identifier + * the identifier from the LISTRIGHTS command. + * @param session Right of the user performing the request. + * @return result suitable for the LISTRIGHTS IMAP command + * @throws UnsupportedRightException + */ + public MailboxACL.MailboxACLRights[] listRigths(MailboxPath mailboxPath, MailboxACL.MailboxACLEntryKey identifier, MailboxSession session) throws MailboxException; + + /** + * Update the Mailbox ACL of the designated mailbox. We can either ADD REPLACE or REMOVE entries. + * + * @param mailboxACLCommand Update to perform. + * @throws UnsupportedRightException + */ + void setRights(MailboxPath mailboxPath, MailboxACL.MailboxACLCommand mailboxACLCommand, MailboxSession session) throws MailboxException; + + + /** * Return a unmodifiable {@link List} of {@link MailboxPath} objects * * @param session diff --git a/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/api/src/main/java/org/apache/james/mailbox/MessageManager.java index 28ad722..272b877 100644 --- a/api/src/main/java/org/apache/james/mailbox/MessageManager.java +++ b/api/src/main/java/org/apache/james/mailbox/MessageManager.java @@ -169,63 +169,6 @@ public interface MessageManager { */ MessageResultIterator getMessages(MessageRange set, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException; - /** - * Tells whether the given {@link MailboxSession}'s user has the given - * {@link MailboxACLRight} for this {@link MessageManager}'s mailbox. - * - * @param right - * @param session - * @return true if the given {@link MailboxSession}'s user has the given - * {@link MailboxACLRight} for this {@link MessageManager}'s - * mailbox; false otherwise. - * @throws MailboxException - */ - public boolean hasRight(MailboxACLRight right, MailboxSession session) throws MailboxException; - - /** - * Returns the rights applicable to the user who has sent the current - * request. - * - * @param session - * @return the rights applicable to the user who has sent the request, - * returns {@link SimpleMailboxACL#NO_RIGHTS} if - * {@code session.getUser()} is null. - * @throws UnsupportedRightException - */ - public abstract MailboxACLRights myRights(MailboxSession session) throws MailboxException; - - /** - * Computes a result suitable for the LISTRIGHTS IMAP command. The result is - * computed for this mailbox and the given {@code identifier}. - * - * From RFC 4314 section 3.7: - * The first element of the resulting array contains the (possibly empty) - * set of rights the identifier will always be granted in the mailbox. - * Following this are zero or more right sets the identifier can be granted - * in the mailbox. Rights mentioned in the same set are tied together. The - * server MUST either grant all tied rights to the identifier in the mailbox - * or grant none. - * - * The same right MUST NOT be listed more than once in the LISTRIGHTS - * command. - * - * @param identifier - * the identifier from the LISTRIGHTS command. - * @param session - * @return - * @throws UnsupportedRightException - */ - public MailboxACLRights[] listRigths(MailboxACLEntryKey identifier, MailboxSession session) throws UnsupportedRightException; - - /** - * TODO setRights. - * - * @param identifier - * @param editMode - * @param mailboxAclRights - * @throws UnsupportedRightException - */ - void setRights(MailboxACLEntryKey identifier, EditMode editMode, MailboxACLRights mailboxAclRights) throws UnsupportedRightException; /** * Gets current meta data for the mailbox.
diff --git a/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java b/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java index 2709ee2..b032d06 100644 --- a/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java +++ b/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java @@ -205,6 +205,15 @@ public interface MailboxACL { * Allows distinguishing between users, groups and special names (see * {@link SpecialName}). */ + + public interface MailboxACLCommand { + MailboxACLEntryKey getEntryKey(); + + EditMode getEditMode(); + + MailboxACLRights getRights(); + }; + enum NameType { group, special, user }; @@ -241,6 +250,15 @@ public interface MailboxACL { public static final char REMOVE_RIGHTS_MARKER = '-'; /** + * Apply the given ACL update on current ACL and return the result as a new ACL. + * + * @param aclUpdate Update to perform + * @return Copy of current ACL updated + * @throws UnsupportedRightException + */ + MailboxACL apply(MailboxACLCommand aclUpdate) throws UnsupportedRightException; + + /** * Performs the set theoretic operation of relative complement of toRemove * {@link MailboxACL} in this {@link MailboxACL}. * diff --git a/api/src/main/java/org/apache/james/mailbox/model/SimpleMailboxACL.java b/api/src/main/java/org/apache/james/mailbox/model/SimpleMailboxACL.java index 28b200c..d443cb7 100644 --- a/api/src/main/java/org/apache/james/mailbox/model/SimpleMailboxACL.java +++ b/api/src/main/java/org/apache/james/mailbox/model/SimpleMailboxACL.java @@ -27,7 +27,6 @@ import java.util.Map.Entry; import java.util.Properties; import org.apache.james.mailbox.exception.UnsupportedRightException; -import org.apache.james.mailbox.model.MailboxACL.MailboxACLRight; /** * Default implementation of {@link MailboxACL}. @@ -798,6 +797,54 @@ public class SimpleMailboxACL implements MailboxACL { } + public static class SimpleMailboxACLCommand implements MailboxACLCommand { + private MailboxACLEntryKey key; + private EditMode editMode; + private MailboxACLRights rights; + + public SimpleMailboxACLCommand(MailboxACLEntryKey key, EditMode editMode, MailboxACLRights rights) { + this.key = key; + this.editMode = editMode; + this.rights = rights; + } + + @Override + public MailboxACLEntryKey getEntryKey() { + return key; + } + + @Override + public EditMode getEditMode() { + return editMode; + } + + @Override + public MailboxACLRights getRights() { + return rights; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SimpleMailboxACLCommand)) return false; + + SimpleMailboxACLCommand that = (SimpleMailboxACLCommand) o; + + if (key != null ? !key.equals(that.key) : that.key != null) return false; + if (editMode != that.editMode) return false; + return !(rights != null ? !rights.equals(that.rights) : that.rights != null); + + } + + @Override + public int hashCode() { + int result = key != null ? key.hashCode() : 0; + result = 31 * result + (editMode != null ? editMode.hashCode() : 0); + result = 31 * result + (rights != null ? rights.hashCode() : 0); + return result; + } + } + public static final MailboxACLEntryKey ANYBODY_KEY; public static final MailboxACLEntryKey ANYBODY_NEGATIVE_KEY; public static final MailboxACLEntryKey AUTHENTICATED_KEY; @@ -926,6 +973,19 @@ public class SimpleMailboxACL implements MailboxACL { return false; } + @Override + public MailboxACL apply(MailboxACLCommand aclUpdate) throws UnsupportedRightException { + switch (aclUpdate.getEditMode()) { + case ADD: + return union(aclUpdate.getEntryKey(), aclUpdate.getRights()); + case REMOVE: + return except(aclUpdate.getEntryKey(), aclUpdate.getRights()); + case REPLACE: + return replace(aclUpdate.getEntryKey(), aclUpdate.getRights()); + } + throw new RuntimeException("Unknown edit mode"); + } + /** * @see org.apache.james.mailbox.MailboxACL#except(org.apache.james.mailbox.MailboxACL) */ diff --git a/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java b/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java index 401351c..9e73a49 100644 --- a/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java +++ b/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java @@ -3,6 +3,7 @@ import java.util.List; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.model.Mailbox; @@ -77,6 +78,11 @@ public class CachingMailboxMapper implements MailboxMapper { return underlying.list(); } + @Override + public void updateACL(Mailbox mailbox, MailboxACL.MailboxACLCommand mailboxACLCommand) throws MailboxException { + mailbox.setACL(mailbox.getACL().apply(mailboxACLCommand)); + } + private void invalidate(Mailbox mailbox) { cache.invalidate(mailbox); } diff --git a/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java index 8b5f018..49d6936 100644 --- a/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java +++ b/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java @@ -37,6 +37,7 @@ import java.util.UUID; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.model.Mailbox; @@ -144,4 +145,8 @@ public class CassandraMailboxMapper implements MailboxMapper { return transaction.run(); } + @Override + public void updateACL(Mailbox mailbox, MailboxACL.MailboxACLCommand mailboxACLCommand) throws MailboxException { + mailbox.setACL(mailbox.getACL().apply(mailboxACLCommand)); + } } diff --git a/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java b/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java index 8308f49..24dce5b 100644 --- a/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java +++ b/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java @@ -54,6 +54,7 @@ import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.hbase.HBaseNonTransactionalMapper; import org.apache.james.mailbox.hbase.mail.model.HBaseMailbox; +import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.model.Mailbox; @@ -392,4 +393,9 @@ public class HBaseMailboxMapper extends HBaseNonTransactionalMapper implements M // IOUtils.closeStream(mailboxes); } } + + @Override + public void updateACL(Mailbox mailbox, MailboxACL.MailboxACLCommand mailboxACLCommand) throws MailboxException { + mailbox.setACL(mailbox.getACL().apply(mailboxACLCommand)); + } } diff --git a/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java b/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java index ca848d4..ff80377 100644 --- a/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java +++ b/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java @@ -39,6 +39,7 @@ import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.jcr.AbstractJCRScalingMapper; import org.apache.james.mailbox.jcr.MailboxSessionJCRRepository; import org.apache.james.mailbox.jcr.mail.model.JCRMailbox; +import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.model.Mailbox; @@ -232,5 +233,9 @@ public class JCRMailboxMapper extends AbstractJCRScalingMapper implements Mailbo throw new MailboxException("Unable to retrieve the list of mailboxes", e); } } - + + @Override + public void updateACL(Mailbox mailbox, MailboxACL.MailboxACLCommand mailboxACLCommand) throws MailboxException { + mailbox.setACL(mailbox.getACL().apply(mailboxACLCommand)); + } } diff --git a/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java b/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java index 28430d1..e981d05 100644 --- a/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java +++ b/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java @@ -32,6 +32,7 @@ import org.apache.james.mailbox.exception.MailboxExistsException; import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.jpa.JPATransactionalMapper; import org.apache.james.mailbox.jpa.mail.model.JPAMailbox; +import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.model.Mailbox; @@ -167,4 +168,9 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM throw new MailboxException("Delete of mailboxes failed", e); } } + + @Override + public void updateACL(Mailbox mailbox, MailboxACL.MailboxACLCommand mailboxACLCommand) throws MailboxException { + mailbox.setACL(mailbox.getACL().apply(mailboxACLCommand)); + } } diff --git a/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java b/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java index 880cc6a..9bfe6ee 100644 --- a/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java +++ b/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java @@ -26,13 +26,13 @@ import org.apache.james.mailbox.MailboxPathLocker; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxNotFoundException; -import org.apache.james.mailbox.maildir.mail.model.MaildirMailbox; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.JVMMailboxPathLocker; import org.apache.james.mailbox.store.mail.ModSeqProvider; import org.apache.james.mailbox.store.mail.UidProvider; import org.apache.james.mailbox.store.mail.model.Mailbox; +import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox; public class MaildirStore implements UidProvider, ModSeqProvider{ @@ -125,7 +125,9 @@ public class MaildirStore implements UidProvider, ModSeqProvider(session, mailboxPath, folder); + Mailbox loadedMailbox = new SimpleMailbox(mailboxPath, folder.getUidValidity()); + loadedMailbox.setACL(folder.getACL(session)); + return loadedMailbox; } catch (IOException e) { throw new MailboxException("Unable to load Mailbox " + mailboxPath, e); } diff --git a/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java b/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java index fa0a03e..09abaf7 100644 --- a/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java +++ b/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java @@ -34,6 +34,7 @@ import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.maildir.MaildirFolder; import org.apache.james.mailbox.maildir.MaildirMessageName; import org.apache.james.mailbox.maildir.MaildirStore; +import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.mail.MailboxMapper; @@ -193,6 +194,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail new IOException("Could not rename folder " + originalFolder)); } } + folder.setACL(session, mailbox.getACL()); } catch (MailboxNotFoundException e) { // it cannot be found and is thus new MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); @@ -214,6 +216,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail throw new MailboxException("Failed to save Mailbox " + mailbox, ioe); } + folder.setACL(session, mailbox.getACL()); } } @@ -320,4 +323,11 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail } + @Override + public void updateACL(Mailbox mailbox, MailboxACL.MailboxACLCommand mailboxACLCommand) throws MailboxException { + MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); + MailboxACL newACL = mailbox.getACL().apply(mailboxACLCommand); + folder.setACL(session, newACL); + mailbox.setACL(newACL); + } } diff --git a/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java b/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java deleted file mode 100644 index 4d0bb9f..0000000 --- a/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.apache.james.mailbox.maildir.mail.model; - -import java.io.IOException; - -import org.apache.james.mailbox.MailboxSession; -import org.apache.james.mailbox.exception.MailboxException; -import org.apache.james.mailbox.maildir.MaildirFolder; -import org.apache.james.mailbox.model.MailboxACL; -import org.apache.james.mailbox.model.MailboxPath; -import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox; - -public class MaildirMailbox extends SimpleMailbox { - - private MaildirFolder folder; - private MailboxSession session; - - public MaildirMailbox(MailboxSession session, MailboxPath path, MaildirFolder folder) throws IOException { - super(path, folder.getUidValidity()); - this.folder = folder; - this.session = session; - } - - @Override - public MailboxACL getACL() { - try { - return folder.getACL(session); - } catch (MailboxException e) { - throw new RuntimeException(e); - } - } - - @Override - public void setACL(MailboxACL acl) { - try { - folder.setACL(session, acl); - } catch (MailboxException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java b/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java index d477ec3..bb84761 100644 --- a/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java +++ b/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java @@ -26,6 +26,7 @@ import java.util.concurrent.atomic.AtomicLong; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.model.Mailbox; @@ -128,5 +129,9 @@ public class InMemoryMailboxMapper implements MailboxMapper { public T execute(Transaction transaction) throws MailboxException { return transaction.run(); } - + + @Override + public void updateACL(Mailbox mailbox, MailboxACL.MailboxACLCommand mailboxACLCommand) throws MailboxException{ + mailbox.setACL(mailbox.getACL().apply(mailboxACLCommand)); + } } diff --git a/store/src/main/java/org/apache/james/mailbox/store/GroupFolderResolver.java b/store/src/main/java/org/apache/james/mailbox/store/GroupFolderResolver.java new file mode 100644 index 0000000..c2fa01c --- /dev/null +++ b/store/src/main/java/org/apache/james/mailbox/store/GroupFolderResolver.java @@ -0,0 +1,37 @@ +/**************************************************************** + * 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.mailbox.store; + +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.store.mail.model.Mailbox; + +public class GroupFolderResolver { + + private MailboxSession mailboxSession; + + public GroupFolderResolver(MailboxSession mailboxSession) { + this.mailboxSession = mailboxSession; + } + + public boolean isGroupFolder(Mailbox mailbox) { + String namespace = mailbox.getNamespace(); + return namespace == null || (!namespace.equals(mailboxSession.getPersonalSpace()) && !namespace.equals(mailboxSession.getOtherUsersSpace())); + } +} diff --git a/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java index b1b89cc..6fd108c 100644 --- a/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java +++ b/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java @@ -34,12 +34,14 @@ import org.apache.james.mailbox.exception.BadCredentialsException; 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.model.MailboxACL; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxMetaData; import org.apache.james.mailbox.model.MailboxMetaData.Selectability; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MailboxQuery; import org.apache.james.mailbox.model.MessageRange; +import org.apache.james.mailbox.model.SimpleMailboxACL; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox; @@ -590,4 +592,46 @@ public class StoreMailboxManager implements MailboxManager { public void removeGlobalListener(MailboxListener listener, MailboxSession session) throws MailboxException { delegatingListener.removeGlobalListener(listener, session); } + + @Override + public boolean hasRight(MailboxPath mailboxPath, MailboxACL.MailboxACLRight right, MailboxSession session) throws MailboxException { + MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session); + Mailbox mailbox = mapper.findMailboxByPath(mailboxPath); + MailboxSession.User user = session.getUser(); + String userName = user != null ? user.getUserName() : null; + return aclResolver.hasRight(userName, groupMembershipResolver, right, mailbox.getACL(), mailbox.getUser(), new GroupFolderResolver(session).isGroupFolder(mailbox)); + } + + @Override + public MailboxACL.MailboxACLRights myRights(MailboxPath mailboxPath, MailboxSession session) throws MailboxException { + MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session); + Mailbox mailbox = mapper.findMailboxByPath(mailboxPath); + MailboxSession.User user = session.getUser(); + if (user != null) { + return aclResolver.resolveRights(user.getUserName(), groupMembershipResolver, mailbox.getACL(), mailbox.getUser(), new GroupFolderResolver(session).isGroupFolder(mailbox)); + } else { + return SimpleMailboxACL.NO_RIGHTS; + } + } + + public MailboxACL.MailboxACLRights[] listRigths(MailboxPath mailboxPath, final MailboxACL.MailboxACLEntryKey key, MailboxSession session) throws MailboxException { + final MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session); + Mailbox mailbox = mapper.findMailboxByPath(mailboxPath); + return aclResolver.listRights(key, groupMembershipResolver, mailbox.getUser(), new GroupFolderResolver(session).isGroupFolder(mailbox)); + } + + @Override + public void setRights(MailboxPath mailboxPath, final MailboxACL.MailboxACLCommand mailboxACLCommand, MailboxSession session) throws MailboxException { + final MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session); + final Mailbox mailbox = mapper.findMailboxByPath(mailboxPath); + mapper.execute( + new Mapper.VoidTransaction() { + @Override + public void runVoid() throws MailboxException { + mapper.updateACL(mailbox, mailboxACLCommand); + } + } + ); + } + } diff --git a/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java index d8b98f7..700ab2c 100644 --- a/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java +++ b/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java @@ -786,64 +786,16 @@ public class StoreMessageManager implements org.apache.james.mailbox.Message return messageMapper.findFirstUnseenMessageUid(getMailboxEntity()); } - /** - * @see org.apache.james.mailbox.MessageManager#hasRight(org.apache.james.mailbox.MailboxACL.MailboxACLRight, - * org.apache.james.mailbox.MailboxSession) - */ - public boolean hasRight(MailboxACLRight right, MailboxSession session) throws UnsupportedRightException { - User user = session.getUser(); - String userName = user != null ? user.getUserName() : null; - - return aclResolver.hasRight(userName, groupMembershipResolver, right, mailbox.getACL(), mailbox.getUser(), isGroupFolder(session)); - } - - /** - * @see org.apache.james.mailbox.MessageManager#myRights(org.apache.james.mailbox.MailboxSession) - */ - @Override - public MailboxACLRights myRights(MailboxSession session) throws MailboxException { + private MailboxACLRights myRights(MailboxSession session) throws MailboxException { User user = session.getUser(); if (user != null) { - return aclResolver.resolveRights(user.getUserName(), groupMembershipResolver, mailbox.getACL(), mailbox.getUser(), isGroupFolder(session)); + return aclResolver.resolveRights(user.getUserName(), groupMembershipResolver, mailbox.getACL(), mailbox.getUser(), new GroupFolderResolver(session).isGroupFolder(mailbox)); } else { return SimpleMailboxACL.NO_RIGHTS; } } /** - * @see org.apache.james.mailbox.MessageManager#listRigths(java.lang.String, org.apache.james.mailbox.MailboxSession) - */ - public MailboxACLRights[] listRigths(final MailboxACLEntryKey key, MailboxSession session) throws UnsupportedRightException { - return aclResolver.listRights(key, groupMembershipResolver, mailbox.getUser(), isGroupFolder(session)); - } - - /** - * @throws UnsupportedRightException - * @see org.apache.james.mailbox.MessageManager#setRights(java.lang.String, org.apache.james.mailbox.model.MailboxACL.EditMode, org.apache.james.mailbox.model.MailboxACL.MailboxACLRights) - */ - @Override - public void setRights(MailboxACLEntryKey mailboxACLEntryKey, EditMode editMode, MailboxACLRights mailboxAclRights) throws UnsupportedRightException { - MailboxACL acl = mailbox.getACL(); - if (acl == null) { - acl = SimpleMailboxACL.EMPTY; - } - switch (editMode) { - case ADD: - acl = acl.union(mailboxACLEntryKey, mailboxAclRights); - break; - case REMOVE: - acl = acl.except(mailboxACLEntryKey, mailboxAclRights); - break; - case REPLACE: - acl = acl.replace(mailboxACLEntryKey, mailboxAclRights); - break; - default: - throw new IllegalStateException("Unexpected "+ EditMode.class.getName() +"."+ editMode); - } - mailbox.setACL(acl); - } - - /** * Applies the global ACL (if there are any) to the mailbox ACL. * * @param mailboxSession @@ -852,19 +804,6 @@ public class StoreMessageManager implements org.apache.james.mailbox.Message * @throws UnsupportedRightException */ protected MailboxACL getResolvedMailboxACL(MailboxSession mailboxSession) throws UnsupportedRightException { - return aclResolver.applyGlobalACL(mailbox.getACL(), isGroupFolder(mailboxSession)); + return aclResolver.applyGlobalACL(mailbox.getACL(), new GroupFolderResolver(mailboxSession).isGroupFolder(mailbox)); } - - /** - * Returns true if the current mailbox does not reside neither in private - * nor other users' namespace. - * - * @param session - * @return - */ - protected boolean isGroupFolder(MailboxSession session) { - final String ns = mailbox.getNamespace(); - return ns == null || (!ns.equals(session.getPersonalSpace()) && !ns.equals(session.getOtherUsersSpace())); - } - } diff --git a/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java b/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java index 25fdc03..648d704 100644 --- a/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java +++ b/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java @@ -22,6 +22,7 @@ import java.util.List; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.transaction.Mapper; @@ -82,7 +83,15 @@ public interface MailboxMapper extends Mapper { */ boolean hasChildren(Mailbox mailbox, char delimiter) throws MailboxException, MailboxNotFoundException; - + + /** + * Update the ACL of the stored mailbox. + * + * @param mailbox Mailbox for whom we want to update ACL + * @param mailboxACLCommand Update to perform + */ + void updateACL(Mailbox mailbox, MailboxACL.MailboxACLCommand mailboxACLCommand) throws MailboxException; + /** * Return a unmodifable {@link List} of all {@link Mailbox} * -- 2.3.2 (Apple Git-55)