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 34c1a44a95d301b2e005e3c219c5f2c7e3bbc315 Author: Benoit Tellier <[email protected]> AuthorDate: Tue Aug 27 13:49:29 2019 +0700 JAMES-2513 AbstractDomainList can return duplicates A domain both added and detected will be returned as duplicated. --- .../james/domainlist/lib/AbstractDomainList.java | 27 ++++++++++++---------- .../lib/AbstractDomainListPrivateMethodsTest.java | 24 +++++++++++++++++++ 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java index 3db1408..8d532e9 100644 --- a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java +++ b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java @@ -21,6 +21,7 @@ package org.apache.james.domainlist.lib; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.Collection; import java.util.List; import java.util.stream.Stream; @@ -39,7 +40,7 @@ import com.github.steveash.guavate.Guavate; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; +import com.google.common.collect.ImmutableSet; /** * All implementations of the DomainList interface should extends this abstract @@ -155,13 +156,15 @@ public abstract class AbstractDomainList implements DomainList, Configurable { public ImmutableList<Domain> getDomains() throws DomainListException { List<Domain> domains = getDomainListInternal(); ImmutableList<Domain> detectedDomains = detectDomains(); - // Guava does not support concatenating ImmutableLists at this time: - // https://stackoverflow.com/questions/37919648/concatenating-immutablelists - // A work-around is to use Iterables.concat() until something like - // https://github.com/google/guava/issues/1029 is implemented. - Iterable<Domain> domainsWithoutIp = Iterables.concat(domains, detectedDomains); - ImmutableList<Domain> detectedIps = detectIps(domainsWithoutIp); - ImmutableList<Domain> allDomains = ImmutableList.copyOf(Iterables.concat(domainsWithoutIp, detectedIps)); + + ImmutableList<Domain> domainsWithoutIp = ImmutableList.<Domain>builder() + .addAll(domains) + .addAll(detectedDomains) + .build(); + ImmutableSet<Domain> allDomains = ImmutableSet.<Domain>builder() + .addAll(domainsWithoutIp) + .addAll(detectIps(domainsWithoutIp)) + .build(); if (LOGGER.isDebugEnabled()) { for (Domain domain : allDomains) { @@ -169,10 +172,10 @@ public abstract class AbstractDomainList implements DomainList, Configurable { } } - return allDomains; + return ImmutableList.copyOf(allDomains); } - private ImmutableList<Domain> detectIps(Iterable<Domain> domains) { + private ImmutableList<Domain> detectIps(Collection<Domain> domains) { if (autoDetectIP) { return getDomainsIpStream(domains, dns, LOGGER) .collect(Guavate.toImmutableList()); @@ -204,8 +207,8 @@ public abstract class AbstractDomainList implements DomainList, Configurable { * Iterable of domains * @return Stream of ipaddress for domains */ - private static Stream<Domain> getDomainsIpStream(Iterable<Domain> domains, DNSService dns, Logger log) { - return Guavate.stream(domains) + private static Stream<Domain> getDomainsIpStream(Collection<Domain> domains, DNSService dns, Logger log) { + return domains.stream() .flatMap(domain -> getDomainIpStream(domain, dns, log)) .distinct(); } diff --git a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java index 96a59ae..c711436 100644 --- a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java +++ b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java @@ -208,6 +208,30 @@ public class AbstractDomainListPrivateMethodsTest { } @Test + public void getDomainsShouldNotReturnDuplicates() throws Exception { + domainList.configure(DomainListConfiguration.builder() + .autoDetect(true) + .autoDetectIp(true)); + + String added = "added.tld"; + String detected = "detected.tld"; + String ip = "148.25.32.1"; + + when(dnsService.getLocalHost()).thenReturn(InetAddress.getByName("127.0.0.1")); + when(dnsService.getHostName(any(InetAddress.class))).thenReturn(detected); + InetAddress address = mock(InetAddress.class); + when(address.getHostAddress()).thenReturn(ip); + when(dnsService.getAllByName(any())).thenReturn(ImmutableList.of(address)); + + domainList.addDomain(Domain.of(added)); + domainList.addDomain(Domain.of(ip)); + + assertThat(domainList.getDomains()) + .extracting(Domain::name) + .containsOnlyOnce(added, detected, ip); + } + + @Test public void getDomainsShouldListAddedDomain() throws Exception { Domain defaultDomain = Domain.of("default.tld"); Domain domain = Domain.of("added.tld"); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
