diff options
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/distrib/linux/authority.sh | 2 | ||||
-rwxr-xr-x | src/main/distrib/linux/install-service-fedora.sh | 10 | ||||
-rw-r--r-- | src/main/distrib/linux/migrate-tickets.sh | 4 | ||||
-rw-r--r-- | src/main/distrib/linux/reindex-tickets.sh | 4 | ||||
-rw-r--r-- | src/main/distrib/linux/service-centos.sh | 6 | ||||
-rw-r--r-- | src/main/distrib/linux/service-ubuntu.sh | 2 | ||||
-rw-r--r-- | src/main/java/com/gitblit/manager/AuthenticationManager.java | 85 | ||||
-rw-r--r-- | src/main/java/com/gitblit/utils/StringUtils.java | 15 |
8 files changed, 78 insertions, 50 deletions
diff --git a/src/main/distrib/linux/authority.sh b/src/main/distrib/linux/authority.sh index 740f51a8..c5c6c687 100644 --- a/src/main/distrib/linux/authority.sh +++ b/src/main/distrib/linux/authority.sh @@ -1,2 +1,2 @@ #!/bin/bash -java -cp gitblit.jar:ext/* com.gitblit.authority.GitblitAuthority --baseFolder data +java -cp "gitblit.jar:ext/*" com.gitblit.authority.GitblitAuthority --baseFolder data diff --git a/src/main/distrib/linux/install-service-fedora.sh b/src/main/distrib/linux/install-service-fedora.sh index 4fb43c61..df17590f 100755 --- a/src/main/distrib/linux/install-service-fedora.sh +++ b/src/main/distrib/linux/install-service-fedora.sh @@ -18,16 +18,16 @@ After=network.target [Service] User=gitblit Group=gitblit -Environment="ARGS=-server -Xmx1024M -Djava.awt.headless=true -jar" +Environment="ARGS=-server -Xmx1024M -Djava.awt.headless=true -cp" EnvironmentFile=-/etc/sysconfig/gitblit WorkingDirectory=/opt/gitblit -ExecStart=/usr/bin/java \$ARGS gitblit.jar --httpsPort \$GITBLIT_HTTPS_PORT --httpPort \$GITBLIT_HTTP_PORT --baseFolder \$GITBLIT_BASE_FOLDER --dailyLogFile -ExecStop=/usr/bin/java \$ARGS gitblit.jar --baseFolder \$GITBLIT_BASE_FOLDER --stop +ExecStart=/usr/bin/java \$ARGS gitblit.jar:ext/* com.gitblit.GitBlitServer --httpsPort \$GITBLIT_HTTPS_PORT --httpPort \$GITBLIT_HTTP_PORT --baseFolder \$GITBLIT_BASE_FOLDER --dailyLogFile +ExecStop=/usr/bin/java \$ARGS gitblit.jar:ext/* com.gitblit.GitBlitServer --baseFolder \$GITBLIT_BASE_FOLDER --stop [Install] WantedBy=multi-user.target EOF # Finally copy the files to the destination and register the systemd unit. -sudo su -c "cp /tmp/gitblit.defaults /etc/sysconfig/gitblit && cp /tmp/gitblit.service /etc/systemd/system/" -sudo su -c "systemctl daemon-reload && systemctl enable gitblit.service && systemctl start gitblit.service" +sudo sh -c "cp /tmp/gitblit.defaults /etc/sysconfig/gitblit && cp /tmp/gitblit.service /etc/systemd/system/" +sudo sh -c "systemctl daemon-reload && systemctl enable gitblit.service && systemctl start gitblit.service" diff --git a/src/main/distrib/linux/migrate-tickets.sh b/src/main/distrib/linux/migrate-tickets.sh index f521528e..4f360918 100644 --- a/src/main/distrib/linux/migrate-tickets.sh +++ b/src/main/distrib/linux/migrate-tickets.sh @@ -8,7 +8,7 @@ # # -------------------------------------------------------------------------- -if [[ -z $1 || -z $2 ]]; then +if [ -z $1 ] || [ -z $2 ]; then echo "Please specify the output ticket service and your baseFolder!"; echo ""; echo "usage:"; @@ -17,5 +17,5 @@ if [[ -z $1 || -z $2 ]]; then exit 1; fi -java -cp gitblit.jar:./ext/* com.gitblit.MigrateTickets $1 --baseFolder $2 +java -cp "gitblit.jar:ext/*" com.gitblit.MigrateTickets $1 --baseFolder $2 diff --git a/src/main/distrib/linux/reindex-tickets.sh b/src/main/distrib/linux/reindex-tickets.sh index 8261b819..42239ea1 100644 --- a/src/main/distrib/linux/reindex-tickets.sh +++ b/src/main/distrib/linux/reindex-tickets.sh @@ -11,7 +11,7 @@ # # -------------------------------------------------------------------------- -if [[ -z $1 ]]; then +if [ -z $1 ] ; then echo "Please specify your baseFolder!"; echo ""; echo "usage:"; @@ -20,5 +20,5 @@ if [[ -z $1 ]]; then exit 1; fi -java -cp gitblit.jar:./ext/* com.gitblit.ReindexTickets --baseFolder $1 +java -cp "gitblit.jar:ext/*" com.gitblit.ReindexTickets --baseFolder $1 diff --git a/src/main/distrib/linux/service-centos.sh b/src/main/distrib/linux/service-centos.sh index 843f015a..a2645e7e 100644 --- a/src/main/distrib/linux/service-centos.sh +++ b/src/main/distrib/linux/service-centos.sh @@ -11,7 +11,7 @@ GITBLIT_HTTP_PORT=0 GITBLIT_HTTPS_PORT=8443 GITBLIT_LOG=/var/log/gitblit.log source ${GITBLIT_PATH}/java-proxy-config.sh -JAVA="java -server -Xmx1024M ${JAVA_PROXY_CONFIG} -Djava.awt.headless=true -jar" +JAVA="java -server -Xmx1024M ${JAVA_PROXY_CONFIG} -Djava.awt.headless=true -cp" RETVAL=0 @@ -21,7 +21,7 @@ case "$1" in then echo $"Starting gitblit server" cd $GITBLIT_PATH - $JAVA $GITBLIT_PATH/gitblit.jar --httpsPort $GITBLIT_HTTPS_PORT --httpPort $GITBLIT_HTTP_PORT --baseFolder $GITBLIT_BASE_FOLDER --dailyLogFile & + $JAVA "$GITBLIT_PATH/gitblit.jar:$GITBLIT_PATH/ext/*" com.gitblit.GitBlitServer --httpsPort $GITBLIT_HTTPS_PORT --httpPort $GITBLIT_HTTP_PORT --baseFolder $GITBLIT_BASE_FOLDER --dailyLogFile & echo "." exit $RETVAL fi @@ -32,7 +32,7 @@ case "$1" in then echo $"Stopping gitblit server" cd $GITBLIT_PATH - $JAVA $GITBLIT_PATH/gitblit.jar --baseFolder $GITBLIT_BASE_FOLDER --stop > /dev/null & + $JAVA "$GITBLIT_PATH/gitblit.jar:$GITBLIT_PATH/ext/*" com.gitblit.GitBlitServer --baseFolder $GITBLIT_BASE_FOLDER --stop > /dev/null & echo "." exit $RETVAL fi diff --git a/src/main/distrib/linux/service-ubuntu.sh b/src/main/distrib/linux/service-ubuntu.sh index 769e3072..461a678c 100644 --- a/src/main/distrib/linux/service-ubuntu.sh +++ b/src/main/distrib/linux/service-ubuntu.sh @@ -19,7 +19,7 @@ GITBLIT_PATH=/opt/gitblit GITBLIT_BASE_FOLDER=/opt/gitblit/data GITBLIT_USER="gitblit" source ${GITBLIT_PATH}/java-proxy-config.sh -ARGS="-server -Xmx1024M ${JAVA_PROXY_CONFIG} -Djava.awt.headless=true -jar gitblit.jar --baseFolder $GITBLIT_BASE_FOLDER --dailyLogFile" +ARGS="-server -Xmx1024M ${JAVA_PROXY_CONFIG} -Djava.awt.headless=true -cp gitblit.jar:ext/* com.gitblit.GitBlitServer --baseFolder $GITBLIT_BASE_FOLDER --dailyLogFile" RETVAL=0 diff --git a/src/main/java/com/gitblit/manager/AuthenticationManager.java b/src/main/java/com/gitblit/manager/AuthenticationManager.java index 83ca4b70..68c83dae 100644 --- a/src/main/java/com/gitblit/manager/AuthenticationManager.java +++ b/src/main/java/com/gitblit/manager/AuthenticationManager.java @@ -18,10 +18,7 @@ package com.gitblit.manager; import java.nio.charset.Charset; import java.security.Principal; import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.TimeUnit; import javax.servlet.http.Cookie; @@ -455,7 +452,6 @@ public class AuthenticationManager implements IAuthenticationManager { /** * Authenticate a user based on a username and password. * - * @see IUserService.authenticate(String, char[]) * @param username * @param password * @return a user object or null @@ -474,34 +470,39 @@ public class AuthenticationManager implements IAuthenticationManager { } String usernameDecoded = StringUtils.decodeUsername(username); - String pw = new String(password); - if (StringUtils.isEmpty(pw)) { + if (StringUtils.isEmpty(password)) { // can not authenticate empty password return null; } UserModel user = userManager.getUserModel(usernameDecoded); - // try local authentication - if (user != null && user.isLocalAccount()) { - UserModel returnedUser = authenticateLocal(user, password); - if (returnedUser != null) { - // user authenticated - return returnedUser; - } - } else { - // try registered external authentication providers - for (AuthenticationProvider provider : authenticationProviders) { - if (provider instanceof UsernamePasswordAuthenticationProvider) { - UserModel returnedUser = provider.authenticate(usernameDecoded, password); - if (returnedUser != null) { - // user authenticated - returnedUser.accountType = provider.getAccountType(); - return validateAuthentication(returnedUser, AuthenticationType.CREDENTIALS); + try { + // try local authentication + if (user != null && user.isLocalAccount()) { + UserModel returnedUser = authenticateLocal(user, password); + if (returnedUser != null) { + // user authenticated + return returnedUser; + } + } else { + // try registered external authentication providers + for (AuthenticationProvider provider : authenticationProviders) { + if (provider instanceof UsernamePasswordAuthenticationProvider) { + UserModel returnedUser = provider.authenticate(usernameDecoded, password); + if (returnedUser != null) { + // user authenticated + returnedUser.accountType = provider.getAccountType(); + return validateAuthentication(returnedUser, AuthenticationType.CREDENTIALS); + } } } } } + finally { + // Zero out password array to delete password from memory + Arrays.fill(password, Character.MIN_VALUE); + } // could not authenticate locally or with a provider logger.warn(MessageFormat.format("Failed login attempt for {0}, invalid credentials from {1}", username, @@ -520,21 +521,33 @@ public class AuthenticationManager implements IAuthenticationManager { protected UserModel authenticateLocal(UserModel user, char [] password) { UserModel returnedUser = null; - PasswordHash pwdHash = PasswordHash.instanceFor(user.password); - if (pwdHash != null) { - if (pwdHash.matches(user.password, password, user.username)) { + // Create a copy of the password that we can use to rehash to upgrade to a more secure hashing method. + // This is done to be independent from the implementation of the PasswordHash, which might already clear out + // the password it gets passed in. This looks a bit stupid, as we could simply clean up the mess, but this + // falls under "better safe than sorry". + char[] pwdToUpgrade = Arrays.copyOf(password, password.length); + try { + PasswordHash pwdHash = PasswordHash.instanceFor(user.password); + if (pwdHash != null) { + if (pwdHash.matches(user.password, password, user.username)) { + returnedUser = user; + } + } else if (user.password.equals(new String(password))) { + // plain-text password returnedUser = user; } - } else if (user.password.equals(new String(password))) { - // plain-text password - returnedUser = user; - } - - // validate user - returnedUser = validateAuthentication(returnedUser, AuthenticationType.CREDENTIALS); - - // try to upgrade the stored password hash to a stronger hash, if necessary - upgradeStoredPassword(returnedUser, password, pwdHash); + + // validate user + returnedUser = validateAuthentication(returnedUser, AuthenticationType.CREDENTIALS); + + // try to upgrade the stored password hash to a stronger hash, if necessary + upgradeStoredPassword(returnedUser, pwdToUpgrade, pwdHash); + } + finally { + // Now we make sure that the password is zeroed out in any case. + Arrays.fill(password, Character.MIN_VALUE); + Arrays.fill(pwdToUpgrade, Character.MIN_VALUE); + } return returnedUser; } diff --git a/src/main/java/com/gitblit/utils/StringUtils.java b/src/main/java/com/gitblit/utils/StringUtils.java index b192c80b..442acbbf 100644 --- a/src/main/java/com/gitblit/utils/StringUtils.java +++ b/src/main/java/com/gitblit/utils/StringUtils.java @@ -57,6 +57,21 @@ public class StringUtils { }
/**
+ * Returns true if the character array represents an empty String.
+ * An empty character sequence is defined as a sequence that
+ * either has no characters at all, or no characters above
+ * '\u0020' (space).
+ *
+ * @param value
+ * @return true if value is null or represents an empty String
+ */
+ public static boolean isEmpty(char[] value) {
+ if (value == null || value.length == 0) return true;
+ for ( char c : value) if (c > '\u0020') return false;
+ return true;
+ }
+
+ /**
* Replaces carriage returns and line feeds with html line breaks.
*
* @param string
|