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