James Moger
2014-11-04 4e84166db5c5538e3984d9d2d6bb1f9902e65ee0
src/main/java/com/gitblit/manager/AuthenticationManager.java
@@ -24,18 +24,18 @@
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.wicket.RequestCycle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.gitblit.Constants;
import com.gitblit.Constants.AccountType;
import com.gitblit.Constants.AuthenticationType;
import com.gitblit.Constants.Role;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.auth.AuthenticationProvider;
@@ -53,7 +53,8 @@
import com.gitblit.utils.HttpUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.X509Utils.X509Metadata;
import com.gitblit.wicket.GitBlitWebSession;
import com.google.inject.Inject;
import com.google.inject.Singleton;
/**
 * The authentication manager handles user login & logout.
@@ -61,6 +62,7 @@
 * @author James Moger
 *
 */
@Singleton
public class AuthenticationManager implements IAuthenticationManager {
   private final Logger logger = LoggerFactory.getLogger(getClass());
@@ -202,7 +204,7 @@
               UserModel user = userManager.getUserModel(username);
               if (user != null) {
                  // existing user
                  flagWicketSession(AuthenticationType.CONTAINER);
                  flagSession(httpRequest, AuthenticationType.CONTAINER);
                  logger.debug(MessageFormat.format("{0} authenticated by servlet container principal from {1}",
                        user.username, httpRequest.getRemoteAddr()));
                  return validateAuthentication(user, AuthenticationType.CONTAINER);
@@ -214,7 +216,7 @@
                  user.password = Constants.EXTERNAL_ACCOUNT;
                  user.accountType = AccountType.CONTAINER;
                  userManager.updateUserModel(user);
                  flagWicketSession(AuthenticationType.CONTAINER);
                  flagSession(httpRequest, AuthenticationType.CONTAINER);
                  logger.debug(MessageFormat.format("{0} authenticated and created by servlet container principal from {1}",
                        user.username, httpRequest.getRemoteAddr()));
                  return validateAuthentication(user, AuthenticationType.CONTAINER);
@@ -235,7 +237,7 @@
         UserModel user = userManager.getUserModel(model.username);
         X509Metadata metadata = HttpUtils.getCertificateMetadata(httpRequest);
         if (user != null) {
            flagWicketSession(AuthenticationType.CERTIFICATE);
            flagSession(httpRequest, AuthenticationType.CERTIFICATE);
            logger.debug(MessageFormat.format("{0} authenticated by client certificate {1} from {2}",
                  user.username, metadata.serialNumber, httpRequest.getRemoteAddr()));
            return validateAuthentication(user, AuthenticationType.CERTIFICATE);
@@ -257,7 +259,7 @@
      if (!StringUtils.isEmpty(cookie)) {
         user = userManager.getUserModel(cookie.toCharArray());
         if (user != null) {
            flagWicketSession(AuthenticationType.COOKIE);
            flagSession(httpRequest, AuthenticationType.COOKIE);
            logger.debug(MessageFormat.format("{0} authenticated by cookie from {1}",
               user.username, httpRequest.getRemoteAddr()));
            return validateAuthentication(user, AuthenticationType.COOKIE);
@@ -279,7 +281,7 @@
            char[] password = values[1].toCharArray();
            user = authenticate(username, password);
            if (user != null) {
               flagWicketSession(AuthenticationType.CREDENTIALS);
               flagSession(httpRequest, AuthenticationType.CREDENTIALS);
               logger.debug(MessageFormat.format("{0} authenticated by BASIC request header from {1}",
                     user.username, httpRequest.getRemoteAddr()));
               return validateAuthentication(user, AuthenticationType.CREDENTIALS);
@@ -344,13 +346,8 @@
      return user;
   }
   protected void flagWicketSession(AuthenticationType authenticationType) {
      RequestCycle requestCycle = RequestCycle.get();
      if (requestCycle != null) {
         // flag the Wicket session, if this is a Wicket request
         GitBlitWebSession session = GitBlitWebSession.get();
         session.authenticationType = authenticationType;
      }
   protected void flagSession(HttpServletRequest httpRequest, AuthenticationType authenticationType) {
      httpRequest.getSession().setAttribute(Constants.AUTHENTICATION_TYPE, authenticationType);
   }
   /**
@@ -456,10 +453,24 @@
    * @param user
    */
   @Override
   @Deprecated
   public void setCookie(HttpServletResponse response, UserModel user) {
      setCookie(null, response, user);
   }
   /**
    * Sets a cookie for the specified user.
    *
    * @param request
    * @param response
    * @param user
    */
   @Override
   public void setCookie(HttpServletRequest request, HttpServletResponse response, UserModel user) {
      if (settings.getBoolean(Keys.web.allowCookieAuthentication, true)) {
         GitBlitWebSession session = GitBlitWebSession.get();
         boolean standardLogin = session.authenticationType.isStandard();
         HttpSession session = request.getSession();
         AuthenticationType authenticationType = (AuthenticationType) session.getAttribute(Constants.AUTHENTICATION_TYPE);
         boolean standardLogin = authenticationType.isStandard();
         if (standardLogin) {
            Cookie userCookie;
@@ -479,7 +490,13 @@
                  userCookie.setMaxAge((int) TimeUnit.DAYS.toSeconds(7));
               }
            }
            userCookie.setPath("/");
            String path = "/";
            if (request != null) {
               if (!StringUtils.isEmpty(request.getContextPath())) {
                  path = request.getContextPath();
               }
            }
            userCookie.setPath(path);
            response.addCookie(userCookie);
         }
      }
@@ -488,11 +505,25 @@
   /**
    * Logout a user.
    *
    * @param response
    * @param user
    */
   @Override
   @Deprecated
   public void logout(HttpServletResponse response, UserModel user) {
      setCookie(response,  null);
      setCookie(null, response,  null);
   }
   /**
    * Logout a user.
    *
    * @param request
    * @param response
    * @param user
    */
   @Override
   public void logout(HttpServletRequest request, HttpServletResponse response, UserModel user) {
      setCookie(request, response,  null);
   }
   /**
@@ -550,6 +581,28 @@
      return (team != null && team.isLocalTeam()) || findProvider(team).supportsTeamMembershipChanges();
   }
   /**
    * Returns true if the user's role can be changed.
    *
    * @param user
    * @return true if the user's role can be changed
    */
   @Override
   public boolean supportsRoleChanges(UserModel user, Role role) {
      return (user != null && user.isLocalAccount()) || findProvider(user).supportsRoleChanges(user, role);
   }
   /**
    * Returns true if the team's role can be changed.
    *
    * @param user
    * @return true if the team's role can be changed
    */
   @Override
   public boolean supportsRoleChanges(TeamModel team, Role role) {
      return (team != null && team.isLocalTeam()) || findProvider(team).supportsRoleChanges(team, role);
   }
   protected AuthenticationProvider findProvider(UserModel user) {
      for (AuthenticationProvider provider : authenticationProviders) {
         if (provider.getAccountType().equals(user.accountType)) {