private void applyMessageMoveNoMailboxChecks(MailboxSession mailboxSession, List<MailboxMessage> currentMailboxMessages, MessageMoves messageMoves) throws MailboxException { MailboxMessage mailboxMessage = currentMailboxMessages.stream().findAny().orElseThrow(() -> new MailboxNotFoundException("can't load message")); validateQuota(messageMoves, mailboxSession, mailboxMessage); addMessageToMailboxes(mailboxMessage, messageMoves.addedMailboxIds(), mailboxSession); removeMessageFromMailboxes(mailboxMessage, messageMoves.removedMailboxIds(), mailboxSession); dispatcher.moved(mailboxSession, messageMoves, ImmutableMap.of(mailboxMessage.getUid(), mailboxMessage)); }
private void applyMessageMoves(MailboxSession mailboxSession, List<MailboxMessage> currentMailboxMessages, MessageMoves messageMoves) throws MailboxException { assertRightsOnMailboxes(messageMoves.addedMailboxIds(), mailboxSession, Right.Insert); assertRightsOnMailboxes(messageMoves.removedMailboxIds(), mailboxSession, Right.DeleteMessages); applyMessageMoveNoMailboxChecks(mailboxSession, currentMailboxMessages, messageMoves); }
@Override public void setInMailboxes(MessageId messageId, Collection<MailboxId> targetMailboxIds, MailboxSession mailboxSession) throws MailboxException { assertRightsOnMailboxes(targetMailboxIds, mailboxSession, Right.Read); List<MailboxMessage> currentMailboxMessages = findRelatedMailboxMessages(messageId, mailboxSession); if (currentMailboxMessages.isEmpty()) { LOGGER.info("Tried to access {} not accessible for {}", messageId, mailboxSession.getUser().getUserName()); return; } MessageMoves messageMoves = MessageMoves.builder() .targetMailboxIds(targetMailboxIds) .previousMailboxIds(toMailboxIds(currentMailboxMessages)) .build(); if (messageMoves.isChange()) { applyMessageMoves(mailboxSession, currentMailboxMessages, messageMoves); } }
@Override public void setFlags(Flags newState, MessageManager.FlagsUpdateMode replace, MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); assertRightsOnMailboxes(mailboxIds, mailboxSession, Right.Write); Map<MailboxId, UpdatedFlags> updatedFlags = messageIdMapper.setFlags(messageId, mailboxIds, newState, replace); for (Map.Entry<MailboxId, UpdatedFlags> entry : updatedFlags.entrySet()) { dispatchFlagsChange(mailboxSession, entry.getKey(), entry.getValue()); } }
public MessageIdManager createMessageIdManager(StoreMailboxManager mailboxManager, MessageId.Factory factory) { return new StoreMessageIdManager( mailboxManager, mailboxManager.getMapperFactory(), mailboxManager.getEventDispatcher(), factory, mailboxManager.getQuotaManager(), mailboxManager.getQuotaRootResolver()); }
@Override public DeleteResult delete(MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); assertRightsOnMailboxes(mailboxIds, mailboxSession, Right.DeleteMessages); List<MailboxMessage> messageList = messageIdMapper .find(ImmutableList.of(messageId), MessageMapper.FetchType.Metadata) .stream() .filter(inMailboxes(mailboxIds)) .collect(Guavate.toImmutableList()); if (!messageList.isEmpty()) { delete(messageIdMapper, messageList, mailboxSession); return DeleteResult.destroyed(messageId); } return DeleteResult.notFound(messageId); }
@Override public DeleteResult delete(List<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.DeleteMessages); ImmutableSet<MessageId> accessibleMessages = messageList.stream() .filter(message -> allowedMailboxIds.contains(message.getMailboxId())) .map(MailboxMessage::getMessageId) .distinct() .collect(Guavate.toImmutableSet()); Sets.SetView<MessageId> nonAccessibleMessages = Sets.difference(ImmutableSet.copyOf(messageIds), accessibleMessages); delete(messageIdMapper, messageList, mailboxSession); return DeleteResult.builder() .addDestroyed(accessibleMessages) .addNotFound(nonAccessibleMessages) .build(); }
public void setInMailboxesNoCheck(MessageId messageId, MailboxId targetMailboxId, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> currentMailboxMessages = messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Full); MessageMoves messageMoves = MessageMoves.builder() .previousMailboxIds(toMailboxIds(currentMailboxMessages)) .targetMailboxIds(targetMailboxId) .build(); if (messageMoves.isChange()) { applyMessageMoveNoMailboxChecks(mailboxSession, currentMailboxMessages, messageMoves); } }
private void validateQuota(MessageMoves messageMoves, MailboxSession mailboxSession, MailboxMessage mailboxMessage) throws MailboxException { MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); Map<QuotaRoot, Integer> messageCountByQuotaRoot = buildMapQuotaRoot(messageMoves, mailboxMapper); for (Map.Entry<QuotaRoot, Integer> entry : messageCountByQuotaRoot.entrySet()) { Integer additionalCopyCount = entry.getValue(); if (additionalCopyCount > 0) { long additionalOccupiedSpace = additionalCopyCount * mailboxMessage.getFullContentOctets(); new QuotaChecker(quotaManager.getMessageQuota(entry.getKey()), quotaManager.getStorageQuota(entry.getKey()), entry.getKey()) .tryAddition(additionalCopyCount, additionalOccupiedSpace); } } }
public static StoreMessageIdManager createMessageIdManager(CassandraMailboxSessionMapperFactory mapperFactory, QuotaManager quotaManager, MailboxEventDispatcher dispatcher) throws Exception { return new StoreMessageIdManager( createMailboxManager(mapperFactory), mapperFactory, dispatcher, new CassandraMessageId.Factory(), quotaManager, new DefaultUserQuotaRootResolver(mapperFactory)); }
@Override protected void initializeMailboxManager() throws Exception { storeMailboxManager = new InMemoryIntegrationResources() .createMailboxManager(new SimpleGroupMembershipResolver()); messageSearchIndex = new SimpleMessageSearchIndex( storeMailboxManager.getMapperFactory(), storeMailboxManager.getMapperFactory(), new PDFTextExtractor()); messageIdManager = new StoreMessageIdManager( storeMailboxManager, storeMailboxManager.getMapperFactory(), storeMailboxManager.getEventDispatcher(), storeMailboxManager.getMessageIdFactory(), storeMailboxManager.getQuotaManager(), storeMailboxManager.getQuotaRootResolver()); storeMailboxManager.setMessageSearchIndex(messageSearchIndex); }
@Override protected void initializeMailboxManager() throws Exception { Client client = MailboxIndexCreationUtil.prepareDefaultClient( new TestingClientProvider(embeddedElasticSearch.getNode()).get()); storeMailboxManager = new InMemoryIntegrationResources() .createMailboxManager(new SimpleGroupMembershipResolver()); ElasticSearchListeningMessageSearchIndex elasticSearchListeningMessageSearchIndex = new ElasticSearchListeningMessageSearchIndex( storeMailboxManager.getMapperFactory(), new ElasticSearchIndexer(client, Executors.newSingleThreadExecutor(), MailboxElasticSearchConstants.DEFAULT_MAILBOX_WRITE_ALIAS, MailboxElasticSearchConstants.MESSAGE_TYPE, BATCH_SIZE), new ElasticSearchSearcher(client, new QueryConverter(new CriterionConverter()), SEARCH_SIZE, new InMemoryId.Factory(), storeMailboxManager.getMessageIdFactory(), MailboxElasticSearchConstants.DEFAULT_MAILBOX_READ_ALIAS, MailboxElasticSearchConstants.MESSAGE_TYPE), new MessageToElasticSearchJson(textExtractor, ZoneId.of("Europe/Paris"), IndexAttachments.YES)); messageIdManager = new StoreMessageIdManager( storeMailboxManager, storeMailboxManager.getMapperFactory(), storeMailboxManager.getEventDispatcher(), storeMailboxManager.getMessageIdFactory(), storeMailboxManager.getQuotaManager(), storeMailboxManager.getQuotaRootResolver()); storeMailboxManager.setMessageSearchIndex(elasticSearchListeningMessageSearchIndex); storeMailboxManager.addGlobalListener(elasticSearchListeningMessageSearchIndex, new MockMailboxSession("admin")); this.messageSearchIndex = elasticSearchListeningMessageSearchIndex; }
new StoreMailboxAnnotationManager(mapperFactory, rightManager), rightManager); StoreMessageIdManager messageIdManager = new StoreMessageIdManager( mailboxManager, mapperFactory,