Paul Martin
2016-04-30 a502d96a860456ec5e8c96761db70f7cabb74751
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,