From a502d96a860456ec5e8c96761db70f7cabb74751 Mon Sep 17 00:00:00 2001
From: Paul Martin <paul@paulsputer.com>
Date: Sat, 30 Apr 2016 04:19:14 -0400
Subject: [PATCH] Merge pull request #1073 from gitblit/1062-DocEditorUpdates

---
 src/main/java/com/gitblit/manager/FederationManager.java |   51 +++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/gitblit/manager/FederationManager.java b/src/main/java/com/gitblit/manager/FederationManager.java
index 568e87f..8f68733 100644
--- a/src/main/java/com/gitblit/manager/FederationManager.java
+++ b/src/main/java/com/gitblit/manager/FederationManager.java
@@ -17,6 +17,7 @@
 
 import java.io.File;
 import java.io.FileFilter;
+import java.nio.charset.Charset;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -24,6 +25,8 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+
+import javax.servlet.http.HttpServletRequest;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,9 +41,12 @@
 import com.gitblit.models.FederationSet;
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.UserModel;
+import com.gitblit.utils.Base64;
 import com.gitblit.utils.FederationUtils;
 import com.gitblit.utils.JsonUtils;
 import com.gitblit.utils.StringUtils;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
 
 /**
  * Federation manager controls all aspects of handling federation sets, tokens,
@@ -49,6 +55,7 @@
  * @author James Moger
  *
  */
+@Singleton
 public class FederationManager implements IFederationManager {
 
 	private final Logger logger = LoggerFactory.getLogger(getClass());
@@ -66,10 +73,10 @@
 
 	private final IRepositoryManager repositoryManager;
 
+	@Inject
 	public FederationManager(
 			IRuntimeManager runtimeManager,
 			INotificationManager notificationManager,
-			IUserManager userManager,
 			IRepositoryManager repositoryManager) {
 
 		this.settings = runtimeManager.getSettings();
@@ -100,6 +107,17 @@
 	}
 
 	@Override
+	public boolean canFederate() {
+		String passphrase = settings.getString(Keys.federation.passphrase, "");
+		return !StringUtils.isEmpty(passphrase);
+	}
+
+	/**
+	 * Returns the federation user account.
+	 *
+	 * @return the federation user account
+	 */
+	@Override
 	public UserModel getFederationUser() {
 		// the federation user is an administrator
 		UserModel federationUser = new UserModel(Constants.FEDERATION_USER);
@@ -108,9 +126,30 @@
 	}
 
 	@Override
-	public boolean canFederate() {
-		String passphrase = settings.getString(Keys.federation.passphrase, "");
-		return !StringUtils.isEmpty(passphrase);
+	public UserModel authenticate(HttpServletRequest httpRequest) {
+		if (canFederate()) {
+			// try to authenticate federation user for cloning
+			final String authorization = httpRequest.getHeader("Authorization");
+			if (authorization != null && authorization.startsWith("Basic")) {
+				// Authorization: Basic base64credentials
+				String base64Credentials = authorization.substring("Basic".length()).trim();
+				String credentials = new String(Base64.decode(base64Credentials),
+						Charset.forName("UTF-8"));
+				// credentials = username:password
+				final String[] values = credentials.split(":", 2);
+				if (values.length == 2) {
+					String username = StringUtils.decodeUsername(values[0]);
+					String password = values[1];
+					if (username.equalsIgnoreCase(Constants.FEDERATION_USER)) {
+						List<String> tokens = getFederationTokens();
+						if (tokens.contains(password)) {
+							return getFederationUser();
+						}
+					}
+				}
+			}
+		}
+		return null;
 	}
 
 	/**
@@ -328,6 +367,10 @@
 							&& file.getName().toLowerCase().endsWith(Constants.PROPOSAL_EXT);
 				}
 			});
+			if (files == null) {
+				return list;
+			}
+				
 			for (File file : files) {
 				String json = com.gitblit.utils.FileUtils.readContent(file, null);
 				FederationProposal proposal = JsonUtils.fromJsonString(json,

--
Gitblit v1.9.1