Repository: james-project Updated Branches: refs/heads/master 24480cd4d -> 98c81db41
JAMES-1874 Access mailbox only once when checking rights in GetMessages Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/98c81db4 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/98c81db4 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/98c81db4 Branch: refs/heads/master Commit: 98c81db41499b145886df29e590e705c22c10136 Parents: 24480cd Author: benwa <[email protected]> Authored: Tue Mar 7 08:28:44 2017 +0700 Committer: benwa <[email protected]> Committed: Tue Mar 7 18:45:24 2017 +0700 ---------------------------------------------------------------------- .../mailbox/store/StoreMessageIdManager.java | 29 +++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/98c81db4/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java index 2a63dd5..dcf812b 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java @@ -115,8 +115,15 @@ public class StoreMessageIdManager implements MessageIdManager { try { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); final MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); - return FluentIterable.from(messageIdMapper.find(messageIds, MessageMapper.FetchType.Full)) - .filter(belongsToUser(mailboxSession, mailboxMapper)) + List<MailboxMessage> messageList = messageIdMapper.find(messageIds, MessageMapper.FetchType.Full); + ImmutableSet<MailboxId> mailboxIds = FluentIterable.from(messageList) + .transform(EXTRACT_MAILBOX_ID_FUNCTION) + .toSet(); + final ImmutableSet<MailboxId> allowedMailboxIds = FluentIterable.from(mailboxIds) + .filter(mailboxBelongsToUser(mailboxSession, mailboxMapper)) + .toSet(); + return FluentIterable.from(messageList) + .filter(inMailboxes(allowedMailboxIds)) .transform(messageResultConverter(fetchGroup)) .toList(); } catch (WrappedException wrappedException) { @@ -133,7 +140,7 @@ public class StoreMessageIdManager implements MessageIdManager { Iterable<MetadataWithMailboxId> metadatasWithMailbox = FluentIterable .from(messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Metadata)) - .filter(inMailbox(mailboxIds)) + .filter(inMailboxes(mailboxIds)) .transform(EXTRACT_METADATA_FUNCTION); messageIdMapper.delete(messageId, mailboxIds); @@ -248,7 +255,7 @@ public class StoreMessageIdManager implements MessageIdManager { }; } - private Predicate<MailboxMessage> inMailbox(final List<MailboxId> mailboxIds) { + private Predicate<MailboxMessage> inMailboxes(final Collection<MailboxId> mailboxIds) { return new Predicate<MailboxMessage>() { @Override public boolean apply(MailboxMessage mailboxMessage) { @@ -271,6 +278,20 @@ public class StoreMessageIdManager implements MessageIdManager { }; } + private Predicate<MailboxId> mailboxBelongsToUser(final MailboxSession mailboxSession, final MailboxMapper mailboxMapper) { + return new Predicate<MailboxId>() { + @Override + public boolean apply(MailboxId mailboxId) { + try { + Mailbox currentMailbox = mailboxMapper.findMailboxById(mailboxId); + return belongsToCurrentUser(currentMailbox, mailboxSession); + } catch (MailboxException e) { + return false; + } + } + }; + } + private void allowOnMailboxSession(List<MailboxId> mailboxIds, MailboxSession mailboxSession, MailboxMapper mailboxMapper) throws MailboxNotFoundException { Optional<MailboxId> mailboxForbidden = FluentIterable.from(mailboxIds) .firstMatch(isMailboxOfOtherUser(mailboxSession, mailboxMapper)) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
