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]
