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: [email protected]
For additional commands, e-mail: [email protected]