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