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-jspf.git

commit 6388698706c348204c43da1ab77e95ead3f767c1
Author: Benoit TELLIER <btell...@linagora.com>
AuthorDate: Mon Jul 29 11:15:48 2024 +0200

    JSPF-112 Bug: SPF Check Hangs Indefinitely in 
org.apache.james.jspf:apache-jspf-resolver:1.0.4
---
 .../jspf/core/SPFCheckerExceptionCatcher.java      |  2 +-
 .../jspf/executor/AsynchronousSPFExecutor.java     | 22 +++++++++++++++++-----
 .../main/java/org/apache/james/jspf/impl/SPF.java  |  4 ++--
 .../apache/james/jspf/terms/IncludeMechanism.java  |  4 ++--
 .../apache/james/jspf/terms/RedirectModifier.java  |  4 ++--
 .../AsynchronousSPFExecutorIntegrationTest.java    |  4 ++--
 ...rationTest.java => DefaultSPFResolverTest.java} | 22 ++++++----------------
 7 files changed, 32 insertions(+), 30 deletions(-)

diff --git 
a/resolver/src/main/java/org/apache/james/jspf/core/SPFCheckerExceptionCatcher.java
 
b/resolver/src/main/java/org/apache/james/jspf/core/SPFCheckerExceptionCatcher.java
index 3102c18..0e0cc90 100644
--- 
a/resolver/src/main/java/org/apache/james/jspf/core/SPFCheckerExceptionCatcher.java
+++ 
b/resolver/src/main/java/org/apache/james/jspf/core/SPFCheckerExceptionCatcher.java
@@ -40,6 +40,6 @@ public interface SPFCheckerExceptionCatcher {
      * @throws TempErrorException
      * @throws NeutralException
      */
-    public void onException(Exception exception, SPFSession session) throws 
PermErrorException, NoneException, TempErrorException, NeutralException;
+    public void onException(Throwable exception, SPFSession session) throws 
PermErrorException, NoneException, TempErrorException, NeutralException;
 
 }
diff --git 
a/resolver/src/main/java/org/apache/james/jspf/executor/AsynchronousSPFExecutor.java
 
b/resolver/src/main/java/org/apache/james/jspf/executor/AsynchronousSPFExecutor.java
index 56d2c8b..3ce330b 100644
--- 
a/resolver/src/main/java/org/apache/james/jspf/executor/AsynchronousSPFExecutor.java
+++ 
b/resolver/src/main/java/org/apache/james/jspf/executor/AsynchronousSPFExecutor.java
@@ -19,7 +19,9 @@
 
 package org.apache.james.jspf.executor;
 
+import java.io.IOException;
 import java.util.ArrayList;
+import java.util.concurrent.CompletionException;
 
 import org.apache.james.jspf.core.DNSLookupContinuation;
 import org.apache.james.jspf.core.DNSResponse;
@@ -82,20 +84,30 @@ public class AsynchronousSPFExecutor implements SPFExecutor 
{
                     }
                 })
                 .exceptionally(e -> {
-                    if (e instanceof NoSuchRRSetException || e.getCause() 
instanceof NoSuchRRSetException) {
+                    if (e instanceof CompletionException) {
+                        e = e.getCause();
+                    }
+                    if (e instanceof IOException && 
e.getMessage().startsWith("Timed out ")) {
+                        e = new TimeoutException(e.getMessage());
+                    }
+                    if (e instanceof NoSuchRRSetException) {
                         try {
                             DNSLookupContinuation dnsLookupContinuation = 
cont.getListener().onDNSResponse(new DNSResponse(new ArrayList<>()), session);
                             handleCont(session, result, dnsLookupContinuation, 
checker);
+                            result.setSPFResult(session);
+                            return null;
                         } catch (PermErrorException | NoneException | 
TempErrorException | NeutralException ex2) {
                             handleError(session, ex2);
+                            result.setSPFResult(session);
+                            return null;
                         }
                     }
                     if (e instanceof TimeoutException) {
                         handleTimeout(cont, new DNSResponse((TimeoutException) 
e), session, result, checker);
+                        result.setSPFResult(session);
+                        return null;
                     }
-                    if (e.getCause() instanceof TimeoutException) {
-                        handleTimeout(cont, new DNSResponse((TimeoutException) 
e.getCause()), session, result, checker);
-                    }
+                    handleError(session, e);
                     result.setSPFResult(session);
                     return null;
                 });
@@ -113,7 +125,7 @@ public class AsynchronousSPFExecutor implements SPFExecutor 
{
         }
     }
 
-    private void handleError(SPFSession session, Exception e) {
+    private void handleError(SPFSession session, Throwable e) {
         while (e != null) {
             SPFChecker checker = session.popChecker(c -> c instanceof 
SPFCheckerExceptionCatcher);
             if (checker == null) {
diff --git a/resolver/src/main/java/org/apache/james/jspf/impl/SPF.java 
b/resolver/src/main/java/org/apache/james/jspf/impl/SPF.java
index b9d8dfc..adfcab2 100644
--- a/resolver/src/main/java/org/apache/james/jspf/impl/SPF.java
+++ b/resolver/src/main/java/org/apache/james/jspf/impl/SPF.java
@@ -254,9 +254,9 @@ public class SPF implements SPFChecker {
         
 
         /**
-         * @see 
org.apache.james.jspf.core.SPFCheckerExceptionCatcher#onException(java.lang.Exception,
 org.apache.james.jspf.core.SPFSession)
+         * @see 
org.apache.james.jspf.core.SPFCheckerExceptionCatcher#onException(java.lang.Throwable,
 org.apache.james.jspf.core.SPFSession)
          */
-        public void onException(Exception exception, SPFSession session)
+        public void onException(Throwable exception, SPFSession session)
                 throws PermErrorException, NoneException, TempErrorException,
                 NeutralException {
 
diff --git 
a/resolver/src/main/java/org/apache/james/jspf/terms/IncludeMechanism.java 
b/resolver/src/main/java/org/apache/james/jspf/terms/IncludeMechanism.java
index 6c01e21..1e7be8b 100644
--- a/resolver/src/main/java/org/apache/james/jspf/terms/IncludeMechanism.java
+++ b/resolver/src/main/java/org/apache/james/jspf/terms/IncludeMechanism.java
@@ -103,9 +103,9 @@ public class IncludeMechanism implements Mechanism, 
ConfigurationEnabled, SPFChe
         }
 
         /**
-         * @see 
org.apache.james.jspf.core.SPFCheckerExceptionCatcher#onException(java.lang.Exception,
 org.apache.james.jspf.core.SPFSession)
+         * @see 
org.apache.james.jspf.core.SPFCheckerExceptionCatcher#onException(java.lang.Throwable,
 org.apache.james.jspf.core.SPFSession)
          */
-        public void onException(Exception exception, SPFSession session)
+        public void onException(Throwable exception, SPFSession session)
                 throws PermErrorException, NoneException,
                 TempErrorException, NeutralException {
             
diff --git 
a/resolver/src/main/java/org/apache/james/jspf/terms/RedirectModifier.java 
b/resolver/src/main/java/org/apache/james/jspf/terms/RedirectModifier.java
index 5ac31d2..7234067 100644
--- a/resolver/src/main/java/org/apache/james/jspf/terms/RedirectModifier.java
+++ b/resolver/src/main/java/org/apache/james/jspf/terms/RedirectModifier.java
@@ -76,9 +76,9 @@ public class RedirectModifier extends GenericModifier 
implements
         }
         
         /**
-         * @see 
org.apache.james.jspf.core.SPFCheckerExceptionCatcher#onException(java.lang.Exception,
 org.apache.james.jspf.core.SPFSession)
+         * @see 
org.apache.james.jspf.core.SPFCheckerExceptionCatcher#onException(java.lang.Throwable,
 org.apache.james.jspf.core.SPFSession)
          */
-        public void onException(Exception exception, SPFSession session)
+        public void onException(Throwable exception, SPFSession session)
                 throws PermErrorException, NoneException,
                 TempErrorException, NeutralException {
             
diff --git 
a/resolver/src/test/java/org/apache/james/jspf/AsynchronousSPFExecutorIntegrationTest.java
 
b/resolver/src/test/java/org/apache/james/jspf/AsynchronousSPFExecutorIntegrationTest.java
index 56b8e51..8037672 100644
--- 
a/resolver/src/test/java/org/apache/james/jspf/AsynchronousSPFExecutorIntegrationTest.java
+++ 
b/resolver/src/test/java/org/apache/james/jspf/AsynchronousSPFExecutorIntegrationTest.java
@@ -31,12 +31,12 @@ public class AsynchronousSPFExecutorIntegrationTest {
     @Test
     public void test() {
         SPF spf = new DefaultSPF();
-        SPFResult result = spf.checkSPF("192.99.55.226", "n...@bytle.net", 
"beau.bytle.net");
+        SPFResult result = spf.checkSPF("109.197.176.25", "n...@linagora.com", 
"linagora.com");
         System.out.println(result.getResult());
         System.out.println(result.getExplanation());
         System.out.println(result.getHeader());
         assertEquals("pass", result.getResult());
-        assertEquals("Received-SPF: pass (spfCheck: domain of bytle.net 
designates 192.99.55.226 as permitted sender) client-ip=192.99.55.226; 
envelope-from=n...@bytle.net; helo=beau.bytle.net;",
+        assertEquals("Received-SPF: pass (spfCheck: domain of linagora.com 
designates 109.197.176.25 as permitted sender) client-ip=109.197.176.25; 
envelope-from=n...@linagora.com; helo=linagora.com;",
             result.getHeader());
     }
 }
\ No newline at end of file
diff --git 
a/resolver/src/test/java/org/apache/james/jspf/AsynchronousSPFExecutorIntegrationTest.java
 b/resolver/src/test/java/org/apache/james/jspf/DefaultSPFResolverTest.java
similarity index 62%
copy from 
resolver/src/test/java/org/apache/james/jspf/AsynchronousSPFExecutorIntegrationTest.java
copy to resolver/src/test/java/org/apache/james/jspf/DefaultSPFResolverTest.java
index 56b8e51..cb6acad 100644
--- 
a/resolver/src/test/java/org/apache/james/jspf/AsynchronousSPFExecutorIntegrationTest.java
+++ b/resolver/src/test/java/org/apache/james/jspf/DefaultSPFResolverTest.java
@@ -19,24 +19,14 @@
 
 package org.apache.james.jspf;
 
-import static org.junit.Assert.assertEquals;
-
-import org.apache.james.jspf.executor.SPFResult;
 import org.apache.james.jspf.impl.DefaultSPF;
-import org.apache.james.jspf.impl.SPF;
+import org.junit.Assert;
 import org.junit.Test;
 
-public class AsynchronousSPFExecutorIntegrationTest {
-
+public class DefaultSPFResolverTest {
     @Test
-    public void test() {
-        SPF spf = new DefaultSPF();
-        SPFResult result = spf.checkSPF("192.99.55.226", "n...@bytle.net", 
"beau.bytle.net");
-        System.out.println(result.getResult());
-        System.out.println(result.getExplanation());
-        System.out.println(result.getHeader());
-        assertEquals("pass", result.getResult());
-        assertEquals("Received-SPF: pass (spfCheck: domain of bytle.net 
designates 192.99.55.226 as permitted sender) client-ip=192.99.55.226; 
envelope-from=n...@bytle.net; helo=beau.bytle.net;",
-            result.getHeader());
+    public void shouldHandleNotFound() {
+        String spfResult = new 
DefaultSPF().checkSPF("207.54.72.202","do_not_re...@reyifglerifwukfvbdjhrkbvebvekvfulervkerkeruerbeb.de","reyifglerifwukfvbdjhrkbvebvekvfulervkerkeruerbeb.de").getResult();
+        Assert.assertEquals("neutral", spfResult);
     }
-}
\ No newline at end of file
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to