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: &lt;&gt;</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