commits@javamail.java.net

[javamail~mercurial:838] Handle more cases of newlines in addresses - bug 7529

From: <shannon_at_java.net>
Date: Fri, 15 Jul 2016 22:10:30 +0000

Project: javamail
Repository: mercurial
Revision: 838
Author: shannon
Date: 2016-07-15 22:09:47 UTC
Link:

Log Message:
------------
Handle more cases of newlines in addresses - bug 7529


Revisions:
----------
838


Modified Paths:
---------------
mail/src/main/java/javax/mail/internet/MimeMessage.java
mail/src/main/java/javax/mail/internet/NewsAddress.java
mail/src/test/java/javax/mail/internet/MimeMessageTest.java


Diffs:
------
diff -r 36a23abb958b -r 65d3c6a9047a mail/src/main/java/javax/mail/internet/MimeMessage.java
--- a/mail/src/main/java/javax/mail/internet/MimeMessage.java Tue Jul 12 16:38:43 2016 -0700
+++ b/mail/src/main/java/javax/mail/internet/MimeMessage.java Fri Jul 15 15:09:47 2016 -0700
@@ -1,7 +1,7 @@
 /*
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
  *
- * Copyright (c) 1997-2015 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997-2016 Oracle and/or its affiliates. All rights reserved.
  *
  * The contents of this file are subject to the terms of either the GNU
  * General Public License Version 2 only ("GPL") or the Common Development
@@ -393,7 +393,7 @@
         if (address == null)
             removeHeader("From");
         else
- setHeader("From", address.toString());
+ setHeader("From", MimeUtility.fold(6, address.toString()));
     }
 
     /**
@@ -497,7 +497,7 @@
         if (address == null)
             removeHeader("Sender");
         else
- setHeader("Sender", address.toString());
+ setHeader("Sender", MimeUtility.fold(8, address.toString()));
     }
 
     /**

diff -r 36a23abb958b -r 65d3c6a9047a mail/src/main/java/javax/mail/internet/NewsAddress.java
--- a/mail/src/main/java/javax/mail/internet/NewsAddress.java Tue Jul 12 16:38:43 2016 -0700
+++ b/mail/src/main/java/javax/mail/internet/NewsAddress.java Fri Jul 15 15:09:47 2016 -0700
@@ -1,7 +1,7 @@
 /*
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
  *
- * Copyright (c) 1997-2014 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997-2016 Oracle and/or its affiliates. All rights reserved.
  *
  * The contents of this file are subject to the terms of either the GNU
  * General Public License Version 2 only ("GPL") or the Common Development
@@ -81,7 +81,9 @@
      * @param host the host
      */
     public NewsAddress(String newsgroup, String host) {
- this.newsgroup = newsgroup;
+ // XXX - this method should throw an exception so we can report
+ // illegal addresses, but for now just remove whitespace
+ this.newsgroup = newsgroup.replaceAll("\\s+", "");
         this.host = host;
     }
 
@@ -182,14 +184,24 @@
 
         StringBuffer s =
                 new StringBuffer(((NewsAddress)addresses[0]).toString());
- for (int i = 1; i < addresses.length; i++)
- s.append(",").append(((NewsAddress)addresses[i]).toString());
+ int used = s.length();
+ for (int i = 1; i < addresses.length; i++) {
+ s.append(",");
+ used++;
+ String ng = ((NewsAddress)addresses[i]).toString();
+ if (used + ng.length() > 76) {
+ s.append("\r\n\t");
+ used = 8;
+ }
+ s.append(ng);
+ used += ng.length();
+ }
         
         return s.toString();
     }
 
     /**
- * Parse the given comma separated sequence of newsgroup into
+ * Parse the given comma separated sequence of newsgroups into
      * NewsAddress objects.
      *
      * @param newsgroups comma separated newsgroup string

diff -r 36a23abb958b -r 65d3c6a9047a mail/src/test/java/javax/mail/internet/MimeMessageTest.java
--- a/mail/src/test/java/javax/mail/internet/MimeMessageTest.java Tue Jul 12 16:38:43 2016 -0700
+++ b/mail/src/test/java/javax/mail/internet/MimeMessageTest.java Fri Jul 15 15:09:47 2016 -0700
@@ -50,6 +50,7 @@
 
 import javax.mail.*;
 import static javax.mail.Message.RecipientType.*;
+import static javax.mail.internet.MimeMessage.RecipientType.*;
 
 import org.junit.*;
 import static org.junit.Assert.assertArrayEquals;
@@ -96,6 +97,72 @@
     }
 
     /**
+ * Test that setFrom with an address containing a newline is folded
+ * properly.
+ * (Bug 7529)
+ */
+ @Test
+ public void testSetFromFold() throws Exception {
+ InternetAddress addr = new InternetAddress("joe_at_bad.com", "Joe\r\nBad");
+ MimeMessage m = new MimeMessage(s);
+ m.setFrom(addr);
+ assertEquals("Joe\r\n Bad <joe_at_bad.com>", m.getHeader("From", null));
+ }
+
+ /**
+ * Test that setSender with an address containing a newline is folded
+ * properly.
+ * (Bug 7529)
+ */
+ @Test
+ public void testSetSenderFold() throws Exception {
+ InternetAddress addr = new InternetAddress("joe_at_bad.com", "Joe\r\nBad");
+ MimeMessage m = new MimeMessage(s);
+ m.setSender(addr);
+ assertEquals("Joe\r\n Bad <joe_at_bad.com>", m.getHeader("Sender", null));
+ }
+
+ /**
+ * Test that setRecipient with a newsgroup address containing a newline is
+ * handled properly.
+ * (Bug 7529)
+ */
+ @Test
+ public void testSetNewsgroupWhitespace() throws Exception {
+ NewsAddress addr = new NewsAddress("alt.\r\nbad");
+ MimeMessage m = new MimeMessage(s);
+ m.setRecipient(NEWSGROUPS, addr);
+ assertEquals("alt.bad", m.getHeader("Newsgroups", null));
+ }
+
+ /**
+ * Test that setRecipients with many newsgroup addresses is folded properly.
+ * (Bug 7529)
+ */
+ @Test
+ public void testSetNewsgroupFold() throws Exception {
+ NewsAddress[] longng = NewsAddress.parse(
+ "alt.loooooooooooooooooooooooooooooooooooooooooooooooooong," +
+ "alt.verylongggggggggggggggggggggggggggggggggggggggggggggg");
+ MimeMessage m = new MimeMessage(s);
+ m.setRecipients(NEWSGROUPS, longng);
+ assertTrue(m.getHeader("Newsgroups", null).indexOf("\r\n\t") > 0);
+ }
+
+ /**
+ * Test that newsgroups can be set and read back (even if folded).
+ */
+ @Test
+ public void testSetGetNewsgroups() throws Exception {
+ NewsAddress[] longng = NewsAddress.parse(
+ "alt.loooooooooooooooooooooooooooooooooooooooooooooooooong," +
+ "alt.verylongggggggggggggggggggggggggggggggggggggggggggggg");
+ MimeMessage m = new MimeMessage(s);
+ m.setRecipients(NEWSGROUPS, longng);
+ assertArrayEquals(longng, m.getRecipients(NEWSGROUPS));
+ }
+
+ /**
      * Test that copying a DataHandler from one message to another
      * has the desired effect.
      */