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