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]