You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by jo...@apache.org on 2006/11/17 15:32:35 UTC
svn commit: r476151 [2/2] - in /james/server/sandbox/mailbox-namespaces: ./
phoenix-bin/bin/ src/conf/ src/java/org/apache/james/
src/java/org/apache/james/core/ src/java/org/apache/james/dnsserver/
src/java/org/apache/james/imapserver/ src/java/org/ap...
Modified: james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/smtpserver/core/filter/fastfail/ReverseEqualsEhloHeloHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/smtpserver/core/filter/fastfail/ReverseEqualsEhloHeloHandler.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/smtpserver/core/filter/fastfail/ReverseEqualsEhloHeloHandler.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/smtpserver/core/filter/fastfail/ReverseEqualsEhloHeloHandler.java Fri Nov 17 06:32:31 2006
@@ -19,101 +19,14 @@
package org.apache.james.smtpserver.core.filter.fastfail;
-import org.apache.avalon.framework.configuration.Configurable;
-import org.apache.avalon.framework.configuration.Configuration;
-import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.avalon.framework.logger.AbstractLogEnabled;
-import org.apache.avalon.framework.service.ServiceException;
-import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.avalon.framework.service.Serviceable;
-import org.apache.james.services.DNSServer;
-import org.apache.james.smtpserver.CommandHandler;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
-import org.apache.mailet.MailAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Collection;
-
-public class ReverseEqualsEhloHeloHandler extends AbstractLogEnabled implements
- CommandHandler, Configurable, Serviceable {
-
- public final static String BAD_EHLO_HELO = "BAD_EHLO_HELO";
-
- private boolean checkAuthNetworks = false;
-
- private boolean checkAuthUsers = false;
-
- private DNSServer dnsServer = null;
-
- /**
- * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
- */
- public void configure(Configuration handlerConfiguration)
- throws ConfigurationException {
- Configuration configRelay = handlerConfiguration.getChild(
- "checkAuthNetworks", false);
- if (configRelay != null) {
- setCheckAuthNetworks(configRelay.getValueAsBoolean(false));
- }
-
- Configuration configAuthUser = handlerConfiguration.getChild(
- "checkAuthUsers", false);
- if (configAuthUser != null) {
- setCheckAuthUsers(configAuthUser.getValueAsBoolean(false));
- }
- }
- /**
- * @see org.apache.avalon.framework.service.Serviceable#service(ServiceManager)
- */
- public void service(ServiceManager serviceMan) throws ServiceException {
- setDnsServer((DNSServer) serviceMan.lookup(DNSServer.ROLE));
- }
-
- /**
- * Set to true if AuthNetworks should be included in the EHLO check
- *
- * @param checkAuthNetworks
- * Set to true to enable
- */
- public void setCheckAuthNetworks(boolean checkAuthNetworks) {
- this.checkAuthNetworks = checkAuthNetworks;
- }
-
- /**
- * Set to true if Auth users should be included in the EHLO/HELO check
- *
- * @param checkAuthUsers
- * Set to true to enable
- */
- public void setCheckAuthUsers(boolean checkAuthUsers) {
- this.checkAuthUsers = checkAuthUsers;
- }
+import java.net.UnknownHostException;
- /**
- * Set the DNSServer
- *
- * @param dnsServer
- * The DNSServer
- */
- public void setDnsServer(DNSServer dnsServer) {
- this.dnsServer = dnsServer;
- }
- /**
- * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
- */
- public void onCommand(SMTPSession session) {
- String argument = session.getCommandArgument();
- String command = session.getCommandName();
- if (command.equals("HELO") || command.equals("EHLO")) {
- checkEhloHelo(session, argument);
- } else if (command.equals("RCPT")) {
- reject(session, argument);
- }
- }
+public class ReverseEqualsEhloHeloHandler extends ResolvableEhloHeloHandler {
/**
* Method which get called on HELO/EHLO
@@ -121,7 +34,7 @@
* @param session The SMTPSession
* @param argument The argument
*/
- private void checkEhloHelo(SMTPSession session, String argument) {
+ protected void checkEhloHelo(SMTPSession session, String argument) {
/**
* don't check if the ip address is allowed to relay. Only check if it
* is set in the config. ed.
@@ -144,49 +57,38 @@
session.getState().put(BAD_EHLO_HELO, "true");
}
}
-
+
/**
- * Method which get called on RCPT
- *
- * @param session The SMTPSession
- * @param argument The argument
+ * @see org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#getJunkScoreLogString(org.apache.james.smtpserver.SMTPSession)
*/
- private void reject(SMTPSession session, String argument) {
- MailAddress rcpt = (MailAddress) session.getState().get(
- SMTPSession.CURRENT_RECIPIENT);
-
- // not reject it
- if (session.getState().get(BAD_EHLO_HELO) == null
- || rcpt.getUser().equalsIgnoreCase("postmaster")
- || rcpt.getUser().equalsIgnoreCase("abuse"))
- return;
-
- // Check if the client was authenticated
- if (!(session.isAuthRequired() && session.getUser() != null && !checkAuthUsers)) {
- String responseString = "501 "
- + DSNStatus.getStatus(DSNStatus.PERMANENT,
- DSNStatus.DELIVERY_INVALID_ARG) + " Provided EHLO "
- + session.getState().get(SMTPSession.CURRENT_HELO_NAME) + " not equal reverse of "
- + session.getRemoteIPAddress();
-
- session.writeResponse(responseString);
- getLogger().info(responseString);
-
- // After this filter match we should not call any other handler!
- session.setStopHandlerProcessing(true);
- }
+ protected String getJunkScoreLogString(SMTPSession session) {
+ return "Provided EHLO/HELO " + session.getState().get(SMTPSession.CURRENT_HELO_NAME) + " not equal reverse of "
+ + session.getRemoteIPAddress() + ". Add junkScore: " + getScore();
}
/**
- * @see org.apache.james.smtpserver.CommandHandler#getImplCommands()
+ * @see org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#getRejectLogString(org.apache.james.smtpserver.SMTPSession)
*/
- public Collection getImplCommands() {
- Collection implCommands = new ArrayList();
- implCommands.add("EHLO");
- implCommands.add("HELO");
- implCommands.add("RCPT");
+ protected String getRejectLogString(SMTPSession session) {
+ return getResponseString(session);
+ }
- return implCommands;
+ /**
+ * @see org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#getResponseString(org.apache.james.smtpserver.SMTPSession)
+ */
+ protected String getResponseString(SMTPSession session) {
+ String responseString = "501 "
+ + DSNStatus.getStatus(DSNStatus.PERMANENT,
+ DSNStatus.DELIVERY_INVALID_ARG)
+ + " Provided EHLO/HELO " + session.getState().get(SMTPSession.CURRENT_HELO_NAME) + " not equal reverse of "
+ + session.getRemoteIPAddress();
+ return responseString;
}
+ /**
+ * @see org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#getScoreName()
+ */
+ protected String getScoreName() {
+ return "ReverseEqualsEhloHeloCheck";
+ }
}
Modified: james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidSenderDomainHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidSenderDomainHandler.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidSenderDomainHandler.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidSenderDomainHandler.java Fri Nov 17 06:32:31 2006
@@ -27,23 +27,24 @@
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.james.services.DNSServer;
import org.apache.james.smtpserver.CommandHandler;
import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.util.junkscore.JunkScore;
import org.apache.james.util.mail.dsn.DSNStatus;
import org.apache.mailet.MailAddress;
public class ValidSenderDomainHandler
- extends AbstractLogEnabled
+ extends AbstractJunkHandler
implements CommandHandler, Configurable, Serviceable {
private boolean checkAuthClients = false;
private DNSServer dnsServer = null;
+
/**
* @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
@@ -54,6 +55,8 @@
if(configRelay != null) {
setCheckAuthClients(configRelay.getValueAsBoolean(false));
}
+
+ super.configure(handlerConfiguration);
}
/**
@@ -81,38 +84,36 @@
this.checkAuthClients = checkAuthClients;
}
-
/**
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
*/
public void onCommand(SMTPSession session) {
-
- String responseString = null;
+ doProcessing(session);
+ }
+
+ /**
+ * @see org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#check(org.apache.james.smtpserver.SMTPSession)
+ */
+ protected boolean check(SMTPSession session) {
MailAddress senderAddress = (MailAddress) session.getState().get(SMTPSession.SENDER);
-
+
// null sender so return
- if (senderAddress == null) return;
-
+ if (senderAddress == null) return false;
+
/**
* don't check if the ip address is allowed to relay. Only check if it is set in the config.
*/
if (checkAuthClients || !session.isRelayingAllowed()) {
-
- // Maybe we should build a static method in org.apache.james.dnsserver.DNSServer ?
Collection records;
-
+
// try to resolv the provided domain in the senderaddress. If it can not resolved do not accept it.
records = dnsServer.findMXRecords(senderAddress.getHost());
if (records == null || records.size() == 0) {
- responseString = "501 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_SYNTAX_SENDER)+ " sender " + senderAddress + " contains a domain with no valid MX records";
- session.writeResponse(responseString);
- getLogger().info(responseString);
-
- // After this filter match we should not call any other handler!
- session.setStopHandlerProcessing(true);
+ return true;
}
}
+ return false;
}
/**
@@ -123,5 +124,37 @@
implCommands.add("MAIL");
return implCommands;
+ }
+
+ /**
+ * @see org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#getJunkScoreLogString(org.apache.james.smtpserver.SMTPSession)
+ */
+ protected String getJunkScoreLogString(SMTPSession session) {
+ MailAddress senderAddress = (MailAddress) session.getState().get(SMTPSession.SENDER);
+ String response = "Sender " + senderAddress + " contains a domain with no valid MX records. Add Junkscore: " + getScore();
+ return response;
+ }
+
+ /**
+ * @see org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#getRejectLogString(org.apache.james.smtpserver.SMTPSession)
+ */
+ protected String getRejectLogString(SMTPSession session) {
+ return getResponseString(session);
+ }
+
+ /**
+ * @see org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#getResponseString(org.apache.james.smtpserver.SMTPSession)
+ */
+ protected String getResponseString(SMTPSession session) {
+ MailAddress senderAddress = (MailAddress) session.getState().get(SMTPSession.SENDER);
+ String response = "501 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_SYNTAX_SENDER)+ " sender " + senderAddress + " contains a domain with no valid MX records";
+ return response;
+ }
+
+ /**
+ * @see org.apache.james.smtpserver.core.filter.fastfail.AbstractJunkHandler#getScoreName()
+ */
+ protected String getScoreName() {
+ return "ValidSenderDomainCheck";
}
}
Modified: james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/AbstractRedirect.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/AbstractRedirect.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/AbstractRedirect.java Fri Nov 17 06:32:31 2006
@@ -44,6 +44,7 @@
import org.apache.mailet.RFC2822Headers;
import org.apache.mailet.dates.RFC822DateFormat;
+import org.apache.james.Constants;
import org.apache.james.core.MailImpl;
import org.apache.james.core.MimeMessageUtil;
@@ -982,14 +983,9 @@
// We don't need to use the original Remote Address and Host,
// and doing so would likely cause a loop with spam detecting
// matchers.
- try {
- newMail.setRemoteAddr(java.net.InetAddress.getLocalHost().getHostAddress());
- newMail.setRemoteHost(java.net.InetAddress.getLocalHost().getHostName());
- } catch (java.net.UnknownHostException _) {
- newMail.setRemoteAddr("127.0.0.1");
- newMail.setRemoteHost("localhost");
- }
-
+ newMail.setRemoteAddr(getMailetContext().getAttribute(Constants.HOSTADDRESS).toString());
+ newMail.setRemoteHost(getMailetContext().getAttribute(Constants.HOSTNAME).toString());
+
if (isDebug) {
log("New mail - sender: " + newMail.getSender()
+ ", recipients: " + arrayToString(newMail.getRecipients().toArray())
Modified: james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java Fri Nov 17 06:32:31 2006
@@ -21,6 +21,7 @@
package org.apache.james.transport.mailets;
+import org.apache.james.Constants;
import org.apache.james.core.MailImpl;
import org.apache.james.util.VirtualUserTableUtil;
import org.apache.mailet.GenericMailet;
@@ -164,13 +165,9 @@
// duplicates the Mail object, to be able to modify the new mail keeping the original untouched
MailImpl newMail = new MailImpl(mail);
try {
- try {
- newMail.setRemoteAddr(java.net.InetAddress.getLocalHost().getHostAddress());
- newMail.setRemoteHost(java.net.InetAddress.getLocalHost().getHostName());
- } catch (java.net.UnknownHostException _) {
- newMail.setRemoteAddr("127.0.0.1");
- newMail.setRemoteHost("localhost");
- }
+ newMail.setRemoteAddr(getMailetContext().getAttribute(Constants.HOSTADDRESS).toString());
+ newMail.setRemoteHost(getMailetContext().getAttribute(Constants.HOSTNAME).toString());
+
newMail.setRecipients(recipientsToAddForward);
newMail.setAttribute(MARKER, Boolean.TRUE);
getMailetContext().sendMail(newMail);
Modified: james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/DSNBounce.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/DSNBounce.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/DSNBounce.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/DSNBounce.java Fri Nov 17 06:32:31 2006
@@ -152,14 +152,9 @@
// We don't need to use the original Remote Address and Host,
// and doing so would likely cause a loop with spam detecting
// matchers.
- try {
- newMail.setRemoteAddr(java.net.InetAddress.getLocalHost().getHostAddress());
- newMail.setRemoteHost(java.net.InetAddress.getLocalHost().getHostName());
- } catch (java.net.UnknownHostException _) {
- newMail.setRemoteAddr("127.0.0.1");
- newMail.setRemoteHost("localhost");
- }
-
+ newMail.setRemoteAddr(getMailetContext().getAttribute(Constants.HOSTADDRESS).toString());
+ newMail.setRemoteHost(getMailetContext().getAttribute(Constants.HOSTNAME).toString());
+
if (originalMail.getSender() == null) {
if (isDebug)
log("Processing a bounce request for a message with an empty reverse-path. No bounce will be sent.");
Modified: james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/RemoteDelivery.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/RemoteDelivery.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/RemoteDelivery.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/transport/mailets/RemoteDelivery.java Fri Nov 17 06:32:31 2006
@@ -860,8 +860,8 @@
PrintWriter out = new PrintWriter(sout, true);
String machine = "[unknown]";
try {
- InetAddress me = InetAddress.getLocalHost();
- machine = me.getHostName();
+ machine = getMailetContext().getAttribute(Constants.HOSTNAME).toString();
+
} catch(Exception e){
machine = "[address unknown]";
}
Modified: james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/util/connection/ServerConnection.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/util/connection/ServerConnection.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/util/connection/ServerConnection.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/util/connection/ServerConnection.java Fri Nov 17 06:32:31 2006
@@ -27,7 +27,6 @@
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.Iterator;
import org.apache.avalon.cornerstone.services.connection.ConnectionHandler;
@@ -107,17 +106,15 @@
* connection will allow.
*/
private int maxOpenConnPerIP;
+
+ private ConnectionPerIpMap connPerIpMap;
/**
* A collection of client connection runners.
*/
private final ArrayList clientConnectionRunners = new ArrayList();
- /**
- * A HashMap of clientip and connections
- */
- private final HashMap connectionPerIP = new HashMap();
-
+
/**
* The thread used to manage this server connection.
*/
@@ -154,6 +151,7 @@
*/
public void initialize() throws Exception {
runnerPool = new HardResourceLimitingPool(theRunnerFactory, 5, maxOpenConn);
+ connPerIpMap = new ConnectionPerIpMap();
ContainerUtil.enableLogging(runnerPool,getLogger());
ContainerUtil.initialize(runnerPool);
}
@@ -212,7 +210,7 @@
runner = null;
}
clientConnectionRunners.clear();
- clearConnectionPerIP();
+ connPerIpMap.clearConnectionPerIP();
}
@@ -267,57 +265,7 @@
synchronized (this) { notify(); } // match the wait(...) in the run() inner loop before accept().
}
- /**
- * Raise the connectionCount for the given ipAdrress
- * @param ip raise the connectionCount for the given ipAddress
- */
- private synchronized void addConnectionPerIP (String ip) {
- connectionPerIP.put(ip,Integer.toString(getConnectionPerIP(ip) +1));
- }
-
- /**
- * Get the count of connections for the given ip
- * @param ip the ipAddress to get the connections for.
- * @return count
- */
- private synchronized int getConnectionPerIP(String ip) {
- int count = 0;
- String curCount = null;
- Object c = connectionPerIP.get(ip);
-
- if (c != null) {
- curCount = c.toString();
-
- if (curCount != null) {
- return Integer.parseInt(curCount);
- }
- }
- return count;
- }
-
- /**
- * Set the connection count for the given ipAddress
- * @param ip ipAddres for which we want to set the count
- */
- private synchronized void removeConnectionPerIP (String ip) {
-
- int count = getConnectionPerIP(ip);
- if (count > 1) {
- connectionPerIP.put(ip,Integer.toString(count -1));
- } else {
- // not need this entry any more
- connectionPerIP.remove(ip);
- }
- }
-
- /**
- * Clear the connection count map
- */
- private synchronized void clearConnectionPerIP () {
- connectionPerIP.clear();
- }
-
/**
* Provides the body for the thread of execution for a ServerConnection.
* Connections made to the server socket are passed to an appropriate,
@@ -388,9 +336,9 @@
// We ignore this exception, as we already have an error condition.
}
continue;
- } else if ((maxOpenConnPerIP > 0) && (getConnectionPerIP(clientSocket.getInetAddress().getHostAddress()) >= maxOpenConnPerIP)) {
+ } else if ((maxOpenConnPerIP > 0) && (connPerIpMap.getConnectionPerIP(clientSocket.getInetAddress().getHostAddress()) >= maxOpenConnPerIP)) {
if (getLogger().isWarnEnabled()) {
- getLogger().warn("Maximum number of open connections per IP exceeded - refusing connection. Current number of connections for " + clientSocket.getInetAddress().getHostAddress() + " is " + getConnectionPerIP(clientSocket.getInetAddress().getHostAddress()));
+ getLogger().warn("Maximum number of open connections per IP exceeded - refusing connection. Current number of connections for " + clientSocket.getInetAddress().getHostAddress() + " is " + connPerIpMap.getConnectionPerIP(clientSocket.getInetAddress().getHostAddress()));
}
try {
clientSocket.close();
@@ -400,7 +348,7 @@
continue;
} else {
- addConnectionPerIP(clientSocket.getInetAddress().getHostAddress());
+ connPerIpMap.addConnectionPerIP(clientSocket.getInetAddress().getHostAddress());
clientSocket.setSoTimeout(socketTimeout);
runner = addClientConnectionRunner();
runner.setSocket(clientSocket);
@@ -417,7 +365,7 @@
getLogger().error("Internal error - insufficient threads available to service request. " +
Thread.activeCount() + " threads in service request pool.", e);
try {
- removeConnectionPerIP(clientSocket.getInetAddress().getHostAddress());
+ connPerIpMap.removeConnectionPerIP(clientSocket.getInetAddress().getHostAddress());
clientSocket.close();
} catch (IOException ignored) {
// We ignore this exception, as we already have an error condition.
@@ -529,7 +477,7 @@
} finally {
// remove this connection from map!
- removeConnectionPerIP(clientSocket.getInetAddress().getHostAddress());
+ connPerIpMap.removeConnectionPerIP(clientSocket.getInetAddress().getHostAddress());
// Close the underlying socket
try {
Modified: james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/util/connection/SimpleConnectionManager.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/util/connection/SimpleConnectionManager.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/util/connection/SimpleConnectionManager.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/java/org/apache/james/util/connection/SimpleConnectionManager.java Fri Nov 17 06:32:31 2006
@@ -136,6 +136,8 @@
public void service(ServiceManager componentManager) throws ServiceException {
setThreadManager((ThreadManager)componentManager.lookup(ThreadManager.ROLE));
}
+
+
/**
* Disconnects all the underlying ServerConnections
*/
@@ -159,6 +161,8 @@
getLogger().debug("Finishing SimpleConnectionManager dispose...");
}
}
+
+
/**
* Start managing a connection.
* Management involves accepting connections and farming them out to threads
@@ -169,6 +173,7 @@
* @param handlerFactory the factory from which to acquire handlers
* @param threadPool the thread pool to use
* @param maxOpenConnections the maximum number of open connections allowed for this server socket.
+ * @param maxOpenConnectionsPerIP the maximum number of open connections per IP allowed for this server socket.
* @exception Exception if an error occurs
*/
public void connect(
@@ -176,7 +181,8 @@
ServerSocket socket,
ConnectionHandlerFactory handlerFactory,
ThreadPool threadPool,
- int maxOpenConnections)
+ int maxOpenConnections,
+ int maxOpenConnectionsPerIP)
throws Exception {
if (disposed) {
throw new IllegalStateException("Connection manager has already been shutdown.");
@@ -187,16 +193,18 @@
if (maxOpenConnections < 0) {
throw new IllegalArgumentException("The maximum number of client connections per server socket cannot be less that zero.");
}
- if (maxOpenConnPerIP < 0) {
+ if (maxOpenConnectionsPerIP < 0) {
throw new IllegalArgumentException("The maximum number of client connections (per IP) per server socket cannot be less that zero.");
}
ServerConnection runner =
- new ServerConnection(socket, handlerFactory, threadPool, timeout, maxOpenConnections, maxOpenConnPerIP);
+ new ServerConnection(socket, handlerFactory, threadPool, timeout, maxOpenConnections, maxOpenConnectionsPerIP);
setupLogger(runner);
ContainerUtil.initialize(runner);
connectionMap.put(name, runner);
threadPool.execute(runner);
}
+
+
/**
* Start managing a connection.
* Management involves accepting connections and farming them out to threads
@@ -214,8 +222,10 @@
ConnectionHandlerFactory handlerFactory,
ThreadPool threadPool)
throws Exception {
- connect(name, socket, handlerFactory, threadPool, maxOpenConn);
+ connect(name, socket, handlerFactory, threadPool, maxOpenConn, maxOpenConnPerIP);
}
+
+
/**
* Start managing a connection.
* This is similar to other connect method except that it uses default thread pool.
@@ -229,6 +239,8 @@
throws Exception {
connect(name, socket, handlerFactory, threadManager.getDefaultThreadPool());
}
+
+
/**
* Start managing a connection.
* This is similar to other connect method except that it uses default thread pool.
@@ -247,6 +259,8 @@
throws Exception {
connect(name, socket, handlerFactory, threadManager.getDefaultThreadPool(), maxOpenConnections);
}
+
+
/**
* This shuts down all handlers and socket, waiting for each to gracefully shutdown.
*
@@ -256,6 +270,8 @@
public void disconnect(final String name) throws Exception {
disconnect(name, false);
}
+
+
/**
* This shuts down a connection.
* If tearDown is true then it will forcefully the connection and try
@@ -274,6 +290,24 @@
// TODO: deal with tear down parameter
connection.dispose();
}
+
+
+ /**
+ * @see org.apache.james.services.JamesConnectionManager#connect(java.lang.String, java.net.ServerSocket, org.apache.avalon.cornerstone.services.connection.ConnectionHandlerFactory, org.apache.excalibur.thread.ThreadPool, int)
+ */
+ public void connect(String name, ServerSocket socket, ConnectionHandlerFactory handlerFactory, ThreadPool threadPool, int maxOpenConnections) throws Exception {
+ connect(name,socket,handlerFactory,threadPool,maxOpenConnections,maxOpenConnPerIP);
+ }
+
+
+ /**
+ * @see org.apache.james.services.JamesConnectionManager#connect(java.lang.String, java.net.ServerSocket, org.apache.avalon.cornerstone.services.connection.ConnectionHandlerFactory, int, int)
+ */
+ public void connect(String name, ServerSocket socket, ConnectionHandlerFactory handlerFactory, int maxOpenConnections,int maxOpenConnectionsPerIP) throws Exception {
+ connect(name,socket,handlerFactory,threadManager.getDefaultThreadPool(),maxOpenConnections,maxOpenConnectionsPerIP);
+ }
+
+
/**
* Returns the default maximum number of open connections supported by this
* SimpleConnectionManager
@@ -284,15 +318,12 @@
return maxOpenConn;
}
+
/**
- * Returns the default maximum number of open connections per IP supported by this
- * SimpleConnectionManager
- *
- * @return the maximum number of connections
+ * @see org.apache.james.services.JamesConnectionManager#getMaximumNumberOfOpenConnectionsPerIP()
*/
public int getMaximumNumberOfOpenConnectionsPerIP() {
return maxOpenConnPerIP;
}
-
}
Modified: james/server/sandbox/mailbox-namespaces/src/site/xdoc/changelog.xml
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/site/xdoc/changelog.xml?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/site/xdoc/changelog.xml (original)
+++ james/server/sandbox/mailbox-namespaces/src/site/xdoc/changelog.xml Fri Nov 17 06:32:31 2006
@@ -28,6 +28,40 @@
<p>This document records what was done between releases. As always, thank you to everyone who contributed code, documentation, bug reports, and feedback.
</p>
+
+<section name="Version 2.3.0 Final">
+<p>Released 23 October 2006</p>
+</section>
+
+<section name="Version 2.3.0rc5">
+<p>Released 12 October 2006</p>
+<p>Detail</p>
+<subsection name="Bug"></subsection>
+<ul>
+<li>[<a href='http://issues.apache.org/jira/browse/JAMES-625'>JAMES-625</a>] - an empty mbox will cause an error at pop3 login</li>
+<li>[<a href='http://issues.apache.org/jira/browse/JAMES-644'>JAMES-644</a>] - FileRegexMatcher possibly leaks minor memory on startup</li>
+<li>[<a href='http://issues.apache.org/jira/browse/JAMES-649'>JAMES-649</a>] - error "OutOfMemoryError: JAVA HEAP SPACE" in connections log file when doing a POP TOP for 4000 messages</li>
+<li>[<a href='http://issues.apache.org/jira/browse/JAMES-655'>JAMES-655</a>] - MboxMailRepository throws NPE when storing mail with mail from: <></li>
+</ul>
+</section>
+
+<section name="Version 2.3.0rc4">
+<p>Released 2 October 2006</p>
+<p>Detail</p>
+<subsection name="Bug"></subsection>
+<ul>
+<li>[<a href='http://issues.apache.org/jira/browse/JAMES-626'>JAMES-626</a>] - Invalid (outdated) urls in config files.</li>
+<li>[<a href='http://issues.apache.org/jira/browse/JAMES-631'>JAMES-631</a>] - Default host configuration for InSpammerBlacklist is relative: it should contain a trailing "." or it will reject all mail when the default domain has an "*" IN A rule.</li>
+<li>[<a href='http://issues.apache.org/jira/browse/JAMES-638'>JAMES-638</a>] - Wrong default encoding in text message (Autoconverted: from 8bit to quoted-printable)</li>
+<li>[<a href='http://issues.apache.org/jira/browse/JAMES-639'>JAMES-639</a>] - SerialUID is not hardcoded</li>
+</ul>
+<subsection name="Task"></subsection>
+<ul>
+<li>[<a href='http://issues.apache.org/jira/browse/JAMES-618'>JAMES-618</a>] - Move server-site documents from james/server repository to james/site/server repository</li>
+<li>[<a href='http://issues.apache.org/jira/browse/JAMES-634'>JAMES-634</a>] - Fix m2 projects to not lookup dependencies on ibiblio, to simplify the website build and to include 2.2.0 and 2.3.0 docs</li>
+</ul>
+</section>
+
<section name="Version 2.3.0rc3">
<p>Released 15 September 2006</p>
<p>Detail</p>
@@ -50,6 +84,7 @@
<li>[<a href='http://issues.apache.org/jira/browse/JAMES-581'>JAMES-581</a>] - Add an "Upgrade documentation" to our docs explaining the upgrade from 2.2.0 to 2.3.0</li>
</ul>
</section>
+
<section name="Version 2.3.0rc2">
<p>Released 12 August 2006</p>
<p>Detail</p>
Modified: james/server/sandbox/mailbox-namespaces/src/site/xdoc/installation_instructions.xml
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/site/xdoc/installation_instructions.xml?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/site/xdoc/installation_instructions.xml (original)
+++ james/server/sandbox/mailbox-namespaces/src/site/xdoc/installation_instructions.xml Fri Nov 17 06:32:31 2006
@@ -89,7 +89,7 @@
</ul>
<p>In addition to adjusting these parameters, you may wish to consult the documentation for a discussion of
common configurations. A list of such configurations, as well as the steps necessary to configure them, can
-be found <a href="documentation.html">here</a>.</p>
+be found <a href="index.html">here</a>.</p>
</section>
<section name="Starting James with Your Configuration">
<p>Once you have edited the configuration file you will need to restart James so that the changes take
Modified: james/server/sandbox/mailbox-namespaces/src/site/xdoc/provided_mailets.xml
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/site/xdoc/provided_mailets.xml?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/site/xdoc/provided_mailets.xml (original)
+++ james/server/sandbox/mailbox-namespaces/src/site/xdoc/provided_mailets.xml Fri Nov 17 06:32:31 2006
@@ -368,7 +368,7 @@
This mailet can produce listserver, forward and notify behaviour, with the
original message intact, attached, appended or left out altogether.<br/>
This built in functionality is controlled by the configuration as described
- <a href="javadocs/org/apache/james/transport/mailets/Redirect.html">here</a>.</p>
+ <a href="apidocs/org/apache/james/transport/mailets/Redirect.html">here</a>.</p>
<p>It is also intended to be easily subclassed to make providing bespoke redirection
mailets simple. <br/>
By extending it and overriding one or more of its methods new behaviour can
Modified: james/server/sandbox/mailbox-namespaces/src/site/xdoc/summary.xml
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/site/xdoc/summary.xml?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/site/xdoc/summary.xml (original)
+++ james/server/sandbox/mailbox-namespaces/src/site/xdoc/summary.xml Fri Nov 17 06:32:31 2006
@@ -82,7 +82,7 @@
servers and deliver them to the local spool. This is useful for consolidating mail delivered to a
number of accounts on different machines to a single account.</p>
-<p>More information on configuring FetchMail can be found <a href="fetchpop_configuration.html">here</a>.</p>
+<p>More information on configuring FetchMail can be found <a href="fetchmail_configuration.html">here</a>.</p>
</section>
<section name="The SpoolManager, Matchers, and Mailets">
Modified: james/server/sandbox/mailbox-namespaces/src/site/xdoc/using_database.xml
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/site/xdoc/using_database.xml?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/site/xdoc/using_database.xml (original)
+++ james/server/sandbox/mailbox-namespaces/src/site/xdoc/using_database.xml Fri Nov 17 06:32:31 2006
@@ -135,7 +135,7 @@
<subsection name="Known Issues">
<p>There are some vendor-specific subtleties in using databases with James that have been observed
by some users. These issues (and methods to resolve them) are recorded on the
-<a href="FAQ.html">James FAQ</a> as they are reported. Please consult the FAQ if you encounter any
+<a href="../FAQ.html">James FAQ</a> as they are reported. Please consult the FAQ if you encounter any
difficulties.</p>
</subsection>
</section>
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/JamesTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/JamesTest.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/JamesTest.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/JamesTest.java Fri Nov 17 06:32:31 2006
@@ -42,6 +42,7 @@
import java.io.File;
import java.io.FileNotFoundException;
import java.net.InetAddress;
+import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
@@ -126,6 +127,10 @@
DNSServer dns = new AbstractDNSServer() {
public String getHostName(InetAddress addr) {
return "localhost";
+ }
+
+ public InetAddress getLocalHost() throws UnknownHostException {
+ throw new UnknownHostException("Unknown");
}
};
return dns;
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/imapserver/handler/commands/AbstractCommandTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/imapserver/handler/commands/AbstractCommandTest.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/imapserver/handler/commands/AbstractCommandTest.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/imapserver/handler/commands/AbstractCommandTest.java Fri Nov 17 06:32:31 2006
@@ -8,6 +8,7 @@
import org.apache.james.imapserver.ProtocolException;
import org.apache.james.services.User;
import org.apache.james.services.UsersRepository;
+import org.apache.james.test.mock.avalon.MockLogger;
import org.jmock.Mock;
import org.jmock.MockObjectTestCase;
@@ -21,6 +22,7 @@
public void setUp() {
handler=new ImapRequestHandler();
+ handler.enableLogging(new MockLogger());
mockSession = mock ( ImapSession.class);
mockUsersRepository = mock ( UsersRepository.class );
mockUser = mock (User.class );
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/imapserver/handler/session/AbstractSessionTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/imapserver/handler/session/AbstractSessionTest.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/imapserver/handler/session/AbstractSessionTest.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/imapserver/handler/session/AbstractSessionTest.java Fri Nov 17 06:32:31 2006
@@ -56,6 +56,7 @@
import org.apache.james.mailboxmanager.mailbox.GeneralMailboxSession;
import org.apache.james.mailboxmanager.mailbox.ImapMailboxSession;
import org.apache.james.mailboxmanager.manager.MailboxManager;
+import org.apache.james.test.mock.avalon.MockLogger;
import org.jmock.MockObjectTestCase;
public abstract class AbstractSessionTest extends MockObjectTestCase implements TestConstants {
@@ -79,6 +80,7 @@
theConfigData.getUsersRepository(), new MockImapHandler(),
HOST_NAME, HOST_ADDRESS);
handler = new ImapRequestHandler();
+ handler.enableLogging(new MockLogger());
mailboxManager=theConfigData.getMailboxManagerProvider().getMailboxManagerInstance(new MockUser());
}
@@ -114,6 +116,14 @@
long uidv=mailbox.getUidValidity();
mailbox.close();
return uidv;
+ }
+
+
+ public long getUidNext(String folder) throws MailboxManagerException {
+ ImapMailboxSession mailbox=getImapMailboxSession(folder);
+ long uidNext=mailbox.getUidNext();
+ mailbox.close();
+ return uidNext;
}
public MimeMessage[] getMessages(String folder) throws MailboxManagerException {
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/AbstractImapMailboxSelfTestCase.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/AbstractImapMailboxSelfTestCase.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/AbstractImapMailboxSelfTestCase.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/AbstractImapMailboxSelfTestCase.java Fri Nov 17 06:32:31 2006
@@ -133,6 +133,13 @@
checkMessageResults(new long[] {1,8,10},new int[] {1,2,3},getResult5);
}
+ public void testGetUidNext() throws MessagingException {
+ assertEquals(1, mailbox.getUidNext());
+ MessageResult mr=mailbox.appendMessage(TestUtil.createMessage(), new Date(), MessageResult.UID | MessageResult.MSN);
+ assertEquals(1,mr.getUid());
+ assertEquals(2, mailbox.getUidNext());
+ }
+
public void testAddedEvents() throws MailboxManagerException, MessagingException {
assertEquals(0,mailbox.getFlagEvents(false).length);
MessageResult mr=mailbox.appendMessage(TestUtil.createMessage(), new Date(), MessageResult.UID | MessageResult.MSN);
@@ -154,7 +161,6 @@
assertEquals("Uid at pos "+i,uids[i], messageResults[i].getUid());
assertEquals("Msn at pos "+i,msns[i], messageResults[i].getMsn());
}
-
}
}
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/AbstractMailboxManagerSelfTestCase.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/AbstractMailboxManagerSelfTestCase.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/AbstractMailboxManagerSelfTestCase.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/AbstractMailboxManagerSelfTestCase.java Fri Nov 17 06:32:31 2006
@@ -25,13 +25,14 @@
import org.apache.james.mailboxmanager.mailbox.GeneralMailboxSession;
import org.apache.james.mailboxmanager.manager.MailboxManager;
+import org.apache.james.mailboxmanager.manager.MailboxManagerProvider;
import junit.framework.TestCase;
public abstract class AbstractMailboxManagerSelfTestCase extends TestCase {
protected MailboxManager mailboxManager;
-
+ protected MailboxManagerProvider mailboxManagerProvider;
public void testCreateList() throws MailboxManagerException {
ListResult[] listResult;
@@ -53,10 +54,16 @@
}
}
- public void testGetSessionMailbox() throws MailboxManagerException {
- mailboxManager.createMailbox("#users.joachim3.INBOX");
- GeneralMailboxSession sessionMailbox=mailboxManager.getGeneralMailboxSession("#users.joachim3.INBOX");
+ public void testGetSessionMailboxLife() throws MailboxManagerException {
+ final String folder="#users.joachim3.INBOX";
+ assertEquals(0, mailboxManagerProvider.getOpenMailboxSessionCountMap().size());
+ mailboxManager.createMailbox(folder);
+ GeneralMailboxSession sessionMailbox=mailboxManager.getGeneralMailboxSession(folder);
assertNotNull(sessionMailbox);
+ assertEquals(1, mailboxManagerProvider.getOpenMailboxSessionCountMap().size());
+ assertEquals(new Integer(1), mailboxManagerProvider.getOpenMailboxSessionCountMap().get(folder));
+ sessionMailbox.close();
+ assertEquals(0, mailboxManagerProvider.getOpenMailboxSessionCountMap().size());
}
public void testListOne() throws MailboxManagerException {
@@ -69,6 +76,5 @@
assertEquals(1, listResult.length);
assertEquals("INBOX", listResult[0].getName());
}
-
}
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/torque/TorqueMailboxManagerSelfTestCase.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/torque/TorqueMailboxManagerSelfTestCase.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/torque/TorqueMailboxManagerSelfTestCase.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/mailboxmanager/torque/TorqueMailboxManagerSelfTestCase.java Fri Nov 17 06:32:31 2006
@@ -32,8 +32,9 @@
}
public void setUp() throws Exception {
- TorqueMailboxManagerProviderSingleton.getTorqueMailboxManagerProviderInstance().deleteEverything();
- mailboxManager = TorqueMailboxManagerProviderSingleton.getTorqueMailboxManagerProviderInstance().getMailboxManagerInstance(new MockUser());
+ mailboxManagerProvider=TorqueMailboxManagerProviderSingleton.getTorqueMailboxManagerProviderInstance();
+ mailboxManagerProvider.deleteEverything();
+ mailboxManager = mailboxManagerProvider.getMailboxManagerInstance(new MockUser());
}
}
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java Fri Nov 17 06:32:31 2006
@@ -28,6 +28,8 @@
import java.util.List;
import java.util.Map;
+import javax.mail.internet.ParseException;
+
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.DefaultConfiguration;
@@ -36,6 +38,9 @@
import org.apache.james.services.DNSServer;
import org.apache.james.smtpserver.core.filter.fastfail.DNSRBLHandler;
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;
import junit.framework.TestCase;
@@ -117,7 +122,7 @@
/**
* Setup mocked smtpsession
*/
- private void setupMockedSMTPSession() {
+ private void setupMockedSMTPSession(final MailAddress rcpt) {
mockedSMTPSession = new AbstractSMTPSession() {
HashMap state = new HashMap();
HashMap connectionState = new HashMap();
@@ -128,6 +133,7 @@
}
public Map getState() {
+ state.put(SMTPSession.CURRENT_RECIPIENT, rcpt);
return state;
}
@@ -163,12 +169,12 @@
}
// ip is blacklisted and has txt details
- public void testBlackListedTextPresent() {
+ public void testBlackListedTextPresent() throws ParseException {
DNSRBLHandler rbl = new DNSRBLHandler();
ContainerUtil.enableLogging(rbl, new MockLogger());
- setupMockedSMTPSession();
+ setupMockedSMTPSession(new MailAddress("any@domain"));
rbl.setDNSServer(mockedDnsServer);
rbl.setBlacklist(new String[] { "bl.spamcop.net." });
@@ -180,12 +186,12 @@
}
// ip is blacklisted and has txt details but we don'T want to retrieve the txt record
- public void testGetNoDetail() {
+ public void testGetNoDetail() throws ParseException {
DNSRBLHandler rbl = new DNSRBLHandler();
ContainerUtil.enableLogging(rbl, new MockLogger());
- setupMockedSMTPSession();
+ setupMockedSMTPSession(new MailAddress("any@domain"));
rbl.setDNSServer(mockedDnsServer);
rbl.setBlacklist(new String[] { "bl.spamcop.net." });
@@ -196,13 +202,13 @@
}
// ip is allowed to relay
- public void testRelayAllowed() {
+ public void testRelayAllowed() throws ParseException {
DNSRBLHandler rbl = new DNSRBLHandler();
ContainerUtil.enableLogging(rbl, new MockLogger());
setRelayingAllowed(true);
- setupMockedSMTPSession();
+ setupMockedSMTPSession(new MailAddress("any@domain"));
rbl.setDNSServer(mockedDnsServer);
@@ -214,12 +220,12 @@
}
// ip not on blacklist
- public void testNotBlackListed() {
+ public void testNotBlackListed() throws ParseException {
DNSRBLHandler rbl = new DNSRBLHandler();
ContainerUtil.enableLogging(rbl, new MockLogger());
setRemoteIp("192.168.0.1");
- setupMockedSMTPSession();
+ setupMockedSMTPSession(new MailAddress("any@domain"));
rbl.setDNSServer(mockedDnsServer);
@@ -231,12 +237,12 @@
}
// ip on blacklist without txt details
- public void testBlackListedNoTxt() {
+ public void testBlackListedNoTxt() throws ParseException {
DNSRBLHandler rbl = new DNSRBLHandler();
ContainerUtil.enableLogging(rbl, new MockLogger());
setRemoteIp("127.0.0.3");
- setupMockedSMTPSession();
+ setupMockedSMTPSession(new MailAddress("any@domain"));
rbl.setDNSServer(mockedDnsServer);
@@ -248,12 +254,12 @@
}
// ip on whitelist
- public void testWhiteListed() {
+ public void testWhiteListed() throws ParseException {
DNSRBLHandler rbl = new DNSRBLHandler();
ContainerUtil.enableLogging(rbl, new MockLogger());
setRemoteIp("127.0.0.2");
- setupMockedSMTPSession();
+ setupMockedSMTPSession(new MailAddress("any@domain"));
rbl.setDNSServer(mockedDnsServer);
@@ -274,6 +280,27 @@
}
assertTrue("Invalid config",exception);
+ }
+
+ public void testAddJunkScore() throws ParseException {
+ DNSRBLHandler rbl = new DNSRBLHandler();
+
+ ContainerUtil.enableLogging(rbl, new MockLogger());
+
+ setupMockedSMTPSession(new MailAddress("any@domain"));
+ mockedSMTPSession.getConnectionState().put(JunkScore.JUNK_SCORE_SESSION, new JunkScoreImpl());
+ rbl.setDNSServer(mockedDnsServer);
+
+ rbl.setBlacklist(new String[] { "bl.spamcop.net." });
+ rbl.setGetDetail(false);
+ rbl.setScore(20);
+ rbl.setAction("junkScore");
+ rbl.onConnect(mockedSMTPSession);
+ assertNull("No details",mockedSMTPSession.getConnectionState().get(RBL_DETAIL_MAIL_ATTRIBUTE_NAME));
+ assertNotNull("Listed on RBL",mockedSMTPSession.getConnectionState().get(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME));
+
+ rbl.onCommand(mockedSMTPSession);
+ assertEquals("Score stored",((JunkScore) mockedSMTPSession.getConnectionState().get(JunkScore.JUNK_SCORE_SESSION)).getStoredScore("DNSRBLCheck"), 20.0, 0d);
}
}
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/ResolvableEhloHeloHandlerTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/ResolvableEhloHeloHandlerTest.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/ResolvableEhloHeloHandlerTest.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/ResolvableEhloHeloHandlerTest.java Fri Nov 17 06:32:31 2006
@@ -35,6 +35,8 @@
import org.apache.james.services.DNSServer;
import org.apache.james.smtpserver.core.filter.fastfail.ResolvableEhloHeloHandler;
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;
public class ResolvableEhloHeloHandlerTest extends TestCase {
@@ -125,7 +127,7 @@
public InetAddress getByName(String host) throws UnknownHostException {
if (host.equals(INVALID_HOST))
throw new UnknownHostException();
- return null;
+ return InetAddress.getLocalHost();
}
};
@@ -309,5 +311,31 @@
assertNull("Not Reject", getResponse());
assertFalse("Not stop handler processing",session.getStopHandlerProcessing());
+ }
+
+ public void testAddJunkScoreInvalidHelo() throws ParseException {
+ SMTPSession session = setupMockSession(INVALID_HOST,false,false,null,new MailAddress("test@localhost"));
+ session.getConnectionState().put(JunkScore.JUNK_SCORE_SESSION, new JunkScoreImpl());
+ ResolvableEhloHeloHandler handler = new ResolvableEhloHeloHandler();
+
+ ContainerUtil.enableLogging(handler,new MockLogger());
+
+ handler.setDnsServer(setupMockDNSServer());
+ handler.setAction("junkScore");
+ handler.setScore(20);
+
+ // helo
+ setCommand(HELO);
+ handler.onCommand(session);
+ assertNotNull("Invalid HELO",session.getState().get(ResolvableEhloHeloHandler.BAD_EHLO_HELO));
+
+
+ // rcpt
+ setCommand(RCPT);
+ handler.onCommand(session);
+ assertNull("Not Reject", getResponse());
+
+ assertFalse("Don'T stop handler processing",session.getStopHandlerProcessing());
+ assertEquals("JunkScore added", ((JunkScore) session.getConnectionState().get(JunkScore.JUNK_SCORE_SESSION)).getStoredScore("ResolvableEhloHeloCheck"), 20.0, 0d);
}
}
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/SMTPServerTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/SMTPServerTest.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/SMTPServerTest.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/SMTPServerTest.java Fri Nov 17 06:32:31 2006
@@ -1018,30 +1018,98 @@
}
+ /*
+ What we want to see is that for a given connection limit and a
+ given backlog, that connection limit requests are handled, and
+ that up to the backlog number of connections are queued. More
+ connections than that should error out until space opens up in
+ the queue.
+
+ For example:
+
+ # telnet localhost <m_smtpListenPort>
+ Trying 127.0.0.1...
+ telnet: Unable to connect to remote host: Connection refused
+
+ is the immediate response if the backlog is full.
+ */
+
public void testConnectionLimitExceeded() throws Exception {
- m_testConfiguration.setConnectionLimit(1); // allow no more than one connection at a time
+ final int acceptLimit = 1;
+ final int backlog = 1;
+
+ m_testConfiguration.setConnectionLimit(acceptLimit); // allow no more than <acceptLimit> connection(s) in the service
+ m_testConfiguration.setConnectionBacklog(backlog); // allow <backlog> additional connection(s) in the queue
finishSetUp(m_testConfiguration);
- SMTPClient smtpProtocol1 = new SMTPClient();
- SMTPClient smtpProtocol2 = new SMTPClient();
- smtpProtocol1.connect("127.0.0.1", m_smtpListenerPort);
- assertTrue("first connection taken", smtpProtocol1.isConnected());
+ final SMTPClient[] client = new SMTPClient[acceptLimit];
+ for (int i = 0; i < client.length; i++) {
+ client[i] = new SMTPClient(); // should connect to worker
+ try {
+ client[i].connect("127.0.0.1", m_smtpListenerPort);
+ } catch (Exception _) {
+ }
+ assertTrue("client #" + (i+1) + " established", client[i].isConnected());
+ }
+
+ // Cannot use SMTPClient. It appears that even though the
+ // client's socket is established, since the client won't be
+ // able to connect to the protocol handler, the connect call
+ // hangs.
+
+ // Different TCP/IP stacks may provide a "grace" margin above
+ // and beyond the specified backlog. So we won't try to be
+ // precise. Instead we will compute some upper limit, loop
+ // until we get a connection error (or hit the limit), and
+ // then test for the expected behavior.
+ //
+ // See: http://www.phrack.org/archives/48/P48-13
+ final Socket connection[] = new Socket[Math.max(((backlog * 3) / 2) + 1, backlog + 3)];
+
+ final java.net.SocketAddress server = new java.net.InetSocketAddress("localhost", m_smtpListenerPort);
+
+ for (int i = 0; i < connection.length; i++) {
+ connection[i] = new Socket();
+ try {
+ connection[i].connect(server, 1000);
+ } catch (Exception _) {
+ assertTrue("Accepted connections " + i + " did not meet or exceed backlog of " + backlog + ".", i >= backlog);
+ connection[i] = null; // didn't open, so don't try to close later
+ break; // OK to fail, since we've at least reached the backlog
+ }
+ assertTrue("connection #" + (i+1) + " established", connection[i].isConnected());
+ }
try {
- smtpProtocol2.connect("127.0.0.1", m_smtpListenerPort);
- fail("second connection not taken1");
- } catch (Exception e) {
+ final Socket shouldFail = new Socket();
+ shouldFail.connect(server, 1000);
+ fail("connection # " + (client.length + connection.length + 1) + " did not fail.");
+ } catch (Exception _) {
}
-
- // disconnect the first
- smtpProtocol1.quit();
- smtpProtocol1.disconnect();
-
+
+ client[0].quit();
+ client[0].disconnect();
+
Thread.sleep(100);
- // now the second should be able to connect
- smtpProtocol2.connect("127.0.0.1", m_smtpListenerPort);
- assertTrue(smtpProtocol2.isConnected());
+ // now should be able to connect (backlog)
+ try {
+ final Socket shouldWork = new Socket();
+ shouldWork.connect(server, 1000);
+ assertTrue("Additional connection established after close.", shouldWork.isConnected());
+ shouldWork.close();
+ } catch (Exception e) {
+ fail("Could not establish additional connection after close." + e.getMessage());
+ }
+
+ // close the pending connections first, so that the server doesn't see them
+ for (int i = 0; i < connection.length; i++) if (connection[i] != null) connection[i].close();
+
+ // close the remaining clients
+ for (int i = 1; i < client.length; i++) {
+ client[i].quit();
+ client[i].disconnect();
+ }
}
// RemoteDelivery tests.
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java Fri Nov 17 06:32:31 2006
@@ -40,6 +40,7 @@
private String m_authorizingMode = "false";
private boolean m_verifyIdentity = false;
private Integer m_connectionLimit = null;
+ private Integer m_connectionBacklog = null;
private boolean m_heloResolv = false;
private boolean m_ehloResolv = false;
private boolean m_senderDomainResolv = false;
@@ -100,6 +101,10 @@
m_connectionLimit = new Integer(iConnectionLimit);
}
+ public void setConnectionBacklog(int iConnectionBacklog) {
+ m_connectionBacklog = new Integer(iConnectionBacklog);
+ }
+
public void setHeloResolv() {
m_heloResolv = true;
}
@@ -146,6 +151,7 @@
addChild(Util.getValuedConfiguration("port", "" + m_smtpListenerPort));
if (m_connectionLimit != null) addChild(Util.getValuedConfiguration("connectionLimit", "" + m_connectionLimit.intValue()));
+ if (m_connectionBacklog != null) addChild(Util.getValuedConfiguration("connectionBacklog", "" + m_connectionBacklog.intValue()));
DefaultConfiguration handlerConfig = new DefaultConfiguration("handler");
handlerConfig.addChild(Util.getValuedConfiguration("helloName", "myMailServer"));
Modified: james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/ValidSenderDomainHandlerTest.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/ValidSenderDomainHandlerTest.java?view=diff&rev=476151&r1=476150&r2=476151
==============================================================================
--- james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/ValidSenderDomainHandlerTest.java (original)
+++ james/server/sandbox/mailbox-namespaces/src/test/org/apache/james/smtpserver/ValidSenderDomainHandlerTest.java Fri Nov 17 06:32:31 2006
@@ -24,11 +24,15 @@
import java.util.HashMap;
import java.util.Map;
+import javax.mail.internet.ParseException;
+
import org.apache.avalon.framework.container.ContainerUtil;
import org.apache.james.services.AbstractDNSServer;
import org.apache.james.services.DNSServer;
import org.apache.james.smtpserver.core.filter.fastfail.ValidSenderDomainHandler;
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;
import junit.framework.TestCase;
@@ -59,6 +63,7 @@
private SMTPSession setupMockedSession(final MailAddress sender) {
SMTPSession session = new AbstractSMTPSession() {
HashMap state = new HashMap();
+ boolean processing = false;
public Map getState() {
@@ -75,6 +80,14 @@
response = resp;
}
+ public void setStopHandlerProcessing(boolean processing) {
+ this.processing = processing;
+ }
+
+ public boolean getStopHandlerProcessing() {
+ return processing;
+ }
+
};
return session;
}
@@ -84,7 +97,7 @@
}
// Test for JAMES-580
- public void testNullSender() {
+ public void testNullSenderNotReject() {
ValidSenderDomainHandler handler = new ValidSenderDomainHandler();
ContainerUtil.enableLogging(handler, new MockLogger());
@@ -92,5 +105,29 @@
handler.onCommand(setupMockedSession(null));
assertNull("Not blocked cause its a nullsender",getResponse());
+ }
+
+ public void testInvalidSenderDomainAddJunkScore() throws ParseException {
+ ValidSenderDomainHandler handler = new ValidSenderDomainHandler();
+ SMTPSession session = setupMockedSession(new MailAddress("invalid@invalid"));
+ ContainerUtil.enableLogging(handler, new MockLogger());
+ session.getState().put(JunkScore.JUNK_SCORE, new JunkScoreImpl());
+ handler.setAction("JunkScore");
+ handler.setScore(20);
+ handler.setDnsServer(setupDNSServer());
+ handler.onCommand(session);
+
+ assertNull("Not blocked cause we use JunkScore",getResponse());
+ assertEquals("JunkScore is stored",((JunkScore) session.getState().get(JunkScore.JUNK_SCORE)).getStoredScore("ValidSenderDomainCheck"),20.0,0d);
+ }
+
+ public void testInvalidSenderDomainReject() throws ParseException {
+ ValidSenderDomainHandler handler = new ValidSenderDomainHandler();
+ SMTPSession session = setupMockedSession(new MailAddress("invalid@invalid"));
+ ContainerUtil.enableLogging(handler, new MockLogger());
+ handler.setDnsServer(setupDNSServer());
+ handler.onCommand(session);
+
+ assertNotNull("Blocked cause we use reject action",getResponse());
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org