James Moger
2013-06-24 79dd0bddbd939c85f002f3a33b95ae84d0bf38cb
src/main/java/com/gitblit/GitBlit.java
@@ -114,6 +114,7 @@
import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.Base64;
import com.gitblit.utils.ByteFormat;
import com.gitblit.utils.CommitCache;
import com.gitblit.utils.ContainerUtils;
import com.gitblit.utils.DeepCopier;
import com.gitblit.utils.FederationUtils;
@@ -509,7 +510,7 @@
      if (user == null) {
         user = UserModel.ANONYMOUS;
      }
      String username = UserModel.ANONYMOUS.equals(user) ? "" : user.username;
      String username = encodeUsername(UserModel.ANONYMOUS.equals(user) ? "" : user.username);
      List<RepositoryUrl> list = new ArrayList<RepositoryUrl>();
      // http/https url
@@ -681,7 +682,15 @@
    * @return true if the user service supports credential changes
    */
   public boolean supportsCredentialChanges(UserModel user) {
      return (user != null && user.isLocalAccount()) || userService.supportsCredentialChanges();
      if (user == null) {
         return false;
      } else if (!Constants.EXTERNAL_ACCOUNT.equals(user.password)) {
         // credentials likely maintained by Gitblit
         return userService.supportsCredentialChanges();
      } else {
         // credentials are externally maintained
         return false;
      }
   }
   /**
@@ -727,6 +736,7 @@
         // can not authenticate empty username
         return null;
      }
      String usernameDecoded = decodeUsername(username);
      String pw = new String(password);
      if (StringUtils.isEmpty(pw)) {
         // can not authenticate empty password
@@ -735,7 +745,7 @@
      // check to see if this is the federation user
      if (canFederate()) {
         if (username.equalsIgnoreCase(Constants.FEDERATION_USER)) {
         if (usernameDecoded.equalsIgnoreCase(Constants.FEDERATION_USER)) {
            List<String> tokens = getFederationTokens();
            if (tokens.contains(pw)) {
               // the federation user is an administrator
@@ -750,7 +760,7 @@
      if (userService == null) {
         return null;
      }
      return userService.authenticate(username, password);
      return userService.authenticate(usernameDecoded, password);
   }
   /**
@@ -827,11 +837,22 @@
      Principal principal = httpRequest.getUserPrincipal();
      if (principal != null) {
         String username = principal.getName();
         if (StringUtils.isEmpty(username)) {
         if (!StringUtils.isEmpty(username)) {
            UserModel user = getUserModel(username);
            if (user != null) {
               // existing user
               flagWicketSession(AuthenticationType.CONTAINER);
               logger.debug(MessageFormat.format("{0} authenticated by servlet container principal from {1}",
                     user.username, httpRequest.getRemoteAddr()));
               return user;
            } else if (settings.getBoolean(Keys.realm.container.autoCreateAccounts, true)) {
               // auto-create user from an authenticated container principal
               user = new UserModel(username.toLowerCase());
               user.displayName = username;
               user.password = Constants.EXTERNAL_ACCOUNT;
               userService.updateUserModel(user);
               flagWicketSession(AuthenticationType.CONTAINER);
               logger.debug(MessageFormat.format("{0} authenticated and created by servlet container principal from {1}",
                     user.username, httpRequest.getRemoteAddr()));
               return user;
            } else {
@@ -910,7 +931,10 @@
      if (userService == null) {
         return;
      }
      if (userService.supportsCookies()) {
      GitBlitWebSession session = GitBlitWebSession.get();
      boolean standardLogin = session.authenticationType.isStandard();
      if (userService.supportsCookies() && standardLogin) {
         Cookie userCookie;
         if (user == null) {
            // clear cookie for logout
@@ -945,6 +969,26 @@
   }
   /**
    * Encode the username for user in an url.
    *
    * @param name
    * @return the encoded name
    */
   protected String encodeUsername(String name) {
      return name.replace("@", "%40").replace(" ", "%20").replace("\\", "%5C");
   }
   /**
    * Decode a username from an encoded url.
    *
    * @param name
    * @return the decoded name
    */
   protected String decodeUsername(String name) {
      return name.replace("%40", "@").replace("%20", " ").replace("%5C", "\\");
   }
   /**
    * Returns the list of all users available to the login service.
    * 
    * @see IUserService.getAllUsernames()
@@ -977,7 +1021,8 @@
      if (StringUtils.isEmpty(username)) {
         return false;
      }
      return userService.deleteUser(username);
      String usernameDecoded = decodeUsername(username);
      return userService.deleteUser(usernameDecoded);
   }
   /**
@@ -991,7 +1036,8 @@
      if (StringUtils.isEmpty(username)) {
         return null;
      }
      UserModel user = userService.getUserModel(username);
      String usernameDecoded = decodeUsername(username);
      UserModel user = userService.getUserModel(usernameDecoded);
      return user;
   }
   
@@ -1939,6 +1985,8 @@
               Constants.CONFIG_GITBLIT, null, "mailingList")));
         model.indexedBranches = new ArrayList<String>(Arrays.asList(config.getStringList(
               Constants.CONFIG_GITBLIT, null, "indexBranch")));
         model.metricAuthorExclusions = new ArrayList<String>(Arrays.asList(config.getStringList(
               Constants.CONFIG_GITBLIT, null, "metricAuthorExclusions")));
         
         // Custom defined properties
         model.customFields = new LinkedHashMap<String, String>();
@@ -2465,6 +2513,7 @@
      updateList(config, "postReceiveScript", repository.postReceiveScripts);
      updateList(config, "mailingList", repository.mailingLists);
      updateList(config, "indexBranch", repository.indexedBranches);
      updateList(config, "metricAuthorExclusions", repository.metricAuthorExclusions);
      
      // User Defined Properties
      if (repository.customFields != null) {
@@ -3006,7 +3055,9 @@
      if (repository != null) {
         for (String teamname : userService.getTeamnamesForRepositoryRole(repository.name)) {
            TeamModel team = userService.getTeamModel(teamname);
            scripts.addAll(team.preReceiveScripts);
            if (!ArrayUtils.isEmpty(team.preReceiveScripts)) {
               scripts.addAll(team.preReceiveScripts);
            }
         }
      }
      return new ArrayList<String>(scripts);
@@ -3056,7 +3107,9 @@
      if (repository != null) {
         for (String teamname : userService.getTeamnamesForRepositoryRole(repository.name)) {
            TeamModel team = userService.getTeamModel(teamname);
            scripts.addAll(team.postReceiveScripts);
            if (!ArrayUtils.isEmpty(team.postReceiveScripts)) {
               scripts.addAll(team.postReceiveScripts);
            }
         }
      }
      return new ArrayList<String>(scripts);
@@ -3350,6 +3403,8 @@
      configureFanout();
      configureGitDaemon();
      
      CommitCache.instance().setCacheDays(settings.getInteger(Keys.web.activityCacheDays, 14));
      ContainerUtils.CVE_2007_0450.test();
   }