[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));