JAMES-1888: Add more testing on MessageIdManager with different user sessions.


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/81832aed
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/81832aed
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/81832aed

Branch: refs/heads/master
Commit: 81832aed62b571e454f76e35fa65d7cc00a7999e
Parents: cc8bac6
Author: Quynh Nguyen <qngu...@linagora.com>
Authored: Mon Dec 19 16:39:51 2016 +0700
Committer: Quynh Nguyen <qngu...@linagora.com>
Committed: Wed Dec 21 09:08:18 2016 +0700

----------------------------------------------------------------------
 .../CassandraMessageIdManagerTestSystem.java    |   8 +-
 .../inmemory/InMemoryMessageIdManager.java      | 142 +++++++++++++------
 .../mailbox/store/StoreMailboxManager.java      |   3 -
 .../mailbox/store/StoreMessageIdManager.java    |  60 +++++++-
 .../mailbox/store/StoreMessageManager.java      |   4 +-
 .../AbstractMessageIdManagerSideEffectTest.java |   3 +-
 .../AbstractMessageIdManagerStorageTest.java    | 131 ++++++++++++++++-
 .../store/StoreMessageIdManagerTestSystem.java  |   4 +-
 8 files changed, 300 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
index 41749ed..fcbdca3 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
@@ -104,16 +104,18 @@ public class CassandraMessageIdManagerTestSystem extends 
MessageIdManagerTestSys
         SimpleMailbox mailbox1 = new SimpleMailbox(new MailboxPath("#private", 
"user", "INBOX"), UID_VALIDITY, CassandraId.timeBased());
         SimpleMailbox mailbox2 = new SimpleMailbox(new MailboxPath("#private", 
"user", "OUTBOX"), UID_VALIDITY, CassandraId.timeBased());
         SimpleMailbox mailbox3 = new SimpleMailbox(new MailboxPath("#private", 
"user", "SENT"), UID_VALIDITY, CassandraId.timeBased());
+        SimpleMailbox mailbox4 = new SimpleMailbox(new MailboxPath("#public", 
"otheruser", "INBOX"), UID_VALIDITY, CassandraId.timeBased());
         MockMailboxSession mailboxSession = new MockMailboxSession("user");
         MailboxMapper mailboxMapper = 
mapperFactory.getMailboxMapper(mailboxSession);
         mailboxMapper.save(mailbox1);
         mailboxMapper.save(mailbox2);
         mailboxMapper.save(mailbox3);
+        mailboxMapper.save(mailbox4);
 
         CassandraMailboxManager cassandraMailboxManager = new 
CassandraMailboxManager(mapperFactory, mock(Authenticator.class), new 
NoMailboxPathLocker(), new MessageParser(), messageIdFactory);
         cassandraMailboxManager.init();
 
-        return new CassandraMessageIdManagerTestSystem(messageIdManager, 
mailboxSession, mailbox1, mailbox2, mailbox3,
+        return new CassandraMessageIdManagerTestSystem(messageIdManager, 
mailboxSession, mailbox1, mailbox2, mailbox3, mailbox4,
             messageIdFactory, mapperFactory, mailboxSession, 
cassandraMailboxManager);
     }
 
@@ -122,8 +124,8 @@ public class CassandraMessageIdManagerTestSystem extends 
MessageIdManagerTestSys
     private final MailboxSession mailboxSession;
     private final CassandraMailboxManager cassandraMailboxManager;
 
-    public CassandraMessageIdManagerTestSystem(MessageIdManager 
messageIdManager, MailboxSession session, Mailbox mailbox1, Mailbox mailbox2, 
Mailbox mailbox3, CassandraMessageId.Factory messageIdFactory, 
CassandraMailboxSessionMapperFactory mapperFactory, MailboxSession 
mailboxSession, CassandraMailboxManager cassandraMailboxManager) {
-        super(messageIdManager, session, mailbox1, mailbox2, mailbox3);
+    public CassandraMessageIdManagerTestSystem(MessageIdManager 
messageIdManager, MailboxSession session, Mailbox mailbox1, Mailbox mailbox2, 
Mailbox mailbox3, Mailbox mailbox4, CassandraMessageId.Factory 
messageIdFactory, CassandraMailboxSessionMapperFactory mapperFactory, 
MailboxSession mailboxSession, CassandraMailboxManager cassandraMailboxManager) 
{
+        super(messageIdManager, session, mailbox1, mailbox2, mailbox3, 
mailbox4);
         this.messageIdFactory = messageIdFactory;
         this.mapperFactory = mapperFactory;
         this.mailboxSession = mailboxSession;

http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java
 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java
index bbde9cc..b10b599 100644
--- 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java
+++ 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java
@@ -27,13 +27,16 @@ import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MailboxSession.SessionType;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.FetchGroupImpl;
 import org.apache.james.mailbox.model.MailboxId;
 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.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
@@ -43,6 +46,7 @@ import 
org.apache.james.mailbox.model.MessageResult.FetchGroup;
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
+import com.google.common.base.Throwables;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -59,23 +63,6 @@ public class InMemoryMessageIdManager implements 
MessageIdManager {
         this.mailboxManager = mailboxManager;
     }
     
-    private Optional<MessageResult> findMessageWithId(MailboxId mailboxId, 
final MessageId messageId, FetchGroup fetchGroup, MailboxSession 
mailboxSession) throws MailboxException {
-        return FluentIterable.from(retrieveAllMessages(mailboxId, fetchGroup, 
mailboxSession))
-            .filter(new Predicate<MessageResult>() {
-
-                @Override
-                public boolean apply(MessageResult messageResult) {
-                    return messageResult.getMessageId().equals(messageId);
-                }
-            })
-            .first();
-    }
-
-    private ImmutableList<MessageResult> retrieveAllMessages(MailboxId 
mailboxId, FetchGroup fetchGroup, MailboxSession mailboxSession) throws 
MailboxException {
-        MessageManager messageManager = mailboxManager.getMailbox(mailboxId, 
mailboxSession);
-        return 
ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), fetchGroup, 
mailboxSession));
-    }
-    
     @Override
     public void setFlags(Flags newState, FlagsUpdateMode flagsUpdateMode, 
MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) 
throws MailboxException {
         for (MailboxId mailboxId: mailboxIds) {
@@ -88,29 +75,11 @@ public class InMemoryMessageIdManager implements 
MessageIdManager {
     }
 
     @Override
-    public List<MessageResult> getMessages(List<MessageId> messages, 
FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException {
-        ImmutableList.Builder<MessageResult> builder = ImmutableList.builder();
-        List<MailboxMetaData> userMailboxes = 
mailboxManager.search(userMailboxes(mailboxSession), mailboxSession);
-        for (MailboxMetaData mailboxMetaData: userMailboxes) {
-            builder.addAll(retrieveMailboxMessages(mailboxMetaData.getId(), 
messages, fetchGroup, mailboxSession));
-        }
-        return builder.build();
-    }
-
-    private MailboxQuery userMailboxes(MailboxSession mailboxSession) {
-        return MailboxQuery.builder()
-                .matchesAll()
-                .username(mailboxSession.getUser().getUserName())
-                .build();
-    }
-
-    private List<MessageResult> retrieveMailboxMessages(MailboxId mailboxId, 
List<MessageId> messages, FetchGroup fetchGroup, MailboxSession mailboxSession) 
throws MailboxException {
+    public List<MessageResult> getMessages(List<MessageId> messages, 
FetchGroup fetchGroup, final MailboxSession mailboxSession) throws 
MailboxException {
         ImmutableList.Builder<MessageResult> builder = ImmutableList.builder();
-        for (MessageId messageId: messages) {
-            Optional<MessageResult> maybeMessage = 
findMessageWithId(mailboxId, messageId, fetchGroup, mailboxSession);
-            if (maybeMessage.isPresent()) {
-                builder.add(maybeMessage.get());
-            }
+        List<MailboxId> userMailboxIds = getUsersMailboxIds(mailboxSession);
+        for (MailboxId mailboxId: userMailboxIds) {
+            builder.addAll(retrieveMailboxMessages(mailboxId, messages, 
fetchGroup, mailboxSession));
         }
         return builder.build();
     }
@@ -131,13 +100,16 @@ public class InMemoryMessageIdManager implements 
MessageIdManager {
     @Override
     public void setInMailboxes(MessageId messageId, List<MailboxId> 
mailboxIds, MailboxSession mailboxSession) throws MailboxException {
         List<MessageResult> messages = 
getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, 
mailboxSession);
+
+        filterOnMailboxSession(mailboxIds, mailboxSession);
+
         if (!messages.isEmpty()) {
             ImmutableSet<MailboxId> currentMailboxes = 
currentMailboxes(messages).toSet();
-            
+
             HashSet<MailboxId> targetMailboxes = Sets.newHashSet(mailboxIds);
             List<MailboxId> mailboxesToRemove = 
ImmutableList.copyOf(Sets.difference(currentMailboxes, targetMailboxes));
             SetView<MailboxId> mailboxesToAdd = 
Sets.difference(targetMailboxes, currentMailboxes);
-            
+
             MessageResult referenceMessage = Iterables.getLast(messages);
             for (MailboxId mailboxId: mailboxesToAdd) {
                 MessageRange messageRange = 
referenceMessage.getUid().toRange();
@@ -145,13 +117,82 @@ public class InMemoryMessageIdManager implements 
MessageIdManager {
                 mailboxManager.getMailbox(mailboxId, mailboxSession)
                     .setFlags(referenceMessage.getFlags(), 
FlagsUpdateMode.REPLACE, messageRange, mailboxSession);
             }
-            
+
             for (MessageResult message: messages) {
                 delete(message.getMessageId(), mailboxesToRemove, 
mailboxSession);
             }
         }
     }
 
+    private List<MailboxId> getUsersMailboxIds(final MailboxSession 
mailboxSession) throws MailboxException {
+        return 
FluentIterable.from(mailboxManager.search(userMailboxes(mailboxSession), 
mailboxSession))
+            .transform(getMailboxIdFromMetadata()).toList();
+    }
+
+    private Function<MailboxMetaData, MailboxId> getMailboxIdFromMetadata() {
+        return new Function<MailboxMetaData, MailboxId>() {
+            @Override
+            public MailboxId apply(MailboxMetaData input) {
+                return input.getId();
+            }
+        };
+    }
+
+    private Function<MailboxPath, MailboxId> getMailboxIdFromMailboxPath(final 
MailboxSession mailboxSession) {
+        return new Function<MailboxPath, MailboxId>() {
+            @Override
+            public MailboxId apply(MailboxPath input) {
+                try {
+                    return mailboxManager.getMailbox(input, 
mailboxSession).getId();
+                } catch (MailboxException e) {
+                    throw Throwables.propagate(e);
+                }
+            }
+        };
+    }
+
+    private MailboxQuery userMailboxes(MailboxSession mailboxSession) {
+        return MailboxQuery.builder()
+                .matchesAll()
+                .username(mailboxSession.getUser().getUserName())
+                .build();
+    }
+
+    private List<MessageResult> retrieveMailboxMessages(MailboxId mailboxId, 
List<MessageId> messages, FetchGroup fetchGroup, MailboxSession mailboxSession) 
throws MailboxException {
+        ImmutableList.Builder<MessageResult> builder = ImmutableList.builder();
+        for (MessageId messageId: messages) {
+            Optional<MessageResult> maybeMessage = 
findMessageWithId(mailboxId, messageId, fetchGroup, mailboxSession);
+            if (maybeMessage.isPresent()) {
+                builder.add(maybeMessage.get());
+            }
+        }
+        return builder.build();
+    }
+
+    private void filterOnMailboxSession(List<MailboxId> mailboxIds, 
MailboxSession mailboxSession) throws MailboxNotFoundException {
+        boolean isForbidden = FluentIterable.from(mailboxIds)
+            .firstMatch(findMailboxBelongsToAnotherSession(mailboxSession))
+            .isPresent();
+
+        if (isForbidden) {
+            throw new MailboxNotFoundException("Mailbox does not belong to 
session");
+        }
+    }
+
+    private Predicate<MailboxId> findMailboxBelongsToAnotherSession(final 
MailboxSession mailboxSession) {
+        return new Predicate<MailboxId>() {
+            @Override
+            public boolean apply(MailboxId input) {
+                try {
+                    MailboxPath currentMailbox = 
mailboxManager.getMailbox(input, mailboxSession).getMailboxPath();
+                    return 
!mailboxSession.getUser().isSameUser(currentMailbox.getUser());
+                } catch (MailboxException e) {
+                    return true;
+                }
+            }
+        };
+    }
+
     private FluentIterable<MailboxId> currentMailboxes(List<MessageResult> 
messages) {
         return FluentIterable.from(messages).transform(new 
Function<MessageResult, MailboxId>() {
             @Override
@@ -161,4 +202,21 @@ public class InMemoryMessageIdManager implements 
MessageIdManager {
         });
     }
 
+    private Optional<MessageResult> findMessageWithId(MailboxId mailboxId, 
final MessageId messageId, FetchGroup fetchGroup, MailboxSession 
mailboxSession) throws MailboxException {
+        return FluentIterable.from(retrieveAllMessages(mailboxId, fetchGroup, 
mailboxSession))
+            .filter(new Predicate<MessageResult>() {
+
+                @Override
+                public boolean apply(MessageResult messageResult) {
+                    return messageResult.getMessageId().equals(messageId);
+                }
+            })
+            .first();
+    }
+
+    private ImmutableList<MessageResult> retrieveAllMessages(MailboxId 
mailboxId, FetchGroup fetchGroup, MailboxSession mailboxSession) throws 
MailboxException {
+        MessageManager messageManager = mailboxManager.getMailbox(mailboxId, 
mailboxSession);
+        return 
ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), fetchGroup, 
mailboxSession));
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 760ea6c..8bee086 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -496,9 +496,6 @@ public class StoreMailboxManager implements MailboxManager {
     }
 
     private boolean belongsToCurrentUser(Mailbox mailbox, MailboxSession 
session) {
-        if (session.getUser() == null) {
-            return mailbox.getUser() == null;
-        }
         return session.getUser().isSameUser(mailbox.getUser());
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/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 0a482c1..fcbc10a 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
@@ -31,10 +31,12 @@ import javax.mail.Flags;
 import javax.mail.internet.SharedInputStream;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MailboxSession.SessionType;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageAttachment;
@@ -100,6 +102,10 @@ public class StoreMessageIdManager implements 
MessageIdManager {
     @Override
     public void setFlags(Flags newState, MessageManager.FlagsUpdateMode 
replace, MessageId messageId, List<MailboxId> mailboxIds, MailboxSession 
mailboxSession) throws MailboxException {
         MessageIdMapper messageIdMapper = 
mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession);
+        MailboxMapper mailboxMapper = 
mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
+
+        allowOnMailboxSession(mailboxIds, mailboxSession, mailboxMapper);
+
         Map<MailboxId, UpdatedFlags> updatedFlags = 
messageIdMapper.setFlags(messageId, mailboxIds, newState, replace);
         for (Map.Entry<MailboxId, UpdatedFlags> entry : 
updatedFlags.entrySet()) {
             dispatchFlagsChange(mailboxSession, entry.getKey(), 
entry.getValue());
@@ -107,10 +113,12 @@ public class StoreMessageIdManager implements 
MessageIdManager {
     }
 
     @Override
-    public List<MessageResult> getMessages(List<MessageId> messageIds, final 
MessageResult.FetchGroup fetchGroup, MailboxSession mailboxSession) throws 
MailboxException {
+    public List<MessageResult> getMessages(List<MessageId> messageIds, final 
MessageResult.FetchGroup fetchGroup, final MailboxSession mailboxSession) 
throws MailboxException {
         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))
                 .transform(messageResultConverter(fetchGroup))
                 .toList();
         } catch (WrappedException wrappedException) {
@@ -123,6 +131,8 @@ public class StoreMessageIdManager implements 
MessageIdManager {
         MessageIdMapper messageIdMapper = 
mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession);
         MailboxMapper mailboxMapper = 
mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
 
+        allowOnMailboxSession(mailboxIds, mailboxSession, mailboxMapper);
+
         Iterable<MetadataWithMailboxId> metadatasWithMailbox = FluentIterable
             .from(messageIdMapper.find(ImmutableList.of(messageId), 
MessageMapper.FetchType.Metadata))
             .filter(inMailbox(mailboxIds))
@@ -138,8 +148,13 @@ public class StoreMessageIdManager implements 
MessageIdManager {
     @Override
     public void setInMailboxes(MessageId messageId, List<MailboxId> 
mailboxIds, MailboxSession mailboxSession) throws MailboxException {
         MessageIdMapper messageIdMapper = 
mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession);
+        MailboxMapper mailboxMapper = 
mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
+
+        allowOnMailboxSession(mailboxIds, mailboxSession, mailboxMapper);
 
-        List<MailboxMessage> mailboxMessages = 
messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Full);
+        List<MailboxMessage> mailboxMessages = 
FluentIterable.from(messageIdMapper.find(ImmutableList.of(messageId), 
MessageMapper.FetchType.Full))
+            .filter(belongsToUser(mailboxSession, mailboxMapper))
+            .toList();
 
         if (!mailboxMessages.isEmpty()) {
             ImmutableSet<MailboxId> currentMailboxes = 
FluentIterable.from(mailboxMessages)
@@ -244,6 +259,47 @@ public class StoreMessageIdManager implements 
MessageIdManager {
         };
     }
 
+    private Predicate<MailboxMessage> belongsToUser(final MailboxSession 
mailboxSession, final MailboxMapper mailboxMapper) {
+        return new Predicate<MailboxMessage>() {
+            @Override
+            public boolean apply(MailboxMessage input) {
+                try {
+                    Mailbox currentMailbox = 
mailboxMapper.findMailboxById(input.getMailboxId());
+                    return belongsToCurrentUser(currentMailbox, 
mailboxSession);
+                } catch (MailboxException e) {
+                    return false;
+                }
+            }
+        };
+    }
+
+    private void allowOnMailboxSession(List<MailboxId> mailboxIds, 
MailboxSession mailboxSession, MailboxMapper mailboxMapper) throws 
MailboxNotFoundException {
+        boolean isForbidden = FluentIterable.from(mailboxIds)
+            .firstMatch(isMailboxOfOtherUser(mailboxSession, mailboxMapper))
+            .isPresent();
+
+        if (isForbidden) {
+            throw new MailboxNotFoundException("Mailbox does not belong to 
session: ");
+        }
+    }
+
+    private Predicate<MailboxId> isMailboxOfOtherUser(final MailboxSession 
mailboxSession, final MailboxMapper mailboxMapper) {
+        return new Predicate<MailboxId>() {
+            @Override
+            public boolean apply(MailboxId mailboxId) {
+                try {
+                    return 
!belongsToCurrentUser(mailboxMapper.findMailboxById(mailboxId), mailboxSession);
+                } catch (MailboxException e) {
+                    return true;
+                }
+            }
+        };
+    }
+
+    private boolean belongsToCurrentUser(Mailbox mailbox, MailboxSession 
session) {
+        return session.getUser().isSameUser(mailbox.getUser());
+    }
+
     private static class MetadataWithMailboxId {
         private final MessageMetaData messageMetaData;
         private final MailboxId mailboxId;

http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 4a394d3..452d877 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -41,6 +41,7 @@ import org.apache.commons.io.input.TeeInputStream;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MailboxSession.SessionType;
 import org.apache.james.mailbox.MailboxSession.User;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
@@ -455,7 +456,8 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
      * @throws MailboxException
      */
     public boolean isWriteable(MailboxSession session) throws MailboxException 
{
-        return aclResolver.isReadWrite(myRights(session), 
getSharedPermanentFlags(session));
+        return session.getType() == SessionType.System
+            || aclResolver.isReadWrite(myRights(session), 
getSharedPermanentFlags(session));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
index 9151a70..957d51d 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
@@ -40,6 +40,7 @@ import 
org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.OverQuotaException;
+import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.FetchGroupImpl;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
@@ -85,9 +86,9 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     @Before
     public void setUp() throws Exception {
         dispatcher = mock(MailboxEventDispatcher.class);
-        session = mock(MailboxSession.class);
         quotaManager = mock(QuotaManager.class);
 
+        session = new MockMailboxSession("user");
         testingData = createTestSystem(quotaManager, dispatcher);
         messageIdManager = testingData.getMessageIdManager();
         mailbox1 = testingData.getMailbox1();

http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
index 82684f9..b8c8565 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
@@ -28,9 +28,12 @@ import java.util.Map;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MailboxSession.SessionType;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.FetchGroupImpl;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
@@ -38,7 +41,9 @@ import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
@@ -47,8 +52,10 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 public abstract class AbstractMessageIdManagerStorageTest {
-
     public static final Flags FLAGS = new Flags();
+
+    private static final MailboxSession OTHER_USER = new 
MockMailboxSession("otheruser");
+    private static final MailboxSession SYSTEM_USER = new 
MockMailboxSession("systemuser", SessionType.System);
     private static final MessageUid messageUid1 = MessageUid.of(111);
     private static final MessageUid messageUid2 = MessageUid.of(222);
 
@@ -84,8 +91,12 @@ public abstract class AbstractMessageIdManagerStorageTest {
     private Mailbox mailbox1;
     private Mailbox mailbox2;
     private Mailbox mailbox3;
+    private Mailbox mailbox4;
     private MailboxSession session;
 
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
     protected abstract MessageIdManagerTestSystem createTestingData() throws 
Exception;
 
     @Before
@@ -95,8 +106,9 @@ public abstract class AbstractMessageIdManagerStorageTest {
         mailbox1 = testingData.getMailbox1();
         mailbox2 = testingData.getMailbox2();
         mailbox3 = testingData.getMailbox3();
+        mailbox4 = testingData.getMailbox4();
 
-        session = testingData.getSession();
+        session = new MockMailboxSession("user");
     }
 
     @After
@@ -142,6 +154,22 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
+    public void getMessageShouldReturnMessageBelongToUser() throws Exception {
+        MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
+
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), 
FetchGroupImpl.MINIMAL, session)).hasSize(1);
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), 
FetchGroupImpl.MINIMAL, OTHER_USER)).isEmpty();
+    }
+
+    @Test
+    public void getMessageShouldReturnAllWithSystemSession() throws Exception {
+        MessageId messageId = testingData.persist(mailbox4.getMailboxId(), 
messageUid1, FLAGS);
+
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), 
FetchGroupImpl.MINIMAL, session)).isEmpty();;
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), 
FetchGroupImpl.MINIMAL, SYSTEM_USER)).hasSize(1);
+    }
+
+    @Test
     public void setInMailboxesShouldSetMessageInBothMailboxes() throws 
Exception {
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
 
@@ -253,6 +281,43 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
+    public void 
setInMailboxesShouldThrowExceptionWhenSetInMailboxesInAnotherSession() throws 
Exception {
+        expectedException.expect(MailboxNotFoundException.class);
+
+        MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
+
+        messageIdManager.setInMailboxes(messageId, 
ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), OTHER_USER);
+    }
+
+    @Test
+    public void 
setInMailboxesShouldThrowExceptionWhenOneMailboxDoesNotBelongToMailboxSession() 
throws Exception {
+        expectedException.expect(MailboxNotFoundException.class);
+
+        MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
+
+        messageIdManager.setInMailboxes(messageId, 
ImmutableList.of(mailbox1.getMailboxId(), mailbox4.getMailboxId()), session);
+    }
+
+    @Test
+    public void setInMailboxesShouldIgnoreMessagesBelongingToOtherUsers() 
throws Exception {
+        MessageId messageId = testingData.persist(mailbox4.getMailboxId(), 
messageUid1, FLAGS);
+
+        messageIdManager.setInMailboxes(messageId, 
ImmutableList.of(mailbox1.getMailboxId()), session);
+
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), 
FetchGroupImpl.MINIMAL, session)).isEmpty();
+    }
+
+    @Test
+    public void setInMailboxesShouldSetMessageWhenSystemSession() throws 
Exception {
+        MessageId messageId = testingData.persist(mailbox4.getMailboxId(), 
messageUid1, FLAGS);
+
+        messageIdManager.setInMailboxes(messageId, 
ImmutableList.of(mailbox1.getMailboxId()), SYSTEM_USER);
+
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), 
FetchGroupImpl.MINIMAL, session)).hasSize(1);
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), 
FetchGroupImpl.MINIMAL, SYSTEM_USER)).hasSize(1);
+    }
+
+    @Test
     public void deleteMessageShouldRemoveMessageFromMailbox() throws Exception 
{
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
 
@@ -285,6 +350,32 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
+    public void deleteMessageShouldThrowExceptionWhenDeletingOnOtherSession() 
throws Exception {
+        expectedException.expect(MailboxNotFoundException.class);
+
+        MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
+
+        messageIdManager.delete(messageId, 
ImmutableList.of(mailbox1.getMailboxId()), OTHER_USER);
+    }
+
+    @Test
+    public void deleteMessageShouldWorkWhenDeletingOnSystemSession() throws 
Exception {
+        MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
+
+        messageIdManager.delete(messageId, 
ImmutableList.of(mailbox1.getMailboxId()), SYSTEM_USER);
+
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), 
FetchGroupImpl.MINIMAL, session)).isEmpty();
+    }
+
+    @Test
+    public void 
deleteMessageShouldThrowExceptionWhenOneMailboxDoesNotBelongToUser() throws 
Exception {
+        expectedException.expect(MailboxNotFoundException.class);
+        MessageId messageId = testingData.persist(mailbox4.getMailboxId(), 
messageUid1, FLAGS);
+
+        messageIdManager.delete(messageId, 
ImmutableList.of(mailbox4.getMailboxId()), session);
+    }
+
+    @Test
     public void setFlagsShouldUpdateFlags() throws Exception {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
@@ -417,6 +508,42 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
+    public void setFlagsShouldThrowExceptionWhenSetFlagsOnOtherSession() 
throws Exception {
+        expectedException.expect(MailboxNotFoundException.class);
+
+        Flags newFlags = new Flags(Flags.Flag.SEEN);
+        MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
+
+        messageIdManager.setFlags(newFlags, 
MessageManager.FlagsUpdateMode.ADD, messageId, 
ImmutableList.of(mailbox1.getMailboxId()), OTHER_USER);
+    }
+
+    @Test
+    public void setFlagsShouldShouldWorkWhenSetFlagsOnSystemSession() throws 
Exception {
+        Flags newFlags = new Flags(Flags.Flag.SEEN);
+        MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
+
+        messageIdManager.setFlags(newFlags, 
MessageManager.FlagsUpdateMode.ADD, messageId, 
ImmutableList.of(mailbox1.getMailboxId()), SYSTEM_USER);
+
+        List<Flags> flags = FluentIterable
+            .from(messageIdManager.getMessages(ImmutableList.of(messageId), 
FetchGroupImpl.MINIMAL, session))
+            .transform(getFlags())
+            .toList();
+
+        assertThat(flags).hasSize(1);
+        assertThat(flags.get(0)).isEqualTo(newFlags);
+    }
+
+    @Test
+    public void 
setFlagsShouldThrowExceptionWhenMailboxDoesNotBelongToMailboxSession() throws 
Exception {
+        expectedException.expect(MailboxNotFoundException.class);
+        Flags newFlags = new Flags(Flags.Flag.SEEN);
+        MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
+
+        messageIdManager.setFlags(newFlags, 
MessageManager.FlagsUpdateMode.ADD, messageId, 
ImmutableList.of(mailbox1.getMailboxId(), mailbox4.getMailboxId()), session);
+
+    }
+
+    @Test
     public void getMessageShouldBeEmptyWhenMessageHasNoMoreMailboxes() throws 
Exception {
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), 
messageUid1, FLAGS);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/81832aed/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerTestSystem.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerTestSystem.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerTestSystem.java
index a5cd64e..5c2d84e 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerTestSystem.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerTestSystem.java
@@ -29,9 +29,11 @@ import javax.mail.Flags;
 
 import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MailboxSession.SessionType;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -40,7 +42,7 @@ import 
org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import com.google.common.base.Throwables;
 
 public class StoreMessageIdManagerTestSystem extends 
MessageIdManagerTestSystem {
-    private static final MailboxSession EMPTY_MAILBOX_SESSION = null;
+    private static final MailboxSession EMPTY_MAILBOX_SESSION = new 
MockMailboxSession("user", SessionType.System);
     private static final long MOD_SEQ = 18;
     private static final ByteArrayInputStream ARRAY_INPUT_STREAM = new 
ByteArrayInputStream("".getBytes());
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to