From ffe9bd0ea959cf768983ff1a3d2de897390016d7 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 29 Mar 2013 12:11:05 -0400
Subject: [PATCH] Fixed UTF-8 encoding in email notifications (issue 218)

---
 releases.moxie                                |    4 ++
 src/main/java/com/gitblit/GitBlit.java        |   49 +++++++++++++-----------
 src/main/java/com/gitblit/MailExecutor.java   |   13 ------
 src/test/java/com/gitblit/tests/MailTest.java |    5 +-
 4 files changed, 33 insertions(+), 38 deletions(-)

diff --git a/releases.moxie b/releases.moxie
index dfad650..b34ea3b 100644
--- a/releases.moxie
+++ b/releases.moxie
@@ -16,6 +16,7 @@
 	 - Do not queue emails with no recipients (issue 201)
 	 - Disable view and blame links for deleted blobs (issue 216)
 	 - Fixed 1.2.x regression with individually symlinked repositories (issue 217)
+	 - Fixed UTF-8 encoding errors in email notifications (issue 218)
 	 - Fixed NPE in 1.2.1 Federation Client (issue 219)
 	 - Fixed extracting Groovy scripts on Express installs (issue 220)
 	 - Ensure Redmine url is properly formatted (issue 223)
@@ -53,6 +54,9 @@
 	- Yukihiko Sawanobori
     - github/akquinet
     - github/dapengme
+	
+	dependencyChanges:
+	- JGit 2.3.1.201302201838-r
 }
 
 #
diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java
index 65dc559..83769d3 100644
--- a/src/main/java/com/gitblit/GitBlit.java
+++ b/src/main/java/com/gitblit/GitBlit.java
@@ -54,6 +54,8 @@
 
 import javax.mail.Message;
 import javax.mail.MessagingException;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMultipart;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
@@ -2580,17 +2582,8 @@
 		}
 
 		// send an email, if possible
-		try {
-			Message message = mailExecutor.createMessageForAdministrators();
-			if (message != null) {
-				message.setSubject("Federation proposal from " + proposal.url);
-				message.setText("Please review the proposal @ " + gitblitUrl + "/proposal/"
-						+ proposal.token);
-				mailExecutor.queue(message);
-			}
-		} catch (Throwable t) {
-			logger.error("Failed to notify administrators of proposal", t);
-		}
+		sendMailToAdministrators("Federation proposal from " + proposal.url,
+				"Please review the proposal @ " + gitblitUrl + "/proposal/" + proposal.token);
 		return true;
 	}
 
@@ -2877,16 +2870,8 @@
 	 * @param message
 	 */
 	public void sendMailToAdministrators(String subject, String message) {
-		try {
-			Message mail = mailExecutor.createMessageForAdministrators();
-			if (mail != null) {
-				mail.setSubject(subject);
-				mail.setText(message);
-				mailExecutor.queue(mail);
-			}
-		} catch (MessagingException e) {
-			logger.error("Messaging error", e);
-		}
+		List<String> toAddresses = settings.getStrings(Keys.mail.adminAddresses);
+		sendMail(subject, message, toAddresses);
 	}
 
 	/**
@@ -2916,7 +2901,16 @@
 			Message mail = mailExecutor.createMessage(toAddresses);
 			if (mail != null) {
 				mail.setSubject(subject);
-				mail.setText(message);
+				
+				MimeBodyPart messagePart = new MimeBodyPart();				
+				messagePart.setText(message, "utf-8");
+				messagePart.setHeader("Content-Type", "text/plain; charset=\"utf-8\"");
+				messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
+				
+				MimeMultipart multiPart = new MimeMultipart();
+				multiPart.addBodyPart(messagePart);
+				mail.setContent(multiPart);
+				
 				mailExecutor.queue(mail);
 			}
 		} catch (MessagingException e) {
@@ -2951,7 +2945,16 @@
 			Message mail = mailExecutor.createMessage(toAddresses);
 			if (mail != null) {
 				mail.setSubject(subject);
-				mail.setContent(message, "text/html");
+				
+				MimeBodyPart messagePart = new MimeBodyPart();				
+				messagePart.setText(message, "utf-8");
+				messagePart.setHeader("Content-Type", "text/html; charset=\"utf-8\"");
+				messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
+				
+				MimeMultipart multiPart = new MimeMultipart();
+				multiPart.addBodyPart(messagePart);
+				mail.setContent(multiPart);
+
 				mailExecutor.queue(mail);
 			}
 		} catch (MessagingException e) {
diff --git a/src/main/java/com/gitblit/MailExecutor.java b/src/main/java/com/gitblit/MailExecutor.java
index 9001e83..54ff8b8 100644
--- a/src/main/java/com/gitblit/MailExecutor.java
+++ b/src/main/java/com/gitblit/MailExecutor.java
@@ -110,19 +110,6 @@
 		return session != null;
 	}
 
-	/**
-	 * Creates a message for the administrators.
-	 * 
-	 * @returna message
-	 */
-	public Message createMessageForAdministrators() {
-		List<String> toAddresses = settings.getStrings(Keys.mail.adminAddresses);
-		if (toAddresses.size() == 0) {
-			logger.warn("Can not notify administrators because no email addresses are defined!");
-			return null;
-		}
-		return createMessage(toAddresses);
-	}
 
 	/**
 	 * Create a message.
diff --git a/src/test/java/com/gitblit/tests/MailTest.java b/src/test/java/com/gitblit/tests/MailTest.java
index 05d55a2..4feedb0 100644
--- a/src/test/java/com/gitblit/tests/MailTest.java
+++ b/src/test/java/com/gitblit/tests/MailTest.java
@@ -22,6 +22,7 @@
 import org.junit.Test;
 
 import com.gitblit.FileSettings;
+import com.gitblit.Keys;
 import com.gitblit.MailExecutor;
 
 public class MailTest {
@@ -30,9 +31,9 @@
 	public void testSendMail() throws Exception {
 		FileSettings settings = new FileSettings("mailtest.properties");
 		MailExecutor mail = new MailExecutor(settings);
-		Message message = mail.createMessageForAdministrators();
+		Message message = mail.createMessage(settings.getStrings(Keys.mail.adminAddresses));
 		message.setSubject("Test");
-		message.setText("this is a test");
+		message.setText("Lägger till andra stycket i ny fil. UTF-8 encoded");
 		mail.queue(message);
 		mail.run();
 

--
Gitblit v1.9.1