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 fa99c394508161794b14b24df7ad4cbf74d41342
Author: RĂ©mi KOWALSKI <[email protected]>
AuthorDate: Tue Feb 11 11:57:17 2020 +0100

    JAMES-3066 Add method in CanSendFrom to list all the  valid from addresses 
of a user
---
 .../java/org/apache/james/rrt/api/CanSendFrom.java |  8 +++
 .../apache/james/rrt/lib/CanSendFromContract.java  | 72 +++++++++++++++++++---
 .../org/apache/james/rrt/lib/CanSendFromImpl.java  | 37 +++++++++++
 3 files changed, 109 insertions(+), 8 deletions(-)

diff --git 
a/server/data/data-api/src/main/java/org/apache/james/rrt/api/CanSendFrom.java 
b/server/data/data-api/src/main/java/org/apache/james/rrt/api/CanSendFrom.java
index 41e495c..794f5c4 100644
--- 
a/server/data/data-api/src/main/java/org/apache/james/rrt/api/CanSendFrom.java
+++ 
b/server/data/data-api/src/main/java/org/apache/james/rrt/api/CanSendFrom.java
@@ -18,6 +18,9 @@
  ****************************************************************/
 package org.apache.james.rrt.api;
 
+import java.util.stream.Stream;
+
+import org.apache.james.core.MailAddress;
 import org.apache.james.core.Username;
 
 public interface CanSendFrom {
@@ -27,4 +30,9 @@ public interface CanSendFrom {
      */
     boolean userCanSendFrom(Username connectedUser, Username fromUser);
 
+    /**
+     * For a given user, return all the addresses he can use in the from 
clause of an email.
+     */
+    Stream<MailAddress> allValidFromAddressesForUser(Username user) throws 
RecipientRewriteTable.ErrorMappingException, RecipientRewriteTableException;
+
 }
diff --git 
a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/CanSendFromContract.java
 
b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/CanSendFromContract.java
index b806193..13df95e 100644
--- 
a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/CanSendFromContract.java
+++ 
b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/CanSendFromContract.java
@@ -23,6 +23,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 import org.apache.james.core.Domain;
 import org.apache.james.core.Username;
 import org.apache.james.rrt.api.CanSendFrom;
+
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 public interface CanSendFromContract {
@@ -41,33 +43,32 @@ public interface CanSendFromContract {
 
     void addGroupMapping(String group, Username user) throws Exception;
 
-
     @Test
-    default void assertUserCanSendFromShouldBeFalseWhenSenderIsNotTheUser() {
+    default void userCanSendFromShouldBeFalseWhenSenderIsNotTheUser() {
         assertThat(canSendFrom().userCanSendFrom(USER, OTHER_USER)).isFalse();
     }
 
     @Test
-    default void assertUserCanSendFromShouldBeTrueWhenSenderIsTheUser() {
+    default void userCanSendFromShouldBeTrueWhenSenderIsTheUser() {
         assertThat(canSendFrom().userCanSendFrom(USER, USER)).isTrue();
     }
 
     @Test
-    default void 
assertUserCanSendFromShouldBeFalseWhenSenderIsAnAliasOfAnotherUser() throws 
Exception {
+    default void 
userCanSendFromShouldBeFalseWhenSenderIsAnAliasOfAnotherUser() throws Exception 
{
         addAliasMapping(USER_ALIAS, OTHER_USER);
 
         assertThat(canSendFrom().userCanSendFrom(USER, USER_ALIAS)).isFalse();
     }
 
     @Test
-    default void 
assertUserCanSendFromShouldBeTrueWhenSenderIsAnAliasOfTheUser() throws 
Exception {
+    default void userCanSendFromShouldBeTrueWhenSenderIsAnAliasOfTheUser() 
throws Exception {
         addAliasMapping(USER_ALIAS, USER);
 
         assertThat(canSendFrom().userCanSendFrom(USER, USER_ALIAS)).isTrue();
     }
 
     @Test
-    default void 
assertUserCanSendFromShouldBeTrueWhenSenderIsAnAliasOfAnAliasOfTheUser() throws 
Exception {
+    default void 
userCanSendFromShouldBeTrueWhenSenderIsAnAliasOfAnAliasOfTheUser() throws 
Exception {
         Username userAliasBis = Username.of("aliasbis@" + DOMAIN.asString());
         addAliasMapping(userAliasBis, USER_ALIAS);
         addAliasMapping(USER_ALIAS, USER);
@@ -76,7 +77,7 @@ public interface CanSendFromContract {
     }
 
     @Test
-    default void 
assertUserCanSendFromShouldBeTrueWhenSenderIsAnAliasOfTheDomainUser() throws 
Exception {
+    default void 
userCanSendFromShouldBeTrueWhenSenderIsAnAliasOfTheDomainUser() throws 
Exception {
         Username fromUser = Username.of(USER.getLocalPart() + "@" + 
OTHER_DOMAIN.asString());
 
         addDomainMapping(OTHER_DOMAIN, DOMAIN);
@@ -85,7 +86,7 @@ public interface CanSendFromContract {
     }
 
     @Test
-    default void 
assertUserCanSendFromShouldBeFalseWhenWhenSenderIsAnAliasOfTheUserFromAGroupAlias()
 throws Exception {
+    default void 
userCanSendFromShouldBeFalseWhenWhenSenderIsAnAliasOfTheUserFromAGroupAlias() 
throws Exception {
         Username fromGroup = Username.of("[email protected]");
 
         addGroupMapping("[email protected]", USER);
@@ -93,4 +94,59 @@ public interface CanSendFromContract {
         assertThat(canSendFrom().userCanSendFrom(USER, fromGroup)).isFalse();
 
     }
+
+    @Test
+    default void 
allValidFromAddressesShouldContainOnlyUserAddressWhenUserHasNoAlias() throws 
Exception {
+        assertThat(canSendFrom().allValidFromAddressesForUser(USER))
+            .containsExactly(USER.asMailAddress());
+    }
+
+    @Test
+    default void 
allValidFromAddressesShouldContainOnlyUserAddressWhenUserHasNoAliasAndAnotherUserHasOne()
 throws Exception {
+        addAliasMapping(USER_ALIAS, OTHER_USER);
+        assertThat(canSendFrom().allValidFromAddressesForUser(USER))
+            .containsExactly(USER.asMailAddress());
+    }
+
+    @Test
+    default void 
allValidFromAddressesShouldContainUserAddressAndAnAliasOfTheUser() throws 
Exception {
+        addAliasMapping(USER_ALIAS, USER);
+
+        assertThat(canSendFrom().allValidFromAddressesForUser(USER))
+            .containsExactlyInAnyOrder(USER.asMailAddress(), 
USER_ALIAS.asMailAddress());
+    }
+
+    @Test
+    @Disabled("Recursive aliases are not supported yet")
+    default void 
allValidFromAddressesFromShouldBeTrueWhenSenderIsAnAliasOfAnAliasOfTheUser() 
throws Exception {
+        Username userAliasBis = Username.of("aliasbis@" + DOMAIN.asString());
+        addAliasMapping(userAliasBis, USER_ALIAS);
+        addAliasMapping(USER_ALIAS, USER);
+
+        assertThat(canSendFrom().allValidFromAddressesForUser(USER))
+            .containsExactlyInAnyOrder(USER.asMailAddress(), 
USER_ALIAS.asMailAddress(), userAliasBis.asMailAddress());
+    }
+
+    @Test
+    default void 
allValidFromAddressesShouldContainUserAddressAndAnAliasOfTheDomainUser() throws 
Exception {
+        Username fromUser = Username.of(USER.getLocalPart() + "@" + 
OTHER_DOMAIN.asString());
+
+        addDomainMapping(OTHER_DOMAIN, DOMAIN);
+
+        assertThat(canSendFrom().allValidFromAddressesForUser(USER))
+            .containsExactlyInAnyOrder(USER.asMailAddress(), 
fromUser.asMailAddress());
+    }
+
+    @Test
+    default void 
allValidFromAddressesShouldContainUserAddressAndAnAliasOfTheDomainUserFromAnotherDomain()
 throws Exception {
+        Username userAliasOtherDomain = Username.of(USER_ALIAS.getLocalPart() 
+ "@" + OTHER_DOMAIN.asString());
+
+        addDomainMapping(OTHER_DOMAIN, DOMAIN);
+        addAliasMapping(userAliasOtherDomain, USER);
+
+        Username userAliasMainDomain = Username.of(USER_ALIAS.getLocalPart() + 
"@" + DOMAIN.asString());
+        Username userOtherDomain = Username.of(USER.getLocalPart() + "@" + 
OTHER_DOMAIN.asString());
+        assertThat(canSendFrom().allValidFromAddressesForUser(USER))
+            .containsExactlyInAnyOrder(USER.asMailAddress(), 
userAliasOtherDomain.asMailAddress(), userAliasMainDomain.asMailAddress(), 
userOtherDomain.asMailAddress());
+    }
 }
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 e82cbe1..97130c6 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
@@ -22,15 +22,22 @@ import static org.apache.james.rrt.lib.Mapping.Type.Alias;
 import static org.apache.james.rrt.lib.Mapping.Type.Domain;
 
 import java.util.EnumSet;
+import java.util.List;
+import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.Domain;
+import org.apache.james.core.MailAddress;
 import org.apache.james.core.Username;
 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.OptionalUtils;
 
+import com.github.fge.lambdas.Throwing;
+import com.github.steveash.guavate.Guavate;
+
 public class CanSendFromImpl implements CanSendFrom {
 
     public static final EnumSet<Mapping.Type> ALIAS_TYPES_ACCEPTED_IN_FROM = 
EnumSet.of(Alias, Domain);
@@ -50,6 +57,16 @@ public class CanSendFromImpl implements CanSendFrom {
         }
     }
 
+    @Override
+    public Stream<MailAddress> allValidFromAddressesForUser(Username user) 
throws RecipientRewriteTable.ErrorMappingException, 
RecipientRewriteTableException {
+        List<String> domains = 
relatedDomains(user).collect(Guavate.toImmutableList());
+
+        return relatedAliases(user)
+            .flatMap(userPart -> domains.stream()
+                .map(domainPart -> userPart + "@" + domainPart)
+            .map(Throwing.<String, 
MailAddress>function(MailAddress::new).sneakyThrow()));
+    }
+
     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)
@@ -60,4 +77,24 @@ public class CanSendFromImpl implements CanSendFrom {
             .anyMatch(alias -> alias.equals(connectedUser));
     }
 
+    private Stream<String> relatedAliases(Username user) throws 
RecipientRewriteTableException {
+        return Stream.concat(
+            Stream.of(user.getLocalPart()),
+            recipientRewriteTable.listSources(Mapping.alias(user.asString()))
+                .map(MappingSource::getFixedUser)
+        );
+    }
+
+    private Stream<String> relatedDomains(Username user) {
+        return user.getDomainPart()
+            .map(Throwing.function(this::fetchDomains).sneakyThrow())
+            .orElseGet(Stream::empty);
+    }
+
+    private Stream<String> fetchDomains(Domain domain) throws 
RecipientRewriteTableException {
+        return Stream.concat(
+            Stream.of(domain.asString()),
+            
recipientRewriteTable.listSources(Mapping.domain(domain)).map(MappingSource::getFixedDomain)
+        );
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to