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 bt...@apache.org on 2020/06/21 09:16:35 UTC
[james-project] 12/12: JAMES-3167 Reactify right management in
StoreMessageIdManager
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 <bt...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org