Author: norman
Date: Wed Dec 27 07:30:35 2006
New Revision: 490515

URL: http://svn.apache.org/viewvc?view=rev&rev=490515
Log:
Commit some proof of concept to use hooks to execute fastfail stuff. This will 
make it more easy to to develop such plugins. The idea is related to qpsmtpd 
(http://wiki.qpsmtpd.org/plugin_hooks).

Added:
    
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/
    
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/RcptHook.java
   (with props)
Modified:
    
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/ExtensibleHandler.java
    
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/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/RcptCmdHandler.java
    
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/CoreFilterCmdHandlerLoader.java
    
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/MaxRcptHandler.java
    
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/MaxRcptHandlerTest.java

Modified: 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/ExtensibleHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/ExtensibleHandler.java?view=diff&rev=490515&r1=490514&r2=490515
==============================================================================
--- 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/ExtensibleHandler.java
 (original)
+++ 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/ExtensibleHandler.java
 Wed Dec 27 07:30:35 2006
@@ -28,17 +28,18 @@
 public interface ExtensibleHandler {
      
     /**
-     * Return the interface of plugins that will
+     * Return a List of interfaces of plugins that will
      * extend this.
      */
-    Class getMarkerInterface();
+    List getMarkerInterfaces();
     
     /**
      * Method called during initialization after all the handlers have been 
declared
      * in the handlerchain.
      * 
+     * @param interfaceName
      * @param extension a list of objects implementing the marker interface
      */
-    void wireExtensions(List extension);
+    void wireExtensions(Class interfaceName, List extension);
     
 }

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=490515&r1=490514&r2=490515
==============================================================================
--- 
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 Dec 27 07:30:35 2006
@@ -76,15 +76,18 @@
         for (Iterator h = handlers.iterator(); h.hasNext(); ) {
             Object handler = h.next();
             if (handler instanceof ExtensibleHandler) {
-                Class markerInterface = ((ExtensibleHandler) 
handler).getMarkerInterface();
-                List extensions = new LinkedList();
-                for (Iterator c2 = handlers.iterator(); c2.hasNext(); ) {
-                    Object ext = c2.next();
-                    if (markerInterface.isInstance(ext)) {
-                        extensions.add(ext);
+                List markerInterfaces = ((ExtensibleHandler) 
handler).getMarkerInterfaces();
+                for (int i= 0;i < markerInterfaces.size(); i++) {
+                    Class markerInterface = (Class) markerInterfaces.get(i);
+                    List extensions = new LinkedList();
+                    for (Iterator c2 = handlers.iterator(); c2.hasNext(); ) {
+                        Object ext = c2.next();
+                        if (markerInterface.isInstance(ext)) {
+                            extensions.add(ext);
+                        }
                     }
+                    ((ExtensibleHandler) 
handler).wireExtensions(markerInterface,extensions);
                 }
-                ((ExtensibleHandler) handler).wireExtensions(extensions);
             }
         }
     }

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=490515&r1=490514&r2=490515
==============================================================================
--- 
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 Dec 27 07:30:35 2006
@@ -438,18 +438,22 @@
 
 
     /**
-     * @see org.apache.james.smtpserver.ExtensibleHandler#getMarkerInterface()
+     * @see org.apache.james.smtpserver.ExtensibleHandler#getMarkerInterfaces()
      */
-    public Class getMarkerInterface() {
-        return MessageHandler.class;
+    public List getMarkerInterfaces() {
+        List classes = new ArrayList(1);
+        classes.add(MessageHandler.class);
+        return classes;
     }
 
 
     /**
-     * @see 
org.apache.james.smtpserver.ExtensibleHandler#wireExtensions(java.util.List)
+     * @see 
org.apache.james.smtpserver.ExtensibleHandler#wireExtensions(java.lang.Class, 
java.util.List)
      */
-    public void wireExtensions(List extension) {
-        this.messageHandlers = extension;
+    public void wireExtensions(Class interfaceName, List extension) {
+        if (MessageHandler.class.equals(interfaceName)) {
+            this.messageHandlers = extension;
+        }
     }
 
     /**

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=490515&r1=490514&r2=490515
==============================================================================
--- 
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 Dec 27 07:30:35 2006
@@ -100,18 +100,21 @@
     }
 
     /**
-     * @see org.apache.james.smtpserver.ExtensibleHandler#getMarkerInterface()
+     * @see org.apache.james.smtpserver.ExtensibleHandler#getMarkerInterfaces()
      */
-    public Class getMarkerInterface() {
-        return EhloExtension.class;
+    public List getMarkerInterfaces() {
+        ArrayList classes = new ArrayList(1);
+        classes.add(EhloExtension.class);
+        return classes;
     }
 
-
     /**
-     * @see 
org.apache.james.smtpserver.ExtensibleHandler#wireExtensions(java.util.List)
+     * @see 
org.apache.james.smtpserver.ExtensibleHandler#wireExtensions(java.lang.Class, 
java.util.List)
      */
-    public void wireExtensions(List extension) {
-        this.ehloExtensions = extension;
+    public void wireExtensions(Class interfaceName, List extension) {
+        if (EhloExtension.class.equals(interfaceName)) {
+            this.ehloExtensions = extension;
+        }
     }
 
     /**

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=490515&r1=490514&r2=490515
==============================================================================
--- 
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 Dec 27 07:30:35 2006
@@ -23,11 +23,16 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+import java.util.StringTokenizer;
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.ExtensibleHandler;
 import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.smtpserver.hook.RcptHook;
 import org.apache.james.util.mail.SMTPRetCode;
 import org.apache.james.util.mail.dsn.DSNStatus;
 import org.apache.mailet.MailAddress;
@@ -36,15 +41,51 @@
   * Handles RCPT command
   */
 public class RcptCmdHandler extends AbstractLogEnabled implements
-        CommandHandler {
+        CommandHandler, ExtensibleHandler {
 
+    private List rcptHooks;
+    
+    
     /**
      * handles RCPT command
      *
      * @see 
org.apache.james.smtpserver.CommandHandler#onCommand(org.apache.james.smtpserver.SMTPSession,
 java.lang.String, java.lang.String) 
     **/
     public SMTPResponse onCommand(SMTPSession session, String command, String 
parameters) {
-        return doRCPT(session, parameters);
+        SMTPResponse response = doRCPTFilter(session,parameters);
+    
+        if (response == null) {
+        response = processExtensions(session);
+        if (response == null) {
+            return doRCPT(session, parameters);
+        } else {
+        return response;
+        }
+    } else {
+        return response;
+    }
+
+    }
+
+    /**
+     * @param session
+     */
+    private SMTPResponse processExtensions(SMTPSession session) {
+        if(rcptHooks != null) {
+            getLogger().debug("executing rcpt hook");
+            int count = rcptHooks.size();
+            for(int i =0; i < count; i++) {
+                    
+                int rCode = ((RcptHook) rcptHooks.get(i)).doRcpt(session, 
(MailAddress) session.getState().get(SMTPSession.CURRENT_RECIPIENT), 
(MailAddress) session.getState().get(SMTPSession.SENDER));
+                    
+                if (rCode == RcptHook.DENY) {
+                    return new 
SMTPResponse(SMTPRetCode.TRANSACTION_FAILED,"Email rejected");
+                }else if (rCode == RcptHook.DENYSOFT) {
+                    return new SMTPResponse(SMTPRetCode.LOCAL_ERROR,"Temporary 
problem. Please try again later");
+                }
+            }
+        }
+        return null;
     }
 
 
@@ -75,6 +116,180 @@
              
     }
     
+
+    /**
+     * @param session SMTP session object
+     * @param argument the argument passed in with the command by the SMTP 
client
+     */
+    private SMTPResponse doRCPTFilter(SMTPSession session, String argument) {
+        String recipient = null;
+        if ((argument != null) && (argument.indexOf(":") > 0)) {
+            int colonIndex = argument.indexOf(":");
+            recipient = argument.substring(colonIndex + 1);
+            argument = argument.substring(0, colonIndex);
+        }
+        if (!session.getState().containsKey(SMTPSession.SENDER)) {
+            return new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, 
DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Need MAIL 
before RCPT");
+        } else if (argument == null || 
!argument.toUpperCase(Locale.US).equals("TO")
+                   || recipient == null) {
+            return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, 
DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_SYNTAX)+" Usage: 
RCPT TO:<recipient>");
+        } else {
+            Collection rcptColl = (Collection) 
session.getState().get(SMTPSession.RCPT_LIST);
+            if (rcptColl == null) {
+                rcptColl = new ArrayList();
+            }
+            recipient = recipient.trim();
+            int lastChar = recipient.lastIndexOf('>');
+            // Check to see if any options are present and, if so, whether 
they are correctly formatted
+            // (separated from the closing angle bracket by a ' ').
+            String rcptOptionString = null;
+            if ((lastChar > 0) && (recipient.length() > lastChar + 2) && 
(recipient.charAt(lastChar + 1) == ' ')) {
+                rcptOptionString = recipient.substring(lastChar + 2);
+
+                // Remove the options from the recipient
+                recipient = recipient.substring(0, lastChar + 1);
+            }
+            if (session.getConfigurationData().useAddressBracketsEnforcement() 
&& (!recipient.startsWith("<") || !recipient.endsWith(">"))) {
+                if (getLogger().isErrorEnabled()) {
+                    StringBuffer errorBuffer =
+                        new StringBuffer(192)
+                                .append("Error parsing recipient address: ")
+                                .append("Address did not start and end with < 
>")
+                                .append(getContext(session,null,recipient));
+                    getLogger().error(errorBuffer.toString());
+                }
+                return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, 
DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_SYNTAX)+" Syntax 
error in parameters or arguments");
+            }
+            MailAddress recipientAddress = null;
+            //Remove < and >
+            if (session.getConfigurationData().useAddressBracketsEnforcement() 
|| (recipient.startsWith("<") && recipient.endsWith(">"))) {
+                recipient = recipient.substring(1, recipient.length() - 1);
+            }
+            
+            if (recipient.indexOf("@") < 0) {
+                // set the default domain
+                recipient = recipient + "@" + 
session.getConfigurationData().getMailServer().getDefaultDomain();
+            }
+            
+            try {
+                recipientAddress = new MailAddress(recipient);
+            } catch (Exception pe) {
+                if (getLogger().isErrorEnabled()) {
+                    StringBuffer errorBuffer =
+                        new StringBuffer(192)
+                                .append("Error parsing recipient address: ")
+                                
.append(getContext(session,recipientAddress,recipient))
+                                .append(pe.getMessage());
+                    getLogger().error(errorBuffer.toString());
+                }
+                /*
+                 * from RFC2822;
+                 * 553 Requested action not taken: mailbox name not allowed
+                 *     (e.g., mailbox syntax incorrect)
+                 */
+                return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_MAILBOX, 
DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_SYNTAX)+" Syntax 
error in recipient address");
+            }
+
+            
+            if (!session.isRelayingAllowed()) {
+                if (session.isAuthRequired()) {
+                    // Make sure the mail is being sent locally if not
+                    // authenticated else reject.
+                    if (session.getUser() == null) {
+                        String toDomain = recipientAddress.getHost();
+                        if 
(!session.getConfigurationData().getMailServer().isLocalServer(toDomain)) {
+                            StringBuffer sb = new StringBuffer(128);
+                            sb.append("Rejected message - authentication is 
required for mail request");
+                            
sb.append(getContext(session,recipientAddress,recipient));
+                            getLogger().error(sb.toString());
+                            return new SMTPResponse(SMTPRetCode.AUTH_REQUIRED, 
DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" 
Authentication Required");
+                        }
+                    } else {
+                        // Identity verification checking
+                        if (session.getConfigurationData().isVerifyIdentity()) 
{
+                            String authUser = 
(session.getUser()).toLowerCase(Locale.US);
+                            MailAddress senderAddress = (MailAddress) 
session.getState().get(SMTPSession.SENDER);
+    
+                            if ((senderAddress == null) || 
(!authUser.equals(senderAddress.getUser())) ||
+                                
(!session.getConfigurationData().getMailServer().isLocalServer(senderAddress.getHost())))
 {
+                                if (getLogger().isErrorEnabled()) {
+                                    StringBuffer errorBuffer =
+                                        new StringBuffer(128)
+                                            .append("User ")
+                                            .append(authUser)
+                                            .append(" authenticated, however 
tried sending email as ")
+                                            .append(senderAddress)
+                                            
.append(getContext(session,recipientAddress,recipient));
+                                    getLogger().error(errorBuffer.toString());
+                                }
+                                
+                                return new 
SMTPResponse(SMTPRetCode.BAD_SEQUENCE, 
DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Incorrect 
Authentication for Specified Email Address");
+                            }
+                        }
+                    }
+                } else {
+                    String toDomain = recipientAddress.getHost();
+                    if 
(!session.getConfigurationData().getMailServer().isLocalServer(toDomain)) {
+                        StringBuffer errorBuffer = new StringBuffer(128)
+                            .append("Rejected message - ")
+                            .append(session.getRemoteIPAddress())
+                            .append(" not authorized to relay to ")
+                            .append(toDomain)
+                            
.append(getContext(session,recipientAddress,recipient));
+                        getLogger().error(errorBuffer.toString());
+                        
+                        return new 
SMTPResponse(SMTPRetCode.MAILBOX_PERM_UNAVAILABLE, 
DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Requested 
action not taken: relaying denied");
+                    }
+                }
+            }
+            if (rcptOptionString != null) {
+
+              StringTokenizer optionTokenizer = new 
StringTokenizer(rcptOptionString, " ");
+              while (optionTokenizer.hasMoreElements()) {
+                  String rcptOption = optionTokenizer.nextToken();
+                  int equalIndex = rcptOption.indexOf('=');
+                  String rcptOptionName = rcptOption;
+                  String rcptOptionValue = "";
+                  if (equalIndex > 0) {
+                      rcptOptionName = rcptOption.substring(0, 
equalIndex).toUpperCase(Locale.US);
+                      rcptOptionValue = rcptOption.substring(equalIndex + 1);
+                  }
+                  // Unexpected option attached to the RCPT command
+                  if (getLogger().isDebugEnabled()) {
+                      StringBuffer debugBuffer =
+                          new StringBuffer(128)
+                              .append("RCPT command had 
unrecognized/unexpected option ")
+                              .append(rcptOptionName)
+                              .append(" with value ")
+                              .append(rcptOptionValue)
+                              
.append(getContext(session,recipientAddress,recipient));
+                      getLogger().debug(debugBuffer.toString());
+                  }
+                  
+                  return new 
SMTPResponse(SMTPRetCode.PARAMETER_NOT_IMPLEMENTED, "Unrecognized or 
unsupported option: "+rcptOptionName);
+              }
+              optionTokenizer = null;
+            }
+    
+            
session.getState().put(SMTPSession.CURRENT_RECIPIENT,recipientAddress);
+        }
+        return null;
+    }
+
+
+    private String getContext(SMTPSession session, MailAddress 
recipientAddress, String recipient){
+        StringBuffer sb = new StringBuffer(128);
+        if(null!=recipientAddress) {
+            sb.append(" [to:" + 
(recipientAddress).toInternetAddress().getAddress() + "]");
+        } else if(null!=recipient) {
+            sb.append(" [to:" + recipient + "]");
+        }
+        if (null!=session.getState().get(SMTPSession.SENDER)) {
+            sb.append(" [from:" + 
((MailAddress)session.getState().get(SMTPSession.SENDER)).toInternetAddress().getAddress()
 + "]");
+        }
+        return sb.toString();
+    } 
+    
     /**
      * @see org.apache.james.smtpserver.CommandHandler#getImplCommands()
      */
@@ -83,6 +298,25 @@
         implCommands.add("RCPT");
         
         return implCommands;
+    }
+
+    /**
+     * @see org.apache.james.smtpserver.ExtensibleHandler#getMarkerInterfaces()
+     */
+    public List getMarkerInterfaces() {
+    List classes = new ArrayList(1);
+    classes.add(RcptHook.class);
+    return classes;
+    }
+
+    /**
+     * @see 
org.apache.james.smtpserver.ExtensibleHandler#wireExtensions(java.lang.Class, 
java.util.List)
+     */
+    public void wireExtensions(Class interfaceName, List extension) {
+    if (RcptHook.class.equals(interfaceName)) {
+            this.rcptHooks = extension; 
+    }
+
     }
 
 }

Modified: 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/CoreFilterCmdHandlerLoader.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/CoreFilterCmdHandlerLoader.java?view=diff&rev=490515&r1=490514&r2=490515
==============================================================================
--- 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/CoreFilterCmdHandlerLoader.java
 (original)
+++ 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/CoreFilterCmdHandlerLoader.java
 Wed Dec 27 07:30:35 2006
@@ -49,7 +49,8 @@
         commands.put("EHLO", EHLOBASEFILTERCMDHANDLER);
         commands.put("HELO", HELOBASEFILTERCMDHANDLER);
         commands.put("MAIL", MAILBASEFILTERCMDHANDLER);
-        commands.put("RCPT", RCPTBASEFILTERCMDHANDLER);
+        // not needed any more the RCPT filters get loaded from the main class
+        //commands.put("RCPT", RCPTBASEFILTERCMDHANDLER);
         
         return commands;
     }

Modified: 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/MaxRcptHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/MaxRcptHandler.java?view=diff&rev=490515&r1=490514&r2=490515
==============================================================================
--- 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/MaxRcptHandler.java
 (original)
+++ 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/MaxRcptHandler.java
 Wed Dec 27 07:30:35 2006
@@ -21,21 +21,17 @@
 
 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.james.smtpserver.CommandHandler;
-import org.apache.james.smtpserver.SMTPResponse;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.smtpserver.hook.RcptHook;
 
-import org.apache.james.util.mail.SMTPRetCode;
-import org.apache.james.util.mail.dsn.DSNStatus;
+import org.apache.mailet.MailAddress;
 
-public class MaxRcptHandler extends AbstractJunkHandler implements
-        CommandHandler, Configurable {
+public class MaxRcptHandler extends AbstractLogEnabled implements
+        RcptHook, Configurable {
 
     private int maxRcpt = 0;
 
@@ -53,7 +49,7 @@
                     "Please set the maxRcpt configuration value");
         }
         
-        super.configure(handlerConfiguration);
+        // super.configure(handlerConfiguration);
     }
 
     /**
@@ -65,35 +61,20 @@
     public void setMaxRcpt(int maxRcpt) {
         this.maxRcpt = maxRcpt;
     }
-
+   
     /**
-     * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
+     * @see 
org.apache.james.smtpserver.hook.RcptHook#doRcpt(org.apache.james.smtpserver.SMTPSession,
 org.apache.mailet.MailAddress, org.apache.mailet.MailAddress)
      */
-    public SMTPResponse onCommand(SMTPSession session, String command, String 
arguments) {
-        return doProcessing(session);
-    }
-    
-    /**
-     * @see org.apache.james.smtpserver.CommandHandler#getImplCommands()
-     */
-    public Collection getImplCommands() {
-        Collection implCommands = new ArrayList();
-        implCommands.add("RCPT");
-        
-        return implCommands;
+    public int doRcpt(SMTPSession session, MailAddress sender, MailAddress 
rcpt) {
+        if ((session.getRcptCount() + 1) > maxRcpt) {
+            return RcptHook.DENY;
+        } else {
+            return RcptHook.OK;
+        }
     }
 
-    /**
-     * @see 
org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#check(org.apache.james.smtpserver.SMTPSession)
-     */
-    protected boolean check(SMTPSession session) {
-        // check if the max recipients has reached
-        return ((session.getRcptCount() + 1) > maxRcpt);
-    }
 
-    /**
-     * @see 
org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#getJunkHandlerData(org.apache.james.smtpserver.SMTPSession)
-     */
+    /*
     public JunkHandlerData getJunkHandlerData(SMTPSession session) {
         JunkHandlerData data = new JunkHandlerData();
     
@@ -104,4 +85,5 @@
         data.setScoreName("MaxRcptCheck");
         return data;
     }
+    */
 }

Added: 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/RcptHook.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/RcptHook.java?view=auto&rev=490515
==============================================================================
--- 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/RcptHook.java
 (added)
+++ 
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/hook/RcptHook.java
 Wed Dec 27 07:30:35 2006
@@ -0,0 +1,33 @@
+/****************************************************************
+ * 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;
+import org.apache.mailet.MailAddress;
+
+public interface RcptHook {
+    public final static int OK = 0;
+    public final static int DENY = 1;
+    public final static int DENYSOFT = 2;
+    
+    public int doRcpt(SMTPSession session, MailAddress sender, MailAddress 
rcpt);
+
+}

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

Modified: 
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/MaxRcptHandlerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/MaxRcptHandlerTest.java?view=diff&rev=490515&r1=490514&r2=490515
==============================================================================
--- 
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/MaxRcptHandlerTest.java
 (original)
+++ 
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/MaxRcptHandlerTest.java
 Wed Dec 27 07:30:35 2006
@@ -25,13 +25,15 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.mail.internet.ParseException;
+
 import junit.framework.TestCase;
 
 import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.james.smtpserver.core.filter.fastfail.MaxRcptHandler;
+import org.apache.james.smtpserver.hook.RcptHook;
 import org.apache.james.test.mock.avalon.MockLogger;
-import org.apache.james.util.junkscore.JunkScore;
-import org.apache.james.util.junkscore.JunkScoreImpl;
+import org.apache.mailet.MailAddress;
 
 
 
@@ -40,8 +42,7 @@
     private SMTPSession setupMockedSession(final int rcptCount) {
         SMTPSession session = new AbstractSMTPSession() {
             HashMap state = new HashMap();
-            boolean processing = false;
-            
+
             public Map getState() {
                 return state;
             }
@@ -50,14 +51,6 @@
                 return false;
             }
             
-            public void setStopHandlerProcessing(boolean processing) {
-                this.processing = processing;
-            }
-            
-            public boolean getStopHandlerProcessing() {
-                return processing;
-            }
-            
             public int getRcptCount() {
                 return rcptCount;
             }
@@ -66,19 +59,19 @@
         return session;
     }
     
-    public void testRejectMaxRcpt() {
+    public void testRejectMaxRcpt() throws ParseException {
         SMTPSession session = setupMockedSession(3);
         MaxRcptHandler handler = new MaxRcptHandler();
     
         ContainerUtil.enableLogging(handler,new MockLogger());
     
-        handler.setAction("reject");
+        //handler.setAction("reject");
         handler.setMaxRcpt(2);
-        SMTPResponse response = handler.onCommand(session,"RCPT","<[EMAIL 
PROTECTED]>");
+        int resp = handler.doRcpt(session,null,new MailAddress("[EMAIL 
PROTECTED]"));
     
-        assertEquals("Rejected.. To many recipients", response.getRetCode(), 
"452");
+        assertEquals("Rejected.. To many recipients", resp, RcptHook.DENY);
     }
-    
+    /*
     public void testAddScoreMaxRcpt() {
         SMTPSession session = setupMockedSession(3);
         session.getState().put(JunkScore.JUNK_SCORE, new JunkScoreImpl());
@@ -95,18 +88,19 @@
         assertNull("Not Rejected.. we use junkScore action", response);
         assertEquals("Get Score", ((JunkScore) 
session.getState().get(JunkScore.JUNK_SCORE)).getStoredScore("MaxRcptCheck"),20.0,0d);
     }
+    */
     
-    public void testNotRejectMaxRcpt() {
+    public void testNotRejectMaxRcpt() throws ParseException {
         SMTPSession session = setupMockedSession(3);
         MaxRcptHandler handler = new MaxRcptHandler();
     
         ContainerUtil.enableLogging(handler,new MockLogger());
     
-        handler.setAction("reject");
+
         handler.setMaxRcpt(4);
-        SMTPResponse response = handler.onCommand(session,"RCPT","<[EMAIL 
PROTECTED]>");
-    
-        assertNull("Not Rejected..", response);
+        int resp = handler.doRcpt(session,null,new MailAddress("[EMAIL 
PROTECTED]"));
+        
+        assertEquals("Not Rejected..", resp, RcptHook.OK);
     }
 
 }



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

Reply via email to