JAMES-2366 Behaviour upon identity should be specified in Mapping::Type
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f08343dd Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f08343dd Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f08343dd Branch: refs/heads/master Commit: f08343ddef434e5fdd2549d69fca4cb828f1e68c Parents: 8947eee Author: benwa <btell...@linagora.com> Authored: Wed Apr 18 09:58:33 2018 +0700 Committer: Matthieu Baechler <matth...@apache.org> Committed: Tue Apr 24 14:45:26 2018 +0200 ---------------------------------------------------------------------- .../java/org/apache/james/rrt/lib/Mapping.java | 38 ++++++++++++++++---- .../rrt/lib/SkipMappingProcessingException.java | 24 +++++++++++++ .../rrt/lib/AbstractRecipientRewriteTable.java | 25 ++++++------- 3 files changed, 66 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/f08343dd/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 3a7757a..c494d8b 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 @@ -22,7 +22,9 @@ package org.apache.james.rrt.lib; import java.util.Optional; import java.util.function.Supplier; +import java.util.stream.Stream; +import org.apache.commons.lang3.NotImplementedException; import org.apache.james.core.Domain; import org.apache.james.core.MailAddress; import org.apache.james.rrt.api.RecipientRewriteTableException; @@ -53,17 +55,19 @@ public interface Mapping { Optional<MailAddress> asMailAddress(); enum Type { - Regex("regex:"), - Domain("domain:"), - Error("error:"), - Forward("forward:"), - Group("group:"), - Address(""); + Regex("regex:", IdentityMappingBehaviour.Throw), + Domain("domain:", IdentityMappingBehaviour.Throw), + Error("error:", IdentityMappingBehaviour.Throw), + Forward("forward:", IdentityMappingBehaviour.ReturnIdentity), + Group("group:", IdentityMappingBehaviour.Throw), + Address("", IdentityMappingBehaviour.Throw); private final String asPrefix; + private final IdentityMappingBehaviour identityMappingBehaviour; - Type(String asPrefix) { + Type(String asPrefix, IdentityMappingBehaviour identityMappingBehaviour) { this.asPrefix = asPrefix; + this.identityMappingBehaviour = identityMappingBehaviour; } public String asPrefix() { @@ -82,6 +86,26 @@ public interface Mapping { || mapping.startsWith(Forward.asPrefix()) || mapping.startsWith(Group.asPrefix()); } + + public IdentityMappingBehaviour getIdentityMappingBehaviour() { + return identityMappingBehaviour; + } + } + + enum IdentityMappingBehaviour { + Throw, + ReturnIdentity; + + public Stream<Mapping> handleIdentity(Stream<Mapping> mapping) { + switch (this) { + case Throw: + throw new SkipMappingProcessingException(); + case ReturnIdentity: + return mapping; + default: + throw new NotImplementedException("Unknown IdentityMappingBehaviour : " + this); + } + } } Type getType(); http://git-wip-us.apache.org/repos/asf/james-project/blob/f08343dd/server/data/data-api/src/main/java/org/apache/james/rrt/lib/SkipMappingProcessingException.java ---------------------------------------------------------------------- diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/SkipMappingProcessingException.java b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/SkipMappingProcessingException.java new file mode 100644 index 0000000..00a62e1 --- /dev/null +++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/SkipMappingProcessingException.java @@ -0,0 +1,24 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.rrt.lib; + +public class SkipMappingProcessingException extends RuntimeException { + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/f08343dd/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 f5da229..1632414 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 @@ -118,20 +118,16 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT return MappingsImpl.fromMappings( targetMappings.asStream() .flatMap(Throwing.<Mapping, Stream<Mapping>>function(target -> convertAndRecurseMapping(user, target, mappingLimit)).sneakyThrow())); - } catch (EmptyMappingException e) { + } catch (SkipMappingProcessingException e) { return MappingsImpl.empty(); } } - private static class EmptyMappingException extends RuntimeException { - - } - - private Stream<Mapping> convertAndRecurseMapping(User user, Mapping associatedMapping, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException, EmptyMappingException, AddressException { + private Stream<Mapping> convertAndRecurseMapping(User user, Mapping associatedMapping, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException, SkipMappingProcessingException, AddressException { Function<String, Stream<Mapping>> convertAndRecurseMapping = Throwing - .function((String stringMapping) -> convertAndRecurseMapping(associatedMapping.getType(), user, remainingLoops, stringMapping)) + .function((String stringMapping) -> convertAndRecurseMapping(associatedMapping.getType(), user, stringMapping, remainingLoops)) .sneakyThrow(); return associatedMapping.apply(user.asMailAddress()) @@ -139,7 +135,7 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT .orElse(Stream.empty()); } - private Stream<Mapping> convertAndRecurseMapping(Type mappingType, User originalUser, int remainingLoops, String addressWithMappingApplied) throws ErrorMappingException, RecipientRewriteTableException { + private Stream<Mapping> convertAndRecurseMapping(Type mappingType, User originalUser, String addressWithMappingApplied, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException { LOGGER.debug("Valid virtual user mapping {} to {}", originalUser, addressWithMappingApplied); Stream<Mapping> nonRecursiveResult = Stream.of(toMapping(addressWithMappingApplied, mappingType)); @@ -150,15 +146,16 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT User targetUser = User.fromUsername(addressWithMappingApplied) .withDefaultDomain(originalUser.getDomainPart().get()); - // Check if the returned mapping is the same as the - // input. If so return null to avoid loops + // 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 (mappingType.equals(Type.Forward)) { - return nonRecursiveResult; - } - throw new EmptyMappingException(); + return mappingType.getIdentityMappingBehaviour() + .handleIdentity(nonRecursiveResult); + } else { + return recurseMapping(nonRecursiveResult, targetUser, remainingLoops); } + } + private Stream<Mapping> recurseMapping(Stream<Mapping> nonRecursiveResult, User targetUser, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException { Mappings childMappings = getMappings(targetUser, remainingLoops - 1); if (childMappings.isEmpty()) { --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org