You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2024/05/07 03:07:38 UTC
(james-project) 02/03: [ENHANCEMENT] Fully reactive RRT for JMAP
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 8d3c4ee84fd97a174eb7573d297e69d4eb7e92f5
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Sat May 4 09:12:37 2024 +0200
[ENHANCEMENT] Fully reactive RRT for JMAP
---
.../apache/james/rrt/api/AliasReverseResolver.java | 2 +-
.../org/apache/james/rrt/lib/CanSendFromImpl.java | 42 +++++++---------------
.../apache/james/rrt/lib/CanSendFromImplTest.java | 2 +-
.../apache/james/lmtpserver/LmtpServerTest.java | 2 +-
.../james/smtpserver/SMTPServerTestSystem.java | 2 +-
.../james/webadmin/routes/UserRoutesTest.java | 2 +-
6 files changed, 18 insertions(+), 34 deletions(-)
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 09672093db..c4d7c64a79 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.apache.james.core.Username;
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 5e29e04e52..331a6db23a 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.MailAddress;
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 @@ public class CanSendFromImpl implements CanSendFrom {
}
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 @@ public class CanSendFromImpl implements CanSendFrom {
@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 3ca74aea0c..7dd41377e1 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 @@ public class CanSendFromImplTest implements CanSendFromContract {
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 d9e99dd957..dd02a3182d 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 @@ class LmtpServerTest {
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 6b11d6181b..a72c2521ab 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 @@ class SMTPServerTestSystem {
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 0f5edfd3da..317a280648 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 @@ class UserRoutesTest {
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));
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org