From ac7e9a61460554aa0183c677bb15d1f473519f55 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 07 Dec 2012 08:24:43 -0500
Subject: [PATCH] Harden metrics from polluted data (issue-176)

---
 src/com/gitblit/utils/StringUtils.java           |   14 ++++++++++++++
 docs/04_releases.mkd                             |    1 +
 src/com/gitblit/models/Activity.java             |    4 ++--
 src/com/gitblit/utils/MetricUtils.java           |    1 +
 src/com/gitblit/wicket/pages/RepositoryPage.java |    2 ++
 5 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/docs/04_releases.mkd b/docs/04_releases.mkd
index 396b255..d42152f 100644
--- a/docs/04_releases.mkd
+++ b/docs/04_releases.mkd
@@ -12,6 +12,7 @@
 
 #### fixes
 
+- Author metrics can be broken by newlines in email addresses from converted repositories (issue 176)
 - Set subjectAlternativeName on generated SSL cert if CN is an ip address (issue 170)
 - Fixed incorrect links on history page for files not in the current/active commit (issue 166)
 - Empty repository page failed to handle missing repository (issue 160)
diff --git a/src/com/gitblit/models/Activity.java b/src/com/gitblit/models/Activity.java
index 771c8a1..7e0cb4b 100644
--- a/src/com/gitblit/models/Activity.java
+++ b/src/com/gitblit/models/Activity.java
@@ -28,6 +28,7 @@
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.revwalk.RevCommit;
 
+import com.gitblit.utils.StringUtils;
 import com.gitblit.utils.TimeUtils;
 
 /**
@@ -93,8 +94,7 @@
 			}
 			repositoryMetrics.get(repository).count++;
 
-			String author = commit.getAuthorIdent().getEmailAddress()
-					.toLowerCase();
+			String author = StringUtils.removeNewlines(commit.getAuthorIdent().getEmailAddress()).toLowerCase();			
 			if (!authorMetrics.containsKey(author)) {
 				authorMetrics.put(author, new Metric(author));
 			}
diff --git a/src/com/gitblit/utils/MetricUtils.java b/src/com/gitblit/utils/MetricUtils.java
index e9e1fa5..26e4581 100644
--- a/src/com/gitblit/utils/MetricUtils.java
+++ b/src/com/gitblit/utils/MetricUtils.java
@@ -210,6 +210,7 @@
 							p = rev.getAuthorIdent().getEmailAddress().toLowerCase();
 						}
 					}
+					p = p.replace('\n',' ').replace('\r',  ' ').trim();
 					if (!metricMap.containsKey(p)) {
 						metricMap.put(p, new Metric(p));
 					}
diff --git a/src/com/gitblit/utils/StringUtils.java b/src/com/gitblit/utils/StringUtils.java
index 8684004..86823db 100644
--- a/src/com/gitblit/utils/StringUtils.java
+++ b/src/com/gitblit/utils/StringUtils.java
@@ -719,4 +719,18 @@
 		Matcher m = p.matcher(input);
 		return m.matches();
 	}
+	
+	/**
+	 * Removes new line and carriage return chars from a string.
+	 * If input value is null an empty string is returned.
+	 *  
+	 * @param input
+	 * @return a sanitized or empty string
+	 */
+	public static String removeNewlines(String input) {
+		if (input == null) {
+			return "";
+		}
+		return input.replace('\n',' ').replace('\r',  ' ').trim();
+	}
 }
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/RepositoryPage.java b/src/com/gitblit/wicket/pages/RepositoryPage.java
index b4e1a0e..897e200 100644
--- a/src/com/gitblit/wicket/pages/RepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/RepositoryPage.java
@@ -450,6 +450,8 @@
 			Constants.SearchType searchType) {
 		String name = identity == null ? "" : identity.getName();
 		String address = identity == null ? "" : identity.getEmailAddress();
+		name = StringUtils.removeNewlines(name);
+		address = StringUtils.removeNewlines(address);
 		boolean showEmail = GitBlit.getBoolean(Keys.web.showEmailAddresses, false);
 		if (!showEmail || StringUtils.isEmpty(name) || StringUtils.isEmpty(address)) {
 			String value = name;

--
Gitblit v1.9.1