You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ma...@apache.org on 2018/04/24 12:50:41 UTC

[12/27] james-project git commit: JAMES-2366 A mapping should rewrite Users

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 <bt...@linagora.com>
Authored: Wed Apr 18 10:08:01 2018 +0700
Committer: Matthieu Baechler <ma...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org