Author: norman
Date: Tue Jul 18 06:41:43 2006
New Revision: 423084

URL: http://svn.apache.org/viewvc?rev=423084&view=rev
Log:
Add SPF support. See JAMES-481
Add new State map wich can be used to store object which should be valid till 
the whole connection

Added:
    james/server/trunk/lib/jspf-0.9b1.jar   (with props)
    james/server/trunk/lib/log4j-1.2.13.jar   (with props)
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/SPFHandler.java
    james/server/trunk/src/test/org/apache/james/smtpserver/SPFHandlerTest.java
Modified:
    james/server/trunk/build.xml
    james/server/trunk/include.properties
    james/server/trunk/src/conf/james-config.xml
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/DNSRBLHandler.java
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/HeloFilterCmdHandler.java
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/MailFilterCmdHandler.java
    
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java
    
james/server/trunk/src/test/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java

Modified: james/server/trunk/build.xml
URL: 
http://svn.apache.org/viewvc/james/server/trunk/build.xml?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- james/server/trunk/build.xml (original)
+++ james/server/trunk/build.xml Tue Jul 18 06:41:43 2006
@@ -90,6 +90,8 @@
                <include name="${javax-activation.jar}"/>
                <include name="${bcmail.jar}"/>
                <include name="${bcmail-workaround.jar}"/>
+               <include name="${jspf.jar}"/>
+               <include name="${log4j.jar}"/>
        </fileset>
       <pathelement path="${java.class.path}" />
       <pathelement path="${build.classes}" />
@@ -524,6 +526,8 @@
           <include name="${cornerstone-datasources-api.jar}"/>
           <include name="${cornerstone-datasources-impl.jar}"/>
           <include name="${concurrent.jar}"/>
+          <include name="${jspf.jar}"/>
+          <include name="${log4j.jar}"/>
         </lib>
         <zipfileset dir="${conf.dir}" fullpath="conf/sqlResources.xml">
           <include name="sqlResources.xml"/>

Modified: james/server/trunk/include.properties
URL: 
http://svn.apache.org/viewvc/james/server/trunk/include.properties?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- james/server/trunk/include.properties (original)
+++ james/server/trunk/include.properties Tue Jul 18 06:41:43 2006
@@ -90,3 +90,11 @@
 
 bcmail.jar=bcmail-jdk14-129.jar
 bcmail-workaround.jar=bcmail-jdk14-129-workaround.jar
+
+# ----- jSPF -----
+jspf.jar=jspf-0.9b1.jar
+
+# ----- Log4J-----
+log4j.jar=log4j-1.2.13.jar
+
+

Added: james/server/trunk/lib/jspf-0.9b1.jar
URL: 
http://svn.apache.org/viewvc/james/server/trunk/lib/jspf-0.9b1.jar?rev=423084&view=auto
==============================================================================
Binary file - no diff available.

Propchange: james/server/trunk/lib/jspf-0.9b1.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: james/server/trunk/lib/log4j-1.2.13.jar
URL: 
http://svn.apache.org/viewvc/james/server/trunk/lib/log4j-1.2.13.jar?rev=423084&view=auto
==============================================================================
Binary file - no diff available.

Propchange: james/server/trunk/lib/log4j-1.2.13.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: james/server/trunk/src/conf/james-config.xml
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/conf/james-config.xml?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- james/server/trunk/src/conf/james-config.xml (original)
+++ james/server/trunk/src/conf/james-config.xml Tue Jul 18 06:41:43 2006
@@ -931,6 +931,15 @@
                   <blacklist> relays.ordb.org </blacklist>
                </rblservers>
             </handler>            
+            --> 
+            <!-- This command handler can be used to reject emails with not 
match the SPF record of the sender domain --> 
+            <!-- If checkAuthNetworks is set to true sender domain will be 
checked also for clients that -->
+            <!-- are allowed to relay. Default is false. -->  
+            <!--
+            <handler class="org.apache.james.smtpserver.core.filter.fastfail" 
command="MAIL,RCPT">
+                <checkAuthClients> false </checkAuthClients>
+                <blockSoftFail> false </blockSoftFail>
+            </handler>
             -->    
             
 

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java 
Tue Jul 18 06:41:43 2006
@@ -120,15 +120,6 @@
      */
     private boolean heloEhloEnforcement;
     
-    /**
-     * TEMPORARY: is the sending address blocklisted
-     */
-    private boolean blocklisted;
-    
-    /**
-     * The blocklisted detail
-     */
-    private String blocklistedDetail = null;
 
     /**
      * The SMTPGreeting
@@ -155,6 +146,11 @@
     private HashMap state = new HashMap();
 
     /**
+     * The hash map holds states which should be used in the whole connection
+     */
+    private HashMap connectionState = new HashMap();
+    
+    /**
      * The per-handler response buffer used to marshal responses.
      */
     private StringBuffer responseBuffer = new StringBuffer(256);
@@ -185,6 +181,7 @@
         sessionEnded = false;
         smtpGreeting = theConfigData.getSMTPGreeting();
         resetState();
+        resetConnectionState();
 
         // if no greeting was configured use a default
         if (smtpGreeting == null) {
@@ -323,6 +320,7 @@
      */
     protected void resetHandler() {
         resetState();
+        resetConnectionState();
 
         clearResponseBuffer();
 
@@ -555,6 +553,14 @@
      */
     public boolean getStopHandlerProcessing() {
         return stopHandlerProcessing;
+    }
+    
+    public void resetConnectionState() {
+        connectionState.clear();
+    }
+    
+    public HashMap getConnectionState() {
+        return connectionState;
     }
 
 }

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java 
Tue Jul 18 06:41:43 2006
@@ -37,6 +37,7 @@
     public final static String SENDER = "SENDER_ADDRESS";     // Sender's 
email address
     public final static String RCPT_LIST = "RCPT_LIST";   // The message 
recipients
     public final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // 
HELO or EHLO
+    public final static String CURRENT_HELO_NAME = "CURRENT_HELO_NAME"; 
     public static final Object CURRENT_RECIPIENT = "CURRENT_RECIPIENT"; // 
Current recipient
 
     /**
@@ -139,9 +140,9 @@
     boolean isSessionEnded();
 
     /**
-     * Returns Map that consists of the state of the SMTPSession
+     * Returns Map that consists of the state of the SMTPSession per mail
      *
-     * @return map of the current SMTPSession state
+     * @return map of the current SMTPSession state per mail
      */
     HashMap getState();
 
@@ -227,6 +228,19 @@
      * @return true or false
      */
     boolean getStopHandlerProcessing();
+    
+    
+    /**
+     * Reset the Connection state
+     */
+    void resetConnectionState();
+    
+    /**
+     * Returns Map that consists of the state of the SMTPSession per connection
+     *
+     * @return map of the current SMTPSession state per connection
+     */
+    HashMap getConnectionState();
 
 }
 

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/DNSRBLHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/DNSRBLHandler.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/DNSRBLHandler.java 
(original)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/DNSRBLHandler.java 
Tue Jul 18 06:41:43 2006
@@ -172,7 +172,7 @@
          */
         if (session.isRelayingAllowed()) {
             getLogger().info("Ipaddress " + session.getRemoteIPAddress() + " 
is allowed to relay. Don't check it");
-            session.getState().put(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME, 
"false");
+            
session.getConnectionState().put(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME, "false");
             return;
         }
         
@@ -192,7 +192,7 @@
                         getLogger().info("Connection from " + ipAddress + " 
whitelisted by " + rblList[i]);
                     }
                     
-                    
session.getState().put(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME, "false");
+                    
session.getConnectionState().put(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME, "false");
                     return;
                 } catch (java.net.UnknownHostException uhe) {
                     if (getLogger().isInfoEnabled()) {
@@ -218,11 +218,11 @@
                             // Set the detail
                             String blocklistedDetail = 
txt.iterator().next().toString();
                             
-                            
session.getState().put(RBL_DETAIL_MAIL_ATTRIBUTE_NAME, blocklistedDetail);
+                            
session.getConnectionState().put(RBL_DETAIL_MAIL_ATTRIBUTE_NAME, 
blocklistedDetail);
                         }
                     }
                     
-                    
session.getState().put(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME, "true");
+                    
session.getConnectionState().put(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME, "true");
                     return;
                 } catch (java.net.UnknownHostException uhe) {
                     // if it is unknown, it isn't blocked
@@ -233,7 +233,7 @@
             }
         }
         // default state
-        session.getState().put(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME, "false");
+        session.getConnectionState().put(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME, 
"false");
     }
 
     /**
@@ -250,12 +250,12 @@
      */
     public void onCommand(SMTPSession session) {
         String responseString = null;
-        String blocklisted = (String) 
session.getState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME);
+        String blocklisted = (String) 
session.getConnectionState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME);
         MailAddress recipientAddress = (MailAddress) session.getState().get(
                 SMTPSession.CURRENT_RECIPIENT);
 
         if (blocklisted.equals("true") && // was found in the RBL
-                !(session.isRelayingAllowed() || (session.isAuthRequired() && 
session
+                ((session.isAuthRequired() && session
                         .getUser() != null)) && // Not (either an authorized IP
                                                 // or (SMTP AUTH is enabled and
                                                 // not authenticated))

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
 Tue Jul 18 06:41:43 2006
@@ -55,8 +55,7 @@
     private void doEHLO(SMTPSession session, String argument) {
         StringBuffer responseBuffer = session.getResponseBuffer();
 
-        session.resetState();
-        session.getState().put(SMTPSession.CURRENT_HELO_MODE, COMMAND_NAME);
+        session.getConnectionState().put(SMTPSession.CURRENT_HELO_MODE, 
COMMAND_NAME);
 
         ArrayList esmtpextensions = new ArrayList();
 

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
 Tue Jul 18 06:41:43 2006
@@ -52,8 +52,7 @@
     private void doHELO(SMTPSession session, String argument) {
         String responseString = null;
 
-        session.resetState();
-        session.getState().put(SMTPSession.CURRENT_HELO_MODE, COMMAND_NAME);
+        session.getConnectionState().put(SMTPSession.CURRENT_HELO_MODE, 
COMMAND_NAME);
         session.getResponseBuffer().append("250 ").append(
                 session.getConfigurationData().getHelloName())
                 .append(" Hello ").append(argument).append(" (").append(

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java
 Tue Jul 18 06:41:43 2006
@@ -53,13 +53,9 @@
     private void doRSET(SMTPSession session, String argument) {
         String responseString = "";
         if ((argument == null) || (argument.length() == 0)) {
-            // remember the ehlo mode
-            Object currentHeloMode = 
session.getState().get(SMTPSession.CURRENT_HELO_MODE);
+
             session.resetState();
-            // start again with the old helo mode
-            if (currentHeloMode != null) {
-                
session.getState().put(SMTPSession.CURRENT_HELO_MODE,currentHeloMode);
-            }
+
             responseString = "250 
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK";
         } else {
             responseString = "500 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" 
Unexpected argument provided with RSET command";

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java
 Tue Jul 18 06:41:43 2006
@@ -51,12 +51,17 @@
     private void doEHLO(SMTPSession session, String argument) {
         String responseString = null;        
      
+        session.resetState();
+        
         if (argument == null) {
             responseString = "501 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" 
Domain address required: " + COMMAND_NAME;
             session.writeResponse(responseString);
             
             // After this filter match we should not call any other handler!
             session.setStopHandlerProcessing(true);
+        } else {
+            // store provided name
+            session.getState().put(SMTPSession.CURRENT_HELO_NAME,argument);
         }
     }
     

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/HeloFilterCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/HeloFilterCmdHandler.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/HeloFilterCmdHandler.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/HeloFilterCmdHandler.java
 Tue Jul 18 06:41:43 2006
@@ -50,7 +50,9 @@
      * @param argument the argument passed in with the command by the SMTP 
client
      */
     private void doHELO(SMTPSession session, String argument) {
-        String responseString = null;
+        String responseString = null;        
+
+        session.resetState();
               
         if (argument == null) {
             responseString = "501 Domain address required: " + COMMAND_NAME;
@@ -60,6 +62,9 @@
             // After this filter match we should not call any other handler!
             session.setStopHandlerProcessing(true);
          
+        } else {
+            // store provided name
+            session.getState().put(SMTPSession.CURRENT_HELO_NAME,argument);
         }
     }
     

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/MailFilterCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/MailFilterCmdHandler.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/MailFilterCmdHandler.java
 (original)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/MailFilterCmdHandler.java
 Tue Jul 18 06:41:43 2006
@@ -19,7 +19,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 import java.util.Locale;
 import java.util.StringTokenizer;
 
@@ -70,7 +69,7 @@
             // After this filter match we should not call any other handler!
             session.setStopHandlerProcessing(true);
             
-        } else if 
(!session.getState().containsKey(SMTPSession.CURRENT_HELO_MODE) && 
session.useHeloEhloEnforcement()) {
+        } else if 
(!session.getConnectionState().containsKey(SMTPSession.CURRENT_HELO_MODE) && 
session.useHeloEhloEnforcement()) {
             responseString = "503 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Need HELO 
or EHLO before MAIL";
             session.writeResponse(responseString);
             

Added: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/SPFHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/SPFHandler.java?rev=423084&view=auto
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/SPFHandler.java
 (added)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/filter/fastfail/SPFHandler.java
 Tue Jul 18 06:41:43 2006
@@ -0,0 +1,271 @@
+/***********************************************************************
+ * Copyright (c) 2006 The Apache Software Foundation.                  *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.smtpserver.core.filter.fastfail;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.james.jspf.SPF;
+import org.apache.james.jspf.SPF1Utils;
+import org.apache.james.jspf.SPFResult;
+import org.apache.james.jspf.core.DNSService;
+import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.MessageHandler;
+import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.util.mail.dsn.DSNStatus;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+
+/**
+ * SPFHandler which could be used to reject mail based on spf. The Following 
attributes
+ * 
+ * org.apache.james.smtpserver.spf.header - Holds the header which can be 
attached later
+ * 
+ * Sample Configuration: <br>
+ * <br>
+ * &lt;handler class="org.apache.james.smtpserver.core.SPFHandler"
+ * command="MAIL,RCPT"&gt; &lt;blockSoftFail&gt;false&lt;/blockSoftFail&gt;
+ * &lt;/handler&gt;
+ */
+public class SPFHandler extends AbstractLogEnabled implements CommandHandler,
+        MessageHandler, Configurable {
+
+    public static final String SPF_BLOCKLISTED = "SPF_BLOCKLISTED";
+
+    public static final String SPF_DETAIL = "SPF_DETAIL";
+
+    public static final String SPF_TEMPBLOCKLISTED = "SPF_TEMPBLOCKLISTED";
+
+    public final static String SPF_HEADER = "SPF_HEADER";
+
+    public final static String SPF_HEADER_MAIL_ATTRIBUTE_NAME = 
"org.apache.james.spf.header";
+
+    /**
+     * If set to true the mail will also be rejected on a softfail
+     */
+    private boolean blockSoftFail = false;
+
+    private DNSService dnsService = null;
+
+    private boolean checkAuthNetworks = false;
+
+    /**
+     * @see 
org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
+     */
+    public void configure(Configuration handlerConfiguration)
+            throws ConfigurationException {
+        Configuration configuration = handlerConfiguration.getChild(
+                "blockSoftFail", false);
+        if (configuration != null) {
+            setBlockSoftFail(configuration.getValueAsBoolean(false));
+        }
+        Configuration configRelay = handlerConfiguration.getChild(
+                "checkAuthNetworks", false);
+        if (configRelay != null) {
+            setCheckAuthNetworks(configRelay.getValueAsBoolean(false));
+        }
+
+    }
+
+    /**
+     * block the email on a softfail
+     * 
+     * @param blockSoftFail
+     *            true or false
+     */
+    public void setBlockSoftFail(boolean blockSoftFail) {
+        this.blockSoftFail = blockSoftFail;
+    }
+
+    /**
+     * DNSService to use
+     * 
+     * @param dnsService The DNSService
+     */
+    public void setDNSService(DNSService dnsService) {
+        this.dnsService = dnsService;
+    }
+
+    /**
+     * Set to true if AuthNetworks should be included in the EHLO check
+     * 
+     * @param checkAuthNetworks
+     *            Set to true to enable
+     */
+    public void setCheckAuthNetworks(boolean checkAuthNetworks) {
+        this.checkAuthNetworks = checkAuthNetworks;
+    }
+
+    /**
+     * Calls the SPFcheck
+     * 
+     * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
+     */
+    public void onCommand(SMTPSession session) {
+        if (session.getCommandName().equals("MAIL")) {
+            doSPFCheck(session);
+        } else if (session.getCommandName().equals("RCPT")) {
+            rejectSession(session);
+
+        }
+    }
+
+    /**
+     * Calls a SPF check
+     * 
+     * @param session
+     *            SMTP session object
+     */
+    private void doSPFCheck(SMTPSession session) {
+
+        MailAddress sender = (MailAddress) session.getState().get(
+                SMTPSession.SENDER);
+        String heloEhlo = (String) session.getState().get(
+                SMTPSession.CURRENT_HELO_NAME);
+
+        // We have no Sender or HELO/EHLO yet return false
+        if (sender == null || heloEhlo == null) {
+            getLogger().info("No Sender or HELO present");
+            System.out.println("sender: " + sender + " helo: " + heloEhlo);
+        } else {
+            // No checks for authorized cliends
+            if (session.isRelayingAllowed() && checkAuthNetworks == false) {
+                getLogger().info(
+                        "Ipaddress " + session.getRemoteIPAddress()
+                                + " is allowed to relay. Don't check it");
+            } else {
+
+                SPF spf;
+
+                String ip = session.getRemoteIPAddress();
+                if (dnsService == null) {
+                    spf = new SPF();
+                } else {
+                    spf = new SPF(dnsService);
+                }
+
+                SPFResult result = spf
+                        .checkSPF(ip, sender.toString(), heloEhlo);
+
+                String spfResult = result.getResult();
+
+                String explanation = "Blocked - see: "
+                        + result.getExplanation();
+
+                // Store the header
+                session.getState().put(SPF_HEADER, result.getHeaderText());
+
+                getLogger().info(
+                        "Result for " + ip + " - " + sender + " - " + heloEhlo
+                                + " = " + spfResult);
+
+                // Check if we should block!
+                if ((spfResult.equals(SPF1Utils.FAIL_CONV))
+                        || (spfResult.equals(SPF1Utils.SOFTFAIL_CONV) && 
blockSoftFail)
+                        || spfResult.equals(SPF1Utils.PERM_ERROR_CONV)) {
+
+                    if (spfResult.equals(SPF1Utils.PERM_ERROR)) {
+                        explanation = "Blocked caused by an invalid SPF 
record";
+                    }
+                    session.getState().put(SPF_DETAIL, explanation);
+                    session.getState().put(SPF_BLOCKLISTED, "true");
+
+                } else if (spfResult.equals(SPF1Utils.TEMP_ERROR_CONV)) {
+                    session.getState().put(SPF_TEMPBLOCKLISTED, "true");
+                }
+            }
+        }
+
+    }
+
+    /**
+     * Reject the session with the right responseCode
+     * 
+     * @param session
+     *            The SMTPSession
+     */
+    private void rejectSession(SMTPSession session) {
+        MailAddress recipientAddress = (MailAddress) session.getState().get(
+                SMTPSession.CURRENT_RECIPIENT);
+        String blocklisted = (String) session.getState().get(SPF_BLOCKLISTED);
+        String blocklistedDetail = (String) session.getState().get(SPF_DETAIL);
+        String tempBlocklisted = (String) session.getState().get(
+                SPF_TEMPBLOCKLISTED);
+
+        // Check if the recipient is postmaster or abuse..
+        if (recipientAddress != null
+                && (recipientAddress.getUser().equalsIgnoreCase("postmaster")
+                        || 
recipientAddress.getUser().equalsIgnoreCase("abuse") || ((session
+                        .isAuthRequired() && session.getUser() != null)))) {
+            System.out.println("HERE2 " + blocklisted);
+            //remove invalid data
+            session.getState().remove(SPF_BLOCKLISTED);
+            session.getState().remove(SPF_DETAIL);
+            session.getState().remove(SPF_TEMPBLOCKLISTED);
+            session.getState().remove(SPF_HEADER);
+        } else {
+            // Check if session is blocklisted
+            if (blocklisted != null && blocklisted.equals("true")) {
+
+                String responseString = "530 "
+                        + DSNStatus.getStatus(DSNStatus.PERMANENT,
+                                DSNStatus.SECURITY_AUTH) + " "
+                        + blocklistedDetail;
+                session.writeResponse(responseString);
+
+                session.setStopHandlerProcessing(true);
+
+            } else if (tempBlocklisted != null
+                    && tempBlocklisted.equals("true")) {
+                String responseString = "451 "
+                        + DSNStatus.getStatus(DSNStatus.TRANSIENT,
+                                DSNStatus.NETWORK_DIR_SERVER) + " "
+                        + "Temporary rejected: Problem on SPF lookup";
+                session.writeResponse(responseString);
+                session.setStopHandlerProcessing(true);
+            }
+        }
+
+    }
+
+    /**
+     * @see org.apache.james.smtpserver.CommandHandler#getImplCommands()
+     */
+    public Collection getImplCommands() {
+        Collection commands = new ArrayList();
+        commands.add("MAIL");
+        commands.add("RCPT");
+
+        return commands;
+    }
+
+    /**
+     * @see org.apache.james.smtpserver.MessageHandler#onMessage(SMTPSession)
+     */
+    public void onMessage(SMTPSession session) {
+        Mail mail = session.getMail();
+
+        // Store the spf header as attribute for later using
+        mail.setAttribute(SPF_HEADER_MAIL_ATTRIBUTE_NAME, (String) session
+                .getState().get(SPF_HEADER));
+    }
+}

Modified: 
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- 
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java 
(original)
+++ 
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java 
Tue Jul 18 06:41:43 2006
@@ -126,6 +126,8 @@
     private void setupMockedSMTPSession() {
         mockedSMTPSession = new SMTPSession() {
             HashMap state = new HashMap();
+            HashMap connectionState = new HashMap();
+            boolean stopHandler = false;
             
             public void writeResponse(String respString) {
                 throw new UnsupportedOperationException(
@@ -249,13 +251,19 @@
             }
 
             public void setStopHandlerProcessing(boolean b) {
-                // TODO Auto-generated method stub
-                
+                stopHandler = b;  
             }
 
             public boolean getStopHandlerProcessing() {
-                // TODO Auto-generated method stub
-                return false;
+                return stopHandler;
+            }
+
+            public HashMap getConnectionState() {       
+                return connectionState;
+            }
+
+            public void resetConnectionState() {
+                connectionState.clear();
             }
 
         };
@@ -274,8 +282,8 @@
         rbl.setGetDetail(true);
         rbl.onConnect(mockedSMTPSession);
         assertEquals("Blocked - see http://www.spamcop.net/bl.shtml?127.0.0.2";,
-               
mockedSMTPSession.getState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
-        
assertEquals("true",mockedSMTPSession.getState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
+               
mockedSMTPSession.getConnectionState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
+        
assertEquals("true",mockedSMTPSession.getConnectionState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
     }
 
     // ip is blacklisted and has txt details but we don'T want to retrieve the 
txt record
@@ -290,8 +298,8 @@
         rbl.setBlacklist(new String[] { "bl.spamcop.net" });
         rbl.setGetDetail(false);
         rbl.onConnect(mockedSMTPSession);
-        
assertNull(mockedSMTPSession.getState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
-        
assertEquals("true",mockedSMTPSession.getState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
+        
assertNull(mockedSMTPSession.getConnectionState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
+        
assertEquals("true",mockedSMTPSession.getConnectionState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
     }
 
     // ip is allowed to relay
@@ -308,8 +316,8 @@
         rbl.setBlacklist(new String[] { "bl.spamcop.net" });
         rbl.setGetDetail(true);
         rbl.onConnect(mockedSMTPSession);
-        
assertNull(mockedSMTPSession.getState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
-        
assertEquals("false",mockedSMTPSession.getState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
+        
assertNull(mockedSMTPSession.getConnectionState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
+        
assertEquals("false",mockedSMTPSession.getConnectionState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
     }
 
     // ip not on blacklist
@@ -325,8 +333,8 @@
         rbl.setBlacklist(new String[] { "bl.spamcop.net" });
         rbl.setGetDetail(true);
         rbl.onConnect(mockedSMTPSession);
-        
assertNull(mockedSMTPSession.getState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
-        
assertEquals("false",mockedSMTPSession.getState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
+        
assertNull(mockedSMTPSession.getConnectionState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
+        
assertEquals("false",mockedSMTPSession.getConnectionState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
     }
 
     // ip on blacklist without txt details
@@ -342,8 +350,8 @@
         rbl.setBlacklist(new String[] { "bl.spamcop.net" });
         rbl.setGetDetail(true);
         rbl.onConnect(mockedSMTPSession);
-        
assertNull(mockedSMTPSession.getState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
-        
assertEquals("true",mockedSMTPSession.getState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
+        
assertNull(mockedSMTPSession.getConnectionState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
+        
assertEquals("true",mockedSMTPSession.getConnectionState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
     }
 
     // ip on whitelist
@@ -359,8 +367,8 @@
         rbl.setWhitelist(new String[] { "bl.spamcop.net" });
         rbl.setGetDetail(true);
         rbl.onConnect(mockedSMTPSession);
-        
assertNull(mockedSMTPSession.getState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
-        
assertEquals("false",mockedSMTPSession.getState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
+        
assertNull(mockedSMTPSession.getConnectionState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
+        
assertEquals("false",mockedSMTPSession.getConnectionState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
     }
 
 }

Added: 
james/server/trunk/src/test/org/apache/james/smtpserver/SPFHandlerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/smtpserver/SPFHandlerTest.java?rev=423084&view=auto
==============================================================================
--- james/server/trunk/src/test/org/apache/james/smtpserver/SPFHandlerTest.java 
(added)
+++ james/server/trunk/src/test/org/apache/james/smtpserver/SPFHandlerTest.java 
Tue Jul 18 06:41:43 2006
@@ -0,0 +1,534 @@
+/***********************************************************************
+ * Copyright (c) 2006 The Apache Software Foundation.                  *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.smtpserver;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import java.util.HashMap;
+
+import java.util.List;
+
+import javax.mail.internet.ParseException;
+
+import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.james.jspf.core.DNSService;
+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.smtpserver.core.filter.fastfail.SPFHandler;
+import org.apache.james.test.mock.avalon.MockLogger;
+import org.apache.james.test.mock.mailet.MockMail;
+import org.apache.james.util.watchdog.Watchdog;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+
+import junit.framework.TestCase;
+
+public class SPFHandlerTest extends TestCase {
+
+    private DNSService mockedDnsService;
+
+    private SMTPSession mockedSMTPSession;;
+
+    private boolean relaying = false;
+
+    private String command = "MAIL";
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        setupMockedDnsService();
+        setRelayingAllowed(false);
+    }
+
+    /**
+     * Set relayingAllowed
+     * 
+     * @param relaying
+     *            true or false
+     */
+    private void setRelayingAllowed(boolean relaying) {
+        this.relaying = relaying;
+    }
+
+    /**
+     * Setup the mocked dnsserver
+     * 
+     */
+    private void setupMockedDnsService() {
+        mockedDnsService = new DNSService() {
+
+            public List getAAAARecords(String arg0, int arg1)
+                    throws NoneException, PermErrorException,
+                    TempErrorException {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public List getARecords(String arg0, int arg1)
+                    throws NoneException, PermErrorException,
+                    TempErrorException {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public List getLocalDomainNames() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public List getMXRecords(String arg0, int arg1)
+                    throws PermErrorException, NoneException,
+                    TempErrorException {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public List getPTRRecords(String arg0) throws PermErrorException,
+                    NoneException, TempErrorException {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getSpfRecord(String host, String version)
+                    throws PermErrorException, NoneException,
+                    TempErrorException {
+                if (host.equals("spf1.james.apache.org")) {
+                    // pass
+                    return "v=spf1 +all";
+                } else if (host.equals("spf2.james.apache.org")) {
+                    // fail
+                    return "v=spf1 -all";
+                } else if (host.equals("spf3.james.apache.org")) {
+                    // softfail
+                    return "v=spf1 ~all";
+                } else if (host.equals("spf4.james.apache.org")) {
+                    // permerror
+                    throw new PermErrorException("junit permerror test");
+                } else if (host.equals("spf5.james.apache.org")) {
+                    throw new TempErrorException("junit temperror test");
+                } else {
+                    throw new NoneException("junit noneerror test");
+                }
+            }
+
+            public String getTxtCatType(String arg0) throws NoneException,
+                    PermErrorException, TempErrorException {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public void setTimeOut(int arg0) {
+                // do nothing
+            }
+
+        };
+    }
+
+    private void setCommand(String command) {
+        this.command = command;
+    }
+
+    /**
+     * Setup mocked smtpsession
+     */
+    private void setupMockedSMTPSession(final String ip, final String helo,
+            final MailAddress sender, final MailAddress recipient) {
+        mockedSMTPSession = new SMTPSession() {
+            HashMap state = new HashMap();
+
+            HashMap connectionState = new HashMap();
+
+            Mail mail = new MockMail();
+
+            boolean stopHandler = false;
+
+            public void writeResponse(String respString) {
+                // Do nothing
+            }
+
+            public String readCommandLine() throws IOException {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public StringBuffer getResponseBuffer() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String clearResponseBuffer() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public InputStream getInputStream() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getCommandName() {
+                return command;
+            }
+
+            public String getCommandArgument() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public Mail getMail() {
+                return mail;
+            }
+
+            public void setMail(Mail mail) {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getRemoteHost() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getRemoteIPAddress() {
+                return ip;
+            }
+
+            public void abortMessage() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public void endSession() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public boolean isSessionEnded() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public HashMap getState() {
+                state.put(SMTPSession.CURRENT_HELO_NAME, helo);
+                state.put(SMTPSession.SENDER, sender);
+                state.put(SMTPSession.CURRENT_RECIPIENT, recipient);
+                return state;
+            }
+
+            public void resetState() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public SMTPHandlerConfigurationData getConfigurationData() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public boolean isRelayingAllowed() {
+                return relaying;
+            }
+
+            public boolean isAuthRequired() {
+                return false;
+            }
+
+            public boolean useHeloEhloEnforcement() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getUser() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public void setUser(String user) {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public Watchdog getWatchdog() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public String getSessionID() {
+                throw new UnsupportedOperationException(
+                        "Unimplemented mock service");
+            }
+
+            public int getRcptCount() {
+                return 0;
+            }
+
+            public void setStopHandlerProcessing(boolean b) {
+                stopHandler = b;
+            }
+
+            public boolean getStopHandlerProcessing() {
+                return stopHandler;
+            }
+
+            public HashMap getConnectionState() {
+                return connectionState;
+            }
+
+            public void resetConnectionState() {
+                connectionState.clear();
+            }
+
+        };
+    }
+
+    private void runHandlers(SPFHandler spf, SMTPSession mockedSMTPSession) {
+
+        setCommand("MAIL");
+        spf.onCommand(mockedSMTPSession);
+
+        setCommand("RCPT");
+        spf.onCommand(mockedSMTPSession);
+
+        spf.onMessage(mockedSMTPSession);
+    }
+
+    public void testSPFpass() throws ParseException {
+        setupMockedSMTPSession("192.168.100.1", "spf1.james.apache.org",
+                new MailAddress("[EMAIL PROTECTED]"), new MailAddress(
+                        "[EMAIL PROTECTED]"));
+        SPFHandler spf = new SPFHandler();
+
+        ContainerUtil.enableLogging(spf, new MockLogger());
+
+        spf.setDNSService(mockedDnsService);
+
+        runHandlers(spf, mockedSMTPSession);
+
+        assertNull("Not reject", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_BLOCKLISTED));
+        assertNull("Not blocked so no details", mockedSMTPSession.getState()
+                .get(SPFHandler.SPF_DETAIL));
+        assertNull("No tempError", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_TEMPBLOCKLISTED));
+        assertNotNull("Header should present", mockedSMTPSession.getState()
+                .get(SPFHandler.SPF_HEADER));
+        assertEquals("header", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_HEADER), mockedSMTPSession.getMail()
+                .getAttribute(SPFHandler.SPF_HEADER_MAIL_ATTRIBUTE_NAME));
+        assertFalse(mockedSMTPSession.getStopHandlerProcessing());
+    }
+
+    public void testSPFfail() throws ParseException {
+        setupMockedSMTPSession("192.168.100.1", "spf2.james.apache.org",
+                new MailAddress("[EMAIL PROTECTED]"), new MailAddress(
+                        "[EMAIL PROTECTED]"));
+        SPFHandler spf = new SPFHandler();
+
+        ContainerUtil.enableLogging(spf, new MockLogger());
+
+        spf.setDNSService(mockedDnsService);
+
+        runHandlers(spf, mockedSMTPSession);
+
+        assertNotNull("reject", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_BLOCKLISTED));
+        assertNotNull("blocked", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_DETAIL));
+        assertNull("No tempError", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_TEMPBLOCKLISTED));
+        assertNotNull("Header should present", mockedSMTPSession.getState()
+                .get(SPFHandler.SPF_HEADER));
+        assertTrue(mockedSMTPSession.getStopHandlerProcessing());
+    }
+
+    public void testSPFsoftFail() throws ParseException {
+        setupMockedSMTPSession("192.168.100.1", "spf3.james.apache.org",
+                new MailAddress("[EMAIL PROTECTED]"), new MailAddress(
+                        "[EMAIL PROTECTED]"));
+        SPFHandler spf = new SPFHandler();
+
+        ContainerUtil.enableLogging(spf, new MockLogger());
+
+        spf.setDNSService(mockedDnsService);
+
+        runHandlers(spf, mockedSMTPSession);
+
+        assertNull("not reject", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_BLOCKLISTED));
+        assertNull("no details ", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_DETAIL));
+        assertNull("No tempError", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_TEMPBLOCKLISTED));
+        assertNotNull("Header should present", mockedSMTPSession.getState()
+                .get(SPFHandler.SPF_HEADER));
+        assertEquals("header", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_HEADER), mockedSMTPSession.getMail()
+                .getAttribute(SPFHandler.SPF_HEADER_MAIL_ATTRIBUTE_NAME));
+        assertFalse(mockedSMTPSession.getStopHandlerProcessing());
+    }
+
+    public void testSPFsoftFailRejectEnabled() throws ParseException {
+        setupMockedSMTPSession("192.168.100.1", "spf3.james.apache.org",
+                new MailAddress("[EMAIL PROTECTED]"), new MailAddress(
+                        "[EMAIL PROTECTED]"));
+        SPFHandler spf = new SPFHandler();
+
+        ContainerUtil.enableLogging(spf, new MockLogger());
+
+        spf.setDNSService(mockedDnsService);
+        spf.setBlockSoftFail(true);
+
+        setCommand("MAIL");
+        spf.onCommand(mockedSMTPSession);
+
+        setCommand("RCPT");
+        spf.onCommand(mockedSMTPSession);
+
+        assertNotNull("reject", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_BLOCKLISTED));
+        assertNotNull("details ", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_DETAIL));
+        assertNull("No tempError", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_TEMPBLOCKLISTED));
+        assertNotNull("Header should present", mockedSMTPSession.getState()
+                .get(SPFHandler.SPF_HEADER));
+        assertTrue(mockedSMTPSession.getStopHandlerProcessing());
+    }
+
+    public void testSPFpermError() throws ParseException {
+        setupMockedSMTPSession("192.168.100.1", "spf4.james.apache.org",
+                new MailAddress("[EMAIL PROTECTED]"), new MailAddress(
+                        "[EMAIL PROTECTED]"));
+        SPFHandler spf = new SPFHandler();
+
+        ContainerUtil.enableLogging(spf, new MockLogger());
+
+        spf.setDNSService(mockedDnsService);
+        spf.setBlockSoftFail(true);
+
+        runHandlers(spf, mockedSMTPSession);
+
+        assertNotNull("reject", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_BLOCKLISTED));
+        assertNotNull("details ", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_DETAIL));
+        assertNull("No tempError", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_TEMPBLOCKLISTED));
+        assertNotNull("Header should present", mockedSMTPSession.getState()
+                .get(SPFHandler.SPF_HEADER));
+        assertTrue(mockedSMTPSession.getStopHandlerProcessing());
+    }
+
+    public void testSPFtempError() throws ParseException {
+        setupMockedSMTPSession("192.168.100.1", "spf5.james.apache.org",
+                new MailAddress("[EMAIL PROTECTED]"), new MailAddress(
+                        "[EMAIL PROTECTED]"));
+        SPFHandler spf = new SPFHandler();
+
+        ContainerUtil.enableLogging(spf, new MockLogger());
+
+        spf.setDNSService(mockedDnsService);
+
+        runHandlers(spf, mockedSMTPSession);
+
+        assertNull("no reject", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_BLOCKLISTED));
+        assertNull("no details ", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_DETAIL));
+        assertNotNull("tempError", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_TEMPBLOCKLISTED));
+        assertNotNull("Header should present", mockedSMTPSession.getState()
+                .get(SPFHandler.SPF_HEADER));
+        assertTrue(mockedSMTPSession.getStopHandlerProcessing());
+    }
+
+    public void testSPFNoRecord() throws ParseException {
+        setupMockedSMTPSession("192.168.100.1", "spf6.james.apache.org",
+                new MailAddress("[EMAIL PROTECTED]"), new MailAddress(
+                        "[EMAIL PROTECTED]"));
+        SPFHandler spf = new SPFHandler();
+
+        ContainerUtil.enableLogging(spf, new MockLogger());
+
+        spf.setDNSService(mockedDnsService);
+
+        runHandlers(spf, mockedSMTPSession);
+
+        assertNull("no reject", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_BLOCKLISTED));
+        assertNull("no details ", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_DETAIL));
+        assertNull("no tempError", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_TEMPBLOCKLISTED));
+        assertNotNull("Header should present", mockedSMTPSession.getState()
+                .get(SPFHandler.SPF_HEADER));
+        assertEquals("header", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_HEADER), mockedSMTPSession.getMail()
+                .getAttribute(SPFHandler.SPF_HEADER_MAIL_ATTRIBUTE_NAME));
+        assertFalse(mockedSMTPSession.getStopHandlerProcessing());
+    }
+
+    public void testSPFpermErrorNotRejectPostmaster() throws ParseException {
+        setupMockedSMTPSession("192.168.100.1", "spf4.james.apache.org",
+                new MailAddress("[EMAIL PROTECTED]"), new MailAddress(
+                        "[EMAIL PROTECTED]"));
+        SPFHandler spf = new SPFHandler();
+
+        ContainerUtil.enableLogging(spf, new MockLogger());
+
+        spf.setDNSService(mockedDnsService);
+        spf.setBlockSoftFail(true);
+
+        runHandlers(spf, mockedSMTPSession);
+
+        assertNull("not reject", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_BLOCKLISTED));
+        assertNull("no details ", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_DETAIL));
+        assertNull("No tempError", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_TEMPBLOCKLISTED));
+        assertNull("no Header should present", mockedSMTPSession.getState()
+                .get(SPFHandler.SPF_HEADER));
+        assertFalse(mockedSMTPSession.getStopHandlerProcessing());
+    }
+
+    public void testSPFpermErrorNotRejectAbuse() throws ParseException {
+        setupMockedSMTPSession("192.168.100.1", "spf4.james.apache.org",
+                new MailAddress("[EMAIL PROTECTED]"), new MailAddress(
+                        "[EMAIL PROTECTED]"));
+        SPFHandler spf = new SPFHandler();
+
+        ContainerUtil.enableLogging(spf, new MockLogger());
+
+        spf.setDNSService(mockedDnsService);
+        spf.setBlockSoftFail(true);
+
+        runHandlers(spf, mockedSMTPSession);
+
+        assertNull("not reject", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_BLOCKLISTED));
+        assertNull("no details ", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_DETAIL));
+        assertNull("No tempError", mockedSMTPSession.getState().get(
+                SPFHandler.SPF_TEMPBLOCKLISTED));
+        assertNull("no Header should present", mockedSMTPSession.getState()
+                .get(SPFHandler.SPF_HEADER));
+        assertFalse(mockedSMTPSession.getStopHandlerProcessing());
+    }
+}

Modified: 
james/server/trunk/src/test/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java?rev=423084&r1=423083&r2=423084&view=diff
==============================================================================
--- 
james/server/trunk/src/test/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java
 (original)
+++ 
james/server/trunk/src/test/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java
 Tue Jul 18 06:41:43 2006
@@ -212,13 +212,23 @@
             }
 
             public void setStopHandlerProcessing(boolean b) {
-                // TODO Auto-generated method stub
-                
+                throw new UnsupportedOperationException(
+                "Unimplemented mock service");     
             }
 
             public boolean getStopHandlerProcessing() {
-                // TODO Auto-generated method stub
-                return false;
+                throw new UnsupportedOperationException(
+                "Unimplemented mock service");
+            }
+
+            public HashMap getConnectionState() {
+                throw new UnsupportedOperationException(
+                "Unimplemented mock service");
+            }
+
+            public void resetConnectionState() {
+                throw new UnsupportedOperationException(
+                "Unimplemented mock service");
             }
         };
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to