This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 3567a93c41ba8e6b23eb893f617d3cedf2856bca Author: Benoit Tellier <[email protected]> AuthorDate: Wed Jun 17 15:34:17 2020 +0700 JAMES-3167 Reactify right management in StoreMessageIdManager --- .../james/mailbox/store/StoreMessageIdManager.java | 59 ++++++++++------------ 1 file changed, 26 insertions(+), 33 deletions(-) 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 4ed6fb9..994daad 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 @@ -118,7 +118,7 @@ public class StoreMessageIdManager implements MessageIdManager { 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); + MailboxReactorUtils.block(assertRightsOnMailboxes(mailboxIds, mailboxSession, Right.Write)); Multimap<MailboxId, UpdatedFlags> updatedFlags = messageIdMapper.setFlags(messageId, mailboxIds, newState, replace); for (Map.Entry<MailboxId, Collection<UpdatedFlags>> entry : updatedFlags.asMap().entrySet()) { @@ -158,19 +158,19 @@ public class StoreMessageIdManager implements MessageIdManager { .map(Throwing.function(messageResultConverter(fetchGroup)).sneakyThrow()); } - 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()); + private ImmutableSet<MailboxId> getAllowedMailboxIds(MailboxSession mailboxSession, List<MailboxMessage> messageList, Right... rights) throws MailboxException { + return MailboxReactorUtils.block(Flux.fromIterable(messageList) + .map(MailboxMessage::getMailboxId) + .distinct() + .filterWhen(hasRightsOnMailboxReactive(mailboxSession, rights)) + .collect(Guavate.toImmutableSet())); } @Override public DeleteResult delete(MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); - assertRightsOnMailboxes(mailboxIds, mailboxSession, Right.DeleteMessages); + MailboxReactorUtils.block(assertRightsOnMailboxes(mailboxIds, mailboxSession, Right.DeleteMessages)); List<MailboxMessage> messageList = messageIdMapper .find(ImmutableList.of(messageId), MessageMapper.FetchType.Metadata) @@ -243,7 +243,7 @@ public class StoreMessageIdManager implements MessageIdManager { @Override public void setInMailboxes(MessageId messageId, Collection<MailboxId> targetMailboxIds, MailboxSession mailboxSession) throws MailboxException { - assertRightsOnMailboxes(targetMailboxIds, mailboxSession, Right.Read); + MailboxReactorUtils.block(assertRightsOnMailboxes(targetMailboxIds, mailboxSession, Right.Read)); List<MailboxMessage> currentMailboxMessages = findRelatedMailboxMessages(messageId, mailboxSession); @@ -276,18 +276,17 @@ public class StoreMessageIdManager implements MessageIdManager { } } - private List<MailboxMessage> findRelatedMailboxMessages(MessageId messageId, MailboxSession mailboxSession) { + private List<MailboxMessage> findRelatedMailboxMessages(MessageId messageId, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); - return messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Metadata) - .stream() - .filter(hasRightsOn(mailboxSession, Right.Read)) - .collect(Guavate.toImmutableList()); + return MailboxReactorUtils.block(messageIdMapper.findReactive(ImmutableList.of(messageId), MessageMapper.FetchType.Metadata) + .filterWhen(hasRightsOn(mailboxSession, Right.Read)) + .collect(Guavate.toImmutableList())); } private void applyMessageMoves(MailboxSession mailboxSession, List<MailboxMessage> currentMailboxMessages, MessageMoves messageMoves) throws MailboxException { - assertRightsOnMailboxes(messageMoves.addedMailboxIds(), mailboxSession, Right.Insert); - assertRightsOnMailboxes(messageMoves.removedMailboxIds(), mailboxSession, Right.DeleteMessages); + MailboxReactorUtils.block(assertRightsOnMailboxes(messageMoves.addedMailboxIds(), mailboxSession, Right.Insert)); + MailboxReactorUtils.block(assertRightsOnMailboxes(messageMoves.removedMailboxIds(), mailboxSession, Right.DeleteMessages)); applyMessageMoveNoMailboxChecks(mailboxSession, currentMailboxMessages, messageMoves); } @@ -427,14 +426,8 @@ public class StoreMessageIdManager implements MessageIdManager { return mailboxMessage -> mailboxIds.contains(mailboxMessage.getMailboxId()); } - private Predicate<MailboxMessage> hasRightsOn(MailboxSession session, Right... rights) { - return message -> hasRightsOnMailbox(session, rights).test(message.getMailboxId()); - } - - - private Predicate<MailboxId> hasRightsOnMailbox(MailboxSession session, Right... rights) { - return Throwing.predicate((MailboxId mailboxId) -> block(Mono.from(rightManager.myRights(mailboxId, session))).contains(rights)) - .fallbackTo(any -> false); + private Function<MailboxMessage, Mono<Boolean>> hasRightsOn(MailboxSession session, Right... rights) { + return hasRightsOnMailboxReactive(session, rights).compose(MailboxMessage::getMailboxId); } private Function<MailboxId, Mono<Boolean>> hasRightsOnMailboxReactive(MailboxSession session, Right... rights) { @@ -443,14 +436,14 @@ public class StoreMessageIdManager implements MessageIdManager { .onErrorResume(any -> Mono.just(false)); } - private void assertRightsOnMailboxes(Collection<MailboxId> mailboxIds, MailboxSession mailboxSession, Right... rights) throws MailboxNotFoundException { - Optional<MailboxId> mailboxForbidden = mailboxIds.stream() - .filter(hasRightsOnMailbox(mailboxSession, rights).negate()) - .findFirst(); - - if (mailboxForbidden.isPresent()) { - LOGGER.info("Mailbox with Id {} does not belong to {}", mailboxForbidden.get(), mailboxSession.getUser().asString()); - throw new MailboxNotFoundException(mailboxForbidden.get()); - } + private Mono<Void> assertRightsOnMailboxes(Collection<MailboxId> mailboxIds, MailboxSession mailboxSession, Right... rights) throws MailboxNotFoundException { + return Flux.fromIterable(mailboxIds) + .filterWhen(hasRightsOnMailboxReactive(mailboxSession, rights).andThen(result -> result.map(b -> !b))) + .next() + .flatMap(mailboxForbidden -> { + LOGGER.info("Mailbox with Id {} does not belong to {}", mailboxForbidden, mailboxSession.getUser().asString()); + return Mono.error(new MailboxNotFoundException(mailboxForbidden)); + }) + .then(); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
