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/12/26 18:06:05 UTC
svn commit: r490331 - in
/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james:
core/ smtpserver/ smtpserver/core/ smtpserver/core/filter/fastfail/ util/
Author: bago
Date: Tue Dec 26 09:06:03 2006
New Revision: 490331
URL: http://svn.apache.org/viewvc?view=rev&rev=490331
Log:
SMTPSession cleanup, changed CRLFDelimitedByteBuffer to automatically manage reads from InputStream
Modified:
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPSession.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AuthCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/UnknownCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/GreylistHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/util/CRLFDelimitedByteBuffer.java
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java?view=diff&rev=490331&r1=490330&r2=490331
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java Tue Dec 26 09:06:03 2006
@@ -159,7 +159,7 @@
outs = new SplitOutputStream(outs, new FileOutputStream(tcplogprefix+"out"));
in = new CopyInputStream(in, new FileOutputStream(tcplogprefix+"in"));
}
- bytebufferHandler = new CRLFDelimitedByteBuffer();
+ bytebufferHandler = new CRLFDelimitedByteBuffer(in);
out = new InternetPrintWriter(outs, true);
} catch (RuntimeException e) {
@@ -453,20 +453,10 @@
public final byte[] readInputLine() throws IOException {
- byte[] buffer = new byte[1000];
- while (bytebufferHandler.isEmpty()) {
- int length = in.read(buffer);
- bytebufferHandler.write(buffer, length);
- }
return bytebufferHandler.read();
}
public final String readInputLineAsString() throws IOException {
- byte[] buffer = new byte[1000];
- while (bytebufferHandler.isEmpty()) {
- int length = in.read(buffer);
- bytebufferHandler.write(buffer, length);
- }
return bytebufferHandler.readString();
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandler.java?view=diff&rev=490331&r1=490330&r2=490331
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandler.java Tue Dec 26 09:06:03 2006
@@ -75,16 +75,6 @@
private final static RFC822DateFormat rfc822DateFormat = new RFC822DateFormat();
/**
- * The name of the currently parsed command
- */
- String curCommandName = null;
-
- /**
- * The value of the currently parsed command
- */
- String curCommandArgument = null;
-
- /**
* The SMTPHandlerChain object set by SMTPServer
*/
SMTPHandlerChain handlerChain = null;
@@ -147,11 +137,6 @@
private HashMap connectionState = new HashMap();
/**
- * The per-handler response buffer used to marshal responses.
- */
- private StringBuffer responseBuffer = new StringBuffer(256);
-
- /**
* If not null every line is sent to this command handler instead
* of the default "command parsing -> dipatching" procedure.
*/
@@ -192,23 +177,22 @@
// resetState();
// resetConnectionState();
+ SMTPResponse welcomeResponse;
// if no greeting was configured use a default
if (smtpGreeting == null) {
// Initially greet the connector
// Format is: Sat, 24 Jan 1998 13:16:09 -0500
-
- responseBuffer.append("220 ")
+ welcomeResponse = new SMTPResponse("220",
+ new StringBuffer(256)
.append(theConfigData.getHelloName())
.append(" SMTP Server (")
.append(SOFTWARE_TYPE)
.append(") ready ")
- .append(rfc822DateFormat.format(new Date()));
+ .append(rfc822DateFormat.format(new Date())));
} else {
- responseBuffer.append("220 ")
- .append(smtpGreeting);
+ welcomeResponse = new SMTPResponse("220",smtpGreeting);
}
- String responseString = clearResponseBuffer();
- writeLoggedFlushedResponse(responseString);
+ writeSMTPResponse(welcomeResponse);
//the core in-protocol handling logic
//run all the connection handlers, if it fast fails, end the session
@@ -250,8 +234,6 @@
theWatchdog.start();
while(!sessionEnded) {
//Reset the current command values
- curCommandName = null;
- curCommandArgument = null;
mode = COMMAND_MODE;
//parse the command
@@ -312,6 +294,8 @@
cmdString = cmdString.trim();
}
+ String curCommandArgument = null;
+ String curCommandName = null;
int spaceIndex = cmdString.indexOf(" ");
if (spaceIndex > 0) {
curCommandName = cmdString.substring(0, spaceIndex);
@@ -357,19 +341,22 @@
} else {
// Iterator i = esmtpextensions.iterator();
for (int k = 0; k < response.getLines().size(); k++) {
- responseBuffer.append(response.getRetCode());
+ StringBuffer respBuff = new StringBuffer(256);
+ respBuff.append(response.getRetCode());
if (k == response.getLines().size() - 1) {
- responseBuffer.append(" ");
+ respBuff.append(" ");
+ respBuff.append(response.getLines().get(k));
+ writeResponse(respBuff.toString());
} else {
- responseBuffer.append("-");
+ respBuff.append("-");
+ respBuff.append(response.getLines().get(k));
+ writeResponse(respBuff.toString());
}
- responseBuffer.append(response.getLines().get(k));
- writeResponse(clearResponseBuffer());
}
}
if (response.isEndSession()) {
- endSession();
+ sessionEnded = true;
}
}
}
@@ -387,8 +374,6 @@
lineHandlers = null;
pushLineHandler(this);
- clearResponseBuffer();
-
authenticatedUser = null;
smtpID = null;
sessionEnded = false;
@@ -413,20 +398,6 @@
}
/**
- * @see org.apache.james.smtpserver.SMTPSession#getCommandName()
- */
- public String getCommandName() {
- return curCommandName;
- }
-
- /**
- * @see org.apache.james.smtpserver.SMTPSession#getCommandArgument()
- */
- public String getCommandArgument() {
- return curCommandArgument;
- }
-
- /**
* @see org.apache.james.smtpserver.SMTPSession#getMail()
*/
public Mail getMail() {
@@ -456,13 +427,6 @@
}
/**
- * @see org.apache.james.smtpserver.SMTPSession#endSession()
- */
- public void endSession() {
- sessionEnded = true;
- }
-
- /**
* @see org.apache.james.smtpserver.SMTPSession#resetState()
*/
public void resetState() {
@@ -545,22 +509,6 @@
*/
public void setUser(String userID) {
authenticatedUser = userID;
- }
-
- /**
- * @see org.apache.james.smtpserver.SMTPSession#getResponseBuffer()
- */
- public StringBuffer getResponseBuffer() {
- return responseBuffer;
- }
-
- /**
- * @see org.apache.james.smtpserver.SMTPSession#clearResponseBuffer()
- */
- public String clearResponseBuffer() {
- String responseString = responseBuffer.toString();
- responseBuffer.delete(0,responseBuffer.length());
- return responseString;
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPSession.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPSession.java?view=diff&rev=490331&r1=490330&r2=490331
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPSession.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPSession.java Tue Dec 26 09:06:03 2006
@@ -43,51 +43,6 @@
public final static String SESSION_STATE_MAP = "SESSION_STATE_MAP"; // the Session state
/**
- * Writes response string to the client
- *
- * @param respString String that needs to send to the client
- */
- // void writeResponse(String respString);
-
- /**
- * Reads a line of characters off the command line.
- *
- * @return the trimmed input line
- * @throws IOException if an exception is generated reading in the input characters
- */
- // String readCommandLine() throws IOException;
-
-
- /**
- * Returns ResponseBuffer, this optimizes the unecessary creation of resources
- * by each handler object
- *
- * @return responseBuffer
- */
- StringBuffer getResponseBuffer();
-
- /**
- * Clears the response buffer, returning the String of characters in the buffer.
- *
- * @return the data in the response buffer
- */
- String clearResponseBuffer();
-
- /**
- * Returns currently process command name
- *
- * @return current command name
- */
- String getCommandName();
-
- /**
- * Returns currently process command argument
- *
- * @return current command argument
- */
- String getCommandArgument();
-
- /**
* Returns Mail object for message handlers to process
*
* @return Mail object
@@ -120,12 +75,6 @@
*
*/
void abortMessage();
-
- /**
- * this makes the session to close
- *
- */
- void endSession();
/**
* Returns Map that consists of the state of the SMTPSession per mail
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AuthCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AuthCmdHandler.java?view=diff&rev=490331&r1=490330&r2=490331
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AuthCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AuthCmdHandler.java Tue Dec 26 09:06:03 2006
@@ -95,6 +95,7 @@
String l = new String(line, "US-ASCII");
//System.err.println("((("+line+")))");
SMTPResponse res = doPlainAuthPass(session, l);
+ session.popLineHandler();
session.writeSMTPResponse(res);
} catch (UnsupportedEncodingException e) {
// TODO should never happen
@@ -115,7 +116,9 @@
public void onLine(SMTPSession session, byte[] line) {
try {
- session.writeSMTPResponse(doLoginAuthPass(session, new String(line, "US-ASCII"), true));
+ SMTPResponse res = doLoginAuthPass(session, new String(line, "US-ASCII"));
+ session.popLineHandler();
+ session.writeSMTPResponse(res);
} catch (UnsupportedEncodingException e) {
// TODO should never happen
e.printStackTrace();
@@ -126,7 +129,7 @@
return new SMTPResponse("334", "VXNlcm5hbWU6"); // base64 encoded "Username:"
} else {
String user = initialResponse.trim();
- return doLoginAuthPass(session, user, false);
+ return doLoginAuthPass(session, user);
}
} else {
return doUnknownAuth(session, authType, initialResponse);
@@ -202,7 +205,6 @@
// Ignored - this exception in parsing will be dealt
// with in the if clause below
}
- session.popLineHandler();
// Authenticate user
if ((user == null) || (pass == null)) {
return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, "Could not decode parameters for AUTH PLAIN");
@@ -222,7 +224,7 @@
* @param session SMTP session object
* @param initialResponse the initial response line passed in with the AUTH command
*/
- private SMTPResponse doLoginAuthPass(SMTPSession session, String user, boolean inCustomeHandler) {
+ private SMTPResponse doLoginAuthPass(SMTPSession session, String user) {
if (user != null) {
try {
user = Base64.decodeAsString(user);
@@ -232,16 +234,15 @@
user = null;
}
}
- if (inCustomeHandler) {
- session.popLineHandler();
- }
session.pushLineHandler(new LineHandler() {
private String user;
public void onLine(SMTPSession session, byte[] line) {
try {
- doLoginAuthPassCheck(session, user, new String(line, "US-ASCII"));
+ SMTPResponse res = doLoginAuthPassCheck(session, user, new String(line, "US-ASCII"));
+ session.popLineHandler();
+ session.writeSMTPResponse(res);
} catch (UnsupportedEncodingException e) {
// TODO should never happen
e.printStackTrace();
@@ -257,7 +258,7 @@
return new SMTPResponse("334", "UGFzc3dvcmQ6"); // base64 encoded "Password:"
}
- private void doLoginAuthPassCheck(SMTPSession session, String user, String pass) {
+ private SMTPResponse doLoginAuthPassCheck(SMTPSession session, String user, String pass) {
SMTPResponse response = null;
if (pass != null) {
try {
@@ -283,9 +284,7 @@
// TODO: Make this string a more useful error message
getLogger().error("AUTH method LOGIN failed");
}
- session.popLineHandler();
- session.popLineHandler();
- session.writeSMTPResponse(response);
+ return response;
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java?view=diff&rev=490331&r1=490330&r2=490331
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java Tue Dec 26 09:06:03 2006
@@ -44,7 +44,7 @@
* @see org.apache.james.smtpserver.CommandHandler#onCommand(org.apache.james.smtpserver.SMTPSession, java.lang.String, java.lang.String)
**/
public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
- return doRSET(session, session.getCommandArgument());
+ return doRSET(session, parameters);
}
@@ -70,7 +70,7 @@
*/
public Collection getImplCommands() {
Collection implCommands = new ArrayList();
- implCommands.add("RSET");
+ implCommands.add(COMMAND_NAME);
return implCommands;
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/UnknownCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/UnknownCmdHandler.java?view=diff&rev=490331&r1=490330&r2=490331
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/UnknownCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/UnknownCmdHandler.java Tue Dec 26 09:06:03 2006
@@ -55,7 +55,7 @@
StringBuffer result = new StringBuffer();
result.append(DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_INVALID_CMD))
.append(" Command ")
- .append(session.getCommandName())
+ .append(command)
.append(" unrecognized.");
return new SMTPResponse("500", result);
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/GreylistHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/GreylistHandler.java?view=diff&rev=490331&r1=490330&r2=490331
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/GreylistHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/GreylistHandler.java Tue Dec 26 09:06:03 2006
@@ -292,7 +292,7 @@
if (!session.isRelayingAllowed() && !(session.isAuthRequired() && session.getUser() != null)) {
if ((wNetworks == null) || (!wNetworks.matchInetNetwork(session.getRemoteIPAddress()))) {
- return doGreyListCheck(session, session.getCommandArgument());
+ return doGreyListCheck(session, arguments);
} else {
getLogger().info("IpAddress " + session.getRemoteIPAddress() + " is whitelisted. Skip greylisting.");
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/util/CRLFDelimitedByteBuffer.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/util/CRLFDelimitedByteBuffer.java?view=diff&rev=490331&r1=490330&r2=490331
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/util/CRLFDelimitedByteBuffer.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/util/CRLFDelimitedByteBuffer.java Tue Dec 26 09:06:03 2006
@@ -20,6 +20,9 @@
package org.apache.james.util;
+import java.io.IOException;
+import java.io.InputStream;
+
/*
* A simple, synchronized, queue of CRLF-delimited lines.
*
@@ -81,11 +84,14 @@
}
}
- public CRLFDelimitedByteBuffer() {
- this(2048);
+ private InputStream input;
+
+ public CRLFDelimitedByteBuffer(InputStream input) {
+ this(input, 2048);
}
- public CRLFDelimitedByteBuffer(int maxLineLength) {
+ public CRLFDelimitedByteBuffer(InputStream input, int maxLineLength) {
+ this.input = input;
lines = new java.util.ArrayList();
workLine = new byte[maxLineLength];
}
@@ -94,11 +100,21 @@
return lines.isEmpty();
}
- synchronized public byte[] read() throws LineLengthExceededException, TerminationException {
+ synchronized public byte[] read() throws IOException, LineLengthExceededException, TerminationException {
+ byte[] buffer = new byte[1000];
+ while (isEmpty()) {
+ int length = input.read(buffer);
+ write(buffer, length);
+ }
return lines.isEmpty() ? null : ((Line) lines.remove(0)).getBytes();
}
- synchronized public String readString() throws LineLengthExceededException, TerminationException {
+ synchronized public String readString() throws IOException, LineLengthExceededException, TerminationException {
+ byte[] buffer = new byte[1000];
+ while (isEmpty()) {
+ int length = input.read(buffer);
+ write(buffer, length);
+ }
if (lines.isEmpty()) return null;
else {
byte[] bytes = ((Line) lines.remove(0)).getBytes();
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org