JAMES-2366 A mapping should rewrite Users
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/23fb3a00 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/23fb3a00 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/23fb3a00 Branch: refs/heads/master Commit: 23fb3a00b1988ba07c62370f5ffeff3cfe379409 Parents: f08343d Author: benwa <btell...@linagora.com> Authored: Wed Apr 18 10:08:01 2018 +0700 Committer: Matthieu Baechler <matth...@apache.org> Committed: Tue Apr 24 14:45:26 2018 +0200 ---------------------------------------------------------------------- .../main/java/org/apache/james/core/User.java | 12 +++++-- .../java/org/apache/james/core/UserTest.java | 35 ++++++++++++++++++++ .../java/org/apache/james/rrt/lib/Mapping.java | 5 ++- .../rrt/lib/AbstractRecipientRewriteTable.java | 28 ++++++++-------- .../org/apache/james/rrt/lib/MappingImpl.java | 19 +++++++---- 5 files changed, 74 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/23fb3a00/core/src/main/java/org/apache/james/core/User.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/james/core/User.java b/core/src/main/java/org/apache/james/core/User.java index a3f07ff..a327da3 100644 --- a/core/src/main/java/org/apache/james/core/User.java +++ b/core/src/main/java/org/apache/james/core/User.java @@ -91,11 +91,19 @@ public class User { return domainPart.isPresent(); } - public User withDefaultDomain(Domain defaultDomain) { + public User withDefaultDomain(Optional<Domain> defaultDomain) { if (hasDomainPart()) { return this; } - return new User(localPart, Optional.of(defaultDomain)); + return new User(localPart, defaultDomain); + } + + public User withDefaultDomain(Domain defaultDomain) { + return withDefaultDomain(Optional.of(defaultDomain)); + } + + public User withDefaultDomainFromUser(User other) { + return withDefaultDomain(other.domainPart); } public String asString() { http://git-wip-us.apache.org/repos/asf/james-project/blob/23fb3a00/core/src/test/java/org/apache/james/core/UserTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/james/core/UserTest.java b/core/src/test/java/org/apache/james/core/UserTest.java index cd4e60a..29ae95b 100644 --- a/core/src/test/java/org/apache/james/core/UserTest.java +++ b/core/src/test/java/org/apache/james/core/UserTest.java @@ -192,4 +192,39 @@ public class UserTest { .withDefaultDomain(Domain.LOCALHOST)) .isEqualTo(User.fromUsername("user@domain")); } + + @Test + public void withDefaultDomainShouldNotThrowUponEmptyDomain() { + assertThat(User.fromUsername("user") + .withDefaultDomain(Optional.empty())) + .isEqualTo(User.fromUsername("user")); + } + + @Test + public void withDefaultDomainShouldNotThrowUponEmptyDomainWhenUsersHadADomain() { + assertThat(User.fromUsername("user@domain") + .withDefaultDomain(Optional.empty())) + .isEqualTo(User.fromUsername("user@domain")); + } + + @Test + public void withDefaultDomainFromUserShouldPreserveUserWhenAlreadyHasADomain() { + assertThat(User.fromUsername("user@domain") + .withDefaultDomainFromUser(User.fromUsername("bob@tld"))) + .isEqualTo(User.fromUsername("user@domain")); + } + + @Test + public void withDefaultDomainFromUserShouldAppendOtherUserDomainWhenNone() { + assertThat(User.fromUsername("user") + .withDefaultDomainFromUser(User.fromUsername("bob@tld"))) + .isEqualTo(User.fromUsername("user@tld")); + } + + @Test + public void withDefaultDomainFromUserShouldNotThrowUponNoDomain() { + assertThat(User.fromUsername("user") + .withDefaultDomainFromUser(User.fromUsername("bob"))) + .isEqualTo(User.fromUsername("user")); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/23fb3a00/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java ---------------------------------------------------------------------- diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java index c494d8b..0bd24e1 100644 --- a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java +++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java @@ -24,9 +24,12 @@ import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Stream; +import javax.mail.internet.AddressException; + import org.apache.commons.lang3.NotImplementedException; import org.apache.james.core.Domain; import org.apache.james.core.MailAddress; +import org.apache.james.core.User; import org.apache.james.rrt.api.RecipientRewriteTableException; import com.google.common.base.Preconditions; @@ -124,6 +127,6 @@ public interface Mapping { String getErrorMessage(); - Optional<String> apply(MailAddress input); + Optional<User> rewriteUser(User user) throws AddressException; } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/23fb3a00/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java index 1632414..08e4c5b 100644 --- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java +++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java @@ -123,35 +123,33 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT } } - private Stream<Mapping> convertAndRecurseMapping(User user, Mapping associatedMapping, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException, SkipMappingProcessingException, AddressException { + private Stream<Mapping> convertAndRecurseMapping(User originalUser, Mapping associatedMapping, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException, SkipMappingProcessingException, AddressException { - Function<String, Stream<Mapping>> convertAndRecurseMapping = + Function<User, Stream<Mapping>> convertAndRecurseMapping = Throwing - .function((String stringMapping) -> convertAndRecurseMapping(associatedMapping.getType(), user, stringMapping, remainingLoops)) + .function((User rewrittenUser) -> convertAndRecurseMapping(associatedMapping.getType(), originalUser, rewrittenUser, remainingLoops)) .sneakyThrow(); - return associatedMapping.apply(user.asMailAddress()) + return associatedMapping.rewriteUser(originalUser) + .map(rewrittenUser -> rewrittenUser.withDefaultDomainFromUser(originalUser)) .map(convertAndRecurseMapping) .orElse(Stream.empty()); } - private Stream<Mapping> convertAndRecurseMapping(Type mappingType, User originalUser, String addressWithMappingApplied, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException { - LOGGER.debug("Valid virtual user mapping {} to {}", originalUser, addressWithMappingApplied); + private Stream<Mapping> convertAndRecurseMapping(Type mappingType, User originalUser, User rewrittenUser, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException { + LOGGER.debug("Valid virtual user mapping {} to {}", originalUser, rewrittenUser); - Stream<Mapping> nonRecursiveResult = Stream.of(toMapping(addressWithMappingApplied, mappingType)); + Stream<Mapping> nonRecursiveResult = Stream.of(toMapping(rewrittenUser, mappingType)); if (!recursive) { return nonRecursiveResult; } - User targetUser = User.fromUsername(addressWithMappingApplied) - .withDefaultDomain(originalUser.getDomainPart().get()); - // Check if the returned mapping is the same as the input. If so we need to handle identity to avoid loops. - if (originalUser.equals(targetUser)) { + if (originalUser.equals(rewrittenUser)) { return mappingType.getIdentityMappingBehaviour() .handleIdentity(nonRecursiveResult); } else { - return recurseMapping(nonRecursiveResult, targetUser, remainingLoops); + return recurseMapping(nonRecursiveResult, rewrittenUser, remainingLoops); } } @@ -165,16 +163,16 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT } } - private Mapping toMapping(String mappedAddress, Type type) { + private Mapping toMapping(User rewrittenUser, Type type) { switch (type) { case Forward: case Group: - return MappingImpl.of(type, mappedAddress); + return MappingImpl.of(type, rewrittenUser.asString()); case Regex: case Domain: case Error: case Address: - return MappingImpl.address(mappedAddress); + return MappingImpl.address(rewrittenUser.asString()); } throw new IllegalArgumentException("unhandled enum type"); } http://git-wip-us.apache.org/repos/asf/james-project/blob/23fb3a00/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java index 54d265e..1881079 100644 --- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java +++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java @@ -29,6 +29,7 @@ import javax.mail.internet.AddressException; import org.apache.james.core.Domain; import org.apache.james.core.MailAddress; +import org.apache.james.core.User; import org.apache.james.rrt.api.RecipientRewriteTableException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -141,23 +142,27 @@ public class MappingImpl implements Mapping, Serializable { } @Override - public Optional<String> apply(MailAddress address) { + public Optional<User> rewriteUser(User user) throws AddressException { switch (getType()) { case Regex: try { - return RecipientRewriteTableUtil.regexMap(address, this); + return RecipientRewriteTableUtil.regexMap(user.asMailAddress(), this) + .map(User::fromUsername); } catch (PatternSyntaxException e) { LOGGER.error("Exception during regexMap processing: ", e); - return Optional.of(asString()); + return Optional.of(User.fromUsername(asString())); } case Domain: - return Optional.of(address.getLocalPart() + "@" + mapping); + return Optional.of( + User.fromLocalPartWithDomain( + user.getLocalPart(), + Domain.of(mapping))); case Forward: - return Optional.of(mapping); + return Optional.of(User.fromUsername(mapping)); case Group: - return Optional.of(mapping); + return Optional.of(User.fromUsername(mapping)); case Address: - return Optional.of(mapping); + return Optional.of(User.fromUsername(mapping)); case Error: return Optional.empty(); } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org