You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2016/12/21 08:48:47 UTC
[3/4] james-project git commit: JAMES-1888: Add more testing on
MessageIdManager with different user sessions.
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 <qn...@linagora.com>
Authored: Mon Dec 19 16:39:51 2016 +0700
Committer: Quynh Nguyen <qn...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org