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 2011/12/23 21:36:23 UTC

svn commit: r1222834 - in /james/protocols/trunk: api/src/main/java/org/apache/james/protocols/api/handler/ smtp/src/main/java/org/apache/james/protocols/smtp/ smtp/src/main/java/org/apache/james/protocols/smtp/core/ smtp/src/test/java/org/apache/james...

Author: norman
Date: Fri Dec 23 20:36:23 2011
New Revision: 1222834

URL: http://svn.apache.org/viewvc?rev=1222834&view=rev
Log:
Fix nullsender handling. I broke this before while refactoring state handling

Added:
    james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java   (with props)
Modified:
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java
    james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java

Added: james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java?rev=1222834&view=auto
==============================================================================
--- james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java (added)
+++ james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java Fri Dec 23 20:36:23 2011
@@ -0,0 +1,57 @@
+package org.apache.james.protocols.api.handler;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.api.ProtocolSession.State;
+import org.apache.james.protocols.api.Response;
+
+/**
+ * A special {@link LineHandler} which will "buffer" the received lines till a point and the push them all at
+ * one to the {@link #onLines(ProtocolSession, Collection)} method
+ * 
+ *
+ * @param <S>
+ */
+public abstract class MultiLineHandler<S extends ProtocolSession> implements LineHandler<S>{
+
+    private static final String BUFFERED_LINES = "BUFFERED_LINES";
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.protocols.api.handler.LineHandler#onLine(org.apache.james.protocols.api.ProtocolSession, byte[])
+     */
+    @SuppressWarnings("unchecked")
+    public Response onLine(S session, byte[] line) {
+        Collection<byte[]> lines = (List<byte[]>) session.getAttachment(BUFFERED_LINES, State.Transaction);
+        if (lines == null)  {
+            lines = new ArrayList<byte[]>();
+            session.setAttachment(BUFFERED_LINES, lines, State.Transaction);
+        }
+        lines.add(line);
+        if (isReady(session, line)) {
+            return onLines(session, (Collection<byte[]>) session.setAttachment(BUFFERED_LINES, null, State.Transaction));
+        }
+        return null;
+    }
+
+    /**
+     * Return <code>true</code> if the buffered lines are ready to get pushed to the {@link #onLines(ProtocolSession, Collection)} method
+     * 
+     * @param session
+     * @param line
+     * @return ready
+     */
+    protected abstract boolean isReady(S session, byte[] line);
+    
+    /**
+     * Handle the buffered lines
+     * 
+     * @param session
+     * @param lines
+     * @return response
+     */
+    protected abstract Response onLines(S session, Collection<byte[]> lines);
+}

Propchange: james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java?rev=1222834&r1=1222833&r2=1222834&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java Fri Dec 23 20:36:23 2011
@@ -66,6 +66,30 @@ public class MailAddress {
     private String localPart = null;
     private String domain = null;
 
+    private static final MailAddress NULL_SENDER = new MailAddress() {
+
+        @Override
+        public String getDomain() {
+            return "";
+        }
+
+        @Override
+        public String getLocalPart() {
+            return "";
+        }
+
+        @Override
+        public String toString() {
+            return "";
+        }
+
+        @Override
+        public boolean isNullSender() {
+            return true;
+        }
+        
+    };
+    
     /**
      * Strips source routing. According to RFC-2821 it is a valid approach
      * to handle mails containing RFC-821 source-route information.
@@ -86,6 +110,13 @@ public class MailAddress {
         return pos;
     }
     
+    public static MailAddress nullSender() {
+        return NULL_SENDER;
+    }
+    
+    private MailAddress() {
+        
+    }
     /**
      * Constructs a MailAddress by parsing the provided address.
      *
@@ -478,4 +509,13 @@ public class MailAddress {
         dSB.append(result);
         return pos;
     }
+    
+    /**
+     * Return <code>true</code> if the {@link MailAddress} should represent a null sender (<>)
+     * 
+     * @return nullsender
+     */
+    public boolean isNullSender() {
+        return false;
+    }
 }

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java?rev=1222834&r1=1222833&r2=1222834&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java Fri Dec 23 20:36:23 2011
@@ -243,7 +243,9 @@ public class MailCmdHandler extends Abst
                                     + " Syntax error in sender address");
                 }
             }
-
+            if (senderAddress == null) {
+                senderAddress = MailAddress.nullSender();
+            }
             // Store the senderAddress in session map
             session.setAttachment(SMTPSession.SENDER, senderAddress, State.Transaction);
         }
@@ -261,7 +263,11 @@ public class MailCmdHandler extends Abst
      * {@inheritDoc}
      */
     protected HookResult callHook(MailHook rawHook, SMTPSession session, String parameters) {
-        return rawHook.doMail(session,(MailAddress) session.getAttachment(SMTPSession.SENDER, State.Transaction));
+        MailAddress sender = (MailAddress) session.getAttachment(SMTPSession.SENDER, State.Transaction);
+        if (sender.isNullSender()) {
+            sender = null;
+        }
+        return rawHook.doMail(session, sender);
     }
 
     
@@ -301,5 +307,6 @@ public class MailCmdHandler extends Abst
     protected String getDefaultDomain() {
         return "localhost";
     }
+    
 
 }

Modified: james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java?rev=1222834&r1=1222833&r2=1222834&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java (original)
+++ james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java Fri Dec 23 20:36:23 2011
@@ -674,6 +674,44 @@ public class SMTPServerTest {
     }
     
     @Test
+    public void testNullSender() throws Exception {
+
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            server = new NettyServer(createProtocol(new ProtocolHandler[0]));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = createClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.setSender("");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+         
+            client.addRecipient(RCPT1);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
     public void testMessageHookPermanentError() throws Exception {
         TestMessageHook testHook = new TestMessageHook();
 



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org