[ENHANCEMENT] Fully reactive RRT for JMAP
diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/api/AliasReverseResolver.java b/server/data/data-api/src/main/java/org/apache/james/rrt/api/AliasReverseResolver.java
index 0967209..c4d7c64 100644
--- a/server/data/data-api/src/main/java/org/apache/james/rrt/api/AliasReverseResolver.java
+++ b/server/data/data-api/src/main/java/org/apache/james/rrt/api/AliasReverseResolver.java
@@ -24,5 +24,5 @@
import org.reactivestreams.Publisher;
public interface AliasReverseResolver {
- Publisher<MailAddress> listAddresses(Username user) throws RecipientRewriteTable.ErrorMappingException, RecipientRewriteTableException;
+ Publisher<MailAddress> listAddresses(Username user);
}
diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/CanSendFromImpl.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/CanSendFromImpl.java
index 5e29e04..331a6db 100644
--- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/CanSendFromImpl.java
+++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/CanSendFromImpl.java
@@ -18,12 +18,6 @@
****************************************************************/
package org.apache.james.rrt.lib;
-import static org.apache.james.rrt.lib.Mapping.Type.Alias;
-import static org.apache.james.rrt.lib.Mapping.Type.DomainAlias;
-
-import java.util.EnumSet;
-import java.util.Optional;
-
import jakarta.inject.Inject;
import org.apache.james.core.Domain;
@@ -31,9 +25,6 @@
import org.apache.james.core.Username;
import org.apache.james.rrt.api.AliasReverseResolver;
import org.apache.james.rrt.api.CanSendFrom;
-import org.apache.james.rrt.api.RecipientRewriteTable;
-import org.apache.james.rrt.api.RecipientRewriteTableException;
-import org.apache.james.util.ReactorUtils;
import org.reactivestreams.Publisher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -49,22 +40,21 @@
}
private static final Logger LOGGER = LoggerFactory.getLogger(CanSendFromImpl.class);
- private static final EnumSet<Mapping.Type> ALIAS_TYPES_ACCEPTED_IN_FROM = EnumSet.of(Alias, DomainAlias);
-
- private final RecipientRewriteTable recipientRewriteTable;
private final AliasReverseResolver aliasReverseResolver;
@Inject
- public CanSendFromImpl(RecipientRewriteTable recipientRewriteTable, AliasReverseResolver aliasReverseResolver) {
- this.recipientRewriteTable = recipientRewriteTable;
+ public CanSendFromImpl(AliasReverseResolver aliasReverseResolver) {
this.aliasReverseResolver = aliasReverseResolver;
}
@Override
public boolean userCanSendFrom(Username connectedUser, Username fromUser) {
try {
- return connectedUser.equals(fromUser) || emailIsAnAliasOfTheConnectedUser(connectedUser, fromUser);
- } catch (RecipientRewriteTableException | RecipientRewriteTable.ErrorMappingException e) {
+ return connectedUser.equals(fromUser) || allValidFromAddressesForUser(connectedUser)
+ .map(Username::fromMailAddress)
+ .any(fromUser::equals)
+ .block();
+ } catch (Exception e) {
LOGGER.warn("Error upon {} mapping resolution for {}. You might want to audit mapping content for this mapping entry. ",
fromUser.asString(),
connectedUser.asString());
@@ -74,22 +64,16 @@
@Override
public Publisher<Boolean> userCanSendFromReactive(Username connectedUser, Username fromUser) {
- return Mono.fromCallable(() -> userCanSendFrom(connectedUser, fromUser))
- .subscribeOn(ReactorUtils.BLOCKING_CALL_WRAPPER);
+ if (connectedUser.equals(fromUser)) {
+ return Mono.just(true);
+ }
+ return allValidFromAddressesForUser(connectedUser)
+ .map(Username::fromMailAddress)
+ .any(fromUser::equals);
}
@Override
- public Flux<MailAddress> allValidFromAddressesForUser(Username user) throws RecipientRewriteTable.ErrorMappingException, RecipientRewriteTableException {
+ public Flux<MailAddress> allValidFromAddressesForUser(Username user) {
return Flux.from(aliasReverseResolver.listAddresses(user));
}
-
- private boolean emailIsAnAliasOfTheConnectedUser(Username connectedUser, Username fromUser) throws RecipientRewriteTable.ErrorMappingException, RecipientRewriteTableException {
- return fromUser.getDomainPart().isPresent()
- && recipientRewriteTable.getResolvedMappings(fromUser.getLocalPart(), fromUser.getDomainPart().get(), ALIAS_TYPES_ACCEPTED_IN_FROM)
- .asStream()
- .map(Mapping::asMailAddress)
- .flatMap(Optional::stream)
- .map(Username::fromMailAddress)
- .anyMatch(alias -> alias.equals(connectedUser));
- }
}
diff --git a/server/data/data-memory/src/test/java/org/apache/james/rrt/lib/CanSendFromImplTest.java b/server/data/data-memory/src/test/java/org/apache/james/rrt/lib/CanSendFromImplTest.java
index 3ca74ae..7dd4137 100644
--- a/server/data/data-memory/src/test/java/org/apache/james/rrt/lib/CanSendFromImplTest.java
+++ b/server/data/data-memory/src/test/java/org/apache/james/rrt/lib/CanSendFromImplTest.java
@@ -54,7 +54,7 @@
recipientRewriteTable.setUserEntityValidator(UserEntityValidator.NOOP);
AliasReverseResolver aliasReverseResolver = new AliasReverseResolverImpl(recipientRewriteTable);
- canSendFrom = new CanSendFromImpl(recipientRewriteTable, aliasReverseResolver);
+ canSendFrom = new CanSendFromImpl(aliasReverseResolver);
}
@Override
diff --git a/server/protocols/protocols-lmtp/src/test/java/org/apache/james/lmtpserver/LmtpServerTest.java b/server/protocols/protocols-lmtp/src/test/java/org/apache/james/lmtpserver/LmtpServerTest.java
index d9e99dd..dd02a31 100644
--- a/server/protocols/protocols-lmtp/src/test/java/org/apache/james/lmtpserver/LmtpServerTest.java
+++ b/server/protocols/protocols-lmtp/src/test/java/org/apache/james/lmtpserver/LmtpServerTest.java
@@ -153,7 +153,7 @@
MemoryRecipientRewriteTable rewriteTable = new MemoryRecipientRewriteTable();
rewriteTable.setConfiguration(RecipientRewriteTableConfiguration.DEFAULT_ENABLED);
AliasReverseResolver aliasReverseResolver = new AliasReverseResolverImpl(rewriteTable);
- CanSendFrom canSendFrom = new CanSendFromImpl(rewriteTable, aliasReverseResolver);
+ CanSendFrom canSendFrom = new CanSendFromImpl(aliasReverseResolver);
return MockProtocolHandlerLoader.builder()
.put(binder -> binder.bind(DomainList.class).toInstance(domainList))
.put(binder -> binder.bind(RecipientRewriteTable.class).toInstance(rewriteTable))
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTestSystem.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTestSystem.java
index 6b11d61..a72c252 100644
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTestSystem.java
+++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTestSystem.java
@@ -156,7 +156,7 @@
rewriteTable = new MemoryRecipientRewriteTable();
rewriteTable.setConfiguration(RecipientRewriteTableConfiguration.DEFAULT_ENABLED);
AliasReverseResolver aliasReverseResolver = new AliasReverseResolverImpl(rewriteTable);
- CanSendFrom canSendFrom = new CanSendFromImpl(rewriteTable, aliasReverseResolver);
+ CanSendFrom canSendFrom = new CanSendFromImpl(aliasReverseResolver);
queueFactory = new MemoryMailQueueFactory(new RawMailQueueItemDecoratorFactory(), CLOCK);
queue = queueFactory.createQueue(MailQueueFactory.SPOOL);
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java
index 0f5edfd..317a280 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java
@@ -127,7 +127,7 @@
this.recipientRewriteTable.setDomainList(domainList);
this.recipientRewriteTable.setConfiguration(RecipientRewriteTableConfiguration.DEFAULT_ENABLED);
this.aliasReverseResolver = new AliasReverseResolverImpl(recipientRewriteTable);
- this.canSendFrom = new CanSendFromImpl(recipientRewriteTable, aliasReverseResolver);
+ this.canSendFrom = new CanSendFromImpl(aliasReverseResolver);
UserEntityValidator validator = UserEntityValidator.aggregate(
new DefaultUserEntityValidator(this.usersRepository),
new RecipientRewriteTableUserEntityValidator(recipientRewriteTable));