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 ba...@apache.org on 2006/10/05 17:53:53 UTC

svn commit: r453276 - in /james/jspf/trunk/src: main/java/org/apache/james/jspf/ main/java/org/apache/james/jspf/exceptions/ main/java/org/apache/james/jspf/policies/local/ test/java/org/apache/james/jspf/

Author: bago
Date: Thu Oct  5 08:53:51 2006
New Revision: 453276

URL: http://svn.apache.org/viewvc?view=rev&rev=453276
Log:
Removed SPFInternalResult (we don't use it anymore)
Moved DefaultExplanationPolicy to policies.local
Introduced a common abstract SPFResultException to be used as the root of our exceptions: the concrete implementations provide also the string representation of the result to use.

Added:
    james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/SPFResultException.java   (with props)
    james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/DefaultExplanationPolicy.java   (with props)
Removed:
    james/jspf/trunk/src/main/java/org/apache/james/jspf/DefaultExplanationPolicy.java
    james/jspf/trunk/src/main/java/org/apache/james/jspf/SPFInternalResult.java
Modified:
    james/jspf/trunk/src/main/java/org/apache/james/jspf/SPF.java
    james/jspf/trunk/src/main/java/org/apache/james/jspf/SPFResult.java
    james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/NeutralException.java
    james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/NoneException.java
    james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/PermErrorException.java
    james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/TempErrorException.java
    james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/FallbackPolicy.java
    james/jspf/trunk/src/test/java/org/apache/james/jspf/AbstractYamlTest.java

Modified: james/jspf/trunk/src/main/java/org/apache/james/jspf/SPF.java
URL: http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/SPF.java?view=diff&rev=453276&r1=453275&r2=453276
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/SPF.java (original)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/SPF.java Thu Oct  5 08:53:51 2006
@@ -30,6 +30,7 @@
 import org.apache.james.jspf.exceptions.NeutralException;
 import org.apache.james.jspf.exceptions.NoneException;
 import org.apache.james.jspf.exceptions.PermErrorException;
+import org.apache.james.jspf.exceptions.SPFResultException;
 import org.apache.james.jspf.exceptions.TempErrorException;
 import org.apache.james.jspf.parser.DefaultSPF1Parser;
 import org.apache.james.jspf.parser.DefaultTermsFactory;
@@ -41,6 +42,7 @@
 import org.apache.james.jspf.policies.ParseRecordPolicy;
 import org.apache.james.jspf.policies.SPFRetriever;
 import org.apache.james.jspf.policies.local.BestGuessPolicy;
+import org.apache.james.jspf.policies.local.DefaultExplanationPolicy;
 import org.apache.james.jspf.policies.local.FallbackPolicy;
 import org.apache.james.jspf.policies.local.TrustedForwarderPolicy;
 import org.apache.james.jspf.wiring.DNSServiceEnabled;
@@ -54,7 +56,7 @@
 /**
  * This class is used to generate a SPF-Test and provided all intressting data.
  */
-public class SPF implements SPFChecker, Policy {
+public class SPF implements SPFChecker {
 
     DNSService dnsProbe;
 
@@ -139,7 +141,6 @@
     public SPFResult checkSPF(String ipAddress, String mailFrom, String hostName) {
         SPF1Data spfData = null;
         String result = null;
-        String resultChar = null;
         String explanation = null;
 
         try {
@@ -147,21 +148,14 @@
             spfData = new SPF1Data(mailFrom, hostName, ipAddress);
             spfData.enableDNSService(dnsProbe);
             checkSPF(spfData);
-            SPFInternalResult res = new SPFInternalResult(spfData.getCurrentResult(), spfData.getExplanation());
-            resultChar = res.getResultChar();
+            String resultChar = spfData.getCurrentResult() != null ? spfData.getCurrentResult() : "";
             result = SPF1Utils.resultToName(resultChar);
-            explanation = res.getExplanation();
-        } catch (PermErrorException e) {
-            log.warn(e.getMessage(),e);
-            result = SPF1Utils.PERM_ERROR_CONV;
-        } catch (NoneException e) {
-            log.warn(e.getMessage(),e);
-            result = SPF1Utils.NONE_CONV;
-        } catch (NeutralException e) {
-            result = SPF1Utils.NEUTRAL_CONV;
-        } catch (TempErrorException e) {
-            log.warn(e.getMessage(),e);
-            result = SPF1Utils.TEMP_ERROR_CONV;
+            explanation = spfData.getExplanation();
+        } catch (SPFResultException e) {
+            result = e.getResult();
+            if (!SPF1Utils.NEUTRAL_CONV.equals(result)) {
+                log.warn(e.getMessage(),e);
+            }
         } catch (IllegalStateException e) {
             // this should never happen at all. But anyway we will set the
             // result to neutral. Safety first ..
@@ -169,7 +163,7 @@
             result = SPF1Constants.NEUTRAL;
         }
 
-        SPFResult ret = new SPFResult(result, resultChar, explanation, spfData);
+        SPFResult ret = new SPFResult(result, explanation, spfData);
         
         log.info("[ipAddress=" + ipAddress + "] [mailFrom=" + mailFrom
                 + "] [helo=" + hostName + "] => " + ret.getResult());
@@ -184,8 +178,21 @@
     public void checkSPF(SPF1Data spfData) throws PermErrorException,
             NoneException, TempErrorException, NeutralException {
 
-        SPF1Record spfRecord = getSPFRecord(spfData.getCurrentDomain());
-        
+        SPF1Record spfRecord = getPolicy().getSPFRecord(spfData.getCurrentDomain());
+        checkSPF(spfData, spfRecord);
+    }
+
+    /**
+     * Check a given spfData with the given spfRecord
+     * 
+     * @param spfData spf data
+     * @param spfRecord record
+     * @throws PermErrorException exception
+     * @throws NoneException exception
+     * @throws TempErrorException exception
+     * @throws NeutralException exception
+     */
+    public void checkSPF(SPF1Data spfData, SPF1Record spfRecord) throws PermErrorException, NoneException, TempErrorException, NeutralException {
         Iterator i = spfRecord.iterator();
         while (i.hasNext()) {
             SPFChecker m = (SPFChecker) i.next();
@@ -193,14 +200,12 @@
             m.checkSPF(spfData);
 
         }
-
-        
     }
 
     /**
-     * @see org.apache.james.jspf.policies.Policy#getSPFRecord(java.lang.String)
+     * Return a default policy for SPF
      */
-    public SPF1Record getSPFRecord(String currentDomain) throws PermErrorException, TempErrorException, NoneException, NeutralException {
+    public Policy getPolicy() {
 
         ArrayList policies = new ArrayList();
         
@@ -229,7 +234,7 @@
         
         policies.add(new InitialChecksPolicy());
         
-        return new ChainPolicy(policies).getSPFRecord(currentDomain);
+        return new ChainPolicy(policies);
     }
     
     /**

Modified: james/jspf/trunk/src/main/java/org/apache/james/jspf/SPFResult.java
URL: http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/SPFResult.java?view=diff&rev=453276&r1=453275&r2=453276
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/SPFResult.java (original)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/SPFResult.java Thu Oct  5 08:53:51 2006
@@ -26,7 +26,7 @@
  * This class is used to return the result of an SPF lookup.
  * 
  */
-public class SPFResult extends SPFInternalResult {
+public class SPFResult  {
 
     private String headerTextAsString = "";
 
@@ -34,16 +34,17 @@
     
     private String result = null;
 
+    protected String explanation = null;
+    
     /**
      * Construct SPFResult
      * 
      * @param result the result 
-     * @param resultChar the rawResult
      * @param explanation the explanation
      * @param spf1data the SPF1Data
      */
-    public SPFResult(String result, String resultChar, String explanation, SPF1Data spf1data) {
-        super(resultChar, explanation);
+    public SPFResult(String result, String explanation, SPF1Data spf1data) {
+        this.explanation = explanation;
         this.result = result;
         this.headerTextAsString = generateHeader(result, spf1data);
     }

Modified: james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/NeutralException.java
URL: http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/NeutralException.java?view=diff&rev=453276&r1=453275&r2=453276
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/NeutralException.java (original)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/NeutralException.java Thu Oct  5 08:53:51 2006
@@ -20,16 +20,23 @@
 
 package org.apache.james.jspf.exceptions;
 
+import org.apache.james.jspf.SPF1Utils;
+
 /**
  * This exception get thrown if the result should be neutral
  * 
  */
-public class NeutralException extends Exception {
-
-    private static final long serialVersionUID = 1L;
+public class NeutralException extends SPFResultException {
 
     public NeutralException(String strErrorMessage) {
         super(strErrorMessage);
+    }
+
+    /**
+     * @see org.apache.james.jspf.exceptions.SPFResultException#getResult()
+     */
+    public String getResult() {
+        return SPF1Utils.NEUTRAL_CONV;
     }
 
 }

Modified: james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/NoneException.java
URL: http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/NoneException.java?view=diff&rev=453276&r1=453275&r2=453276
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/NoneException.java (original)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/NoneException.java Thu Oct  5 08:53:51 2006
@@ -20,16 +20,23 @@
 
 package org.apache.james.jspf.exceptions;
 
+import org.apache.james.jspf.SPF1Utils;
+
 /**
  * This exception get thrown if the result should be none
  * 
  */
-public class NoneException extends Exception {
-
-    private static final long serialVersionUID = 1L;
+public class NoneException extends SPFResultException {
 
     public NoneException(String strErrorMessage) {
         super(strErrorMessage);
+    }
+
+    /**
+     * @see org.apache.james.jspf.exceptions.SPFResultException#getResult()
+     */
+    public String getResult() {
+        return SPF1Utils.NONE_CONV;
     }
 
 }

Modified: james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/PermErrorException.java
URL: http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/PermErrorException.java?view=diff&rev=453276&r1=453275&r2=453276
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/PermErrorException.java (original)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/PermErrorException.java Thu Oct  5 08:53:51 2006
@@ -20,16 +20,23 @@
 
 package org.apache.james.jspf.exceptions;
 
+import org.apache.james.jspf.SPF1Utils;
+
 /**
  * This exception get thrown if the result should be PermError
  * 
  */
-public class PermErrorException extends Exception {
-
-    private static final long serialVersionUID = 1L;
+public class PermErrorException extends SPFResultException {
 
     public PermErrorException(String strErrorMessage) {
         super(strErrorMessage);
+    }
+
+    /**
+     * @see org.apache.james.jspf.exceptions.SPFResultException#getResult()
+     */
+    public String getResult() {
+        return SPF1Utils.PERM_ERROR_CONV;
     }
 
 }

Added: james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/SPFResultException.java
URL: http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/SPFResultException.java?view=auto&rev=453276
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/SPFResultException.java (added)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/SPFResultException.java Thu Oct  5 08:53:51 2006
@@ -0,0 +1,42 @@
+/****************************************************************
+ * 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.jspf.exceptions;
+
+/**
+ * Root exception for SPF methods
+ */
+public abstract class SPFResultException extends Exception {
+
+    /**
+     * Exception
+     * 
+     * @param strErrorMessage string
+     */
+    public SPFResultException(String strErrorMessage) {
+        super(strErrorMessage);
+    }
+
+    /**
+     * The result for this exception
+     * 
+     * @return the spf result for this exception
+     */
+    public abstract String getResult();
+}

Propchange: james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/SPFResultException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/TempErrorException.java
URL: http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/TempErrorException.java?view=diff&rev=453276&r1=453275&r2=453276
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/TempErrorException.java (original)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/exceptions/TempErrorException.java Thu Oct  5 08:53:51 2006
@@ -20,16 +20,23 @@
 
 package org.apache.james.jspf.exceptions;
 
+import org.apache.james.jspf.SPF1Utils;
+
 /**
  * This exception get thrown if the result should be TempError
  * 
  */
-public class TempErrorException extends Exception {
-
-    private static final long serialVersionUID = 1L;
+public class TempErrorException extends SPFResultException {
 
     public TempErrorException(String strErrorMessage) {
         super(strErrorMessage);
+    }
+
+    /**
+     * @see org.apache.james.jspf.exceptions.SPFResultException#getResult()
+     */
+    public String getResult() {
+        return SPF1Utils.TEMP_ERROR_CONV;
     }
 
 }

Added: james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/DefaultExplanationPolicy.java
URL: http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/DefaultExplanationPolicy.java?view=auto&rev=453276
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/DefaultExplanationPolicy.java (added)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/DefaultExplanationPolicy.java Thu Oct  5 08:53:51 2006
@@ -0,0 +1,93 @@
+/****************************************************************
+ * 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.jspf.policies.local;
+
+import org.apache.james.jspf.SPF1Utils;
+import org.apache.james.jspf.core.Logger;
+import org.apache.james.jspf.core.SPF1Constants;
+import org.apache.james.jspf.core.SPF1Data;
+import org.apache.james.jspf.core.SPF1Record;
+import org.apache.james.jspf.core.SPFChecker;
+import org.apache.james.jspf.exceptions.NeutralException;
+import org.apache.james.jspf.exceptions.NoneException;
+import org.apache.james.jspf.exceptions.PermErrorException;
+import org.apache.james.jspf.exceptions.TempErrorException;
+import org.apache.james.jspf.macro.MacroExpand;
+import org.apache.james.jspf.policies.AbstractNestedPolicy;
+
+/**
+ * Policy to add a default explanation
+ */
+public final class DefaultExplanationPolicy extends AbstractNestedPolicy {
+    /**
+     * log
+     */
+    private Logger log;
+    /**
+     * the default explanation
+     */
+    private String defExplanation;
+
+    /**
+     * @param spf
+     */
+    public DefaultExplanationPolicy(Logger log, String explanation) {
+        this.log = log;
+        this.defExplanation = explanation;
+    }
+
+    /**
+     * @see org.apache.james.jspf.policies.AbstractNestedPolicy#getSPFRecordPostFilter(java.lang.String, org.apache.james.jspf.core.SPF1Record)
+     */
+    protected SPF1Record getSPFRecordPostFilter(String currentDomain, SPF1Record spfRecord) throws PermErrorException, TempErrorException, NoneException, NeutralException {
+        // Default explanation policy
+        spfRecord.getModifiers().add(new SPFChecker() {
+            public void checkSPF(SPF1Data spfData) throws PermErrorException, NoneException, TempErrorException, NeutralException {
+                
+                if (SPF1Constants.FAIL.equals(spfData.getCurrentResult())) {  
+                    if (spfData.getExplanation()==null || spfData.getExplanation().equals("")) {
+                        String explanation;
+                        if (defExplanation == null) {
+                            explanation = SPF1Utils.DEFAULT_EXPLANATION;
+                        } else {
+                            explanation = defExplanation;
+                        }
+                        try {
+                            spfData.setExplanation(new MacroExpand(spfData, log)
+                                    .expandExplanation(SPF1Utils.DEFAULT_EXPLANATION));
+                        } catch (PermErrorException e) {
+                            // Should never happen !
+                            log.debug("Invalid defaulfExplanation: " + explanation);
+                        }
+                    }
+                }
+            }
+            
+            public String toString() {
+                if (defExplanation == null) {
+                    return "defaultExplanation";
+                } else {
+                    return "defaultExplanation="+defExplanation;
+                }
+            }
+        });
+        return spfRecord;
+    }
+}
\ No newline at end of file

Propchange: james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/DefaultExplanationPolicy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/FallbackPolicy.java
URL: http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/FallbackPolicy.java?view=diff&rev=453276&r1=453275&r2=453276
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/FallbackPolicy.java (original)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/policies/local/FallbackPolicy.java Thu Oct  5 08:53:51 2006
@@ -27,9 +27,7 @@
 import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.SPF1Record;
 import org.apache.james.jspf.core.SPFRecordParser;
-import org.apache.james.jspf.exceptions.NeutralException;
-import org.apache.james.jspf.exceptions.NoneException;
-import org.apache.james.jspf.exceptions.PermErrorException;
+import org.apache.james.jspf.exceptions.SPFResultException;
 import org.apache.james.jspf.policies.AbstractNestedPolicy;
 
 /**
@@ -79,13 +77,7 @@
             synchronized (fallBackMap) {
                 fallBackMap.put(host, spfRecord);
             }
-        } catch (PermErrorException e) {
-            throw new IllegalArgumentException("Invalid SPF-Record: "
-                    + rawSpfRecord);
-        } catch (NoneException e) {
-            throw new IllegalArgumentException("Invalid SPF-Record: "
-                    + rawSpfRecord);
-        } catch (NeutralException e) {
+        } catch (SPFResultException e) {
             throw new IllegalArgumentException("Invalid SPF-Record: "
                     + rawSpfRecord);
         }

Modified: james/jspf/trunk/src/test/java/org/apache/james/jspf/AbstractYamlTest.java
URL: http://svn.apache.org/viewvc/james/jspf/trunk/src/test/java/org/apache/james/jspf/AbstractYamlTest.java?view=diff&rev=453276&r1=453275&r2=453276
==============================================================================
--- james/jspf/trunk/src/test/java/org/apache/james/jspf/AbstractYamlTest.java (original)
+++ james/jspf/trunk/src/test/java/org/apache/james/jspf/AbstractYamlTest.java Thu Oct  5 08:53:51 2006
@@ -175,7 +175,7 @@
         String resultSPF = res.getResult();
         
         if (currentTest.get("result") instanceof String) {
-            assertEquals("Test "+next+" ("+currentTest.get("description")+") failed. Returned: "+res.getResult()+" Expected: "+currentTest.get("result")+" [["+res.getResultChar()+"||"+res.getHeaderText()+"]]", currentTest.get("result"), res.getResult());
+            assertEquals("Test "+next+" ("+currentTest.get("description")+") failed. Returned: "+res.getResult()+" Expected: "+currentTest.get("result")+" [["+res.getResult()+"||"+res.getHeaderText()+"]]", currentTest.get("result"), res.getResult());
         } else {
             ArrayList results = (ArrayList) currentTest.get("result");
             boolean match = false;



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