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 2004/08/19 02:45:16 UTC

cvs commit: james-server/src/java/org/apache/james/transport/mailets AbstractRedirect.java Bounce.java DSNBounce.java LocalDelivery.java

noel        2004/08/18 17:45:16

  Modified:    src/java/org/apache/james Tag: branch_2_1_fcs James.java
               src/java/org/apache/james/smtpserver Tag: branch_2_1_fcs
                        SMTPHandler.java
               src/java/org/apache/james/transport/mailets Tag:
                        branch_2_1_fcs AbstractRedirect.java Bounce.java
                        DSNBounce.java LocalDelivery.java
  Log:
  Change to remove improper use of Return-Path header and support proper RFC 2821 reverse path handling.  Should also fix JAMES-264.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.35.4.17 +9 -23     james-server/src/java/org/apache/james/James.java
  
  Index: James.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/James.java,v
  retrieving revision 1.35.4.16
  retrieving revision 1.35.4.17
  diff -u -r1.35.4.16 -r1.35.4.17
  --- James.java	3 May 2004 03:58:07 -0000	1.35.4.16
  +++ James.java	19 Aug 2004 00:45:15 -0000	1.35.4.17
  @@ -638,32 +638,18 @@
           //Create the reply message
           MimeMessage reply = (MimeMessage) orig.reply(false);
   
  -        //If there is a Return-Path header,
  -        String[] returnPathHeaders = orig.getHeader(RFC2822Headers.RETURN_PATH);
  -        String returnPathHeader = null;
  -        if (returnPathHeaders != null) {
  -            // TODO: Take a look at the JavaMail spec to see if the originating header
  -            //       is guaranteed to be at position 0
  -            returnPathHeader = returnPathHeaders[0];
  -            if (returnPathHeader != null) {
  -                returnPathHeader = returnPathHeader.trim();
  -                if (returnPathHeader.equals("<>")) {
  -                    if (getLogger().isInfoEnabled())
  -                        getLogger().info("Processing a bounce request for a message with an empty return path.  No bounce will be sent.");
  -                    return;
  -                } else {
  -                    if (getLogger().isInfoEnabled())
  -                        getLogger().info("Processing a bounce request for a message with a return path header.  The bounce will be sent to " + returnPathHeader);
  -                    //Return the message to that address, not to the Reply-To address
  -                    reply.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(returnPathHeader));
  -                }
  -            }
  +        if (mail.getSender() == null) {
  +            if (getLogger().isInfoEnabled())
  +                getLogger().info("Mail to be bounced contains a null (<>) reverse path.  No bounce will be sent.");
  +            return;
           } else {
  -            getLogger().warn("Mail to be bounced does not contain a Return-Path header.");
  +            // Bounce message goes to the reverse path, not to the Reply-To address
  +            if (getLogger().isInfoEnabled())
  +                getLogger().info("Processing a bounce request for a message with a reverse path of " + mail.getSender().toString());
  +            reply.setRecipient(MimeMessage.RecipientType.TO, mail.getSender().toInternetAddress());
           }
   
           reply.setSentDate(new Date());
  -        reply.setHeader(RFC2822Headers.RETURN_PATH,"<>");
           //Create the list of recipients in our MailAddress format
           Collection recipients = new HashSet();
           Address addresses[] = reply.getAllRecipients();
  
  
  
  No                   revision
  No                   revision
  1.35.4.20 +8 -27     james-server/src/java/org/apache/james/smtpserver/SMTPHandler.java
  
  Index: SMTPHandler.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/smtpserver/SMTPHandler.java,v
  retrieving revision 1.35.4.19
  retrieving revision 1.35.4.20
  diff -u -r1.35.4.19 -r1.35.4.20
  --- SMTPHandler.java	8 May 2004 02:28:30 -0000	1.35.4.19
  +++ SMTPHandler.java	19 Aug 2004 00:45:16 -0000	1.35.4.20
  @@ -1345,35 +1345,16 @@
           if (!headers.isSet(RFC2822Headers.FROM) && state.get(SENDER) != null) {
               headers.setHeader(RFC2822Headers.FROM, state.get(SENDER).toString());
           }
  -        // Determine the Return-Path
  -        String returnPath = headers.getHeader(RFC2822Headers.RETURN_PATH, "\r\n");
  -        headers.removeHeader(RFC2822Headers.RETURN_PATH);
  +        // RFC 2821 says that we cannot examine the message to see if
  +        // Return-Path headers are present.  If there is one, our
  +        // Received: header may precede it, but the Return-Path header
  +        // should be removed when making final delivery.
  +     // headers.removeHeader(RFC2822Headers.RETURN_PATH);
           StringBuffer headerLineBuffer = new StringBuffer(512);
  -        if (returnPath == null) {
  -            if (state.get(SENDER) == null) {
  -                returnPath = "<>";
  -            } else {
  -                headerLineBuffer.append("<")
  -                                .append(state.get(SENDER))
  -                                .append(">");
  -                returnPath = headerLineBuffer.toString();
  -                headerLineBuffer.delete(0, headerLineBuffer.length());
  -            }
  -        }
  -        // We will rebuild the header object to put Return-Path and our
  -        // Received header at the top
  +        // We will rebuild the header object to put our Received header at the top
           Enumeration headerLines = headers.getAllHeaderLines();
           MailHeaders newHeaders = new MailHeaders();
  -        // Put the Return-Path first
  -        // JAMES-281 fix for messages that improperly have multiple
  -        // Return-Path headers
  -        StringTokenizer tokenizer = new StringTokenizer(returnPath, "\r\n");
  -        while(tokenizer.hasMoreTokens()) {
  -            String path = tokenizer.nextToken();
  -            newHeaders.addHeaderLine(RFC2822Headers.RETURN_PATH + ": " + path);
  -        }
  -
  -        // Put our Received header next
  +        // Put our Received header first
           headerLineBuffer.append(RFC2822Headers.RECEIVED + ": from ")
                           .append(remoteHost)
                           .append(" ([")
  
  
  
  No                   revision
  No                   revision
  1.1.2.22  +1 -6      james-server/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
  
  Index: AbstractRedirect.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/transport/mailets/AbstractRedirect.java,v
  retrieving revision 1.1.2.21
  retrieving revision 1.1.2.22
  diff -u -r1.1.2.21 -r1.1.2.22
  --- AbstractRedirect.java	15 Mar 2004 03:54:19 -0000	1.1.2.21
  +++ AbstractRedirect.java	19 Aug 2004 00:45:16 -0000	1.1.2.22
  @@ -706,15 +706,10 @@
        */
       protected void setReversePath(Mail newMail, MailAddress reversePath, Mail originalMail) throws MessagingException {
           if(reversePath != null) {
  -            String reversePathString;
               if (reversePath == SpecialAddress.NULL) {
                   reversePath = null;
  -                reversePathString = "";
  -            } else {
  -                reversePathString = reversePath.toString();
               }
               ((MailImpl) newMail).setSender(reversePath);
  -            newMail.getMessage().setHeader(RFC2822Headers.RETURN_PATH, "<" + reversePathString + ">");
               if (isDebug) {
                   log("reversePath set to: " + reversePath);
               }
  
  
  
  1.1.2.11  +6 -8      james-server/src/java/org/apache/james/transport/mailets/Bounce.java
  
  Index: Bounce.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/transport/mailets/Bounce.java,v
  retrieving revision 1.1.2.10
  retrieving revision 1.1.2.11
  diff -u -r1.1.2.10 -r1.1.2.11
  --- Bounce.java	15 Mar 2004 03:54:19 -0000	1.1.2.10
  +++ Bounce.java	19 Aug 2004 00:45:16 -0000	1.1.2.11
  @@ -169,20 +169,18 @@
        * @throws MessagingException if a problem arises formulating the redirected mail
        */
       public void service(Mail originalMail) throws MessagingException {
  -        MailAddress returnAddress = getExistingReturnPath(originalMail);
  -        if (returnAddress == SpecialAddress.NULL) {
  +        if (originalMail.getSender() == null) {
               if (isDebug)
                   log("Processing a bounce request for a message with an empty reverse-path.  No bounce will be sent.");
               if(!getPassThrough(originalMail)) {
                   originalMail.setState(Mail.GHOST);
               }
               return;
  -        } else if (returnAddress == null) {
  -            log("WARNING: Mail to be bounced does not contain a reverse-path.");
  -        } else {
  -            if (isDebug)
  -                log("Processing a bounce request for a message with a return path header.  The bounce will be sent to " + returnAddress);
           }
  +
  +        if (isDebug)
  +            log("Processing a bounce request for a message with a reverse path.  The bounce will be sent to " + originalMail.getSender().toString());
  +
           super.service(originalMail);
       }
   
  
  
  
  1.1.2.2   +8 -9      james-server/src/java/org/apache/james/transport/mailets/Attic/DSNBounce.java
  
  Index: DSNBounce.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/transport/mailets/Attic/DSNBounce.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- DSNBounce.java	5 May 2004 10:34:53 -0000	1.1.2.1
  +++ DSNBounce.java	19 Aug 2004 00:45:16 -0000	1.1.2.2
  @@ -498,23 +498,22 @@
               ((MailImpl) newMail).setRemoteAddr("127.0.0.1");
               ((MailImpl) newMail).setRemoteHost("localhost");
           }
  -        MailAddress returnAddress = getExistingReturnPath(originalMail);
  -        Collection newRecipients = new HashSet();
  -        if (returnAddress == SpecialAddress.NULL) {
  +
  +        if (originalMail.getSender() == null) {
               if (isDebug)
                   log("Processing a bounce request for a message with an empty reverse-path.  No bounce will be sent.");
               if(!getPassThrough(originalMail)) {
                   originalMail.setState(Mail.GHOST);
               }
               return;
  -        } else if (returnAddress == null) {
  -            log("WARNING: Mail to be bounced does not contain a reverse-path.");
  -        } else {
  -            if (isDebug)
  -                log("Processing a bounce request for a message with a return path header.  The bounce will be sent to " + returnAddress);
           }
   
  -        newRecipients.add(returnAddress);
  +        String reversePath = originalMail.getSender().toString();
  +        if (isDebug)
  +            log("Processing a bounce request for a message with a reverse path.  The bounce will be sent to " + reversePath);
  +
  +        Collection newRecipients = new HashSet();
  +        newRecipients.add(reversePath);
           ((MailImpl)newMail).setRecipients(newRecipients);
   
           if (isDebug) {
  
  
  
  1.6.4.8   +42 -11    james-server/src/java/org/apache/james/transport/mailets/LocalDelivery.java
  
  Index: LocalDelivery.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/transport/mailets/LocalDelivery.java,v
  retrieving revision 1.6.4.7
  retrieving revision 1.6.4.8
  diff -u -r1.6.4.7 -r1.6.4.8
  --- LocalDelivery.java	15 Mar 2004 03:54:19 -0000	1.6.4.7
  +++ LocalDelivery.java	19 Aug 2004 00:45:16 -0000	1.6.4.8
  @@ -17,13 +17,20 @@
   
   package org.apache.james.transport.mailets;
   
  +import org.apache.james.util.RFC2822Headers;
  +
   import org.apache.mailet.GenericMailet;
   import org.apache.mailet.Mail;
   import org.apache.mailet.MailAddress;
   
  +import javax.mail.Header;
   import javax.mail.MessagingException;
   import javax.mail.internet.MimeMessage;
  +import javax.mail.internet.InternetHeaders;
  +
  +import java.util.ArrayList;
   import java.util.Collection;
  +import java.util.Enumeration;
   import java.util.Iterator;
   import java.util.Vector;
   
  @@ -43,23 +50,47 @@
       public void service(Mail mail) throws MessagingException {
           Collection recipients = mail.getRecipients();
           Collection errors = new Vector();
  +
           MimeMessage message = mail.getMessage();
  +
  +        // Create a new InternetHeader collection
  +        InternetHeaders newHeaders = new InternetHeaders();
  +        // Set our Return-Path header
  +        newHeaders.setHeader(RFC2822Headers.RETURN_PATH, mail.getSender() == null ? "<>" : "<" + mail.getSender() + ">");
  +        // Remove all Return-Path headers from the message
  +        message.removeHeader(RFC2822Headers.RETURN_PATH);
  +        // Copy all remaining header lines from the message to our new header set
  +        Enumeration headers = message.getAllHeaderLines();
  +        while (headers.hasMoreElements()) {
  +            newHeaders.addHeaderLine((String) headers.nextElement());
  +        }
  +        // Remember all Header names
  +        headers = message.getAllHeaders();
  +        ArrayList names = new ArrayList();
  +        while (headers.hasMoreElements()) {
  +            names.add(((Header)headers.nextElement()).getName());
  +        }
  +        final String[] headerNames = (String[]) names.toArray(new String[0]);
  +        names = null;
  +
           for (Iterator i = recipients.iterator(); i.hasNext(); ) {
               MailAddress recipient = (MailAddress) i.next();
               try {
  +                // Remove all headers
  +                for(int h = 0; h < headerNames.length; h++) {
  +                    message.removeHeader(headerNames[h]);
  +                }
  +
  +                // Copy our new header set to the message
  +                headers = newHeaders.getAllHeaderLines();
  +                while (headers.hasMoreElements()) {
  +                    message.addHeaderLine((String) headers.nextElement());
  +                }
  +
                   // Add qmail's de facto standard Delivered-To header
  -                MimeMessage localMessage = new MimeMessage(message) {
  -                    protected void updateHeaders() throws MessagingException {
  -                        if (getMessageID() == null) super.updateHeaders();
  -                        else {
  -                            modified = false;
  -                        }
  -                    }
  -                };
  -                localMessage.addHeader("Delivered-To", recipient.toString());
  -                localMessage.saveChanges();
  +                message.addHeaderLine("Delivered-To: " + recipient.toString());
   
  -                getMailetContext().storeMail(mail.getSender(), recipient, localMessage);
  +                getMailetContext().storeMail(mail.getSender(), recipient, message);
               } catch (Exception ex) {
                   getMailetContext().log("Error while storing mail.", ex);
                   errors.add(recipient);
  
  
  

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