This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 4d8ad6602ec992c0a3acb7f9e29cae6c15cec973 Author: Benoit Tellier <[email protected]> AuthorDate: Tue Mar 17 09:05:56 2020 +0700 JAMES-3113 Split JamesMailetContext responsibilities --- .../james/mailetcontainer/LocalResources.java | 113 +++++++++++++++++++++ .../mailetcontainer/impl/JamesMailetContext.java | 70 ++----------- .../META-INF/spring/mailetcontainer-context.xml | 1 + .../impl/JamesMailetContextTest.java | 4 +- 4 files changed, 124 insertions(+), 64 deletions(-) diff --git a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/LocalResources.java b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/LocalResources.java new file mode 100644 index 0000000..ce83023 --- /dev/null +++ b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/LocalResources.java @@ -0,0 +1,113 @@ +/**************************************************************** + * 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.mailetcontainer; + +import java.util.EnumSet; +import java.util.Locale; + +import javax.inject.Inject; +import javax.mail.internet.ParseException; + +import org.apache.james.core.Domain; +import org.apache.james.core.MailAddress; +import org.apache.james.domainlist.api.DomainList; +import org.apache.james.domainlist.api.DomainListException; +import org.apache.james.rrt.api.RecipientRewriteTable; +import org.apache.james.rrt.api.RecipientRewriteTableException; +import org.apache.james.rrt.lib.Mapping; +import org.apache.james.user.api.UsersRepository; +import org.apache.james.user.api.UsersRepositoryException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.fge.lambdas.Throwing; + +public class LocalResources { + private static final Logger LOGGER = LoggerFactory.getLogger(LocalResources.class); + private static final EnumSet<Mapping.Type> ALIAS_TYPES = EnumSet.of(Mapping.Type.Alias, Mapping.Type.DomainAlias); + + private final UsersRepository localusers; + private final DomainList domains; + private final RecipientRewriteTable recipientRewriteTable; + + @Inject + public LocalResources(UsersRepository localusers, DomainList domains, RecipientRewriteTable recipientRewriteTable) { + this.localusers = localusers; + this.domains = domains; + this.recipientRewriteTable = recipientRewriteTable; + } + + public boolean isLocalServer(Domain domain) { + try { + return domains.containsDomain(domain); + } catch (DomainListException e) { + LOGGER.error("Unable to retrieve domains", e); + return false; + } + } + + public boolean isLocalUser(String name) { + if (name == null) { + return false; + } + try { + if (!name.contains("@")) { + try { + return isLocalEmail(new MailAddress(name.toLowerCase(Locale.US), domains.getDefaultDomain().asString())); + } catch (DomainListException e) { + LOGGER.error("Unable to access DomainList", e); + return false; + } + } else { + return isLocalEmail(new MailAddress(name.toLowerCase(Locale.US))); + } + } catch (ParseException e) { + LOGGER.info("Error checking isLocalUser for user {}", name, e); + return false; + } + } + + public boolean isLocalEmail(MailAddress mailAddress) { + if (mailAddress != null) { + if (!isLocalServer(mailAddress.getDomain())) { + return false; + } + try { + return isLocaluser(mailAddress) + || isLocalAlias(mailAddress); + } catch (UsersRepositoryException | RecipientRewriteTable.ErrorMappingException | RecipientRewriteTableException e) { + LOGGER.error("Unable to access UsersRepository", e); + } + } + return false; + } + + private boolean isLocaluser(MailAddress mailAddress) throws UsersRepositoryException { + return localusers.contains(localusers.getUser(mailAddress)); + } + + private boolean isLocalAlias(MailAddress mailAddress) throws UsersRepositoryException, RecipientRewriteTable.ErrorMappingException, RecipientRewriteTableException { + return recipientRewriteTable.getResolvedMappings(mailAddress.getLocalPart(), mailAddress.getDomain(), ALIAS_TYPES) + .asStream() + .map(mapping -> mapping.asMailAddress() + .orElseThrow(() -> new IllegalStateException(String.format("Can not compute address for mapping %s", mapping.asString())))) + .anyMatch(Throwing.predicate(this::isLocaluser).sneakyThrow()); + } +} diff --git a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java index 6309e52..5d513a4 100644 --- a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java +++ b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java @@ -22,7 +22,6 @@ package org.apache.james.mailetcontainer.impl; import java.io.IOException; import java.util.Collection; import java.util.Date; -import java.util.EnumSet; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -40,7 +39,6 @@ import javax.mail.MessagingException; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; -import javax.mail.internet.ParseException; import org.apache.commons.configuration2.HierarchicalConfiguration; import org.apache.commons.configuration2.ex.ConfigurationException; @@ -55,15 +53,10 @@ import org.apache.james.domainlist.api.DomainListException; import org.apache.james.lifecycle.api.Configurable; import org.apache.james.lifecycle.api.Disposable; import org.apache.james.lifecycle.api.LifecycleUtil; +import org.apache.james.mailetcontainer.LocalResources; import org.apache.james.queue.api.MailQueue; import org.apache.james.queue.api.MailQueueFactory; -import org.apache.james.rrt.api.RecipientRewriteTable; -import org.apache.james.rrt.api.RecipientRewriteTable.ErrorMappingException; -import org.apache.james.rrt.api.RecipientRewriteTableException; -import org.apache.james.rrt.lib.Mapping; import org.apache.james.server.core.MailImpl; -import org.apache.james.user.api.UsersRepository; -import org.apache.james.user.api.UsersRepositoryException; import org.apache.mailet.LookupException; import org.apache.mailet.Mail; import org.apache.mailet.MailetContext; @@ -71,13 +64,11 @@ import org.apache.mailet.base.RFC2822Headers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.fge.lambdas.Throwing; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; public class JamesMailetContext implements MailetContext, Configurable, Disposable { private static final Logger LOGGER = LoggerFactory.getLogger(JamesMailetContext.class); - public static final EnumSet<Mapping.Type> ALIAS_TYPES = EnumSet.of(Mapping.Type.Alias, Mapping.Type.DomainAlias); /** * A hash table of server attributes These are the MailetContext attributes @@ -85,19 +76,17 @@ public class JamesMailetContext implements MailetContext, Configurable, Disposab private final Map<String, Object> attributes = new ConcurrentHashMap<>(); protected final DNSService dns; - private final UsersRepository localusers; private final DomainList domains; - private final RecipientRewriteTable recipientRewriteTable; + private final LocalResources localResources; private final MailQueueFactory<?> mailQueueFactory; private MailQueue rootMailQueue; private MailAddress postmaster; @Inject - public JamesMailetContext(DNSService dns, UsersRepository localusers, DomainList domains, RecipientRewriteTable recipientRewriteTable, MailQueueFactory<?> mailQueueFactory) { + public JamesMailetContext(DNSService dns, DomainList domains, LocalResources localResources, MailQueueFactory<?> mailQueueFactory) { this.dns = dns; - this.localusers = localusers; this.domains = domains; - this.recipientRewriteTable = recipientRewriteTable; + this.localResources = localResources; this.mailQueueFactory = mailQueueFactory; } @@ -243,52 +232,12 @@ public class JamesMailetContext implements MailetContext, Configurable, Disposab @Override public boolean isLocalUser(String name) { - if (name == null) { - return false; - } - try { - if (!name.contains("@")) { - try { - return isLocalEmail(new MailAddress(name.toLowerCase(Locale.US), domains.getDefaultDomain().asString())); - } catch (DomainListException e) { - LOGGER.error("Unable to access DomainList", e); - return false; - } - } else { - return isLocalEmail(new MailAddress(name.toLowerCase(Locale.US))); - } - } catch (ParseException e) { - LOGGER.info("Error checking isLocalUser for user {}", name, e); - return false; - } + return localResources.isLocalUser(name); } @Override public boolean isLocalEmail(MailAddress mailAddress) { - if (mailAddress != null) { - if (!isLocalServer(mailAddress.getDomain())) { - return false; - } - try { - return isLocaluser(mailAddress) - || isLocalAlias(mailAddress); - } catch (UsersRepositoryException | ErrorMappingException | RecipientRewriteTableException e) { - LOGGER.error("Unable to access UsersRepository", e); - } - } - return false; - } - - private boolean isLocaluser(MailAddress mailAddress) throws UsersRepositoryException { - return localusers.contains(localusers.getUser(mailAddress)); - } - - private boolean isLocalAlias(MailAddress mailAddress) throws UsersRepositoryException, ErrorMappingException, RecipientRewriteTableException { - return recipientRewriteTable.getResolvedMappings(mailAddress.getLocalPart(), mailAddress.getDomain(), ALIAS_TYPES) - .asStream() - .map(mapping -> mapping.asMailAddress() - .orElseThrow(() -> new IllegalStateException(String.format("Can not compute address for mapping %s", mapping.asString())))) - .anyMatch(Throwing.predicate(this::isLocaluser).sneakyThrow()); + return localResources.isLocalEmail(mailAddress); } @Override @@ -339,12 +288,7 @@ public class JamesMailetContext implements MailetContext, Configurable, Disposab @Override public boolean isLocalServer(Domain domain) { - try { - return domains.containsDomain(domain); - } catch (DomainListException e) { - LOGGER.error("Unable to retrieve domains", e); - return false; - } + return localResources.isLocalServer(domain); } @Override diff --git a/server/mailet/mailetcontainer-camel/src/main/resources/META-INF/spring/mailetcontainer-context.xml b/server/mailet/mailetcontainer-camel/src/main/resources/META-INF/spring/mailetcontainer-context.xml index ddc1b29..783aab9 100644 --- a/server/mailet/mailetcontainer-camel/src/main/resources/META-INF/spring/mailetcontainer-context.xml +++ b/server/mailet/mailetcontainer-camel/src/main/resources/META-INF/spring/mailetcontainer-context.xml @@ -33,6 +33,7 @@ it is used - Seems like a Spring bug. --> <bean id="mailetcontext" class="org.apache.james.mailetcontainer.impl.JamesMailetContext" autowire="byType"/> + <bean id="localResources" class="org.apache.james.mailetcontainer.LocalResources" autowire="byType"/> <bean id="mailspooler" class="org.apache.james.mailetcontainer.impl.JamesMailSpooler" autowire="byType"/> </beans> diff --git a/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java b/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java index b3c8713..87ac492 100644 --- a/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java +++ b/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java @@ -38,6 +38,7 @@ import org.apache.james.core.builder.MimeMessageBuilder; import org.apache.james.dnsservice.api.DNSService; import org.apache.james.domainlist.lib.DomainListConfiguration; import org.apache.james.domainlist.memory.MemoryDomainList; +import org.apache.james.mailetcontainer.LocalResources; import org.apache.james.queue.api.MailQueue; import org.apache.james.queue.api.MailQueueFactory; import org.apache.james.rrt.memory.MemoryRecipientRewriteTable; @@ -87,7 +88,8 @@ public class JamesMailetContextTest { spoolMailQueue = mock(MailQueue.class); when(mailQueueFactory.createQueue(MailQueueFactory.SPOOL)).thenReturn(spoolMailQueue); DNSService dnsService = null; - testee = new JamesMailetContext(dnsService, usersRepository, domainList, recipientRewriteTable, mailQueueFactory); + LocalResources localResources = new LocalResources(usersRepository, domainList, recipientRewriteTable); + testee = new JamesMailetContext(dnsService, domainList, localResources, mailQueueFactory); testee.configure(new BaseHierarchicalConfiguration()); mailAddress = new MailAddress(USERMAIL.asString()); } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
