JAMES-2390 Accessible messages should only make one ACL call per mailbox Upon checking whether a set of messages is accessible, the containing mailbox rights were checks on a per-mailbox base. This is sub-optimal as some messages might be in the same mailbox, whose rights will be needlessly checked several times.
This change inserts smoothly into the codebase, the tools for checking rights once per mailbox is already implemented. Just not used in that case. Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9180da41 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9180da41 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9180da41 Branch: refs/heads/master Commit: 9180da413956e9af659f4c0c00446405e93ba211 Parents: ce9321a Author: benwa <btell...@linagora.com> Authored: Sun May 6 09:16:19 2018 +0700 Committer: benwa <btell...@linagora.com> Committed: Tue May 8 09:15:36 2018 +0700 ---------------------------------------------------------------------- .../mailbox/store/StoreMessageIdManager.java | 23 ++++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/9180da41/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 d65e6c6..bcda820 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 @@ -131,9 +131,12 @@ public class StoreMessageIdManager implements MessageIdManager { public Set<MessageId> accessibleMessages(Collection<MessageId> messageIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> messageList = messageIdMapper.find(messageIds, MessageMapper.FetchType.Metadata); + + ImmutableSet<MailboxId> allowedMailboxIds = getAllowedMailboxIds(mailboxSession, messageList, Right.Read); + return messageList.stream() - .filter(hasRightsOn(mailboxSession, Right.Read)) - .map(message -> message.getComposedMessageIdWithMetaData().getComposedMessageId().getMessageId()) + .filter(message -> allowedMailboxIds.contains(message.getMailboxId())) + .map(MailboxMessage::getMessageId) .collect(Guavate.toImmutableSet()); } @@ -142,11 +145,7 @@ public class StoreMessageIdManager implements MessageIdManager { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> messageList = messageIdMapper.find(messageIds, MessageMapper.FetchType.Full); - ImmutableSet<MailboxId> allowedMailboxIds = messageList.stream() - .map(MailboxMessage::getMailboxId) - .distinct() - .filter(hasRightsOnMailbox(mailboxSession, Right.Read)) - .collect(Guavate.toImmutableSet()); + ImmutableSet<MailboxId> allowedMailboxIds = getAllowedMailboxIds(mailboxSession, messageList, Right.Read); return messageList.stream() .filter(inMailboxes(allowedMailboxIds)) @@ -154,6 +153,14 @@ public class StoreMessageIdManager implements MessageIdManager { .collect(Guavate.toImmutableList()); } + private ImmutableSet<MailboxId> getAllowedMailboxIds(MailboxSession mailboxSession, List<MailboxMessage> messageList, Right... rights) { + return messageList.stream() + .map(MailboxMessage::getMailboxId) + .distinct() + .filter(hasRightsOnMailbox(mailboxSession, rights)) + .collect(Guavate.toImmutableSet()); + } + @Override public void delete(MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); @@ -212,6 +219,7 @@ public class StoreMessageIdManager implements MessageIdManager { private List<MailboxMessage> findRelatedMailboxMessages(MessageId messageId, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); + return messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Full) .stream() .filter(hasRightsOn(mailboxSession, Right.Read)) @@ -338,6 +346,7 @@ public class StoreMessageIdManager implements MessageIdManager { return message -> hasRightsOnMailbox(session, rights).test(message.getMailboxId()); } + private Predicate<MailboxId> hasRightsOnMailbox(MailboxSession session, Right... rights) { return Throwing.predicate((MailboxId mailboxId) -> mailboxManager.myRights(mailboxId, session).contains(rights)) .fallbackTo(any -> false); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org