Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java?rev=392343&r1=392342&r2=392343&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java 
Fri Apr  7 10:42:11 2006
@@ -1,335 +1,335 @@
-/***********************************************************************
- * Copyright (c) 1999-2006 The Apache Software Foundation.             *
- * All rights reserved.                                                *
- * ------------------------------------------------------------------- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you *
- * may not use this file except in compliance with the License. You    *
- * may obtain a copy of the License at:                                *
- *                                                                     *
- *     http://www.apache.org/licenses/LICENSE-2.0                      *
- *                                                                     *
- * Unless required by applicable law or agreed to in writing, software *
- * distributed under the License is distributed on an "AS IS" BASIS,   *
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
- * implied.  See the License for the specific language governing       *
- * permissions and limitations under the License.                      *
- ***********************************************************************/
-
-package org.apache.james.smtpserver;
-
-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.james.util.mail.dsn.DSNStatus;
-import org.apache.mailet.MailAddress;
-import java.util.Collection;
-import java.util.ArrayList;
-import java.util.StringTokenizer;
-import java.util.Locale;
-
-/**
-  * Handles RCPT command
-  */
-public class RcptCmdHandler
-    extends AbstractLogEnabled
-    implements CommandHandler,Configurable {
-
-    /**
-     * The keys used to store sender and recepients in the SMTPSession state
-     */
-    private final static String RCPTCOUNT = "RCPT_COUNT";
-    private int maxRcpt = 0;
-    private int tarpitRcptCount = 0;
-    private long tarpitSleepTime = 0;
-    
-    /**
-     * @see 
org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
-     */
-    public void configure(Configuration handlerConfiguration) throws 
ConfigurationException {
-        Configuration configuration = 
handlerConfiguration.getChild("maxRcpt",false);
-        if(configuration != null) {
-           maxRcpt = configuration.getValueAsInteger();
-        }
-        
-        Configuration configTarpitRcptCount = 
handlerConfiguration.getChild("tarpitRcptCount",false);
-        if(configTarpitRcptCount != null) {
-           tarpitRcptCount = configTarpitRcptCount.getValueAsInteger();
-        }
-        
-        Configuration configTarpitSleepTime = 
handlerConfiguration.getChild("tarpitSleepTime",false);
-        if(configTarpitSleepTime != null) {
-           tarpitSleepTime = configTarpitSleepTime.getValueAsLong();
-        }
-    }
-    
-    /*
-     * handles RCPT command
-     *
-     * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
-    **/
-    public void onCommand(SMTPSession session) {
-        doRCPT(session, session.getCommandArgument());
-    }
-
-
-    /**
-     * Handler method called upon receipt of a RCPT command.
-     * Reads recipient.  Does some connection validation.
-     *
-     *
-     * @param session SMTP session object
-     * @param argument the argument passed in with the command by the SMTP 
client
-     */
-    private void doRCPT(SMTPSession session, String argument) {
-        String responseString = null;
-        StringBuffer responseBuffer = session.getResponseBuffer();
-        boolean maxRcptReached = false;
-        boolean useTarpit = false;
-        
-        String recipient = null;
-        if ((argument != null) && (argument.indexOf(":") > 0)) {
-            int colonIndex = argument.indexOf(":");
-            recipient = argument.substring(colonIndex + 1);
-            argument = argument.substring(0, colonIndex);
-        }
-        if (!session.getState().containsKey(SMTPSession.SENDER)) {
-            responseString = "503 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Need MAIL 
before RCPT";
-            session.writeResponse(responseString);
-        } else if (argument == null || 
!argument.toUpperCase(Locale.US).equals("TO")
-                   || recipient == null) {
-            responseString = "501 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_SYNTAX)+" Usage: 
RCPT TO:<recipient>";
-            session.writeResponse(responseString);
-        } else {
-            Collection rcptColl = (Collection) 
session.getState().get(SMTPSession.RCPT_LIST);
-            if (rcptColl == null) {
-                rcptColl = new ArrayList();
-            }
-            recipient = recipient.trim();
-            int lastChar = recipient.lastIndexOf('>');
-            // Check to see if any options are present and, if so, whether 
they are correctly formatted
-            // (separated from the closing angle bracket by a ' ').
-            String rcptOptionString = null;
-            if ((lastChar > 0) && (recipient.length() > lastChar + 2) && 
(recipient.charAt(lastChar + 1) == ' ')) {
-                rcptOptionString = recipient.substring(lastChar + 2);
-
-                // Remove the options from the recipient
-                recipient = recipient.substring(0, lastChar + 1);
-            }
-            if (!recipient.startsWith("<") || !recipient.endsWith(">")) {
-                responseString = "501 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_SYNTAX)+" Syntax 
error in parameters or arguments";
-                session.writeResponse(responseString);
-                if (getLogger().isErrorEnabled()) {
-                    StringBuffer errorBuffer =
-                        new StringBuffer(192)
-                                .append("Error parsing recipient address: ")
-                                .append("Address did not start and end with < 
>")
-                                .append(getContext(session,null,recipient));
-                    getLogger().error(errorBuffer.toString());
-                }
-                return;
-            }
-            MailAddress recipientAddress = null;
-            //Remove < and >
-            recipient = recipient.substring(1, recipient.length() - 1);
-            if (recipient.indexOf("@") < 0) {
-                recipient = recipient + "@localhost";
-            }
-            
-            try {
-                recipientAddress = new MailAddress(recipient);
-            } catch (Exception pe) {
-                /*
-                 * from RFC2822;
-                 * 553 Requested action not taken: mailbox name not allowed
-                 *     (e.g., mailbox syntax incorrect)
-                 */
-                responseString = "553 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_SYNTAX)+" Syntax 
error in recipient address";
-                session.writeResponse(responseString);
-
-                if (getLogger().isErrorEnabled()) {
-                    StringBuffer errorBuffer =
-                        new StringBuffer(192)
-                                .append("Error parsing recipient address: ")
-                                
.append(getContext(session,recipientAddress,recipient))
-                                .append(pe.getMessage());
-                    getLogger().error(errorBuffer.toString());
-                }
-                return;
-            }
-
-            if (session.isBlockListed() &&                                     
           // was found in the RBL
-                (!session.isRelayingAllowed() || (session.isAuthRequired() && 
session.getUser() == null)) &&  // Not an authorized IP or SMTP AUTH is enabled 
and not authenticated
-                !(recipientAddress.getUser().equalsIgnoreCase("postmaster") || 
recipientAddress.getUser().equalsIgnoreCase("abuse"))) {
-                // trying to send e-mail to other than postmaster or abuse
-                responseString = "530 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Rejected: 
unauthenticated e-mail from " + session.getRemoteIPAddress() + " is restricted. 
 Contact the postmaster for details.";
-                session.writeResponse(responseString);
-                return;
-            }
-
-            if (session.isAuthRequired() && !session.isRelayingAllowed()) {
-                // Make sure the mail is being sent locally if not
-                // authenticated else reject.
-                if (session.getUser() == null) {
-                    String toDomain = recipientAddress.getHost();
-                    if 
(!session.getConfigurationData().getMailServer().isLocalServer(toDomain)) {
-                        responseString = "530 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" 
Authentication Required";
-                        session.writeResponse(responseString);
-                        StringBuffer sb = new StringBuffer(128);
-                        sb.append("Rejected message - authentication is 
required for mail request");
-                        
sb.append(getContext(session,recipientAddress,recipient));
-                        getLogger().error(sb.toString());
-                        return;
-                    }
-                } else {
-                    // Identity verification checking
-                    if (session.getConfigurationData().isVerifyIdentity()) {
-                        String authUser = 
(session.getUser()).toLowerCase(Locale.US);
-                        MailAddress senderAddress = (MailAddress) 
session.getState().get(SMTPSession.SENDER);
-
-                        if ((senderAddress == null) || 
(!authUser.equals(senderAddress.getUser())) ||
-                            
(!session.getConfigurationData().getMailServer().isLocalServer(senderAddress.getHost())))
 {
-                            responseString = "503 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Incorrect 
Authentication for Specified Email Address";
-                            session.writeResponse(responseString);
-                            if (getLogger().isErrorEnabled()) {
-                                StringBuffer errorBuffer =
-                                    new StringBuffer(128)
-                                        .append("User ")
-                                        .append(authUser)
-                                        .append(" authenticated, however tried 
sending email as ")
-                                        .append(senderAddress)
-                                        
.append(getContext(session,recipientAddress,recipient));
-                                getLogger().error(errorBuffer.toString());
-                            }
-                            return;
-                        }
-                    }
-                }
-            } else if (!session.isRelayingAllowed()) {
-                String toDomain = recipientAddress.getHost();
-                if 
(!session.getConfigurationData().getMailServer().isLocalServer(toDomain)) {
-                    responseString = "550 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Requested 
action not taken: relaying denied";
-                    session.writeResponse(responseString);
-                    StringBuffer errorBuffer = new StringBuffer(128)
-                        .append("Rejected message - ")
-                        .append(session.getRemoteIPAddress())
-                        .append(" not authorized to relay to ")
-                        .append(toDomain)
-                        
.append(getContext(session,recipientAddress,recipient));
-                    getLogger().error(errorBuffer.toString());
-                    return;
-                }
-            }
-            if (rcptOptionString != null) {
-
-              StringTokenizer optionTokenizer = new 
StringTokenizer(rcptOptionString, " ");
-              while (optionTokenizer.hasMoreElements()) {
-                  String rcptOption = optionTokenizer.nextToken();
-                  int equalIndex = rcptOption.indexOf('=');
-                  String rcptOptionName = rcptOption;
-                  String rcptOptionValue = "";
-                  if (equalIndex > 0) {
-                      rcptOptionName = rcptOption.substring(0, 
equalIndex).toUpperCase(Locale.US);
-                      rcptOptionValue = rcptOption.substring(equalIndex + 1);
-                  }
-                  // Unexpected option attached to the RCPT command
-                  if (getLogger().isDebugEnabled()) {
-                      StringBuffer debugBuffer =
-                          new StringBuffer(128)
-                              .append("RCPT command had 
unrecognized/unexpected option ")
-                              .append(rcptOptionName)
-                              .append(" with value ")
-                              .append(rcptOptionValue)
-                              
.append(getContext(session,recipientAddress,recipient));
-                      getLogger().debug(debugBuffer.toString());
-                  }
-              }
-              optionTokenizer = null;
-            }
-            
-            // check if we should check for max recipients
-            if (maxRcpt > 0) {
-                int rcptCount = 0;
-            
-                // check if the key exists
-                rcptCount = getRcptCount(session);
-                
-                rcptCount++;
-        
-                // check if the max recipients has reached
-                if (rcptCount > maxRcpt) {
-                    maxRcptReached = true;
-                    responseString = "550 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Requested 
action not taken: max recipients reached";
-                    session.writeResponse(responseString);
-                    getLogger().error(responseString);
-                }
-                
-                // put the recipient cound in session hashtable
-                session.getState().put(RCPTCOUNT,Integer.toString(rcptCount));
-            }
-            
-            // check if we should use tarpit
-            if (tarpitRcptCount > 0) {
-                int rcptCount = 0;
-                rcptCount = getRcptCount(session);
-                rcptCount++;
-                
-                if (rcptCount > tarpitRcptCount) {
-                    useTarpit = true;                   
-                }
-                
-                // put the recipient cound in session hashtable
-                session.getState().put(RCPTCOUNT,Integer.toString(rcptCount));
-                 
-            }
-            
-            if (maxRcptReached == false) {
-                rcptColl.add(recipientAddress);
-                session.getState().put(SMTPSession.RCPT_LIST, rcptColl);
-                responseBuffer.append("250 
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.ADDRESS_VALID)+" Recipient <")
-                              .append(recipient)
-                              .append("> OK");
-                responseString = session.clearResponseBuffer();
-                
-                if (useTarpit == true) {
-                    try {
-                        sleep(tarpitSleepTime);
-                    } catch (InterruptedException e) { }
-                }
-                session.writeResponse(responseString);
-            }
-        }
-    }
-
-
-    private String getContext(SMTPSession session, MailAddress 
recipientAddress, String recipient){
-        StringBuffer sb = new StringBuffer(128);
-        if(null!=recipientAddress) {
-            sb.append(" [to:" + 
(recipientAddress).toInternetAddress().getAddress() + "]");
-        } else if(null!=recipient) {
-            sb.append(" [to:" + recipient + "]");
-        }
-        if (null!=session.getState().get(SMTPSession.SENDER)) {
-            sb.append(" [from:" + 
((MailAddress)session.getState().get(SMTPSession.SENDER)).toInternetAddress().getAddress()
 + "]");
-        }
-        return sb.toString();
-    } 
-    
-    
-    private int getRcptCount(SMTPSession session) {
-        int startCount = 0;
-        
-        // check if the key exists
-        if (session.getState().get(RCPTCOUNT) != null) {
-            Integer rcptCountInteger = 
Integer.valueOf(session.getState().get(RCPTCOUNT).toString());
-            return rcptCountInteger.intValue();
-        } else {
-            return startCount;
-        }
-    }
-    
-    
-    public void sleep(float timeInMillis) throws InterruptedException {
-        Thread.sleep( (long) timeInMillis );
-    }
-}
+/***********************************************************************
+ * Copyright (c) 1999-2006 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you *
+ * may not use this file except in compliance with the License. You    *
+ * may obtain a copy of the License at:                                *
+ *                                                                     *
+ *     http://www.apache.org/licenses/LICENSE-2.0                      *
+ *                                                                     *
+ * Unless required by applicable law or agreed to in writing, software *
+ * distributed under the License is distributed on an "AS IS" BASIS,   *
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
+ * implied.  See the License for the specific language governing       *
+ * permissions and limitations under the License.                      *
+ ***********************************************************************/
+
+package org.apache.james.smtpserver;
+
+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.james.util.mail.dsn.DSNStatus;
+import org.apache.mailet.MailAddress;
+import java.util.Collection;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.util.Locale;
+
+/**
+  * Handles RCPT command
+  */
+public class RcptCmdHandler
+    extends AbstractLogEnabled
+    implements CommandHandler,Configurable {
+
+    /**
+     * The keys used to store sender and recepients in the SMTPSession state
+     */
+    private final static String RCPTCOUNT = "RCPT_COUNT";
+    private int maxRcpt = 0;
+    private int tarpitRcptCount = 0;
+    private long tarpitSleepTime = 0;
+    
+    /**
+     * @see 
org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
+     */
+    public void configure(Configuration handlerConfiguration) throws 
ConfigurationException {
+        Configuration configuration = 
handlerConfiguration.getChild("maxRcpt",false);
+        if(configuration != null) {
+           maxRcpt = configuration.getValueAsInteger();
+        }
+        
+        Configuration configTarpitRcptCount = 
handlerConfiguration.getChild("tarpitRcptCount",false);
+        if(configTarpitRcptCount != null) {
+           tarpitRcptCount = configTarpitRcptCount.getValueAsInteger();
+        }
+        
+        Configuration configTarpitSleepTime = 
handlerConfiguration.getChild("tarpitSleepTime",false);
+        if(configTarpitSleepTime != null) {
+           tarpitSleepTime = configTarpitSleepTime.getValueAsLong();
+        }
+    }
+    
+    /*
+     * handles RCPT command
+     *
+     * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
+    **/
+    public void onCommand(SMTPSession session) {
+        doRCPT(session, session.getCommandArgument());
+    }
+
+
+    /**
+     * Handler method called upon receipt of a RCPT command.
+     * Reads recipient.  Does some connection validation.
+     *
+     *
+     * @param session SMTP session object
+     * @param argument the argument passed in with the command by the SMTP 
client
+     */
+    private void doRCPT(SMTPSession session, String argument) {
+        String responseString = null;
+        StringBuffer responseBuffer = session.getResponseBuffer();
+        boolean maxRcptReached = false;
+        boolean useTarpit = false;
+        
+        String recipient = null;
+        if ((argument != null) && (argument.indexOf(":") > 0)) {
+            int colonIndex = argument.indexOf(":");
+            recipient = argument.substring(colonIndex + 1);
+            argument = argument.substring(0, colonIndex);
+        }
+        if (!session.getState().containsKey(SMTPSession.SENDER)) {
+            responseString = "503 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Need MAIL 
before RCPT";
+            session.writeResponse(responseString);
+        } else if (argument == null || 
!argument.toUpperCase(Locale.US).equals("TO")
+                   || recipient == null) {
+            responseString = "501 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_SYNTAX)+" Usage: 
RCPT TO:<recipient>";
+            session.writeResponse(responseString);
+        } else {
+            Collection rcptColl = (Collection) 
session.getState().get(SMTPSession.RCPT_LIST);
+            if (rcptColl == null) {
+                rcptColl = new ArrayList();
+            }
+            recipient = recipient.trim();
+            int lastChar = recipient.lastIndexOf('>');
+            // Check to see if any options are present and, if so, whether 
they are correctly formatted
+            // (separated from the closing angle bracket by a ' ').
+            String rcptOptionString = null;
+            if ((lastChar > 0) && (recipient.length() > lastChar + 2) && 
(recipient.charAt(lastChar + 1) == ' ')) {
+                rcptOptionString = recipient.substring(lastChar + 2);
+
+                // Remove the options from the recipient
+                recipient = recipient.substring(0, lastChar + 1);
+            }
+            if (!recipient.startsWith("<") || !recipient.endsWith(">")) {
+                responseString = "501 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_SYNTAX)+" Syntax 
error in parameters or arguments";
+                session.writeResponse(responseString);
+                if (getLogger().isErrorEnabled()) {
+                    StringBuffer errorBuffer =
+                        new StringBuffer(192)
+                                .append("Error parsing recipient address: ")
+                                .append("Address did not start and end with < 
>")
+                                .append(getContext(session,null,recipient));
+                    getLogger().error(errorBuffer.toString());
+                }
+                return;
+            }
+            MailAddress recipientAddress = null;
+            //Remove < and >
+            recipient = recipient.substring(1, recipient.length() - 1);
+            if (recipient.indexOf("@") < 0) {
+                recipient = recipient + "@localhost";
+            }
+            
+            try {
+                recipientAddress = new MailAddress(recipient);
+            } catch (Exception pe) {
+                /*
+                 * from RFC2822;
+                 * 553 Requested action not taken: mailbox name not allowed
+                 *     (e.g., mailbox syntax incorrect)
+                 */
+                responseString = "553 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_SYNTAX)+" Syntax 
error in recipient address";
+                session.writeResponse(responseString);
+
+                if (getLogger().isErrorEnabled()) {
+                    StringBuffer errorBuffer =
+                        new StringBuffer(192)
+                                .append("Error parsing recipient address: ")
+                                
.append(getContext(session,recipientAddress,recipient))
+                                .append(pe.getMessage());
+                    getLogger().error(errorBuffer.toString());
+                }
+                return;
+            }
+
+            if (session.isBlockListed() &&                                     
           // was found in the RBL
+                (!session.isRelayingAllowed() || (session.isAuthRequired() && 
session.getUser() == null)) &&  // Not an authorized IP or SMTP AUTH is enabled 
and not authenticated
+                !(recipientAddress.getUser().equalsIgnoreCase("postmaster") || 
recipientAddress.getUser().equalsIgnoreCase("abuse"))) {
+                // trying to send e-mail to other than postmaster or abuse
+                responseString = "530 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Rejected: 
unauthenticated e-mail from " + session.getRemoteIPAddress() + " is restricted. 
 Contact the postmaster for details.";
+                session.writeResponse(responseString);
+                return;
+            }
+
+            if (session.isAuthRequired() && !session.isRelayingAllowed()) {
+                // Make sure the mail is being sent locally if not
+                // authenticated else reject.
+                if (session.getUser() == null) {
+                    String toDomain = recipientAddress.getHost();
+                    if 
(!session.getConfigurationData().getMailServer().isLocalServer(toDomain)) {
+                        responseString = "530 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" 
Authentication Required";
+                        session.writeResponse(responseString);
+                        StringBuffer sb = new StringBuffer(128);
+                        sb.append("Rejected message - authentication is 
required for mail request");
+                        
sb.append(getContext(session,recipientAddress,recipient));
+                        getLogger().error(sb.toString());
+                        return;
+                    }
+                } else {
+                    // Identity verification checking
+                    if (session.getConfigurationData().isVerifyIdentity()) {
+                        String authUser = 
(session.getUser()).toLowerCase(Locale.US);
+                        MailAddress senderAddress = (MailAddress) 
session.getState().get(SMTPSession.SENDER);
+
+                        if ((senderAddress == null) || 
(!authUser.equals(senderAddress.getUser())) ||
+                            
(!session.getConfigurationData().getMailServer().isLocalServer(senderAddress.getHost())))
 {
+                            responseString = "503 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Incorrect 
Authentication for Specified Email Address";
+                            session.writeResponse(responseString);
+                            if (getLogger().isErrorEnabled()) {
+                                StringBuffer errorBuffer =
+                                    new StringBuffer(128)
+                                        .append("User ")
+                                        .append(authUser)
+                                        .append(" authenticated, however tried 
sending email as ")
+                                        .append(senderAddress)
+                                        
.append(getContext(session,recipientAddress,recipient));
+                                getLogger().error(errorBuffer.toString());
+                            }
+                            return;
+                        }
+                    }
+                }
+            } else if (!session.isRelayingAllowed()) {
+                String toDomain = recipientAddress.getHost();
+                if 
(!session.getConfigurationData().getMailServer().isLocalServer(toDomain)) {
+                    responseString = "550 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Requested 
action not taken: relaying denied";
+                    session.writeResponse(responseString);
+                    StringBuffer errorBuffer = new StringBuffer(128)
+                        .append("Rejected message - ")
+                        .append(session.getRemoteIPAddress())
+                        .append(" not authorized to relay to ")
+                        .append(toDomain)
+                        
.append(getContext(session,recipientAddress,recipient));
+                    getLogger().error(errorBuffer.toString());
+                    return;
+                }
+            }
+            if (rcptOptionString != null) {
+
+              StringTokenizer optionTokenizer = new 
StringTokenizer(rcptOptionString, " ");
+              while (optionTokenizer.hasMoreElements()) {
+                  String rcptOption = optionTokenizer.nextToken();
+                  int equalIndex = rcptOption.indexOf('=');
+                  String rcptOptionName = rcptOption;
+                  String rcptOptionValue = "";
+                  if (equalIndex > 0) {
+                      rcptOptionName = rcptOption.substring(0, 
equalIndex).toUpperCase(Locale.US);
+                      rcptOptionValue = rcptOption.substring(equalIndex + 1);
+                  }
+                  // Unexpected option attached to the RCPT command
+                  if (getLogger().isDebugEnabled()) {
+                      StringBuffer debugBuffer =
+                          new StringBuffer(128)
+                              .append("RCPT command had 
unrecognized/unexpected option ")
+                              .append(rcptOptionName)
+                              .append(" with value ")
+                              .append(rcptOptionValue)
+                              
.append(getContext(session,recipientAddress,recipient));
+                      getLogger().debug(debugBuffer.toString());
+                  }
+              }
+              optionTokenizer = null;
+            }
+            
+            // check if we should check for max recipients
+            if (maxRcpt > 0) {
+                int rcptCount = 0;
+            
+                // check if the key exists
+                rcptCount = getRcptCount(session);
+                
+                rcptCount++;
+        
+                // check if the max recipients has reached
+                if (rcptCount > maxRcpt) {
+                    maxRcptReached = true;
+                    responseString = "550 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Requested 
action not taken: max recipients reached";
+                    session.writeResponse(responseString);
+                    getLogger().error(responseString);
+                }
+                
+                // put the recipient cound in session hashtable
+                session.getState().put(RCPTCOUNT,Integer.toString(rcptCount));
+            }
+            
+            // check if we should use tarpit
+            if (tarpitRcptCount > 0) {
+                int rcptCount = 0;
+                rcptCount = getRcptCount(session);
+                rcptCount++;
+                
+                if (rcptCount > tarpitRcptCount) {
+                    useTarpit = true;                   
+                }
+                
+                // put the recipient cound in session hashtable
+                session.getState().put(RCPTCOUNT,Integer.toString(rcptCount));
+                 
+            }
+            
+            if (maxRcptReached == false) {
+                rcptColl.add(recipientAddress);
+                session.getState().put(SMTPSession.RCPT_LIST, rcptColl);
+                responseBuffer.append("250 
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.ADDRESS_VALID)+" Recipient <")
+                              .append(recipient)
+                              .append("> OK");
+                responseString = session.clearResponseBuffer();
+                
+                if (useTarpit == true) {
+                    try {
+                        sleep(tarpitSleepTime);
+                    } catch (InterruptedException e) { }
+                }
+                session.writeResponse(responseString);
+            }
+        }
+    }
+
+
+    private String getContext(SMTPSession session, MailAddress 
recipientAddress, String recipient){
+        StringBuffer sb = new StringBuffer(128);
+        if(null!=recipientAddress) {
+            sb.append(" [to:" + 
(recipientAddress).toInternetAddress().getAddress() + "]");
+        } else if(null!=recipient) {
+            sb.append(" [to:" + recipient + "]");
+        }
+        if (null!=session.getState().get(SMTPSession.SENDER)) {
+            sb.append(" [from:" + 
((MailAddress)session.getState().get(SMTPSession.SENDER)).toInternetAddress().getAddress()
 + "]");
+        }
+        return sb.toString();
+    } 
+    
+    
+    private int getRcptCount(SMTPSession session) {
+        int startCount = 0;
+        
+        // check if the key exists
+        if (session.getState().get(RCPTCOUNT) != null) {
+            Integer rcptCountInteger = 
Integer.valueOf(session.getState().get(RCPTCOUNT).toString());
+            return rcptCountInteger.intValue();
+        } else {
+            return startCount;
+        }
+    }
+    
+    
+    public void sleep(float timeInMillis) throws InterruptedException {
+        Thread.sleep( (long) timeInMillis );
+    }
+}

Propchange: 
james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java?rev=392343&r1=392342&r2=392343&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java 
Fri Apr  7 10:42:11 2006
@@ -771,4 +771,4 @@
         mode = MESSAGE_ABORT_MODE;
     }
 
-}
\ No newline at end of file
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to