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]

Reply via email to