James Moger
2014-03-04 9aa11943f821cb6c10a6d1c41c3d2381676f5047
src/main/java/com/gitblit/manager/AuthenticationManager.java
@@ -22,6 +22,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
@@ -108,10 +109,10 @@
      String realm = settings.getString(Keys.realm.userService, "${baseFolder}/users.conf");
      if (legacyRedirects.containsKey(realm)) {
         logger.warn("");
         logger.warn("#################################################################");
         logger.warn(Constants.BORDER2);
         logger.warn(" IUserService '{}' is obsolete!", realm);
         logger.warn(" Please set '{}={}'", "realm.authenticationProviders", legacyRedirects.get(realm));
         logger.warn("#################################################################");
         logger.warn(Constants.BORDER2);
         logger.warn("");
         // conditionally override specified authentication providers
@@ -149,6 +150,13 @@
   @Override
   public AuthenticationManager stop() {
      for (AuthenticationProvider provider : authenticationProviders) {
         try {
            provider.stop();
         } catch (Exception e) {
            logger.error("Failed to stop " + provider.getClass().getSimpleName(), e);
         }
      }
      return this;
   }
@@ -190,7 +198,7 @@
                  flagWicketSession(AuthenticationType.CONTAINER);
                  logger.debug(MessageFormat.format("{0} authenticated by servlet container principal from {1}",
                        user.username, httpRequest.getRemoteAddr()));
                  return user;
                  return validateAuthentication(user, AuthenticationType.CONTAINER);
               } else if (settings.getBoolean(Keys.realm.container.autoCreateAccounts, false)
                     && !internalAccount) {
                  // auto-create user from an authenticated container principal
@@ -202,7 +210,7 @@
                  flagWicketSession(AuthenticationType.CONTAINER);
                  logger.debug(MessageFormat.format("{0} authenticated and created by servlet container principal from {1}",
                        user.username, httpRequest.getRemoteAddr()));
                  return user;
                  return validateAuthentication(user, AuthenticationType.CONTAINER);
               } else if (!internalAccount) {
                  logger.warn(MessageFormat.format("Failed to find UserModel for {0}, attempted servlet container authentication from {1}",
                        principal.getName(), httpRequest.getRemoteAddr()));
@@ -223,7 +231,7 @@
            flagWicketSession(AuthenticationType.CERTIFICATE);
            logger.debug(MessageFormat.format("{0} authenticated by client certificate {1} from {2}",
                  user.username, metadata.serialNumber, httpRequest.getRemoteAddr()));
            return user;
            return validateAuthentication(user, AuthenticationType.CERTIFICATE);
         } else {
            logger.warn(MessageFormat.format("Failed to find UserModel for {0}, attempted client certificate ({1}) authentication from {2}",
                  model.username, metadata.serialNumber, httpRequest.getRemoteAddr()));
@@ -235,13 +243,18 @@
         return null;
      }
      UserModel user = null;
      // try to authenticate by cookie
      UserModel user = authenticate(httpRequest.getCookies());
      if (user != null) {
         flagWicketSession(AuthenticationType.COOKIE);
         logger.debug(MessageFormat.format("{0} authenticated by cookie from {1}",
      String cookie = getCookie(httpRequest);
      if (!StringUtils.isEmpty(cookie)) {
         user = userManager.getUserModel(cookie.toCharArray());
         if (user != null) {
            flagWicketSession(AuthenticationType.COOKIE);
            logger.debug(MessageFormat.format("{0} authenticated by cookie from {1}",
               user.username, httpRequest.getRemoteAddr()));
         return user;
            return validateAuthentication(user, AuthenticationType.COOKIE);
         }
      }
      // try to authenticate by BASIC
@@ -262,7 +275,7 @@
               flagWicketSession(AuthenticationType.CREDENTIALS);
               logger.debug(MessageFormat.format("{0} authenticated by BASIC request header from {1}",
                     user.username, httpRequest.getRemoteAddr()));
               return user;
               return validateAuthentication(user, AuthenticationType.CREDENTIALS);
            } else {
               logger.warn(MessageFormat.format("Failed login attempt for {0}, invalid credentials from {1}",
                     username, httpRequest.getRemoteAddr()));
@@ -273,23 +286,24 @@
   }
   /**
    * Authenticate a user based on their cookie.
    * This method allows the authentication manager to reject authentication
    * attempts.  It is called after the username/secret have been verified to
    * ensure that the authentication technique has been logged.
    *
    * @param cookies
    * @return a user object or null
    * @param user
    * @return
    */
   protected UserModel authenticate(Cookie[] cookies) {
      if (settings.getBoolean(Keys.web.allowCookieAuthentication, true)) {
         if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
               if (cookie.getName().equals(Constants.NAME)) {
                  String value = cookie.getValue();
                  return userManager.getUserModel(value.toCharArray());
               }
            }
         }
   protected UserModel validateAuthentication(UserModel user, AuthenticationType type) {
      if (user == null) {
         return null;
      }
      return null;
      if (user.disabled) {
         // user has been disabled
         logger.warn("Rejected {} authentication attempt by disabled account \"{}\"",
               type, user.username);
         return null;
      }
      return user;
   }
   protected void flagWicketSession(AuthenticationType authenticationType) {
@@ -323,9 +337,10 @@
         return null;
      }
      // try local authentication
      UserModel user = userManager.getUserModel(usernameDecoded);
      if (user != null) {
      // try local authentication
      if (user != null && user.isLocalAccount()) {
         UserModel returnedUser = null;
         if (user.password.startsWith(StringUtils.MD5_TYPE)) {
            // password digest
@@ -344,7 +359,7 @@
            // plain-text password
            returnedUser = user;
         }
         return returnedUser;
         return validateAuthentication(returnedUser, AuthenticationType.CREDENTIALS);
      }
      // try registered external authentication providers
@@ -355,12 +370,34 @@
               if (user != null) {
                  // user authenticated
                  user.accountType = provider.getAccountType();
                  return user;
                  return validateAuthentication(user, AuthenticationType.CREDENTIALS);
               }
            }
         }
      }
      return user;
      return validateAuthentication(user, AuthenticationType.CREDENTIALS);
   }
   /**
    * Returns the Gitlbit cookie in the request.
    *
    * @param request
    * @return the Gitblit cookie for the request or null if not found
    */
   @Override
   public String getCookie(HttpServletRequest request) {
      if (settings.getBoolean(Keys.web.allowCookieAuthentication, true)) {
         Cookie[] cookies = request.getCookies();
         if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
               if (cookie.getName().equals(Constants.NAME)) {
                  String value = cookie.getValue();
                  return value;
               }
            }
         }
      }
      return null;
   }
   /**
@@ -389,7 +426,8 @@
               } else {
                  // create real cookie
                  userCookie = new Cookie(Constants.NAME, cookie);
                  userCookie.setMaxAge(Integer.MAX_VALUE);
                  // expire the cookie in 7 days
                  userCookie.setMaxAge((int) TimeUnit.DAYS.toSeconds(7));
               }
            }
            userCookie.setPath("/");