Author: bago Date: Thu Mar 30 04:08:43 2006 New Revision: 390102 URL: http://svn.apache.org/viewcvs?rev=390102&view=rev Log: Check for valid domain in HELO - patch by Norman Maurer (JAMES-451)
Modified: james/server/trunk/src/conf/james-config.xml james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.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/conf/james-config.xml URL: http://svn.apache.org/viewcvs/james/server/trunk/src/conf/james-config.xml?rev=390102&r1=390101&r2=390102&view=diff ============================================================================== --- james/server/trunk/src/conf/james-config.xml (original) +++ james/server/trunk/src/conf/james-config.xml Thu Mar 30 04:08:43 2006 @@ -706,7 +706,11 @@ --> <!-- The command handler configuration --> - <handler command="HELO" class="org.apache.james.smtpserver.HeloCmdHandler"></handler> + <handler command="HELO" class="org.apache.james.smtpserver.HeloCmdHandler"> + <!-- If is set to true helo is only accepted if it can be resolved + <checkValidHelo> false </checkValidHelo> + --> + </handler> <handler command="EHLO" class="org.apache.james.smtpserver.EhloCmdHandler"></handler> <handler command="AUTH" class="org.apache.james.smtpserver.AuthCmdHandler"></handler> <handler command="VRFY" class="org.apache.james.smtpserver.VrfyCmdHandler"></handler> Modified: james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java URL: http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java?rev=390102&r1=390101&r2=390102&view=diff ============================================================================== --- james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java (original) +++ james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java Thu Mar 30 04:08:43 2006 @@ -1,78 +1,119 @@ -/*********************************************************************** - * 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; - -/** - * Handles HELO command - */ -public class HeloCmdHandler implements CommandHandler { - - /** - * The name of the command handled by the command handler - */ - private final static String COMMAND_NAME = "HELO"; - - /** - * The key used to store helo mode - */ - private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // HELO or EHLO - - /* - * process HELO command - * - * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession) - **/ - public void onCommand(SMTPSession session) { - doHELO(session, session.getCommandArgument()); - - } - - /** - * Handler method called upon receipt of a HELO 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 doHELO(SMTPSession session, String argument) { - String responseString = null; - if (argument == null) { - responseString = "501 Domain address required: " + COMMAND_NAME; - session.writeResponse(responseString); - } else { - session.resetState(); - session.getState().put(CURRENT_HELO_MODE, COMMAND_NAME); - session.getResponseBuffer().append("250 ") - .append(session.getConfigurationData().getHelloName()) - .append(" Hello ") - .append(argument) - .append(" (") - .append(session.getRemoteHost()) - .append(" [") - .append(session.getRemoteIPAddress()) - .append("])"); - responseString = session.clearResponseBuffer(); - session.writeResponse(responseString); - } - } - - - - -} +/*********************************************************************** + * 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 java.net.UnknownHostException; +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; + + +/** + * Handles HELO command + */ +public class HeloCmdHandler extends AbstractLogEnabled implements CommandHandler,Configurable { + + /** + * The name of the command handled by the command handler + */ + private final static String COMMAND_NAME = "HELO"; + + /** + * The key used to store helo mode + */ + private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // HELO or EHLO + + /** + * set checkValidHelo to false as default value + */ + private boolean checkValidHelo = false; + + /** + * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration) + */ + public void configure(Configuration handlerConfiguration) throws ConfigurationException { + Configuration configuration = handlerConfiguration.getChild("checkValidHelo",false); + if(configuration != null) { + checkValidHelo = configuration.getValueAsBoolean(); + } + } + + /* + * process HELO command + * + * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession) + **/ + public void onCommand(SMTPSession session) { + doHELO(session, session.getCommandArgument()); + + } + + /** + * Handler method called upon receipt of a HELO 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 doHELO(SMTPSession session, String argument) { + String responseString = null; + boolean badHelo = false; + + + // check for helo if its set in config + if (checkValidHelo == 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) { + badHelo = true; + responseString = "501 Helo can not resolved"; + session.writeResponse(responseString); + getLogger().info(responseString); + } + } + + if (argument == null) { + responseString = "501 Domain address required: " + COMMAND_NAME; + session.writeResponse(responseString); + getLogger().info(responseString); + } else if (badHelo == false) { + session.resetState(); + session.getState().put(CURRENT_HELO_MODE, COMMAND_NAME); + session.getResponseBuffer().append("250 ") + .append(session.getConfigurationData().getHelloName()) + .append(" Hello ") + .append(argument) + .append(" (") + .append(session.getRemoteHost()) + .append(" [") + .append(session.getRemoteIPAddress()) + .append("])"); + responseString = session.clearResponseBuffer(); + session.writeResponse(responseString); + } + } + + + + +} 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=390102&r1=390101&r2=390102&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 04:08:43 2006 @@ -266,7 +266,49 @@ smtpProtocol1.quit(); } + public void testHeloResolv() throws Exception, SMTPException { + m_testConfiguration.setHeloResolv(); + 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[] helo1 = new String[] { "abgsfe3rsf.de"}; + String[] helo2 = new String[] { "james.apache.org" }; + + smtpProtocol1.sendCommand("helo",helo1); + SMTPResponse response = smtpProtocol1.getResponse(); + // this should give a 501 code cause the helo could not resolved + assertEquals("expected error: helo could not resolved", 501, response.getCode()); + + smtpProtocol1.sendCommand("helo", helo2); + SMTPResponse response2 = smtpProtocol1.getResponse(); + // helo is resolvable. so this should give a 250 code + assertEquals("Helo accepted", 250, response2.getCode()); + + smtpProtocol1.quit(); + } + + public void testHeloResolvDefault() throws Exception, SMTPException { + finishSetUp(m_testConfiguration); + + MySMTPProtocol smtpProtocol1 = new MySMTPProtocol("127.0.0.1", m_smtpListenerPort); + smtpProtocol1.openPort(); + + smtpProtocol1.sendCommand("helo",new String[]{"abgsfe3rsf.de"}); + 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 testHeloEnforcement() throws Exception, SMTPException { finishSetUp(m_testConfiguration); 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=390102&r1=390101&r2=390102&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 04:08:43 2006 @@ -29,6 +29,7 @@ private String m_authorizingMode = "false"; private boolean m_verifyIdentity = false; private Integer m_connectionLimit = null; + private boolean m_heloResolv = false; public SMTPTestConfiguration(int smtpListenerPort) { super("smptserver"); @@ -71,6 +72,10 @@ public void setConnectionLimit(int iConnectionLimit) { m_connectionLimit = new Integer(iConnectionLimit); } + + public void setHeloResolv() { + m_heloResolv = true; + } public void init() { @@ -86,8 +91,14 @@ handlerConfig.addChild(Util.getValuedConfiguration("maxmessagesize", "" + m_maxMessageSize)); handlerConfig.addChild(Util.getValuedConfiguration("authRequired", m_authorizingMode)); if (m_verifyIdentity) handlerConfig.addChild(Util.getValuedConfiguration("verifyIdentity", "" + m_verifyIdentity)); - + handlerConfig.addChild(Util.createRemoteManagerHandlerChainConfiguration()); + + // Add Configuration for Helo checks + + DefaultConfiguration heloConfig = (DefaultConfiguration) handlerConfig.getChild("handlerchain").getChild("handler"); + heloConfig.addChild(Util.getValuedConfiguration("checkValidHelo",m_heloResolv+"")); + addChild(handlerConfig); } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]