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("[EMAIL PROTECTED]"));
smtpProtocol.rcpt(new Address("[EMAIL PROTECTED]"));
@@ -209,6 +211,7 @@
assertNull("no mail received by mail server",
m_mailServer.getLastMail());
smtpProtocol1.helo(InetAddress.getLocalHost());
+ smtpProtocol2.helo(InetAddress.getLocalHost());
String sender1 = "[EMAIL PROTECTED]";
String recipient1 = "[EMAIL PROTECTED]";
@@ -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 = "[EMAIL PROTECTED]";
+ String recipient1 = "[EMAIL PROTECTED]";
+ smtpProtocol1.mail(new Address(sender1));
+ smtpProtocol1.rcpt(new Address(recipient1));
+
+
smtpProtocol1.data(MimeTreeRenderer.getInstance().renderMimePart(createMail()));
+ verifyLastMail(sender1, recipient1, null);
+
+ String sender2 = "[EMAIL PROTECTED]";
+ String recipient2 = "[EMAIL PROTECTED]";
+ 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 = "[EMAIL PROTECTED]";
+ 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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]