diff options
author | David Pursehouse <david.pursehouse@sonymobile.com> | 2014-11-26 00:51:49 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-11-26 00:51:50 +0000 |
commit | 4ecb82d6f380104fc818781476035e18b8000700 (patch) | |
tree | 2abad61b13bbf8bbedb64d0f710303828839e841 | |
parent | 7848e5988e5c0cb14f435e9048a3f8751afe48a1 (diff) | |
parent | aca0479621d21f659d1e98b65e5c32c3cadaafc9 (diff) |
Merge "Fix quoted-printable encoding of e-mail addresses" into stable-2.9
-rw-r--r-- | gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailHeader.java | 40 | ||||
-rw-r--r-- | gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java | 6 |
2 files changed, 38 insertions, 8 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailHeader.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailHeader.java index 6492a5e7ca..7e4f36f3be 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailHeader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailHeader.java @@ -64,23 +64,47 @@ public abstract class EmailHeader { return false; } + static boolean needsQuotedPrintableWithinPhrase(final int cp) { + switch (cp) { + case '!': + case '*': + case '+': + case '-': + case '/': + case '=': + case '_': + return false; + default: + if (('a' <= cp && cp <= 'z') + || ('A' <= cp && cp <= 'Z') + || ('0' <= cp && cp <= '9')) { + return false; + } else { + return true; + } + } + } + static java.lang.String quotedPrintable(java.lang.String value) throws UnsupportedEncodingException { final StringBuilder r = new StringBuilder(); - final byte[] encoded = value.getBytes("UTF-8"); r.append("=?UTF-8?Q?"); - for (byte b : encoded) { - if (b == ' ') { + for (int i = 0; i < value.length(); i++) { + final int cp = value.codePointAt(i); + if (cp == ' ') { r.append('_'); - } else if (b == ',' || b == '=' || b == '"' || b == '_' || b < ' ' || '~' <= b) { - r.append('='); - r.append(Integer.toHexString((b >>> 4) & 0x0f).toUpperCase()); - r.append(Integer.toHexString(b & 0x0f).toUpperCase()); + } else if (needsQuotedPrintableWithinPhrase(cp)) { + byte[] buf = new java.lang.String(Character.toChars(cp)).getBytes("UTF-8"); + for (byte b: buf) { + r.append('='); + r.append(Integer.toHexString((b >>> 4) & 0x0f).toUpperCase()); + r.append(Integer.toHexString(b & 0x0f).toUpperCase()); + } } else { - r.append((char) b); + r.append(Character.toChars(cp)); } } r.append("?="); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java index 02ebf51a69..625e4b6ef6 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java @@ -131,6 +131,12 @@ public class AddressTest { } @Test + public void testToHeaderString_NameEmail7() { + assertEquals("=?UTF-8?Q?A_=E2=82=AC_B_=28Code_Review=29?= <a@a>", + format("A \u20ac B (Code Review)", "a@a")); + } + + @Test public void testToHeaderString_Email1() { assertEquals("a@a", format(null, "a@a")); } |