From 14cbbeaf61ce67c1ef5a6445515f3134dd5690ce Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 30 Dec 2013 16:53:58 -0500
Subject: [PATCH] New canonical base url setting for repository urls and notifications

---
 src/main/java/com/gitblit/git/GitblitReceivePackFactory.java |   10 ++++++----
 src/main/java/com/gitblit/servlet/SyndicationServlet.java    |    5 ++++-
 src/main/java/com/gitblit/servlet/RpcServlet.java            |   10 ++++++++--
 src/main/java/com/gitblit/git/GitblitReceivePack.java        |    6 ------
 src/main/java/com/gitblit/manager/GitblitManager.java        |    6 +++++-
 src/main/distrib/data/gitblit.properties                     |    6 ++++++
 src/main/java/com/gitblit/servlet/FederationServlet.java     |   12 +++++++++---
 7 files changed, 38 insertions(+), 17 deletions(-)

diff --git a/src/main/distrib/data/gitblit.properties b/src/main/distrib/data/gitblit.properties
index edfa1c4..482a835 100644
--- a/src/main/distrib/data/gitblit.properties
+++ b/src/main/distrib/data/gitblit.properties
@@ -612,6 +612,12 @@
 # SINCE 0.5.0
 web.siteName =
 
+# The canonical url of your Gitblit server to bs used in email notifications.
+# e.g. web.canonicalUrl = https://demo-gitblit.rhcloud.com
+#
+# SINCE 1.4.0
+web.canonicalUrl = 
+
 # You may specify a different logo image for the header but it must be 120x45px.
 # If the specified file does not exist, the default Gitblit logo will be used.
 #
diff --git a/src/main/java/com/gitblit/git/GitblitReceivePack.java b/src/main/java/com/gitblit/git/GitblitReceivePack.java
index e5c0ea4..c373465 100644
--- a/src/main/java/com/gitblit/git/GitblitReceivePack.java
+++ b/src/main/java/com/gitblit/git/GitblitReceivePack.java
@@ -85,8 +85,6 @@
 
 	protected String gitblitUrl;
 
-	protected String repositoryUrl;
-
 	protected GroovyScriptEngine gse;
 
 	private final IStoredSettings settings;
@@ -388,10 +386,6 @@
 
 	protected void setGitblitUrl(String url) {
 		this.gitblitUrl = url;
-	}
-
-	protected void setRepositoryUrl(String url) {
-		this.repositoryUrl = url;
 	}
 
 	protected void sendRejection(final ReceiveCommand cmd, final String why, Object... objects) {
diff --git a/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java b/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java
index bdf9b1a..b8b49bc 100644
--- a/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java
+++ b/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java
@@ -63,7 +63,6 @@
 		String repositoryName = "";
 		String origin = "";
 		String gitblitUrl = "";
-		String repositoryUrl = "";
 		int timeout = 0;
 
 		if (req instanceof HttpServletRequest) {
@@ -72,7 +71,6 @@
 			repositoryName = request.getAttribute("gitblitRepositoryName").toString();
 			origin = request.getRemoteHost();
 			gitblitUrl = HttpUtils.getGitblitURL(request);
-			repositoryUrl = request.getRequestURI();
 
 			// determine pushing user
 			String username = request.getRemoteUser();
@@ -98,11 +96,15 @@
 			throw new ServiceNotEnabledException();
 		}
 
+		String url = settings.getString(Keys.web.canonicalUrl, null);
+		if (StringUtils.isEmpty(url)) {
+			url = gitblitUrl;
+		}
+		
 		final RepositoryModel repository = gitblit.getRepositoryModel(repositoryName);
 
 		final GitblitReceivePack rp = new GitblitReceivePack(gitblit, db, repository, user);
-		rp.setGitblitUrl(gitblitUrl);
-		rp.setRepositoryUrl(repositoryUrl);
+		rp.setGitblitUrl(url);
 		rp.setRefLogIdent(new PersonIdent(user.username, user.username + "@" + origin));
 		rp.setTimeout(timeout);
 
diff --git a/src/main/java/com/gitblit/manager/GitblitManager.java b/src/main/java/com/gitblit/manager/GitblitManager.java
index 75b258a..7e78836 100644
--- a/src/main/java/com/gitblit/manager/GitblitManager.java
+++ b/src/main/java/com/gitblit/manager/GitblitManager.java
@@ -337,8 +337,12 @@
 	}
 
 	protected String getRepositoryUrl(HttpServletRequest request, String username, RepositoryModel repository) {
+		String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null);
+		if (StringUtils.isEmpty(gitblitUrl)) {
+			gitblitUrl = HttpUtils.getGitblitURL(request);
+		}
 		StringBuilder sb = new StringBuilder();
-		sb.append(HttpUtils.getGitblitURL(request));
+		sb.append(gitblitUrl);
 		sb.append(Constants.R_PATH);
 		sb.append(repository.name);
 
diff --git a/src/main/java/com/gitblit/servlet/FederationServlet.java b/src/main/java/com/gitblit/servlet/FederationServlet.java
index 372292d..8dbf0e1 100644
--- a/src/main/java/com/gitblit/servlet/FederationServlet.java
+++ b/src/main/java/com/gitblit/servlet/FederationServlet.java
@@ -138,8 +138,11 @@
 				return;
 			}
 
-			String url = HttpUtils.getGitblitURL(request);
-			federationManager.submitFederationProposal(proposal, url);
+			String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null);
+			if (StringUtils.isEmpty(gitblitUrl)) {
+				gitblitUrl = HttpUtils.getGitblitURL(request);
+			}
+			federationManager.submitFederationProposal(proposal, gitblitUrl);
 			logger.info(MessageFormat.format(
 					"Submitted {0} federation proposal to pull {1} repositories from {2}",
 					proposal.tokenType.name(), proposal.repositories.size(), proposal.url));
@@ -185,7 +188,10 @@
 
 		Object result = null;
 		if (FederationRequest.PULL_REPOSITORIES.equals(reqType)) {
-			String gitblitUrl = HttpUtils.getGitblitURL(request);
+			String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null);
+			if (StringUtils.isEmpty(gitblitUrl)) {
+				gitblitUrl = HttpUtils.getGitblitURL(request);
+			}
 			result = federationManager.getRepositories(gitblitUrl, token);
 		} else {
 			if (FederationRequest.PULL_SETTINGS.equals(reqType)) {
diff --git a/src/main/java/com/gitblit/servlet/RpcServlet.java b/src/main/java/com/gitblit/servlet/RpcServlet.java
index e7b3ed2..28f0d5b 100644
--- a/src/main/java/com/gitblit/servlet/RpcServlet.java
+++ b/src/main/java/com/gitblit/servlet/RpcServlet.java
@@ -101,7 +101,10 @@
 			result = PROTOCOL_VERSION;
 		} else if (RpcRequest.LIST_REPOSITORIES.equals(reqType)) {
 			// Determine the Gitblit clone url
-			String gitblitUrl = HttpUtils.getGitblitURL(request);
+			String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null);
+			if (StringUtils.isEmpty(gitblitUrl)) {
+				gitblitUrl = HttpUtils.getGitblitURL(request);
+			}
 			StringBuilder sb = new StringBuilder();
 			sb.append(gitblitUrl);
 			sb.append(Constants.R_PATH);
@@ -320,7 +323,10 @@
 		} else if (RpcRequest.LIST_FEDERATION_SETS.equals(reqType)) {
 			// return the list of federation sets
 			if (allowAdmin && gitblit.canFederate()) {
-				String gitblitUrl = HttpUtils.getGitblitURL(request);
+				String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null);
+				if (StringUtils.isEmpty(gitblitUrl)) {
+					gitblitUrl = HttpUtils.getGitblitURL(request);
+				}
 				result = gitblit.getFederationSets(gitblitUrl);
 			} else {
 				response.sendError(notAllowedCode);
diff --git a/src/main/java/com/gitblit/servlet/SyndicationServlet.java b/src/main/java/com/gitblit/servlet/SyndicationServlet.java
index 8acd019..66ca4a1 100644
--- a/src/main/java/com/gitblit/servlet/SyndicationServlet.java
+++ b/src/main/java/com/gitblit/servlet/SyndicationServlet.java
@@ -222,7 +222,10 @@
 			// parameterized parameters
 			urlPattern = "{0}/commit/?r={1}&h={2}";
 		}
-		String gitblitUrl = HttpUtils.getGitblitURL(request);
+		String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null);
+		if (StringUtils.isEmpty(gitblitUrl)) {
+			gitblitUrl = HttpUtils.getGitblitURL(request);
+		}
 		char fsc = settings.getChar(Keys.web.forwardSlashCharacter, '/');
 
 		List<FeedEntryModel> entries = new ArrayList<FeedEntryModel>();

--
Gitblit v1.9.1