Author: norman
Date: Thu May  6 13:09:09 2010
New Revision: 941711

URL: http://svn.apache.org/viewvc?rev=941711&view=rev
Log:
* Add some reusable SMTPProtocolHandlerChain
* If not MessageHook wrote a result back to the client, write back a Permanent 
Reject message
* Add Hook interface

Added:
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/Hook.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownHook.java
      - copied, changed from r940388, 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownCmdHook.java
Removed:
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownCmdHook.java
Modified:
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/UnknownCmdHandler.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/AuthHook.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/HeloHook.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailHook.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailParametersHook.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MessageHook.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/QuitHook.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/RcptHook.java

Added: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java?rev=941711&view=auto
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java
 (added)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java
 Thu May  6 13:09:09 2010
@@ -0,0 +1,154 @@
+/****************************************************************
+ * 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.protocols.smtp;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.james.protocols.api.AbstractProtocolHandlerChain;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.api.WiringException;
+import org.apache.james.protocols.smtp.core.DataCmdHandler;
+import org.apache.james.protocols.smtp.core.DataLineMessageHookHandler;
+import org.apache.james.protocols.smtp.core.ExpnCmdHandler;
+import org.apache.james.protocols.smtp.core.HeloCmdHandler;
+import org.apache.james.protocols.smtp.core.HelpCmdHandler;
+import org.apache.james.protocols.smtp.core.MailCmdHandler;
+import org.apache.james.protocols.smtp.core.NoopCmdHandler;
+import org.apache.james.protocols.smtp.core.PostmasterAbuseRcptHook;
+import org.apache.james.protocols.smtp.core.QuitCmdHandler;
+import org.apache.james.protocols.smtp.core.RcptCmdHandler;
+import org.apache.james.protocols.smtp.core.ReceivedDataLineFilter;
+import org.apache.james.protocols.smtp.core.RsetCmdHandler;
+import org.apache.james.protocols.smtp.core.SMTPCommandDispatcherLineHandler;
+import org.apache.james.protocols.smtp.core.VrfyCmdHandler;
+import org.apache.james.protocols.smtp.core.WelcomeMessageHandler;
+import org.apache.james.protocols.smtp.core.esmtp.EhloCmdHandler;
+import org.apache.james.protocols.smtp.core.esmtp.MailSizeEsmtpExtension;
+import org.apache.james.protocols.smtp.hook.Hook;
+import org.apache.james.protocols.smtp.hook.MessageHook;
+
+/**
+ * This {...@link ProtocolHandlerChain} implementation add all needed handlers 
to
+ * the chain to act as full blown SMTPServer. By default messages will just get
+ * rejected after the DATA command.
+ * 
+ * If you want to accept the messagejust add a {...@link MessageHook}
+ * implementation to the chain and handle the queuing
+ * 
+ * 
+ * 
+ */
+public class SMTPProtocolHandlerChain extends AbstractProtocolHandlerChain {
+    private final List<Object> defaultHandlers = new ArrayList<Object>();
+    private final List<Hook> hooks = new ArrayList<Hook>();
+    private final List<Object> handlers = new ArrayList<Object>();
+
+    public SMTPProtocolHandlerChain() throws WiringException {
+        defaultHandlers.add(new SMTPCommandDispatcherLineHandler());
+        defaultHandlers.add(new ExpnCmdHandler());
+        defaultHandlers.add(new EhloCmdHandler());
+        defaultHandlers.add(new HeloCmdHandler());
+        defaultHandlers.add(new HelpCmdHandler());
+        defaultHandlers.add(new MailCmdHandler());
+        defaultHandlers.add(new NoopCmdHandler());
+        defaultHandlers.add(new QuitCmdHandler());
+        defaultHandlers.add(new RcptCmdHandler());
+        defaultHandlers.add(new RsetCmdHandler());
+        defaultHandlers.add(new VrfyCmdHandler());
+        defaultHandlers.add(new DataCmdHandler());
+        defaultHandlers.add(new MailSizeEsmtpExtension());
+        defaultHandlers.add(new WelcomeMessageHandler());
+        defaultHandlers.add(new PostmasterAbuseRcptHook());
+        defaultHandlers.add(new ReceivedDataLineFilter());
+        defaultHandlers.add(new DataLineMessageHookHandler());
+        copy();
+        wireExtensibleHandlers();
+    }
+
+    /**
+     * Add the hook to the chain
+     * 
+     * @param hook
+     * @throws WiringException
+     */
+    public final synchronized void addHook(Hook hook) throws WiringException {
+        addHook(hooks.size(), hook);
+    }
+
+    /**
+     * Add the hook to the chain on the given index
+     * 
+     * @param index
+     * @param hook
+     * @throws WiringException
+     */
+    public final synchronized void addHook(int index, Hook hook) throws 
WiringException {
+        hooks.add(index, hook);
+        copy();
+        wireExtensibleHandlers();
+
+    }
+
+    /**
+     * Remove the Hook found on the given index from the chain
+     * 
+     * @param index
+     * @return hook
+     * @throws WiringException
+     */
+    public final synchronized Hook removeHook(int index) throws 
WiringException {
+        Hook hook = hooks.remove(index);
+        handlers.remove(hook);
+        wireExtensibleHandlers();
+        return hook;
+
+    }
+
+    /**
+     * Return the index of the given hook
+     * 
+     * @param hook
+     * @return index
+     */
+    public synchronized int getIndexOfHook(Hook hook) {
+        return hooks.indexOf(hook);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * 
org.apache.james.protocols.api.AbstractProtocolHandlerChain#getHandlers()
+     */
+    @Override
+    protected synchronized List<Object> getHandlers() {
+        return Collections.unmodifiableList(handlers);
+    }
+
+    /**
+     * Copy the lists
+     */
+    private void copy() {
+        handlers.clear();
+        handlers.addAll(defaultHandlers);
+        handlers.addAll(hooks);
+    }
+}

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java?rev=941711&r1=941710&r2=941711&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java
 Thu May  6 13:09:09 2010
@@ -36,8 +36,14 @@ import org.apache.james.protocols.smtp.S
 import org.apache.james.protocols.smtp.dsn.DSNStatus;
 import org.apache.james.protocols.smtp.hook.HookResult;
 import org.apache.james.protocols.smtp.hook.HookResultHook;
+import org.apache.james.protocols.smtp.hook.HookReturnCode;
 import org.apache.james.protocols.smtp.hook.MessageHook;
 
+/**
+ * This class handles the actual calling of the {...@link MessageHook} 
implementations to queue the message. If no {...@link MessageHook} return OK or 
DECLINED it will write back an
+ * error to the client to report the problem while trying to queue the message 
+ *
+ */
 public final class DataLineMessageHookHandler implements DataLineFilter, 
ExtensibleHandler {
 
     
@@ -91,6 +97,7 @@ public final class DataLineMessageHookHa
      * @param session
      */
     private void processExtensions(SMTPSession session, MailEnvelopeImpl mail) 
{
+        boolean match = false;
         if(mail != null && messageHandlers != null) {
             try {
                 int count = messageHandlers.size();
@@ -112,9 +119,16 @@ public final class DataLineMessageHookHa
                     //if the response is received, stop processing of command 
handlers
                     if(response != null) {
                         session.writeResponse(response);
+                        match = true;
                         break;
                     }
                 }
+                if (match == false) {
+                    // Not queue the message!
+                    SMTPResponse response = 
AbstractHookableCmdHandler.calcDefaultSMTPResponse(new 
HookResult(HookReturnCode.DENY));
+                    session.writeResponse(response);
+                    
+                }
             } finally {
                
                 //do the clean up

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/UnknownCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/UnknownCmdHandler.java?rev=941711&r1=941710&r2=941711&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/UnknownCmdHandler.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/UnknownCmdHandler.java
 Thu May  6 13:09:09 2010
@@ -29,12 +29,12 @@ import org.apache.james.protocols.smtp.S
 import org.apache.james.protocols.smtp.SMTPSession;
 import org.apache.james.protocols.smtp.dsn.DSNStatus;
 import org.apache.james.protocols.smtp.hook.HookResult;
-import org.apache.james.protocols.smtp.hook.UnknownCmdHook;
+import org.apache.james.protocols.smtp.hook.UnknownHook;
 
 /**
   * Default command handler for handling unknown commands
   */
-public class UnknownCmdHandler extends 
AbstractHookableCmdHandler<UnknownCmdHook>{
+public class UnknownCmdHandler extends AbstractHookableCmdHandler<UnknownHook>{
 
     /**
      * The name of the command handled by the command handler
@@ -70,13 +70,13 @@ public class UnknownCmdHandler extends A
        }
 
        @Override
-       protected HookResult callHook(UnknownCmdHook rawHook, SMTPSession 
session,
+       protected HookResult callHook(UnknownHook rawHook, SMTPSession session,
                        String parameters) {
                return rawHook.doUnkown(session, 
(String)session.getState().get("CURR_COMMAND"));
        }
 
        @Override
-       protected Class<UnknownCmdHook> getHookInterface() {
-               return UnknownCmdHook.class;
+       protected Class<UnknownHook> getHookInterface() {
+               return UnknownHook.class;
        }
 }

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/AuthHook.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/AuthHook.java?rev=941711&r1=941710&r2=941711&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/AuthHook.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/AuthHook.java
 Thu May  6 13:09:09 2010
@@ -23,7 +23,7 @@ import org.apache.james.protocols.smtp.S
 /**
  * Implement this interfaces to hook in the AUTH Command
  */
-public interface AuthHook {
+public interface AuthHook extends Hook{
 
     /**
      * Return the HookResult after run the hook

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/HeloHook.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/HeloHook.java?rev=941711&r1=941710&r2=941711&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/HeloHook.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/HeloHook.java
 Thu May  6 13:09:09 2010
@@ -28,7 +28,7 @@ import org.apache.james.protocols.smtp.S
  * Implement this interfaces to hook in the HELO Command
  * 
  */
-public interface HeloHook {
+public interface HeloHook extends Hook{
 
     /**
      * Return the HookResult after run the hook

Added: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/Hook.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/Hook.java?rev=941711&view=auto
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/Hook.java
 (added)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/Hook.java
 Thu May  6 13:09:09 2010
@@ -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.protocols.smtp.hook;
+
+/**
+ * Just and marker interface for the different Hooks
+ * 
+ *
+ */
+public interface Hook {
+
+}

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailHook.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailHook.java?rev=941711&r1=941710&r2=941711&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailHook.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailHook.java
 Thu May  6 13:09:09 2010
@@ -30,7 +30,7 @@ import org.apache.mailet.MailAddress;
  * Implement this interfaces to hook in the MAIL Command
  * 
  */
-public interface MailHook {
+public interface MailHook extends Hook{
 
     /**
      * Return the HookResult after run the hook

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailParametersHook.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailParametersHook.java?rev=941711&r1=941710&r2=941711&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailParametersHook.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailParametersHook.java
 Thu May  6 13:09:09 2010
@@ -24,7 +24,7 @@ import org.apache.james.protocols.smtp.S
  * Implement this interfaces to hook in the MAIL Command
  * 
  */
-public interface MailParametersHook {
+public interface MailParametersHook extends Hook{
 
     /**
      * Return the HookResult after run the hook

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MessageHook.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MessageHook.java?rev=941711&r1=941710&r2=941711&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MessageHook.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MessageHook.java
 Thu May  6 13:09:09 2010
@@ -26,7 +26,7 @@ import org.apache.james.protocols.smtp.S
  * be server-wide common to all the SMTPHandlers, therefore the handlers must
  * store all the state information in the SMTPSession object
  */
-public interface MessageHook {
+public interface MessageHook extends Hook{
        /**
         * Handle Message
         */

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/QuitHook.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/QuitHook.java?rev=941711&r1=941710&r2=941711&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/QuitHook.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/QuitHook.java
 Thu May  6 13:09:09 2010
@@ -28,7 +28,7 @@ import org.apache.james.protocols.smtp.S
  * Implement this interfaces to hook in the MAIL Command
  * 
  */
-public interface QuitHook {
+public interface QuitHook extends Hook{
 
     /**
      * Return the HookResult after run the hook

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/RcptHook.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/RcptHook.java?rev=941711&r1=941710&r2=941711&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/RcptHook.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/RcptHook.java
 Thu May  6 13:09:09 2010
@@ -24,7 +24,7 @@ import org.apache.mailet.MailAddress;
 /**
  * Implement this interfaces to hook in the MAIL Command
  */
-public interface RcptHook {
+public interface RcptHook extends Hook{
     
     /**
      * Return the HookResult after run the hook

Copied: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownHook.java
 (from r940388, 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownCmdHook.java)
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownHook.java?p2=james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownHook.java&p1=james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownCmdHook.java&r1=940388&r2=941711&rev=941711&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownCmdHook.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownHook.java
 Thu May  6 13:09:09 2010
@@ -25,7 +25,7 @@ import org.apache.james.protocols.smtp.S
  * 
  *
  */
-public interface UnknownCmdHook {
+public interface UnknownHook extends Hook{
 
        /**
         * Called on unknown smtp command



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

Reply via email to