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 no...@apache.org on 2007/01/03 18:11:00 UTC

svn commit: r492222 - in /james/server/sandbox/handlerapi-experiment: ./ src/java/org/apache/james/smtpserver/ src/java/org/apache/james/smtpserver/core/ src/java/org/apache/james/smtpserver/core/filter/fastfail/ src/java/org/apache/james/smtpserver/ho...

Author: norman
Date: Wed Jan  3 09:10:58 2007
New Revision: 492222

URL: http://svn.apache.org/viewvc?view=rev&rev=492222
Log:
Add HookResultHook to hook in on HookResult.
Use HookResultHook to implement JunkScoreHandler

Added:
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java   (with props)
Removed:
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/AbstractJunkHandler.java
Modified:
    james/server/sandbox/handlerapi-experiment/TODO
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AbstractHookableCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/JunkScoreHandler.java
    james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/JunkScoreHandlerTest.java
    james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java
    james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
    james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SPFHandlerTest.java

Modified: james/server/sandbox/handlerapi-experiment/TODO
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/TODO?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/TODO (original)
+++ james/server/sandbox/handlerapi-experiment/TODO Wed Jan  3 09:10:58 2007
@@ -1,5 +1,4 @@
 - Enable From/Sender and Date checks on message received
-- Find a way to handle the old JunkHandlerScore stuff
 - Check DataCmdHandler for correct clean-up on every exceptions
 - on Rcpt message reject, the original code was logging a lot of informations. Maybe we should change the Hook callers to do something similar (in RcptCmdHandler create a log string including context() call)
 - RcptOptions: introduce a new extension points to have Handlers to declare support for given command options so that the syntax check can support them.
@@ -9,4 +8,5 @@
 - Decide what to do with services and DI (logging and more).
 - SenderAuthIdentifyVerificationRcptHook use session.getConfigurationData().isVerifyIdentity() to decide wether to enable itself or not: isn't it better to add the handler to the config and commenting/uncommenting the handler already do the trick? If so we shoudl simply remove that configuration and remove the check in the code.
 - I would like to Merge HeloHook and EhloHook to a single hook. They are alternative and I think there is no need for both in the high-level api. less is more ;-)
-  (currently we have a single handler implementing both hook and doing the same thing for both).
\ No newline at end of file
+  (currently we have a single handler implementing both hook and doing the same thing for both).
+- Let AuthCmdHandler and EhloCmdHandler handler HookResultHook too
\ No newline at end of file

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java Wed Jan  3 09:10:58 2007
@@ -32,6 +32,7 @@
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.Serviceable;
 import org.apache.james.smtpserver.core.CoreCmdHandlerLoader;
+import org.apache.james.smtpserver.core.SendMailHandler;
 
 import java.util.Enumeration;
 import java.util.Iterator;
@@ -122,6 +123,9 @@
                         }
                     }
                 }
+                // load the sendmail handler
+                // TODO: Should move this to an extra loader ?
+                loadClass(classLoader, SendMailHandler.class.getName(), addHandler(null, SendMailHandler.class.getName()));
 
             }
         }

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AbstractHookableCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AbstractHookableCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AbstractHookableCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AbstractHookableCmdHandler.java Wed Jan  3 09:10:58 2007
@@ -25,6 +25,7 @@
 import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.smtpserver.hook.HookResult;
+import org.apache.james.smtpserver.hook.HookResultHook;
 import org.apache.james.smtpserver.hook.HookReturnCode;
 import org.apache.james.util.mail.SMTPRetCode;
 
@@ -41,6 +42,7 @@
 
 
     private List hooks;
+    private List rHooks;
 
     /**
      * Handle command processing
@@ -80,13 +82,20 @@
     private SMTPResponse processHooks(SMTPSession session, String command,
             String parameters) {
         List hooks = getHooks();
-
         if (hooks != null) {
             int count = hooks.size();
             for (int i = 0; i < count; i++) {
                 Object rawHook = hooks.get(i);
                 getLogger().debug("executing hook " + rawHook.getClass().getName());
-                SMTPResponse res = callHook(rawHook, session, parameters);
+                HookResult hRes = callHook(rawHook, session, parameters);
+                if (rHooks != null) {
+                    for (int i2 = 0; i2 < rHooks.size(); i2++) {
+                        Object rHook = rHooks.get(i2);
+                        getLogger().debug("executing hook " + rHook);
+                        hRes = ((HookResultHook) rHook).onHookResult(session, hRes, rawHook);
+                    }
+                }
+                SMTPResponse res = HookResultToSMTPResponse(hRes);
                 if (res != null) {
                     return res;
                 }
@@ -101,11 +110,21 @@
      * @param rawHook the hook (to be casted)
      * @param session the session
      * @param parameters the parameters
-     * @return the SMTPResponse, can be calculated using calcDefaultSMTPResponse.
+     * @return the HookResult, will be calculated using HookResultToSMTPResponse.
      */
-    protected abstract SMTPResponse callHook(Object rawHook, SMTPSession session, String parameters);
+    protected abstract HookResult callHook(Object rawHook, SMTPSession session, String parameters);
 
     /**
+     * Convert the HookResult to SMTPResponse using default values. Should be override for using own values
+     * 
+     * @param result
+     * @return
+     */
+    protected SMTPResponse HookResultToSMTPResponse(HookResult result) {
+        return calcDefaultSMTPResponse(result);
+    }
+    
+    /**
      * @param result
      */
     public static SMTPResponse calcDefaultSMTPResponse(HookResult result) {
@@ -173,6 +192,7 @@
     public List getMarkerInterfaces() {
         List classes = new ArrayList(1);
         classes.add(getHookInterface());
+        classes.add(HookResultHook.class);
         return classes;
     }
 
@@ -188,6 +208,8 @@
     public void wireExtensions(Class interfaceName, List extension) {
         if (getHookInterface().equals(interfaceName)) {
             this.hooks = extension;
+        } else if (HookResultHook.class.equals(interfaceName)) {
+            this.rHooks = extension;
         }
 
     }

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java Wed Jan  3 09:10:58 2007
@@ -45,7 +45,7 @@
     private final Object VRFYCMDHANDLER = VrfyCmdHandler.class.getName();
     private final Object WELCOMEMESSAGEHANDLER = WelcomeMessageHandler.class.getName();
     private final Object ADDDEFAULTATTRIBUTESHANDLER = AddDefaultAttributesMessageHook.class.getName();
-    private final Object SENDMAILHANDLER = SendMailHandler.class.getName();
+    //private final Object SENDMAILHANDLER = SendMailHandler.class.getName();
     private final Object USERSREPOSITORYAUTHHANDLER = UsersRepositoryAuthHook.class.getName();
     private final Object POSTMASTERABUSEHOOK = PostmasterAbuseRcptHook.class.getName();
     private final Object AUTHREQUIREDTORELAY = AuthRequiredToRelayRcptHook.class.getName();
@@ -60,7 +60,7 @@
         // Insert the basecommands in the Map
         commands.add(WELCOMEMESSAGEHANDLER);
         commands.add(ADDDEFAULTATTRIBUTESHANDLER);
-        commands.add(SENDMAILHANDLER);
+        //commands.add(SENDMAILHANDLER);
         commands.add(AUTHCMDHANDLER);
         commands.add(DATACMDHANDLER);
         commands.add(EHLOCMDHANDLER);

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java Wed Jan  3 09:10:58 2007
@@ -36,6 +36,8 @@
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.smtpserver.SizeLimitedOutputStream;
 import org.apache.james.smtpserver.WiringException;
+import org.apache.james.smtpserver.hook.HookResult;
+import org.apache.james.smtpserver.hook.HookResultHook;
 import org.apache.james.smtpserver.hook.MessageHook;
 import org.apache.james.util.mail.SMTPRetCode;
 import org.apache.james.util.mail.dsn.DSNStatus;
@@ -61,7 +63,7 @@
 public class DataCmdHandler
     extends AbstractLogEnabled
     implements CommandHandler, ExtensibleHandler {
-
+    
     private final class DataLineHandler implements LineHandler {
         public void onLine(SMTPSession session, byte[] line) {
             MimeMessageInputStreamSource mmiss = (MimeMessageInputStreamSource) session.getState().get(DATA_MIMEMESSAGE_STREAMSOURCE);
@@ -165,6 +167,8 @@
 
     private List messageHandlers;
     
+    private List rHooks;
+    
     /**
      * process DATA command
      *
@@ -359,8 +363,9 @@
      * @see org.apache.james.smtpserver.ExtensibleHandler#getMarkerInterfaces()
      */
     public List getMarkerInterfaces() {
-        List classes = new ArrayList(1);
+        List classes = new ArrayList(2);
         classes.add(MessageHook.class);
+        classes.add(HookResultHook.class);
         return classes;
     }
 
@@ -380,6 +385,8 @@
                 }
                 throw new WiringException("No messageHandler configured");
             }
+        } else if (HookResultHook.class.equals(interfaceName)) {
+            this.rHooks = extension;
         }
     }
 
@@ -389,10 +396,21 @@
     private void processExtensions(SMTPSession session, Mail mail) {
         if(mail != null && mail instanceof Mail && messageHandlers != null) {
             try {
-                getLogger().debug("executing message handlers");
                 int count = messageHandlers.size();
                 for(int i =0; i < count; i++) {
-                    SMTPResponse response = AbstractHookableCmdHandler.calcDefaultSMTPResponse(((MessageHook)messageHandlers.get(i)).onMessage(session, (Mail) mail));
+                    Object rawHandler =  messageHandlers.get(i);
+                    getLogger().debug("executing message handler " + rawHandler);
+                    HookResult hRes = ((MessageHook)rawHandler).onMessage(session, (Mail) mail);
+                    
+                    if (rHooks != null) {
+                        for (int i2 = 0; i2 < rHooks.size(); i2++) {
+                            Object rHook = rHooks.get(i2);
+                            getLogger().debug("executing hook " + rHook);
+                            hRes = ((HookResultHook) rHook).onHookResult(session, hRes, rawHandler);
+                        }
+                    }
+                    
+                    SMTPResponse response = AbstractHookableCmdHandler.calcDefaultSMTPResponse(hRes);
                     
                     //if the response is received, stop processing of command handlers
                     if(response != null) {

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java Wed Jan  3 09:10:58 2007
@@ -23,6 +23,7 @@
 import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.smtpserver.hook.EhloHook;
+import org.apache.james.smtpserver.hook.HookResult;
 import org.apache.james.util.mail.SMTPRetCode;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
@@ -166,11 +167,12 @@
         return EhloHook.class;
     }
 
-    /**
+    /*
+     * (non-Javadoc)
      * @see org.apache.james.smtpserver.core.AbstractHookableCmdHandler#callHook(java.lang.Object, org.apache.james.smtpserver.SMTPSession, java.lang.String)
      */
-    protected SMTPResponse callHook(Object rawHook, SMTPSession session, String parameters) {
-        return calcDefaultSMTPResponse(((EhloHook) rawHook).doEhlo(session, parameters));
+    protected HookResult callHook(Object rawHook, SMTPSession session, String parameters) {
+        return ((EhloHook) rawHook).doEhlo(session, parameters);
     }
 
 }

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java Wed Jan  3 09:10:58 2007
@@ -23,6 +23,7 @@
 import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.smtpserver.hook.HeloHook;
+import org.apache.james.smtpserver.hook.HookResult;
 import org.apache.james.util.mail.SMTPRetCode;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
@@ -93,11 +94,12 @@
         return HeloHook.class;
     }
 
+
     /**
      * @see org.apache.james.smtpserver.core.AbstractHookableCmdHandler#callHook(java.lang.Object, org.apache.james.smtpserver.SMTPSession, java.lang.String)
      */
-    protected SMTPResponse callHook(Object rawHook, SMTPSession session, String parameters) {
-        return calcDefaultSMTPResponse(((HeloHook) rawHook).doHelo(session, parameters));
+    protected HookResult callHook(Object rawHook, SMTPSession session, String parameters) {
+        return ((HeloHook) rawHook).doHelo(session, parameters);
     }
 
 

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java Wed Jan  3 09:10:58 2007
@@ -22,6 +22,7 @@
 import org.apache.james.smtpserver.CommandHandler;
 import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.smtpserver.hook.HookResult;
 import org.apache.james.smtpserver.hook.MailHook;
 import org.apache.james.util.mail.SMTPRetCode;
 import org.apache.james.util.mail.dsn.DSNStatus;
@@ -292,11 +293,12 @@
         return MailHook.class;
     }
 
+
     /**
      * @see org.apache.james.smtpserver.core.AbstractHookableCmdHandler#callHook(java.lang.Object, org.apache.james.smtpserver.SMTPSession, java.lang.String)
      */
-    protected SMTPResponse callHook(Object rawHook, SMTPSession session, String parameters) {
-        return calcDefaultSMTPResponse(((MailHook) rawHook).doMail(session,(MailAddress) session.getState().get(SMTPSession.SENDER)));
+    protected HookResult callHook(Object rawHook, SMTPSession session, String parameters) {
+        return ((MailHook) rawHook).doMail(session,(MailAddress) session.getState().get(SMTPSession.SENDER));
     }
 
 

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java Wed Jan  3 09:10:58 2007
@@ -21,6 +21,7 @@
 
 import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.smtpserver.hook.HookResult;
 import org.apache.james.smtpserver.hook.QuitHook;
 import org.apache.james.util.mail.SMTPRetCode;
 import org.apache.james.util.mail.dsn.DSNStatus;
@@ -106,8 +107,8 @@
     /**
      * @see org.apache.james.smtpserver.core.AbstractHookableCmdHandler#callHook(java.lang.Object, org.apache.james.smtpserver.SMTPSession, java.lang.String)
      */
-    protected SMTPResponse callHook(Object rawHook, SMTPSession session, String parameters) {
-        return calcDefaultSMTPResponse(((QuitHook) rawHook).doQuit(session));
+    protected HookResult callHook(Object rawHook, SMTPSession session, String parameters) {
+        return ((QuitHook) rawHook).doQuit(session);
     }
 
 }

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java Wed Jan  3 09:10:58 2007
@@ -22,6 +22,7 @@
 import org.apache.james.smtpserver.CommandHandler;
 import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.smtpserver.hook.HookResult;
 import org.apache.james.smtpserver.hook.RcptHook;
 import org.apache.james.util.mail.SMTPRetCode;
 import org.apache.james.util.mail.dsn.DSNStatus;
@@ -246,11 +247,11 @@
      * @see org.apache.james.smtpserver.core.AbstractHookableCmdHandler#callHook(java.lang.Object,
      *      org.apache.james.smtpserver.SMTPSession, java.lang.String)
      */
-    protected SMTPResponse callHook(Object rawHook, SMTPSession session,
+    protected HookResult callHook(Object rawHook, SMTPSession session,
             String parameters) {
-        return calcDefaultSMTPResponse(((RcptHook) rawHook).doRcpt(session,
+        return ((RcptHook) rawHook).doRcpt(session,
                 (MailAddress) session.getState().get(SMTPSession.SENDER),
-                (MailAddress) session.getState().get(CURRENT_RECIPIENT)));
+                (MailAddress) session.getState().get(CURRENT_RECIPIENT));
     }
 
 }

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/JunkScoreHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/JunkScoreHandler.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/JunkScoreHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/JunkScoreHandler.java Wed Jan  3 09:10:58 2007
@@ -25,9 +25,9 @@
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.smtpserver.hook.HookResult;
+import org.apache.james.smtpserver.hook.HookResultHook;
 import org.apache.james.smtpserver.hook.HookReturnCode;
 import org.apache.james.smtpserver.hook.MessageHook;
-import org.apache.james.util.junkscore.ComposedJunkScore;
 import org.apache.james.util.junkscore.JunkScore;
 import org.apache.james.util.junkscore.JunkScoreImpl;
 import org.apache.james.util.mail.dsn.DSNStatus;
@@ -36,6 +36,7 @@
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
@@ -46,30 +47,53 @@
  * -Compose action stores the junkScore values in the mail attributes
  * -Header action create headers which holds the junkScore for each check
  */
-public class JunkScoreHandler extends AbstractLogEnabled implements MessageHook, Configurable {
+public class JunkScoreHandler extends AbstractLogEnabled implements HookResultHook, MessageHook, Configurable {
 
     private double maxScore = 0;
     private String action;
     private static final String REJECT_ACTION = "reject";
-    private static final String COMPOSE_ACTION = "compose";
     private static final String HEADER_ACTION = "header";
+    private Map scoreMappings;
 
     /**
      * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
      */
     public void configure(Configuration arg0) throws ConfigurationException {
-        Configuration maxScoreConfig = arg0.getChild("maxScore");
+        Configuration maxScoreConfig = arg0.getChild("maxScore",true);
 
         if (maxScoreConfig != null) {
             setMaxScore(maxScoreConfig.getValueAsDouble(0));
         }
         
-        Configuration actionConfig = arg0.getChild("action");
+        Configuration actionConfig = arg0.getChild("action",true);
         if (actionConfig != null) {
             setAction(actionConfig.getValue().toLowerCase());
         } else {
             throw new ConfigurationException("Please configure the action");
         }
+        Configuration[] children = arg0.getChildren("mappings");
+        
+        if (children != null) {
+            if (children.length != 0) {
+            scoreMappings = new HashMap(children.length);
+            
+            for (int i = 0 ; i < children.length; i++) {
+                    String args[] = children[i].getValue().split("=");
+                
+                    if (args.length == 2) {
+                        scoreMappings.put(args[0], args[1]);
+                    } else {
+                        throw new ConfigurationException("Invalid mapping syntax use: className=score");
+                    }
+                }
+            } else {
+                throw new ConfigurationException("Please configure at least one mapping");
+            }
+        }
+    }
+    
+    public void setScoreMappings(Map scoreMappings) {
+        this.scoreMappings = scoreMappings;
     }
     
     /**
@@ -88,7 +112,7 @@
      * @throws ConfigurationException if invalid action is used
      */
     public void setAction(String action) throws ConfigurationException {
-        if (!action.equals(REJECT_ACTION) && !action.equals(COMPOSE_ACTION) && !action.equals(HEADER_ACTION)) 
+        if (!action.equals(REJECT_ACTION) && !action.equals(HEADER_ACTION)) 
             throw new ConfigurationException("Illegal action: " + action);
      
         this.action = action;  
@@ -98,27 +122,11 @@
      * @see org.apache.james.smtpserver.hook.MessageHook#onMessage(org.apache.james.smtpserver.SMTPSession, org.apache.mailet.Mail)
      */
     public HookResult onMessage(SMTPSession session, Mail mail) {
-        return checkScore(session, mail);
-    }
 
-    /**
-     * Check if the JunkScore limit is reached and perform the configured action
-     * 
-     * @param session the SMTPSession
-     */
-    private HookResult checkScore(SMTPSession session, Mail mail) {
-        JunkScore score1 = getLazyJunkScoreHandler(session.getConnectionState(),JunkScore.JUNK_SCORE_SESSION);
-        JunkScore score2 = getLazyJunkScoreHandler(session.getState(),JunkScore.JUNK_SCORE);
-        
-        JunkScore composed = new ComposedJunkScore(score1,score2);
-        
-        if (action.equals(COMPOSE_ACTION)) {
-            // Save the scores attribute to maybe use it later!
-            mail.setAttribute(JunkScore.JUNK_SCORE_SESSION_ATTR, String.valueOf(score1.getCompleteStoredScores()));
-            mail.setAttribute(JunkScore.JUNK_SCORE_ATTR, String.valueOf(score2.getCompleteStoredScores()));
-            mail.setAttribute(JunkScore.JUNK_SCORE_COMPOSED_ATTR, String.valueOf(composed.getCompleteStoredScores()));
-        } else if (action.equals(REJECT_ACTION)) {
-            if (maxScore <  composed.getCompleteStoredScores()) {
+        JunkScore junkScore = getJunkScore(session);
+        
+         if (action.equals(REJECT_ACTION)) {
+            if (maxScore <  junkScore.getCompleteStoredScores()) {
  
                 StringBuffer buffer = new StringBuffer(256).append(
                     "Rejected message from ").append(
@@ -126,9 +134,9 @@
                             .toString()).append(" from host ")
                     .append(session.getRemoteHost()).append(" (")
                     .append(session.getRemoteIPAddress()).append(
-                            "). This message reach the smap hits treshold. Required rejection hits: ")
+                            "). This message reach the spam hits treshold. Required rejection hits: ")
                     .append(maxScore).append(" hits: ")
-                    .append(composed.getCompleteStoredScores());
+                    .append(junkScore.getCompleteStoredScores());
                 getLogger().info(buffer.toString());
                 
                 return new HookResult(HookReturnCode.DENY, DSNStatus.getStatus(DSNStatus.PERMANENT,
@@ -137,7 +145,7 @@
         } else if (action.equals(HEADER_ACTION)) {
             try {
                 MimeMessage message = mail.getMessage();
-                Map scores = composed.getStoredScores();
+                Map scores = junkScore.getStoredScores();
                 Iterator itScores = scores.keySet().iterator();
         
                 StringBuffer header = new StringBuffer();
@@ -150,7 +158,7 @@
                 }
         
                 message.setHeader("X-JUNKSCORE", header.toString());
-                message.setHeader("X-JUNKSCORE-COMPOSED", String.valueOf(composed.getCompleteStoredScores()));
+                message.setHeader("X-JUNKSCORE-COMPOSED", String.valueOf(junkScore.getCompleteStoredScores()));
         
             } catch (MessagingException e) {
                 getLogger().info("Unable to add Junkscore to header: " + e.getMessage());
@@ -158,13 +166,37 @@
         }
         return new HookResult(HookReturnCode.DECLINED);
     }
+
     
-    public static JunkScore getLazyJunkScoreHandler(Map state, String key) {
-        JunkScore score = (JunkScore) state.get(key);
+    private JunkScore getJunkScore(SMTPSession session) {
+        JunkScore score = (JunkScore) session.getState().get(JunkScore.JUNK_SCORE);
         if (score == null) {
             score = new JunkScoreImpl();
-            state.put(key, score);
+            session.getState().put(JunkScore.JUNK_SCORE, score);
         }
         return score;
     }
+
+    /**
+     * @see org.apache.james.smtpserver.hook.HookResultHook#onHookResult(org.apache.james.smtpserver.SMTPSession, org.apache.james.smtpserver.hook.HookResult, java.lang.Object)
+     */
+    public HookResult onHookResult(SMTPSession session, HookResult result, Object object) {
+        if (result.getResult() == HookReturnCode.DENY) {
+            String className = object.getClass().getName();
+       
+            if (scoreMappings != null) {
+                String score = (String) scoreMappings.get(className);
+        
+                if (score != null) {
+                    getLogger().debug("Add JunkScore " + score + " for " + className);
+                    getJunkScore(session).setStoredScore(className, Double.parseDouble(score));
+        
+                    return new HookResult(HookReturnCode.DECLINED);
+                }
+            }
+        }
+        return result;
+    }
+    
+    
 }

Added: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java?view=auto&rev=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java (added)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java Wed Jan  3 09:10:58 2007
@@ -0,0 +1,28 @@
+/****************************************************************
+ * 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.smtpserver.hook;
+
+import org.apache.james.smtpserver.SMTPSession;
+
+public interface HookResultHook {
+    
+    public HookResult onHookResult(SMTPSession session,HookResult result, Object object);
+}

Propchange: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/HookResultHook.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/JunkScoreHandlerTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/JunkScoreHandlerTest.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/JunkScoreHandlerTest.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/JunkScoreHandlerTest.java Wed Jan  3 09:10:58 2007
@@ -34,17 +34,11 @@
 import org.apache.james.test.mock.avalon.MockLogger;
 import org.apache.james.test.mock.javaxmail.MockMimeMessage;
 import org.apache.james.test.mock.mailet.MockMail;
-import org.apache.james.util.junkscore.JunkScore;
 import org.apache.mailet.Mail;
 
 import junit.framework.TestCase;
 
 public class JunkScoreHandlerTest extends TestCase {
-    private String response = null;
-    private final static String KEY1 = "KEY1";
-    private final static String KEY2 = "KEY2";
-    private final static double SCORE1 = 10.0;
-    private final static double SCORE2 = 7.1;
 
     private SMTPSession setupMockedSMTPSession() {
         SMTPSession session = new AbstractSMTPSession() {
@@ -52,7 +46,7 @@
             HashMap cState = new HashMap();
         
             public Map getState() {
-            state.put(SMTPSession.SENDER, "sender@localhost");
+                state.put(SMTPSession.SENDER, "sender@localhost");
                 return state;
             }
 
@@ -96,39 +90,60 @@
     }
     
     public void testRejectAction() throws ConfigurationException {
-
+        Map mappings = new HashMap();
+        Object c = getDummyClass();
+        Object o = new Object().getClass();
+        
+        mappings.put(c.getClass().getName(), "20.0");
+        
         SMTPSession session = setupMockedSMTPSession();
         JunkScoreHandler handler = new JunkScoreHandler();
         ContainerUtil.enableLogging(handler,new MockLogger());
-    
+        
         handler.setAction("reject");
         handler.setMaxScore(15.0);
         Mail m = getMockMail();
         handler.onMessage(session, m);
 
-        assertNull("Not rejected",response);
-        ((JunkScore) session.getState().get(JunkScore.JUNK_SCORE)).setStoredScore(KEY1, SCORE1);
-        ((JunkScore) session.getConnectionState().get(JunkScore.JUNK_SCORE_SESSION)).setStoredScore(KEY2, SCORE2);
-        HookResult response = handler.onMessage(session, m);
-    
-        assertEquals("Rejected",response.getResult(), HookReturnCode.DENY);
+        handler.setScoreMappings(mappings);
+        
+        assertEquals("HookResult not changed", handler.onHookResult(session, new HookResult(HookReturnCode.DENY), o).getResult(), HookReturnCode.DENY);
+
+        assertEquals("HookResult changed", handler.onHookResult(session, new HookResult(HookReturnCode.DENY), c).getResult(), HookReturnCode.DECLINED);
+
+        assertEquals("Rejected", handler.onMessage(session, m).getResult(), HookReturnCode.DENY);
     }
+
     
     public void testHeaderAction() throws ConfigurationException, MessagingException {
+        Map mappings = new HashMap();
+        Object c = getDummyClass();
+        
+        mappings.put(c.getClass().getName(), "20.0");
+        
         SMTPSession session = setupMockedSMTPSession();
         JunkScoreHandler handler = new JunkScoreHandler();
         ContainerUtil.enableLogging(handler,new MockLogger());
     
         handler.setAction("header");
+        handler.setScoreMappings(mappings);
 
-        JunkScoreHandler.getLazyJunkScoreHandler(session.getState(), JunkScore.JUNK_SCORE).setStoredScore(KEY1, SCORE1);
-        JunkScoreHandler.getLazyJunkScoreHandler(session.getConnectionState(), JunkScore.JUNK_SCORE_SESSION).setStoredScore(KEY2, SCORE2);
         Mail m = getMockMail();
-        HookResult response = handler.onMessage(session,m);
+        assertEquals("HookResult changed", handler.onHookResult(session, new HookResult(HookReturnCode.DENY), c).getResult(), HookReturnCode.DECLINED);
+
+        assertEquals("Not rejected", handler.onMessage(session,m).getResult(),HookReturnCode.DECLINED);
     
         MimeMessage message = m.getMessage();
         assertNotNull("Header added",message.getHeader("X-JUNKSCORE")[0]);
-        assertNotNull("Header added",message.getHeader("X-JUNKSCORE-COMPOSED")[0]);
-        assertEquals("Not rejected", response.getResult(),HookReturnCode.DECLINED);
     }
+    
+    
+    private DummyClass getDummyClass() {
+        return new DummyClass();
+    }
+    
+    private class DummyClass{
+        // just a dummy class for testing
+    }
+    
 }

Modified: james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java Wed Jan  3 09:10:58 2007
@@ -1696,4 +1696,36 @@
         assertEquals("Not reject emails to abuse"+ smtpProtocol.getReplyString(), 250, smtpProtocol
                 .getReplyCode());
     }
+    
+    public void testJunkScore() throws Exception {
+        m_testConfiguration.setAuthorizedAddresses("192.168.0.1/32");
+        m_testConfiguration.useRBL(true);
+        m_testConfiguration.useJunkScore(true);
+        finishSetUp(m_testConfiguration);
+
+        m_dnsServer.setLocalhostByName(InetAddress.getByName("127.0.0.1"));
+
+        SMTPClient smtpProtocol = new SMTPClient();
+        smtpProtocol.connect("127.0.0.1", m_smtpListenerPort);
+
+        smtpProtocol.sendCommand("ehlo", InetAddress.getLocalHost().toString());
+
+        String sender = "test_user_smtp@localhost";
+
+        smtpProtocol.setSender(sender);
+
+        smtpProtocol.addRecipient("mail@localhost");
+        assertEquals("not reject: "+smtpProtocol.getReplyString(), 250, smtpProtocol
+                .getReplyCode());
+
+        smtpProtocol.sendShortMessageData("Subject: test\r\n\r\nTest body testDNSRBLRejectWorks\r\n");
+        assertEquals("reject: "+smtpProtocol.getReplyString(), 554, smtpProtocol
+                .getReplyCode());
+        
+        smtpProtocol.quit();
+
+        // mail was rejected by SMTPServer
+        assertNull("mail reject by mail server", m_mailServer
+                .getLastMail());
+    }
 }

Modified: james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java Wed Jan  3 09:10:58 2007
@@ -25,6 +25,7 @@
 import org.apache.avalon.framework.configuration.DefaultConfiguration;
 import org.apache.james.smtpserver.core.CoreCmdHandlerLoader;
 import org.apache.james.smtpserver.core.filter.fastfail.DNSRBLHandler;
+import org.apache.james.smtpserver.core.filter.fastfail.JunkScoreHandler;
 import org.apache.james.smtpserver.core.filter.fastfail.MaxRcptHandler;
 import org.apache.james.smtpserver.core.filter.fastfail.ResolvableEhloHeloHandler;
 import org.apache.james.smtpserver.core.filter.fastfail.ReverseEqualsEhloHeloHandler;
@@ -50,6 +51,7 @@
     private int m_maxRcpt = 0;
     private boolean m_useRBL = false;
     private boolean m_addressBracketsEnforcement = true;
+    private boolean m_useJunkScore = false;
 
     
     public SMTPTestConfiguration(int smtpListenerPort) {
@@ -138,6 +140,10 @@
     public void setAddressBracketsEnforcement(boolean addressBracketsEnforcement) {
         this.m_addressBracketsEnforcement = addressBracketsEnforcement;
     }
+    
+    public void useJunkScore(boolean useJunkScore) {
+    this.m_useJunkScore = useJunkScore;
+    }
 
     public void init() throws ConfigurationException {
 
@@ -207,6 +213,27 @@
             d.addChild(Util.getValuedConfiguration("maxRcpt", m_maxRcpt + ""));
             config.addChild(d);
         }
+        if (m_useJunkScore) {
+            DefaultConfiguration handler = new DefaultConfiguration("handler");
+            handler.setAttribute("class", JunkScoreHandler.class.getName());
+
+            DefaultConfiguration mapping = new DefaultConfiguration("mappings");
+            mapping.setValue(DNSRBLHandler.class.getName() + "=" + "25.0");
+            handler.addChild(mapping);
+            
+            DefaultConfiguration action = new DefaultConfiguration("action");
+            action.setValue("reject");
+            handler.addChild(action);
+            
+            DefaultConfiguration score = new DefaultConfiguration("maxScore");
+            score.setValue("15.0");
+            handler.addChild(score);
+            
+            
+            config.addChild(handler);
+
+        }
+        
         config.addChild(createHandler(CoreCmdHandlerLoader.class.getName(),
                 null));
         handlerConfig.addChild(config);

Modified: james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SPFHandlerTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SPFHandlerTest.java?view=diff&rev=492222&r1=492221&r2=492222
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SPFHandlerTest.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SPFHandlerTest.java Wed Jan  3 09:10:58 2007
@@ -158,7 +158,7 @@
             }
             
             public String getUser() {
-        	return null;
+            return null;
             }
 
             public int getRcptCount() {



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