summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Pursehouse <david.pursehouse@sonymobile.com>2014-11-26 00:51:49 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-11-26 00:51:50 +0000
commit4ecb82d6f380104fc818781476035e18b8000700 (patch)
tree2abad61b13bbf8bbedb64d0f710303828839e841
parent7848e5988e5c0cb14f435e9048a3f8751afe48a1 (diff)
parentaca0479621d21f659d1e98b65e5c32c3cadaafc9 (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.java40
-rw-r--r--gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java6
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"));
}