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/01 11:16:15 UTC
svn commit: r381973 - in /james/server/trunk/src:
java/org/apache/james/smtpserver/ test/org/apache/james/smtpserver/
Author: bago
Date: Wed Mar 1 02:16:12 2006
New Revision: 381973
URL: http://svn.apache.org/viewcvs?rev=381973&view=rev
Log:
Enforcement for HELO/EHLO commands before MAIL (JAMES-445)
Add failed recipient address to log when authorization fails (JAMES-437)
Added a few SMTPServer tests, removed unused HashMap from SMTPSession.
Modified:
james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java
james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java
Modified: james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java?rev=381973&r1=381972&r2=381973&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java (original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java Wed Mar 1 02:16:12 2006
@@ -36,6 +36,11 @@
private final static String SENDER = "SENDER_ADDRESS"; // Sender's email address
+ /**
+ * The helo mode set in state object
+ */
+ private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // HELO or EHLO
+
/*
* handles MAIL command
*
@@ -65,6 +70,9 @@
}
if (session.getState().containsKey(SENDER)) {
responseString = "503 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Sender already specified";
+ session.writeResponse(responseString);
+ } else if (!session.getState().containsKey(CURRENT_HELO_MODE)) {
+ responseString = "503 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Need HELO or EHLO before MAIL";
session.writeResponse(responseString);
} else if (argument == null || !argument.toUpperCase(Locale.US).equals("FROM")
|| sender == null) {
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=381973&r1=381972&r2=381973&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 Wed Mar 1 02:16:12 2006
@@ -96,8 +96,8 @@
StringBuffer errorBuffer =
new StringBuffer(192)
.append("Error parsing recipient address: ")
- .append(recipient)
- .append(": did not start and end with < >");
+ .append("Address did not start and end with < >")
+ .append(getContext(session,null,recipient));
getLogger().error(errorBuffer.toString());
}
return;
@@ -123,8 +123,7 @@
StringBuffer errorBuffer =
new StringBuffer(192)
.append("Error parsing recipient address: ")
- .append(recipient)
- .append(": ")
+ .append(getContext(session,recipientAddress,recipient))
.append(pe.getMessage());
getLogger().error(errorBuffer.toString());
}
@@ -149,7 +148,10 @@
if (!session.getConfigurationData().getMailServer().isLocalServer(toDomain)) {
responseString = "530 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Authentication Required";
session.writeResponse(responseString);
- getLogger().error("Rejected message - authentication is required for mail request");
+ 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 {
@@ -168,7 +170,8 @@
.append("User ")
.append(authUser)
.append(" authenticated, however tried sending email as ")
- .append(senderAddress);
+ .append(senderAddress)
+ .append(getContext(session,recipientAddress,recipient));
getLogger().error(errorBuffer.toString());
}
return;
@@ -180,7 +183,13 @@
if (!session.getConfigurationData().getMailServer().isLocalServer(toDomain)) {
responseString = "550 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH)+" Requested action not taken: relaying denied";
session.writeResponse(responseString);
- getLogger().error("Rejected message - " + session.getRemoteIPAddress() + " not authorized to relay to " + toDomain);
+ 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;
}
}
@@ -203,7 +212,8 @@
.append("RCPT command had unrecognized/unexpected option ")
.append(rcptOptionName)
.append(" with value ")
- .append(rcptOptionValue);
+ .append(rcptOptionValue)
+ .append(getContext(session,recipientAddress,recipient));
getLogger().debug(debugBuffer.toString());
}
}
@@ -220,4 +230,16 @@
}
+ 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(SENDER)) {
+ sb.append(" [from:" + ((MailAddress)session.getState().get(SENDER)).toInternetAddress().getAddress() + "]");
+ }
+ return sb.toString();
+ }
}
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=381973&r1=381972&r2=381973&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 Wed Mar 1 02:16:12 2006
@@ -78,6 +78,7 @@
private final static String SENDER = "SENDER_ADDRESS"; // Sender's email address
private final static String MESG_FAILED = "MESG_FAILED"; // Message failed flag
private final static String RCPT_LIST = "RCPT_LIST"; // The message recipients
+ private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // HELO or EHLO
/**
* Static Random instance used to generate SMTP ids
@@ -212,12 +213,6 @@
/**
- * The per-handler map to store session scope variables
- * the various handlers use this for storing state information
- */
- private HashMap sessionState = new HashMap();
-
- /**
* The per-handler map to store message scope variables
* the various handlers use this for storing state information
*/
@@ -441,11 +436,20 @@
if (mail instanceof Disposable) {
((Disposable) mail).dispose();
}
+
+ // remember the ehlo mode
+ Object currentHeloMode = state.get(CURRENT_HELO_MODE);
+
mail = null;
resetState();
//reset the message scope state
messageState.clear();
+
+ // start again with the old helo mode
+ if (currentHeloMode != null) {
+ state.put(CURRENT_HELO_MODE,currentHeloMode);
+ }
}
}
@@ -492,7 +496,6 @@
}
} finally {
//Clear all the session state variables
- sessionState.clear();
resetHandler();
}
}
@@ -872,12 +875,5 @@
return messageState;
}
-
- /**
- * @see org.apache.james.smtpserver.SMTPSession#getSessionState()
- */
- public HashMap getSessionState() {
- return sessionState;
- }
}
Modified: james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java?rev=381973&r1=381972&r2=381973&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java (original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java Wed Mar 1 02:16:12 2006
@@ -216,12 +216,5 @@
HashMap getMessageState();
- /**
- * Used for storing Session scope variables
- *
- * @return map of session scope param-values
- */
- HashMap getSessionState();
-
}
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=381973&r1=381972&r2=381973&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 Wed Mar 1 02:16:12 2006
@@ -157,6 +157,8 @@
// no message there, yet
assertNull("no mail received by mail server", m_mailServer.getLastMail());
+ smtpProtocol.helo(InetAddress.getLocalHost());
+
smtpProtocol.mail(new Address("mail@localhost"));
smtpProtocol.rcpt(new Address("mail@localhost"));
@@ -209,6 +211,7 @@
assertNull("no mail received by mail server", m_mailServer.getLastMail());
smtpProtocol1.helo(InetAddress.getLocalHost());
+ smtpProtocol2.helo(InetAddress.getLocalHost());
String sender1 = "mail_sender1@localhost";
String recipient1 = "mail_recipient1@localhost";
@@ -228,6 +231,64 @@
smtpProtocol1.quit();
smtpProtocol2.quit();
+ }
+
+ public void testTwoMailsInSequence() throws Exception, SMTPException {
+ finishSetUp(m_testConfiguration);
+
+ SMTPProtocol smtpProtocol1 = new SMTPProtocol("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());
+
+ smtpProtocol1.helo(InetAddress.getLocalHost());
+
+ String sender1 = "mail_sender1@localhost";
+ String recipient1 = "mail_recipient1@localhost";
+ smtpProtocol1.mail(new Address(sender1));
+ smtpProtocol1.rcpt(new Address(recipient1));
+
+ smtpProtocol1.data(MimeTreeRenderer.getInstance().renderMimePart(createMail()));
+ verifyLastMail(sender1, recipient1, null);
+
+ String sender2 = "mail_sender2@localhost";
+ String recipient2 = "mail_recipient2@localhost";
+ smtpProtocol1.mail(new Address(sender2));
+ smtpProtocol1.rcpt(new Address(recipient2));
+
+ smtpProtocol1.data(MimeTreeRenderer.getInstance().renderMimePart(createMail()));
+ verifyLastMail(sender2, recipient2, null);
+
+ smtpProtocol1.quit();
+ }
+
+ public void testHeloEnforcement() throws Exception, SMTPException {
+ finishSetUp(m_testConfiguration);
+
+ SMTPProtocol smtpProtocol1 = new SMTPProtocol("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 sender1 = "mail_sender1@localhost";
+ try {
+ smtpProtocol1.mail(new Address(sender1));
+ fail("helo not enforced");
+ } catch (SMTPException e) {
+ assertEquals("expected 503 error", 503, e.getCode());
+ }
+
+ smtpProtocol1.helo(InetAddress.getLocalHost());
+
+ smtpProtocol1.mail(new Address(sender1));
+
+ smtpProtocol1.quit();
}
public void testAuth() throws Exception, SMTPException {
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org