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 no...@apache.org on 2006/12/25 18:31:12 UTC
svn commit: r490155 [1/3] - in
/james/server/sandbox/handlerapi-experiment/src:
java/org/apache/james/core/ java/org/apache/james/nntpserver/
java/org/apache/james/pop3server/ java/org/apache/james/remotemanager/
java/org/apache/james/smtpserver/ java/...
Author: norman
Date: Mon Dec 25 09:31:07 2006
New Revision: 490155
URL: http://svn.apache.org/viewvc?view=rev&rev=490155
Log:
Commit the changes of Stefano for IO handling and some fixes of tests etc. See JAMES-750
Added:
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java (with props)
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java (with props)
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/util/CRLFDelimitedByteBuffer.java (with props)
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/util/mail/SMTPRetCode.java (with props)
Modified:
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/nntpserver/NNTPHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Handler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Session.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/CommandHandler.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/SMTPServer.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/DataCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/ExpnCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HelpCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/NoopCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.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/VrfyCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/DataFilterCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/HeloFilterCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/MailFilterCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/RcptFilterCmdHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/AbstractJunkHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/DNSRBLHandler.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/smtpserver/core/filter/fastfail/MaxRcptHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/ResolvableEhloHeloHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/SPFHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/SupressDuplicateRcptHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/TarpitHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidRcptHandler.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidRcptMX.java
james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidSenderDomainHandler.java
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/AbstractSMTPSession.java
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/MaxRcptHandlerTest.java
james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.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=490155&r1=490154&r2=490155
==============================================================================
--- 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 Mon Dec 25 09:31:07 2006
@@ -31,7 +31,7 @@
import org.apache.james.imapserver.debug.CopyInputStream;
import org.apache.james.imapserver.debug.SplitOutputStream;
import org.apache.james.services.DNSServer;
-import org.apache.james.util.CRLFTerminatedReader;
+import org.apache.james.util.CRLFDelimitedByteBuffer;
import org.apache.james.util.InternetPrintWriter;
import org.apache.james.util.watchdog.Watchdog;
import org.apache.james.util.watchdog.WatchdogTarget;
@@ -74,11 +74,11 @@
* The incoming stream of bytes coming from the socket.
*/
protected InputStream in;
-
+
/**
- * The reader associated with incoming characters.
+ * Manage inputstream as a bytebuffer
*/
- protected CRLFTerminatedReader inReader;
+ private CRLFDelimitedByteBuffer bytebufferHandler;
/**
* The socket's output stream
@@ -159,8 +159,8 @@
outs = new SplitOutputStream(outs, new FileOutputStream(tcplogprefix+"out"));
in = new CopyInputStream(in, new FileOutputStream(tcplogprefix+"in"));
}
- inReader = new CRLFTerminatedReader(in, "ASCII");
-
+ bytebufferHandler = new CRLFDelimitedByteBuffer();
+
out = new InternetPrintWriter(outs, true);
} catch (RuntimeException e) {
StringBuffer exceptionBuffer =
@@ -211,15 +211,15 @@
}
// Clear the streams
- try {
- if (inReader != null) {
- inReader.close();
- }
- } catch (IOException ioe) {
- getLogger().warn("Handler: Unexpected exception occurred while closing reader: " + ioe);
- } finally {
- inReader = null;
- }
+// try {
+// if (inReader != null) {
+// inReader.close();
+// }
+// } catch (IOException ioe) {
+// getLogger().warn("Handler: Unexpected exception occurred while closing reader: " + ioe);
+// } finally {
+// inReader = null;
+// }
in = null;
@@ -449,6 +449,25 @@
public void setDnsServer(DNSServer dnsServer) {
this.dnsServer = dnsServer;
+ }
+
+
+ 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/nntpserver/NNTPHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/nntpserver/NNTPHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/nntpserver/NNTPHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/nntpserver/NNTPHandler.java Mon Dec 25 09:31:07 2006
@@ -282,7 +282,7 @@
}
theWatchdog.start();
- while (parseCommand(inReader.readLine())) {
+ while (parseCommand(new String(readInputLine(), "US-ASCII"))) {
theWatchdog.reset();
}
theWatchdog.stop();
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Handler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Handler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Handler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Handler.java Mon Dec 25 09:31:07 2006
@@ -26,7 +26,7 @@
import org.apache.james.core.AbstractJamesHandler;
import org.apache.james.core.MailImpl;
import org.apache.james.services.MailRepository;
-import org.apache.james.util.CRLFTerminatedReader;
+import org.apache.james.util.CRLFDelimitedByteBuffer;
import org.apache.james.util.watchdog.Watchdog;
import org.apache.mailet.Mail;
@@ -208,7 +208,13 @@
mode = COMMAND_MODE;
//parse the command
- String cmdString = readCommandLine();
+ String cmdString = null;
+ try {
+ cmdString = readInputLineAsString();
+ } catch (CRLFDelimitedByteBuffer.TerminationException te) {
+ writeLoggedFlushedResponse("-ERR Syntax error at character position " + te.position() + ". CR and LF must be CRLF paired. See RFC 1939 #3.");
+ }
+
if (cmdString == null) {
break;
}
@@ -303,24 +309,6 @@
// Clear config data
theConfigData = null;
- }
-
- /**
- * 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
- */
- public final String readCommandLine() throws IOException {
- for (;;) try {
- String commandLine = inReader.readLine();
- if (commandLine != null) {
- commandLine = commandLine.trim();
- }
- return commandLine;
- } catch (CRLFTerminatedReader.TerminationException te) {
- writeLoggedFlushedResponse("-ERR Syntax error at character position " + te.position() + ". CR and LF must be CRLF paired. See RFC 1939 #3.");
- }
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Session.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Session.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Session.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Session.java Mon Dec 25 09:31:07 2006
@@ -25,7 +25,6 @@
import org.apache.james.services.MailRepository;
import org.apache.james.util.watchdog.Watchdog;
-import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
@@ -43,14 +42,6 @@
* @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;
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java Mon Dec 25 09:31:07 2006
@@ -151,9 +151,9 @@
writeLoggedFlushedResponse(message);
}
writeLoggedFlushedResponse("Login id:");
- login = inReader.readLine().trim();
+ login = readInputLineAsString().trim();
writeLoggedFlushedResponse("Password:");
- password = inReader.readLine().trim();
+ password = readInputLineAsString().trim();
} while (!password.equals(theConfigData.getAdministrativeAccountData().get(login)) || password.length() == 0);
StringBuffer messageBuffer =
@@ -176,7 +176,7 @@
out.print(theConfigData.getPrompt());
out.flush();
theWatchdog.start();
- while (parseCommand(inReader.readLine())) {
+ while (parseCommand(readInputLineAsString())) {
theWatchdog.reset();
out.print(theConfigData.getPrompt());
out.flush();
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/CommandHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/CommandHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/CommandHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/CommandHandler.java Mon Dec 25 09:31:07 2006
@@ -35,7 +35,7 @@
/**
* Handle the command
**/
- void onCommand(SMTPSession session);
+ SMTPResponse onCommand(SMTPSession session, String command, String parameters);
/**
* Return a Collection of implemented commands
Added: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java?view=auto&rev=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java (added)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java Mon Dec 25 09:31:07 2006
@@ -0,0 +1,32 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you 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;
+
+/**
+ * Custom line handlers must implement this interface
+ */
+public interface LineHandler {
+
+ /**
+ * Handle the command
+ **/
+ void onLine(SMTPSession session, byte[] line);
+
+}
Propchange: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
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=490155&r1=490154&r2=490155
==============================================================================
--- 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 Mon Dec 25 09:31:07 2006
@@ -24,17 +24,17 @@
import org.apache.avalon.framework.container.ContainerUtil;
import org.apache.james.Constants;
import org.apache.james.core.AbstractJamesHandler;
-import org.apache.james.util.CRLFTerminatedReader;
-import org.apache.james.util.watchdog.Watchdog;
+import org.apache.james.util.CRLFDelimitedByteBuffer;
import org.apache.mailet.Mail;
import org.apache.mailet.dates.RFC822DateFormat;
import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
+import java.io.UnsupportedEncodingException;
+import java.net.Socket;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -48,7 +48,7 @@
*/
public class SMTPHandler
extends AbstractJamesHandler
- implements SMTPSession {
+ implements SMTPSession, LineHandler {
/**
* The constants to indicate the current processing mode of the session
@@ -142,15 +142,6 @@
private SMTPHandlerConfigurationData theConfigData;
/**
- * The hash map that holds variables for the SMTP message transfer in progress.
- *
- * This hash map should only be used to store variable set in a particular
- * set of sequential MAIL-RCPT-DATA commands, as described in RFC 2821. Per
- * connection values should be stored as member variables in this class.
- */
- private HashMap state = new HashMap();
-
- /**
* The hash map holds states which should be used in the whole connection
*/
private HashMap connectionState = new HashMap();
@@ -161,6 +152,17 @@
private StringBuffer responseBuffer = new StringBuffer(256);
private boolean stopHandlerProcessing = false;
+
+ /**
+ * If not null every line is sent to this command handler instead
+ * of the default "command parsing -> dipatching" procedure.
+ */
+ private LinkedList lineHandlers;
+
+ protected void initHandler(Socket connection) throws IOException {
+ super.initHandler(connection);
+ pushLineHandler(this);
+ }
/**
* Set the configuration data for the handler
@@ -183,10 +185,11 @@
relayingAllowed = theConfigData.isRelayingAllowed(remoteIP);
authRequired = theConfigData.isAuthRequired(remoteIP);
heloEhloEnforcement = theConfigData.useHeloEhloEnforcement();
- sessionEnded = false;
smtpGreeting = theConfigData.getSMTPGreeting();
- resetState();
- resetConnectionState();
+ // Both called in resetHandler, we don't need to call them again here.
+ // sessionEnded = false;
+ // resetState();
+ // resetConnectionState();
// if no greeting was configured use a default
if (smtpGreeting == null) {
@@ -251,40 +254,21 @@
mode = COMMAND_MODE;
//parse the command
- String cmdString = readCommandLine();
- if (cmdString == null) {
- break;
- }
- int spaceIndex = cmdString.indexOf(" ");
- if (spaceIndex > 0) {
- curCommandName = cmdString.substring(0, spaceIndex);
- curCommandArgument = cmdString.substring(spaceIndex + 1);
- } else {
- curCommandName = cmdString;
+ byte[] line = null;
+ try {
+ line = readInputLine();
+ } catch (CRLFDelimitedByteBuffer.TerminationException e) {
+ writeLoggedFlushedResponse("501 Syntax error at character position " + e.position() + ". CR and LF must be CRLF paired. See RFC 2821 #2.7.1.");
+ } catch (CRLFDelimitedByteBuffer.LineLengthExceededException e) {
+ writeLoggedFlushedResponse("500 Line length exceeded. See RFC 2821 #4.5.3.1.");
}
- curCommandName = curCommandName.toUpperCase(Locale.US);
-
- //fetch the command handlers registered to the command
- List commandHandlers = handlerChain.getCommandHandlers(curCommandName);
- if(commandHandlers == null) {
- //end the session
+ if (line == null) {
break;
- } else {
- int count = commandHandlers.size();
- for(int i = 0; i < count; i++) {
- setStopHandlerProcessing(false);
- ((CommandHandler)commandHandlers.get(i)).onCommand(this);
-
- theWatchdog.reset();
-
- //if the response is received, stop processing of command handlers
- if(mode != COMMAND_MODE || getStopHandlerProcessing()) {
- break;
- }
- }
-
}
+ ((LineHandler) lineHandlers.getLast()).onLine(this, line);
+ theWatchdog.reset();
+
//handle messages
if(mode == MESSAGE_RECEIVED_MODE) {
try {
@@ -303,16 +287,8 @@
if(mail != null) {
ContainerUtil.dispose(mail);
- // remember the ehlo mode
- Object currentHeloMode = state.get(CURRENT_HELO_MODE);
-
mail = null;
resetState();
-
- // start again with the old helo mode
- if (currentHeloMode != null) {
- state.put(CURRENT_HELO_MODE,currentHeloMode);
- }
}
}
}
@@ -322,18 +298,97 @@
}
/**
+ * @see org.apache.james.smtpserver.LineHandler#onLine(org.apache.james.smtpserver.SMTPSession, byte[])
+ */
+ public void onLine(SMTPSession session, byte[] line) {
+ String cmdString;
+ try {
+ cmdString = new String(line, "US-ASCII");
+ if (cmdString != null) {
+ cmdString = cmdString.trim();
+ }
+
+ int spaceIndex = cmdString.indexOf(" ");
+ if (spaceIndex > 0) {
+ curCommandName = cmdString.substring(0, spaceIndex);
+ curCommandArgument = cmdString.substring(spaceIndex + 1);
+ } else {
+ curCommandName = cmdString;
+ }
+ curCommandName = curCommandName.toUpperCase(Locale.US);
+
+ //fetch the command handlers registered to the command
+ List commandHandlers = handlerChain.getCommandHandlers(curCommandName);
+ if(commandHandlers == null) {
+ //end the session
+ sessionEnded = true;
+ } else {
+ int count = commandHandlers.size();
+ for(int i = 0; i < count; i++) {
+ setStopHandlerProcessing(false);
+ SMTPResponse response = ((CommandHandler)commandHandlers.get(i)).onCommand(this, curCommandName, curCommandArgument);
+
+ writeSMTPResponse(response);
+
+ //if the response is received, stop processing of command handlers
+ if(mode != COMMAND_MODE || response != null) {
+ break;
+ }
+ }
+
+ }
+ } catch (UnsupportedEncodingException e) {
+ // TODO Define what to do
+ e.printStackTrace();
+ }
+ }
+
+ /*
+ * @see org.apache.james.smtpserver.SMTPSession#writeSMTPResponse(org.apache.james.smtpserver.SMTPResponse)
+ */
+ public void writeSMTPResponse(SMTPResponse response) {
+ // Write a single-line or multiline response
+ if (response != null) {
+ if (response.getRawLine() != null) {
+ writeResponse(response.getRawLine());
+ } else {
+ // Iterator i = esmtpextensions.iterator();
+ for (int k = 0; k < response.getLines().size(); k++) {
+ responseBuffer.append(response.getRetCode());
+ if (k == response.getLines().size() - 1) {
+ responseBuffer.append(" ");
+ } else {
+ responseBuffer.append("-");
+ }
+ responseBuffer.append(response.getLines().get(k));
+ writeResponse(clearResponseBuffer());
+ }
+ }
+
+ if (response.isEndSession()) {
+ endSession();
+ }
+ }
+ }
+
+ /**
* Resets the handler data to a basic state.
*/
protected void resetHandler() {
- resetState();
+ // not needed anymore because state is inside the connection state
+ // resetState();
resetConnectionState();
+ // empty any previous line handler and add self (command dispatcher)
+ // as the default.
+ lineHandlers = null;
+ pushLineHandler(this);
+
clearResponseBuffer();
- remoteHost = null;
- remoteIP = null;
authenticatedUser = null;
smtpID = null;
+ sessionEnded = false;
}
/**
@@ -407,28 +462,41 @@
}
/**
- * @see org.apache.james.smtpserver.SMTPSession#isSessionEnded()
- */
- public boolean isSessionEnded() {
- return sessionEnded;
- }
-
- /**
* @see org.apache.james.smtpserver.SMTPSession#resetState()
*/
public void resetState() {
- ArrayList recipients = (ArrayList)state.get(RCPT_LIST);
- if (recipients != null) {
- recipients.clear();
+ // We already clear the map, it should be enough
+// ArrayList recipients = (ArrayList)state.get(RCPT_LIST);
+// if (recipients != null) {
+// recipients.clear();
+// }
+ // remember the ehlo mode between resets
+ Object currentHeloMode = getState().get(CURRENT_HELO_MODE);
+
+ getState().clear();
+
+ // start again with the old helo mode
+ if (currentHeloMode != null) {
+ getState().put(CURRENT_HELO_MODE,currentHeloMode);
}
- state.clear();
}
/**
+ * The hash map that holds variables for the SMTP message transfer in progress.
+ *
+ * This hash map should only be used to store variable set in a particular
+ * set of sequential MAIL-RCPT-DATA commands, as described in RFC 2821. Per
+ * connection values should be stored as member variables in this class.
+ *
* @see org.apache.james.smtpserver.SMTPSession#getState()
*/
public Map getState() {
- return state;
+ Object res = getConnectionState().get(SMTPSession.SESSION_STATE_MAP);
+ if (res == null || !(res instanceof Map)) {
+ res = new HashMap();
+ getConnectionState().put(SMTPSession.SESSION_STATE_MAP, res);
+ }
+ return (Map) res;
}
/**
@@ -494,38 +562,6 @@
return responseString;
}
-
- /**
- * @see org.apache.james.smtpserver.SMTPSession#readCommandLine()
- */
- public final String readCommandLine() throws IOException {
- for (;;) try {
- String commandLine = inReader.readLine();
- if (commandLine != null) {
- commandLine = commandLine.trim();
- }
- return commandLine;
- } catch (CRLFTerminatedReader.TerminationException te) {
- writeLoggedFlushedResponse("501 Syntax error at character position " + te.position() + ". CR and LF must be CRLF paired. See RFC 2821 #2.7.1.");
- } catch (CRLFTerminatedReader.LineLengthExceededException llee) {
- writeLoggedFlushedResponse("500 Line length exceeded. See RFC 2821 #4.5.3.1.");
- }
- }
-
- /**
- * @see org.apache.james.smtpserver.SMTPSession#getWatchdog()
- */
- public Watchdog getWatchdog() {
- return theWatchdog;
- }
-
- /**
- * @see org.apache.james.smtpserver.SMTPSession#getInputStream()
- */
- public InputStream getInputStream() {
- return in;
- }
-
/**
* @see org.apache.james.smtpserver.SMTPSession#getSessionID()
*/
@@ -547,8 +583,8 @@
int count = 0;
// check if the key exists
- if (state.get(SMTPSession.RCPT_LIST) != null) {
- count = ((Collection) state.get(SMTPSession.RCPT_LIST)).size();
+ if (getState().get(SMTPSession.RCPT_LIST) != null) {
+ count = ((Collection) getState().get(SMTPSession.RCPT_LIST)).size();
}
return count;
@@ -572,8 +608,30 @@
connectionState.clear();
}
+ /**
+ * @see org.apache.james.smtpserver.SMTPSession#getConnectionState()
+ */
public Map getConnectionState() {
return connectionState;
+ }
+
+ /**
+ * @see org.apache.james.smtpserver.SMTPSession#popLineHandler()
+ */
+ public void popLineHandler() {
+ if (lineHandlers != null) {
+ lineHandlers.removeLast();
+ }
+ }
+
+ /**
+ * @see org.apache.james.smtpserver.SMTPSession#pushLineHandler(org.apache.james.smtpserver.LineHandler)
+ */
+ public void pushLineHandler(LineHandler lineHandler) {
+ if (lineHandlers == null) {
+ lineHandlers = new LinkedList();
+ }
+ lineHandlers.addLast(lineHandler);
}
}
Added: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java?view=auto&rev=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java (added)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java Mon Dec 25 09:31:07 2006
@@ -0,0 +1,98 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you 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.util.LinkedList;
+import java.util.List;
+
+/**
+ * Contains an SMTP result
+ */
+public class SMTPResponse {
+
+ private String retCode = null;
+ private List lines = null;
+ private String rawLine = null;
+ private boolean endSession = false;
+
+ public SMTPResponse() {
+
+ }
+
+ public SMTPResponse(String code, String description) {
+ this.setRetCode(code);
+ this.appendLine(description);
+ }
+
+ public SMTPResponse(String code, StringBuffer description) {
+ this.setRetCode(code);
+ this.appendLine(description);
+ }
+
+ public SMTPResponse(String rawLine) {
+ String args[] = rawLine.split(" ");
+ if (args != null && args.length > 1) {
+ this.setRetCode(args[0]);
+ this.appendLine(new StringBuffer(rawLine.substring(args[0].length()+1)));
+ } else {
+ // TODO: Throw exception ?
+ }
+ this.rawLine = rawLine;
+ }
+
+ public void appendLine(String line) {
+ if (lines == null) {
+ lines = new LinkedList();
+ }
+ lines.add(line);
+ }
+
+ public void appendLine(StringBuffer line) {
+ if (lines == null) {
+ lines = new LinkedList();
+ }
+ lines.add(line);
+ }
+
+ public String getRetCode() {
+ return retCode;
+ }
+
+ public void setRetCode(String retCode) {
+ this.retCode = retCode;
+ }
+
+ public List getLines() {
+ return lines;
+ }
+
+ public String getRawLine() {
+ return rawLine;
+ }
+
+ public boolean isEndSession() {
+ return endSession;
+ }
+
+ public void setEndSession(boolean endSession) {
+ this.endSession = endSession;
+ }
+
+}
\ No newline at end of file
Propchange: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPServer.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPServer.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPServer.java Mon Dec 25 09:31:07 2006
@@ -338,7 +338,7 @@
* @see org.apache.james.smtpserver.SMTPHandlerConfigurationData#isAuthRequired(String)
*/
public boolean isAuthRequired(String remoteIP) {
- if (SMTPServer.this.authRequired == AUTH_ANNOUNCE) return true;
+ if (SMTPServer.this.authRequired == AUTH_ANNOUNCE) return true;
boolean authRequired = SMTPServer.this.authRequired != AUTH_DISABLED;
if (authorizedNetworks != null) {
authRequired = authRequired && !SMTPServer.this.authorizedNetworks.matchInetNetwork(remoteIP);
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=490155&r1=490154&r2=490155
==============================================================================
--- 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 Mon Dec 25 09:31:07 2006
@@ -22,11 +22,8 @@
package org.apache.james.smtpserver;
-import org.apache.james.util.watchdog.Watchdog;
import org.apache.mailet.Mail;
-import java.io.IOException;
-import java.io.InputStream;
import java.util.Map;
/**
@@ -43,6 +40,7 @@
public final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // HELO or EHLO
public final static String CURRENT_HELO_NAME = "CURRENT_HELO_NAME";
public static final Object CURRENT_RECIPIENT = "CURRENT_RECIPIENT"; // Current recipient
+ public final static String SESSION_STATE_MAP = "SESSION_STATE_MAP"; // the Session state
/**
* Writes response string to the client
@@ -57,7 +55,7 @@
* @return the trimmed input line
* @throws IOException if an exception is generated reading in the input characters
*/
- String readCommandLine() throws IOException;
+ // String readCommandLine() throws IOException;
/**
@@ -76,13 +74,6 @@
String clearResponseBuffer();
/**
- * Returns Inputstream for handling messages and commands
- *
- * @return InputStream object
- */
- InputStream getInputStream();
-
- /**
* Returns currently process command name
*
* @return current command name
@@ -137,13 +128,6 @@
void endSession();
/**
- * Returns the session status
- *
- * @return if the session is open or closed
- */
- boolean isSessionEnded();
-
- /**
* Returns Map that consists of the state of the SMTPSession per mail
*
* @return map of the current SMTPSession state per mail
@@ -206,13 +190,6 @@
void setUser(String user);
/**
- * Returns Watchdog object used for handling timeout
- *
- * @return Watchdog object
- */
- Watchdog getWatchdog();
-
- /**
* Returns the SMTP session id
*
* @return SMTP session id
@@ -240,12 +217,6 @@
*/
boolean getStopHandlerProcessing();
-
- /**
- * Reset the Connection state
- */
- void resetConnectionState();
-
/**
* Returns Map that consists of the state of the SMTPSession per connection
*
@@ -253,5 +224,20 @@
*/
Map getConnectionState();
+ /**
+ * Put a new line handler in the chain
+ * @param overrideCommandHandler
+ */
+ void pushLineHandler(LineHandler overrideCommandHandler);
+
+ /**
+ * Pop the last command handler
+ */
+ void popLineHandler();
+
+ /**
+ * Write an SMTPResponse to the client
+ */
+ void writeSMTPResponse(SMTPResponse response);
}
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=490155&r1=490154&r2=490155
==============================================================================
--- 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 Mon Dec 25 09:31:07 2006
@@ -22,6 +22,8 @@
package org.apache.james.smtpserver.core;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.LineHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
@@ -31,7 +33,7 @@
import java.util.Locale;
import java.util.StringTokenizer;
import org.apache.james.util.Base64;
-import java.io.IOException;
+import java.io.UnsupportedEncodingException;
/**
@@ -50,21 +52,14 @@
* The text string for the SMTP AUTH type LOGIN.
*/
private final static String AUTH_TYPE_LOGIN = "LOGIN";
-
+
/**
* handles AUTH command
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
*/
- public void onCommand(SMTPSession session) {
- //deviation from the Main code
- //Instead of throwing exception just end the session
- try{
- doAUTH(session, session.getCommandArgument());
- } catch (Exception ex) {
- getLogger().error("Exception occured:" + ex.getMessage());
- session.endSession();
- }
+ public SMTPResponse onCommand(SMTPSession session, String command, String argument) {
+ return doAUTH(session, argument);
}
@@ -76,16 +71,12 @@
* @param session SMTP session
* @param argument the argument passed in with the command by the SMTP client
*/
- private void doAUTH(SMTPSession session, String argument)
- throws Exception {
- String responseString = null;
+ private SMTPResponse doAUTH(SMTPSession session, String argument) {
if (session.getUser() != null) {
- responseString = "503 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" User has previously authenticated. "
- + " Further authentication is not required!";
- session.writeResponse(responseString);
+ return new SMTPResponse("503", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" User has previously authenticated. "
+ + " Further authentication is not required!");
} else if (argument == null) {
- responseString = "501 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Usage: AUTH (authentication type) <challenge>";
- session.writeResponse(responseString);
+ return new SMTPResponse("501", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Usage: AUTH (authentication type) <challenge>");
} else {
String initialResponse = null;
if ((argument != null) && (argument.indexOf(" ") > 0)) {
@@ -94,14 +85,50 @@
}
String authType = argument.toUpperCase(Locale.US);
if (authType.equals(AUTH_TYPE_PLAIN)) {
- doPlainAuth(session, initialResponse);
- return;
+ String userpass;
+ if (initialResponse == null) {
+ session.pushLineHandler(new LineHandler() {
+
+ public void onLine(SMTPSession session, byte[] line) {
+ try {
+ String l = new String(line, "US-ASCII");
+ System.err.println("((("+line+")))");
+ SMTPResponse res = doPlainAuthPass(session, l);
+ session.writeSMTPResponse(res);
+ } catch (UnsupportedEncodingException e) {
+ // TODO should never happen
+ e.printStackTrace();
+ }
+ }
+
+ });
+ return new SMTPResponse("334", "OK. Continue authentication");
+ } else {
+ userpass = initialResponse.trim();
+ return doPlainAuthPass(session, userpass);
+ }
} else if (authType.equals(AUTH_TYPE_LOGIN)) {
- doLoginAuth(session, initialResponse);
- return;
+
+ if (initialResponse == null) {
+ session.pushLineHandler(new LineHandler() {
+
+ public void onLine(SMTPSession session, byte[] line) {
+ try {
+ session.writeSMTPResponse(doLoginAuthPass(session, new String(line, "US-ASCII"), true));
+ } catch (UnsupportedEncodingException e) {
+ // TODO should never happen
+ e.printStackTrace();
+ }
+ }
+
+ });
+ return new SMTPResponse("334", "VXNlcm5hbWU6"); // base64 encoded "Username:"
+ } else {
+ String user = initialResponse.trim();
+ return doLoginAuthPass(session, user, false);
+ }
} else {
- doUnknownAuth(session, authType, initialResponse);
- return;
+ return doUnknownAuth(session, authType, initialResponse);
}
}
}
@@ -120,16 +147,8 @@
* @param session SMTP session object
* @param initialResponse the initial response line passed in with the AUTH command
*/
- private void doPlainAuth(SMTPSession session, String initialResponse)
- throws IOException {
- String userpass = null, user = null, pass = null, responseString = null;
- if (initialResponse == null) {
- responseString = "334 OK. Continue authentication";
- session.writeResponse(responseString);
- userpass = session.readCommandLine();
- } else {
- userpass = initialResponse.trim();
- }
+ private SMTPResponse doPlainAuthPass(SMTPSession session, String userpass) {
+ String user = null, pass = null;
try {
if (userpass != null) {
userpass = Base64.decodeAsString(userpass);
@@ -182,21 +201,18 @@
// Ignored - this exception in parsing will be dealt
// with in the if clause below
}
+ session.popLineHandler();
// Authenticate user
if ((user == null) || (pass == null)) {
- responseString = "501 Could not decode parameters for AUTH PLAIN";
- session.writeResponse(responseString);
+ return new SMTPResponse("501", "Could not decode parameters for AUTH PLAIN");
} else if (session.getConfigurationData().getUsersRepository().test(user, pass)) {
session.setUser(user);
- responseString = "235 Authentication Successful";
- session.writeResponse(responseString);
getLogger().info("AUTH method PLAIN succeeded");
+ return new SMTPResponse("235", "Authentication Successful");
} else {
- responseString = "535 Authentication Failed";
- session.writeResponse(responseString);
getLogger().error("AUTH method PLAIN failed");
+ return new SMTPResponse("535", "Authentication Failed");
}
- return;
}
/**
@@ -205,16 +221,7 @@
* @param session SMTP session object
* @param initialResponse the initial response line passed in with the AUTH command
*/
- private void doLoginAuth(SMTPSession session, String initialResponse)
- throws IOException {
- String user = null, pass = null, responseString = null;
- if (initialResponse == null) {
- responseString = "334 VXNlcm5hbWU6"; // base64 encoded "Username:"
- session.writeResponse(responseString);
- user = session.readCommandLine();
- } else {
- user = initialResponse.trim();
- }
+ private SMTPResponse doLoginAuthPass(SMTPSession session, String user, boolean inCustomeHandler) {
if (user != null) {
try {
user = Base64.decodeAsString(user);
@@ -224,9 +231,33 @@
user = null;
}
}
- responseString = "334 UGFzc3dvcmQ6"; // base64 encoded "Password:"
- session.writeResponse(responseString);
- pass = session.readCommandLine();
+ 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"));
+ } catch (UnsupportedEncodingException e) {
+ // TODO should never happen
+ e.printStackTrace();
+ }
+ }
+
+ public LineHandler setUser(String user) {
+ this.user = user;
+ return this;
+ }
+
+ }.setUser(user));
+ return new SMTPResponse("334", "UGFzc3dvcmQ6"); // base64 encoded "Password:"
+ }
+
+ private void doLoginAuthPassCheck(SMTPSession session, String user, String pass) {
+ String responseString = null;
if (pass != null) {
try {
pass = Base64.decodeAsString(pass);
@@ -251,6 +282,8 @@
// TODO: Make this string a more useful error message
getLogger().error("AUTH method LOGIN failed");
}
+ session.popLineHandler();
+ session.popLineHandler();
session.writeResponse(responseString);
return;
}
@@ -262,9 +295,7 @@
* @param authType the unknown auth type
* @param initialResponse the initial response line passed in with the AUTH command
*/
- private void doUnknownAuth(SMTPSession session, String authType, String initialResponse) {
- String responseString = "504 Unrecognized Authentication Type";
- session.writeResponse(responseString);
+ private SMTPResponse doUnknownAuth(SMTPSession session, String authType, String initialResponse) {
if (getLogger().isErrorEnabled()) {
StringBuffer errorBuffer =
new StringBuffer(128)
@@ -273,7 +304,7 @@
.append(" is an unrecognized authentication type");
getLogger().error(errorBuffer.toString());
}
- return;
+ return new SMTPResponse("504", "Unrecognized Authentication Type");
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -27,13 +27,14 @@
import org.apache.james.core.MailImpl;
import org.apache.james.fetchmail.ReaderInputStream;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.LineHandler;
import org.apache.james.smtpserver.MessageSizeException;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.smtpserver.SizeLimitedInputStream;
import org.apache.james.util.CharTerminatedInputStream;
import org.apache.james.util.DotStuffingInputStream;
import org.apache.james.util.mail.dsn.DSNStatus;
-import org.apache.james.util.watchdog.BytesReadResetInputStream;
import org.apache.mailet.MailAddress;
import org.apache.mailet.RFC2822Headers;
import org.apache.mailet.dates.RFC822DateFormat;
@@ -43,6 +44,9 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
import java.io.SequenceInputStream;
import java.io.StringReader;
import java.util.ArrayList;
@@ -89,8 +93,8 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
*/
- public void onCommand(SMTPSession session) {
- doDATA(session, session.getCommandArgument());
+ public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+ return doDATA(session, parameters);
}
@@ -102,16 +106,81 @@
* @param session SMTP session object
* @param argument the argument passed in with the command by the SMTP client
*/
- private void doDATA(SMTPSession session, String argument) {
+ private SMTPResponse doDATA(SMTPSession session, String argument) {
+ PipedInputStream messageIn = new PipedInputStream();
+ Thread t = new Thread() {
+ private PipedInputStream in;
+ private SMTPSession session;
- String responseString = null;
- responseString = "354 Ok Send data ending with <CRLF>.<CRLF>";
- session.writeResponse(responseString);
- InputStream msgIn = new CharTerminatedInputStream(session
- .getInputStream(), SMTPTerminator);
+ public void run() {
+ handleStream(session, in);
+ }
+
+ public Thread setParam(SMTPSession session, PipedInputStream in) {
+ this.in = in;
+ this.session = session;
+ return this;
+ }
+ }.setParam(session, messageIn);
+
+ t.start();
+
+ OutputStream out;
+ try {
+ out = new PipedOutputStream(messageIn);
+ session.pushLineHandler(new LineHandler() {
+
+ private OutputStream out;
+ private Thread worker;
+
+ public void onLine(SMTPSession session, byte[] line) {
+ try {
+ out.write(line);
+// out.write(13);
+// out.write(10);
+ out.flush();
+ // 46 is "."
+ if (line.length == 3 && line[0] == 46) {
+ try {
+ worker.join();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ } catch (IOException e) {
+ // TODO Define what we have to do here!
+ e.printStackTrace();
+ }
+ }
+
+ public LineHandler setParam(OutputStream out, Thread t) {
+ this.out = out;
+ this.worker = t;
+ return this;
+ };
+
+ }.setParam(out,t));
+ } catch (IOException e1) {
+ // TODO Define what to do.
+ e1.printStackTrace();
+ }
+
+ return new SMTPResponse("354", "Ok Send data ending with <CRLF>.<CRLF>");
+ }
+
+
+ public void handleStream(SMTPSession session, InputStream stream) {
+ String responseString;
+ InputStream msgIn = new CharTerminatedInputStream(stream, SMTPTerminator);
try {
- msgIn = new BytesReadResetInputStream(msgIn, session.getWatchdog(),
- session.getConfigurationData().getResetLength());
+ // 2006/12/24 - We can remove this now that every single line is pushed and
+ // reset the watchdog already in the handler.
+ // This means we don't use resetLength anymore and we can remove
+ // watchdog from the SMTPSession interface
+ // msgIn = new BytesReadResetInputStream(msgIn, session.getWatchdog(),
+ // session.getConfigurationData().getResetLength());
// if the message size limit has been set, we'll
// wrap msgIn with a SizeLimitedInputStream
@@ -168,6 +237,7 @@
getLogger().error(
"Unknown error occurred while processing DATA.", me);
}
+ session.popLineHandler();
session.writeResponse(responseString);
return;
} finally {
@@ -311,6 +381,8 @@
mail.setAttribute(SMTP_AUTH_NETWORK_NAME,"true");
}
+ session.popLineHandler();
+
session.setMail(mail);
} catch (MessagingException me) {
// if we get here, it means that we received a
@@ -355,5 +427,6 @@
return implCommands;
}
+
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -26,7 +26,9 @@
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.util.mail.SMTPRetCode;
/**
* Handles EHLO command
@@ -44,8 +46,8 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
**/
- public void onCommand(SMTPSession session) {
- doEHLO(session, session.getCommandArgument());
+ public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+ return doEHLO(session, arguments);
}
/**
@@ -56,47 +58,34 @@
* @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) {
- StringBuffer responseBuffer = session.getResponseBuffer();
-
+ private SMTPResponse doEHLO(SMTPSession session, String argument) {
+ SMTPResponse resp = new SMTPResponse();
+ resp.setRetCode(SMTPRetCode.MAIL_OK);
+
session.getConnectionState().put(SMTPSession.CURRENT_HELO_MODE, COMMAND_NAME);
- ArrayList esmtpextensions = new ArrayList();
-
- esmtpextensions.add(new StringBuffer(session.getConfigurationData()
+ resp.appendLine(new StringBuffer(session.getConfigurationData()
.getHelloName()).append(" Hello ").append(argument)
.append(" (").append(session.getRemoteHost()).append(" [")
- .append(session.getRemoteIPAddress()).append("])").toString());
+ .append(session.getRemoteIPAddress()).append("])"));
// Extension defined in RFC 1870
long maxMessageSize = session.getConfigurationData()
.getMaxMessageSize();
if (maxMessageSize > 0) {
- esmtpextensions.add("SIZE " + maxMessageSize);
+ resp.appendLine("SIZE " + maxMessageSize);
}
if (session.isAuthRequired()) {
- esmtpextensions.add("AUTH LOGIN PLAIN");
- esmtpextensions.add("AUTH=LOGIN PLAIN");
+ resp.appendLine("AUTH LOGIN PLAIN");
+ resp.appendLine("AUTH=LOGIN PLAIN");
}
- esmtpextensions.add("PIPELINING");
- esmtpextensions.add("ENHANCEDSTATUSCODES");
+ resp.appendLine("PIPELINING");
+ resp.appendLine("ENHANCEDSTATUSCODES");
// see http://issues.apache.org/jira/browse/JAMES-419
- 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());
- }
- }
+ resp.appendLine("8BITMIME");
+ return resp;
}
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/ExpnCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/ExpnCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/ExpnCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/ExpnCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
import java.util.Collection;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -45,9 +46,8 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
*/
- public void onCommand(SMTPSession session) {
- String responseString = "502 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" EXPN is not supported";
- session.writeResponse(responseString);
+ public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+ return new SMTPResponse("502", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" EXPN is not supported");
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -27,6 +27,7 @@
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
@@ -45,25 +46,22 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
**/
- public void onCommand(SMTPSession session) {
- doHELO(session, session.getCommandArgument());
+ public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+ return doHELO(session, arguments);
}
/**
* @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;
-
+ private SMTPResponse doHELO(SMTPSession session, String argument) {
session.getConnectionState().put(SMTPSession.CURRENT_HELO_MODE, COMMAND_NAME);
- session.getResponseBuffer().append("250 ").append(
- session.getConfigurationData().getHelloName())
+ StringBuffer response = new StringBuffer();
+ response.append(session.getConfigurationData().getHelloName())
.append(" Hello ").append(argument).append(" (").append(
session.getRemoteHost()).append(" [").append(
session.getRemoteIPAddress()).append("])");
- responseString = session.clearResponseBuffer();
- session.writeResponse(responseString);
+ return new SMTPResponse("250", response);
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HelpCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HelpCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HelpCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HelpCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
import java.util.Collection;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -43,9 +44,8 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
**/
- public void onCommand(SMTPSession session) {
- String responseString = "502 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" HELP is not supported";
- session.writeResponse(responseString);
+ public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+ return new SMTPResponse("502", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" HELP is not supported");
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -26,6 +26,7 @@
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
import org.apache.mailet.MailAddress;
@@ -43,8 +44,8 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
*/
- public void onCommand(SMTPSession session) {
- doMAIL(session, session.getCommandArgument());
+ public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+ return doMAIL(session, arguments);
}
@@ -55,21 +56,12 @@
* @param session SMTP session object
* @param argument the argument passed in with the command by the SMTP client
*/
- private void doMAIL(SMTPSession session, String argument) {
-
- StringBuffer responseBuffer = session.getResponseBuffer();
- String responseString = null;
-
- MailAddress sender = (MailAddress) session.getState().get(
- SMTPSession.SENDER);
- responseBuffer.append(
- "250 "
- + DSNStatus.getStatus(DSNStatus.SUCCESS,
- DSNStatus.ADDRESS_OTHER) + " Sender <").append(
- sender).append("> OK");
- responseString = session.clearResponseBuffer();
- session.writeResponse(responseString);
-
+ private SMTPResponse doMAIL(SMTPSession session, String argument) {
+ StringBuffer responseBuffer = new StringBuffer();
+ MailAddress sender = (MailAddress) session.getState().get(SMTPSession.SENDER);
+ responseBuffer.append(DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.ADDRESS_OTHER) + " Sender <")
+ .append(sender).append("> OK");
+ return new SMTPResponse("250", responseBuffer);
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/NoopCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/NoopCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/NoopCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/NoopCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
import java.util.Collection;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -44,9 +45,8 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
*/
- public void onCommand(SMTPSession session) {
- String responseString = "250 "+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK";
- session.writeResponse(responseString);
+ public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+ return new SMTPResponse("250", DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK");
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
import java.util.Collection;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -43,8 +44,8 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
*/
- public void onCommand(SMTPSession session) {
- doQUIT(session, session.getCommandArgument());
+ public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+ return doQUIT(session, parameters);
}
@@ -57,19 +58,20 @@
* @param session SMTP session object
* @param argument the argument passed in with the command by the SMTP client
*/
- private void doQUIT(SMTPSession session, String argument) {
-
- String responseString = "";
+ private SMTPResponse doQUIT(SMTPSession session, String argument) {
+ SMTPResponse ret;
if ((argument == null) || (argument.length() == 0)) {
- session.getResponseBuffer().append("221 "+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" ")
- .append(session.getConfigurationData().getHelloName())
- .append(" Service closing transmission channel");
- responseString = session.clearResponseBuffer();
+ StringBuffer response = new StringBuffer();
+ response.append(DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS))
+ .append(" ")
+ .append(session.getConfigurationData().getHelloName())
+ .append(" Service closing transmission channel");
+ ret = new SMTPResponse("221", response);
} else {
- responseString = "500 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with QUIT command";
+ ret = new SMTPResponse("500", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with QUIT command");
}
- session.writeResponse(responseString);
- session.endSession();
+ ret.setEndSession(true);
+ return ret;
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -26,6 +26,7 @@
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
import org.apache.mailet.MailAddress;
@@ -41,8 +42,8 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
**/
- public void onCommand(SMTPSession session) {
- doRCPT(session, session.getCommandArgument());
+ public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+ return doRCPT(session, parameters);
}
@@ -54,11 +55,7 @@
* @param session SMTP session object
* @param argument the argument passed in with the command by the SMTP client
*/
- private void doRCPT(SMTPSession session, String argument) {
-
- String responseString = null;
- StringBuffer responseBuffer = session.getResponseBuffer();
-
+ private SMTPResponse doRCPT(SMTPSession session, String argument) {
Collection rcptColl = (Collection) session.getState().get(
SMTPSession.RCPT_LIST);
if (rcptColl == null) {
@@ -68,13 +65,12 @@
SMTPSession.CURRENT_RECIPIENT);
rcptColl.add(recipientAddress);
session.getState().put(SMTPSession.RCPT_LIST, rcptColl);
- responseBuffer.append(
- "250 "
- + DSNStatus.getStatus(DSNStatus.SUCCESS,
- DSNStatus.ADDRESS_VALID) + " Recipient <")
- .append(recipientAddress).append("> OK");
- responseString = session.clearResponseBuffer();
- session.writeResponse(responseString);
+ StringBuffer response = new StringBuffer();
+ response.append(DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.ADDRESS_VALID))
+ .append(" Recipient <")
+ .append(recipientAddress)
+ .append("> OK");
+ return new SMTPResponse("250", 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=490155&r1=490154&r2=490155
==============================================================================
--- 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 Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
import java.util.Collection;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -42,8 +43,8 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
**/
- public void onCommand(SMTPSession session) {
- doRSET(session, session.getCommandArgument());
+ public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+ return doRSET(session, session.getCommandArgument());
}
@@ -53,18 +54,15 @@
*
* @param session SMTP session object
* @param argument the argument passed in with the command by the SMTP client
+ * @return
*/
- private void doRSET(SMTPSession session, String argument) {
- String responseString = "";
+ private SMTPResponse doRSET(SMTPSession session, String argument) {
if ((argument == null) || (argument.length() == 0)) {
-
session.resetState();
-
- responseString = "250 "+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK";
+ return new SMTPResponse("250", DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK");
} else {
- responseString = "500 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with RSET command";
+ return new SMTPResponse("500", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with RSET command");
}
- session.writeResponse(responseString);
}
/**
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=490155&r1=490154&r2=490155
==============================================================================
--- 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 Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
import java.util.Collection;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -38,28 +39,25 @@
*/
public static final String UNKNOWN_COMMAND = "UNKNOWN";
- private boolean stopHandlerProcessing = true;
-
/**
* Handler method called upon receipt of an unrecognized command.
* Returns an error response and logs the command.
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
**/
- public void onCommand(SMTPSession session) {
+ public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
//If there was message failure, don't consider it as an unknown command
if (session.getState().get(SMTPSession.MESG_FAILED) != null) {
- return;
+ return null;
}
- session.getResponseBuffer().append("500 "+DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_INVALID_CMD))
+ StringBuffer result = new StringBuffer();
+ result.append(DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_INVALID_CMD))
.append(" Command ")
.append(session.getCommandName())
.append(" unrecognized.");
- String responseString = session.clearResponseBuffer();
-
- session.writeResponse(responseString);
+ return new SMTPResponse("500", result);
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/VrfyCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/VrfyCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/VrfyCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/VrfyCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,7 +25,9 @@
import java.util.Collection;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.util.mail.SMTPRetCode;
import org.apache.james.util.mail.dsn.DSNStatus;
/**
@@ -42,9 +44,9 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
**/
- public void onCommand(SMTPSession session) {
- String responseString = "502 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" VRFY is not supported";
- session.writeResponse(responseString);
+ public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+ return new SMTPResponse(SMTPRetCode.UNIMPLEMENTED_COMMAND,
+ DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" VRFY is not supported");
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/DataFilterCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/DataFilterCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/DataFilterCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/DataFilterCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -26,6 +26,7 @@
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -42,8 +43,8 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
*/
- public void onCommand(SMTPSession session) {
- doDATA(session, session.getCommandArgument());
+ public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+ return doDATA(session, parameters);
}
@@ -51,28 +52,16 @@
* @param session SMTP session object
* @param argument the argument passed in with the command by the SMTP client
*/
- private void doDATA(SMTPSession session, String argument) {
- String responseString = null;
+ private SMTPResponse doDATA(SMTPSession session, String argument) {
if ((argument != null) && (argument.length() > 0)) {
- responseString = "500 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with DATA command";
- session.writeResponse(responseString);
-
- //TODO: Check if this should been!
+ return new SMTPResponse("500", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with DATA command");
}
if (!session.getState().containsKey(SMTPSession.SENDER)) {
- responseString = "503 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No sender specified";
- session.writeResponse(responseString);
-
- // After this filter match we should not call any other handler!
- session.setStopHandlerProcessing(true);
-
+ return new SMTPResponse("503", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No sender specified");
} else if (!session.getState().containsKey(SMTPSession.RCPT_LIST)) {
- responseString = "503 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No recipients specified";
- session.writeResponse(responseString);
-
- // After this filter match we should not call any other handler!
- session.setStopHandlerProcessing(true);
+ return new SMTPResponse("503", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No recipients specified");
}
+ return null;
}
/**
Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -26,6 +26,7 @@
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
import org.apache.james.smtpserver.SMTPSession;
import org.apache.james.util.mail.dsn.DSNStatus;
@@ -44,28 +45,23 @@
*
* @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
**/
- public void onCommand(SMTPSession session) {
- doEHLO(session, session.getCommandArgument());
+ public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+ return doEHLO(session, arguments);
}
/**
* @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;
-
+ private SMTPResponse doEHLO(SMTPSession session, String argument) {
session.resetState();
if (argument == null) {
- responseString = "501 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Domain address required: " + COMMAND_NAME;
- session.writeResponse(responseString);
-
- // After this filter match we should not call any other handler!
- session.setStopHandlerProcessing(true);
+ return new SMTPResponse("501", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Domain address required: " + COMMAND_NAME);
} else {
// store provided name
session.getState().put(SMTPSession.CURRENT_HELO_NAME,argument);
+ return null;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org