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 ba...@apache.org on 2006/03/30 15:30:34 UTC

svn commit: r390122 - in /james/server/trunk/src: java/org/apache/james/smtpserver/EhloCmdHandler.java test/org/apache/james/smtpserver/SMTPServerTest.java test/org/apache/james/smtpserver/SMTPTestConfiguration.java

Author: bago
Date: Thu Mar 30 05:30:32 2006
New Revision: 390122

URL: http://svn.apache.org/viewcvs?rev=390122&view=rev
Log:
Check for valid domain in EHLO - patch by Norman Maurer (JAMES-451)

Modified:
    james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java
    james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java
    james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java

Modified: james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java?rev=390122&r1=390121&r2=390122&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java (original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java Thu Mar 30 05:30:32 2006
@@ -1,109 +1,144 @@
-/***********************************************************************
- * 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.james.util.mail.dsn.DSNStatus;
-import java.util.ArrayList;
-
-/**
-  * Handles EHLO command
-  */
-public class EhloCmdHandler implements CommandHandler {
-
-    /**
-     * The name of the command handled by the command handler
-     */
-    private final static String COMMAND_NAME = "EHLO";
-
-    /**
-     * The helo mode set in state object
-     */
-    private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // HELO or EHLO
-
-
-    /*
-     * processes EHLO command
-     *
-     * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
-    **/
-    public void onCommand(SMTPSession session) {
-        doEHLO(session, session.getCommandArgument());
-    }
-
-    /**
-     * Handler method called upon receipt of a EHLO command.
-     * Responds with a greeting and informs the client whether
-     * client authentication is required.
-     *
-     * @param session SMTP session object
-     * @param argument the argument passed in with the command by the SMTP client
-     */
-    private void doEHLO(SMTPSession session, String argument) {
-        String responseString = null;
-        StringBuffer responseBuffer = session.getResponseBuffer();
-
-        if (argument == null) {
-            responseString = "501 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Domain address required: " + COMMAND_NAME;
-            session.writeResponse(responseString);
-        } else {
-            session.resetState();
-            session.getState().put(CURRENT_HELO_MODE, COMMAND_NAME);
-
-            ArrayList esmtpextensions = new ArrayList();
-
-            esmtpextensions.add(new StringBuffer(session.getConfigurationData().getHelloName())
-                .append(" Hello ")
-                .append(argument)
-                .append(" (")
-                .append(session.getRemoteHost())
-                .append(" [")
-                .append(session.getRemoteIPAddress())
-                .append("])").toString());
-
-            // Extension defined in RFC 1870
-            long maxMessageSize = session.getConfigurationData().getMaxMessageSize();
-            if (maxMessageSize > 0) {
-                esmtpextensions.add("SIZE " + maxMessageSize);
-            }
-
-            if (session.isAuthRequired()) {
-                esmtpextensions.add("AUTH LOGIN PLAIN");
-                esmtpextensions.add("AUTH=LOGIN PLAIN");
-            }
-
-            esmtpextensions.add("PIPELINING");
-            esmtpextensions.add("ENHANCEDSTATUSCODES");
-            esmtpextensions.add("8BITMIME");
-
-
-            // Iterator i = esmtpextensions.iterator();
-            for (int i = 0; i < esmtpextensions.size(); i++) {
-                if (i == esmtpextensions.size() - 1) {
-                    responseBuffer.append("250 ");
-                    responseBuffer.append((String) esmtpextensions.get(i));
-                    session.writeResponse(session.clearResponseBuffer());
-                } else {
-                    responseBuffer.append("250-");
-                    responseBuffer.append((String) esmtpextensions.get(i));
-                    session.writeResponse(session.clearResponseBuffer());
-                }
-            }
-        }
-    }
-
-}
+/***********************************************************************
+ * 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 java.net.UnknownHostException;
+import java.util.ArrayList;
+
+/**
+  * Handles EHLO command
+  */
+public class EhloCmdHandler extends AbstractLogEnabled implements CommandHandler,Configurable {
+
+    /**
+     * The name of the command handled by the command handler
+     */
+    private final static String COMMAND_NAME = "EHLO";
+
+    /**
+     * The helo mode set in state object
+     */
+    private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // HELO or EHLO
+
+    /**
+     * set checkValidHelo to false as default value
+     */
+    private boolean checkValidEhlo = false;
+    
+    /**
+     * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
+     */
+    public void configure(Configuration handlerConfiguration) throws ConfigurationException {
+        Configuration configuration = handlerConfiguration.getChild("checkValidEhlo",false);
+        if(configuration != null) {
+           checkValidEhlo = configuration.getValueAsBoolean();
+        }
+    }
+
+    /*
+     * processes EHLO command
+     *
+     * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
+    **/
+    public void onCommand(SMTPSession session) {
+        doEHLO(session, session.getCommandArgument());
+    }
+
+    /**
+     * Handler method called upon receipt of a EHLO command.
+     * Responds with a greeting and informs the client whether
+     * client authentication is required.
+     *
+     * @param session SMTP session object
+     * @param argument the argument passed in with the command by the SMTP client
+     */
+    private void doEHLO(SMTPSession session, String argument) {
+        String responseString = null;
+        StringBuffer responseBuffer = session.getResponseBuffer();
+        boolean badEhlo = false;
+        
+        // check for helo if its set in config
+        if (checkValidEhlo == true) {
+             
+            // try to resolv the provided helo. If it can not resolved do not accept it.
+            try {
+                org.apache.james.dnsserver.DNSServer.getByName(argument);
+            } catch (UnknownHostException e) {
+                badEhlo = true;
+                responseString = "501 Ehlo can not resolved";
+                session.writeResponse(responseString);
+                getLogger().info(responseString);
+            }
+        }
+        
+        if (argument == null) {
+            responseString = "501 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Domain address required: " + COMMAND_NAME;
+            session.writeResponse(responseString);
+        } else if (badEhlo == false){
+            session.resetState();
+            session.getState().put(CURRENT_HELO_MODE, COMMAND_NAME);
+
+            ArrayList esmtpextensions = new ArrayList();
+
+            esmtpextensions.add(new StringBuffer(session.getConfigurationData().getHelloName())
+                .append(" Hello ")
+                .append(argument)
+                .append(" (")
+                .append(session.getRemoteHost())
+                .append(" [")
+                .append(session.getRemoteIPAddress())
+                .append("])").toString());
+
+            // Extension defined in RFC 1870
+            long maxMessageSize = session.getConfigurationData().getMaxMessageSize();
+            if (maxMessageSize > 0) {
+                esmtpextensions.add("SIZE " + maxMessageSize);
+            }
+
+            if (session.isAuthRequired()) {
+                esmtpextensions.add("AUTH LOGIN PLAIN");
+                esmtpextensions.add("AUTH=LOGIN PLAIN");
+            }
+
+            esmtpextensions.add("PIPELINING");
+            esmtpextensions.add("ENHANCEDSTATUSCODES");
+            esmtpextensions.add("8BITMIME");
+
+
+            // Iterator i = esmtpextensions.iterator();
+            for (int i = 0; i < esmtpextensions.size(); i++) {
+                if (i == esmtpextensions.size() - 1) {
+                    responseBuffer.append("250 ");
+                    responseBuffer.append((String) esmtpextensions.get(i));
+                    session.writeResponse(session.clearResponseBuffer());
+                } else {
+                    responseBuffer.append("250-");
+                    responseBuffer.append((String) esmtpextensions.get(i));
+                    session.writeResponse(session.clearResponseBuffer());
+                }
+            }
+        }
+    }
+
+}

Modified: james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java?rev=390122&r1=390121&r2=390122&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java (original)
+++ james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java Thu Mar 30 05:30:32 2006
@@ -266,6 +266,7 @@
 
         smtpProtocol1.quit();
     }
+    
     public void testHeloResolv() throws Exception, SMTPException {
         m_testConfiguration.setHeloResolv();
         finishSetUp(m_testConfiguration);
@@ -305,6 +306,49 @@
         SMTPResponse response = smtpProtocol1.getResponse();
         // helo should not be checked. so this should give a 250 code
         assertEquals("Helo accepted", 250, response.getCode());
+
+        smtpProtocol1.quit();
+    }
+    
+    public void testEhloResolv() throws Exception, SMTPException {
+        m_testConfiguration.setEhloResolv();
+        finishSetUp(m_testConfiguration);
+
+
+        MySMTPProtocol smtpProtocol1 = new MySMTPProtocol("127.0.0.1", m_smtpListenerPort);
+        smtpProtocol1.openPort();
+
+        assertEquals("first connection taken", 1, smtpProtocol1.getState());
+
+        // no message there, yet
+        assertNull("no mail received by mail server", m_mailServer.getLastMail());
+
+        String[] ehlo1 = new String[] { "abgsfe3rsf.de"};
+        String[] ehlo2 = new String[] { "james.apache.org" };
+        
+        smtpProtocol1.sendCommand("ehlo",ehlo1);
+        SMTPResponse response = smtpProtocol1.getResponse();
+        // this should give a 501 code cause the ehlo could not resolved
+        assertEquals("expected error: ehlo could not resolved", 501, response.getCode());
+            
+        smtpProtocol1.sendCommand("ehlo", ehlo2);
+        SMTPResponse response2 = smtpProtocol1.getResponse();
+        // ehlo is resolvable. so this should give a 250 code
+        assertEquals("ehlo accepted", 250, response2.getCode());
+
+        smtpProtocol1.quit();
+    }
+    
+    public void testEhloResolvDefault() throws Exception, SMTPException {
+        finishSetUp(m_testConfiguration);
+
+        MySMTPProtocol smtpProtocol1 = new MySMTPProtocol("127.0.0.1", m_smtpListenerPort);
+        smtpProtocol1.openPort();
+        
+        smtpProtocol1.sendCommand("ehlo",new String[]{"abgsfe3rsf.de"});
+        SMTPResponse response = smtpProtocol1.getResponse();
+        // ehlo should not be checked. so this should give a 250 code
+        assertEquals("ehlo accepted", 250, response.getCode());
 
         smtpProtocol1.quit();
     }

Modified: james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java?rev=390122&r1=390121&r2=390122&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java (original)
+++ james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java Thu Mar 30 05:30:32 2006
@@ -30,7 +30,8 @@
     private boolean m_verifyIdentity = false;
     private Integer m_connectionLimit = null;
     private boolean m_heloResolv = false;
-
+    private boolean m_ehloResolv = false;
+    
     public SMTPTestConfiguration(int smtpListenerPort) {
         super("smptserver");
 
@@ -76,6 +77,10 @@
     public void setHeloResolv() {
         m_heloResolv = true; 
     }
+    
+    public void setEhloResolv() {
+        m_ehloResolv = true; 
+    }
 
     public void init() {
 
@@ -94,10 +99,10 @@
         
         handlerConfig.addChild(Util.createRemoteManagerHandlerChainConfiguration());
         
-        // Add Configuration for Helo checks
-
+        // Add Configuration for Helo checks and Ehlo checks
         DefaultConfiguration heloConfig = (DefaultConfiguration) handlerConfig.getChild("handlerchain").getChild("handler");
         heloConfig.addChild(Util.getValuedConfiguration("checkValidHelo",m_heloResolv+""));     
+        heloConfig.addChild(Util.getValuedConfiguration("checkValidEhlo",m_ehloResolv+""));  
         
         addChild(handlerConfig);
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


RE: svn commit: r390122 - in /james/server/trunk/src: java/org/apache/james/smtpserver/EhloCmdHandler.java test/org/apache/james/smtpserver/SMTPServerTest.java test/org/apache/james/smtpserver/SMTPTestConfiguration.java

Posted by "Noel J. Bergman" <no...@devtech.com>.
> +                responseString = "501 Ehlo can not resolved";

Shouldn't that be EHLO?  A bit too aggressive on the case folding?

Personally, I think that it ought to be all upper case everywhere, since that is the name of the command in the specification, but certainly in emitted text.

And, while on the subject of log messages, at pet peeve of mine, this one should stand for all similar ones that are bad (in my view).  Look at the message:

+                responseString = "501 Ehlo can not resolved";
+                session.writeResponse(responseString);
+                getLogger().info(responseString);

Minorly, it is the name passed to EHLO that cannot be resolved, but more importantly, we should log the name that could not be resolved.

At some point, we should audit our logging to be more consistent, and to make sure that we are providing the right level of diagnostic information in the messages.

	--- Noel


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org