From 15dcc074a7db2b3dae95c37e7e8625139f0e37da Mon Sep 17 00:00:00 2001
From: Inaiat Henrique <inaiat@gmail.com>
Date: Thu, 03 Jan 2013 14:56:20 -0500
Subject: [PATCH] Fixed loading of Brazilian Portuguese translation from *nix server

---
 src/com/gitblit/GitBlit.java |  166 +++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 142 insertions(+), 24 deletions(-)

diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java
index 870e22f..3dcd5a0 100644
--- a/src/com/gitblit/GitBlit.java
+++ b/src/com/gitblit/GitBlit.java
@@ -24,6 +24,8 @@
 import java.lang.reflect.Field;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.security.Principal;
 import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -58,6 +60,7 @@
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.wicket.RequestCycle;
 import org.apache.wicket.protocol.http.WebResponse;
 import org.apache.wicket.resource.ContextRelativeResource;
 import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
@@ -97,6 +100,7 @@
 import com.gitblit.models.TeamModel;
 import com.gitblit.models.UserModel;
 import com.gitblit.utils.ArrayUtils;
+import com.gitblit.utils.Base64;
 import com.gitblit.utils.ByteFormat;
 import com.gitblit.utils.ContainerUtils;
 import com.gitblit.utils.DeepCopier;
@@ -566,6 +570,20 @@
 	 * @return a user object or null
 	 */
 	public UserModel authenticate(HttpServletRequest httpRequest) {
+		return authenticate(httpRequest, false);
+	}
+	
+	/**
+	 * Authenticate a user based on HTTP request parameters.
+	 * 
+	 * Authentication by X509Certificate, servlet container principal, cookie,
+	 * and BASIC header.
+	 * 
+	 * @param httpRequest
+	 * @param requiresCertificate
+	 * @return a user object or null
+	 */
+	public UserModel authenticate(HttpServletRequest httpRequest, boolean requiresCertificate) {
 		// try to authenticate by certificate
 		boolean checkValidity = settings.getBoolean(Keys.git.enforceCertificateValidity, true);
 		String [] oids = getStrings(Keys.git.certificateUsernameOIDs).toArray(new String[0]);
@@ -573,30 +591,84 @@
 		if (model != null) {
 			// grab real user model and preserve certificate serial number
 			UserModel user = getUserModel(model.username);
+			X509Metadata metadata = HttpUtils.getCertificateMetadata(httpRequest);
 			if (user != null) {
-				GitBlitWebSession session = GitBlitWebSession.get();
-				session.authenticationType = AuthenticationType.CERTIFICATE;
-				X509Metadata metadata = HttpUtils.getCertificateMetadata(httpRequest);
+				flagWicketSession(AuthenticationType.CERTIFICATE);
 				logger.info(MessageFormat.format("{0} authenticated by client certificate {1} from {2}",
 						user.username, metadata.serialNumber, httpRequest.getRemoteAddr()));
 				return user;
+			} else {
+				logger.warn(MessageFormat.format("Failed to find UserModel for {0}, attempted client certificate ({1}) authentication from {2}",
+						model.username, metadata.serialNumber, httpRequest.getRemoteAddr()));
+			}
+		}
+		
+		if (requiresCertificate) {
+			// caller requires client certificate authentication (e.g. git servlet)
+			return null;
+		}
+		
+		// try to authenticate by servlet container principal
+		Principal principal = httpRequest.getUserPrincipal();
+		if (principal != null) {
+			UserModel user = getUserModel(principal.getName());
+			if (user != null) {
+				flagWicketSession(AuthenticationType.CONTAINER);
+				logger.info(MessageFormat.format("{0} authenticated by servlet container principal from {1}",
+						user.username, httpRequest.getRemoteAddr()));
+				return user;
+			} else {
+				logger.warn(MessageFormat.format("Failed to find UserModel for {0}, attempted servlet container authentication from {1}",
+						principal.getName(), httpRequest.getRemoteAddr()));
 			}
 		}
 		
 		// try to authenticate by cookie
-		Cookie[] cookies = httpRequest.getCookies();
-		if (allowCookieAuthentication() && cookies != null && cookies.length > 0) {
-			// Grab cookie from Browser Session
-			UserModel user = authenticate(cookies);
+		if (allowCookieAuthentication()) {
+			UserModel user = authenticate(httpRequest.getCookies());
 			if (user != null) {
-				GitBlitWebSession session = GitBlitWebSession.get();
-				session.authenticationType = AuthenticationType.COOKIE;
+				flagWicketSession(AuthenticationType.COOKIE);
 				logger.info(MessageFormat.format("{0} authenticated by cookie from {1}",
 						user.username, httpRequest.getRemoteAddr()));
 				return user;
 			}
 		}
+		
+		// try to authenticate by BASIC
+		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 = values[0];
+				char[] password = values[1].toCharArray();
+				UserModel user = authenticate(username, password);
+				if (user != null) {
+					flagWicketSession(AuthenticationType.CREDENTIALS);
+					logger.info(MessageFormat.format("{0} authenticated by BASIC request header from {1}",
+							user.username, httpRequest.getRemoteAddr()));
+					return user;
+				} else {
+					logger.warn(MessageFormat.format("Failed login attempt for {0}, invalid credentials ({1}) from {2}", 
+							username, credentials, httpRequest.getRemoteAddr()));
+				}
+			}
+		}
 		return null;
+	}
+	
+	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;
+		}
 	}
 
 	/**
@@ -684,6 +756,9 @@
 	 * @return true if successful
 	 */
 	public boolean deleteUser(String username) {
+		if (StringUtils.isEmpty(username)) {
+			return false;
+		}
 		return userService.deleteUser(username);
 	}
 
@@ -695,6 +770,9 @@
 	 * @return a user object or null
 	 */
 	public UserModel getUserModel(String username) {
+		if (StringUtils.isEmpty(username)) {
+			return null;
+		}
 		UserModel user = userService.getUserModel(username);		
 		return user;
 	}
@@ -1261,7 +1339,7 @@
 		}
 
 		// check for updates
-		Repository r = getRepository(repositoryName);
+		Repository r = getRepository(model.name);
 		if (r == null) {
 			// repository is missing
 			removeFromCachedRepositoryList(repositoryName);
@@ -1524,6 +1602,7 @@
 			} catch (Exception e) {
 				model.lastGC = new Date(0);
 			}
+			model.maxActivityCommits = getConfig(config, "maxActivityCommits", settings.getInteger(Keys.web.maxActivityCommits, 0));
 			model.origin = config.getString("remote", "origin", "url");
 			if (model.origin != null) {
 				model.origin = model.origin.replace('\\', '/');
@@ -1573,7 +1652,18 @@
 	 * @return true if the repository exists
 	 */
 	public boolean hasRepository(String repositoryName) {
-		if (settings.getBoolean(Keys.git.cacheRepositoryList, true)) {
+		return hasRepository(repositoryName, false);
+	}
+	
+	/**
+	 * Determines if this server has the requested repository.
+	 * 
+	 * @param name
+	 * @param caseInsensitive
+	 * @return true if the repository exists
+	 */
+	public boolean hasRepository(String repositoryName, boolean caseSensitiveCheck) {
+		if (!caseSensitiveCheck && settings.getBoolean(Keys.git.cacheRepositoryList, true)) {
 			// if we are caching use the cache to determine availability
 			// otherwise we end up adding a phantom repository to the cache
 			return repositoryListCache.containsKey(repositoryName.toLowerCase());
@@ -1649,7 +1739,7 @@
 			ProjectModel project = getProjectModel(userProject);
 			for (String repository : project.repositories) {
 				if (repository.startsWith(userProject)) {
-					RepositoryModel model = repositoryListCache.get(repository);
+					RepositoryModel model = getRepositoryModel(repository);
 					if (model.originRepository.equalsIgnoreCase(origin)) {
 						// user has a fork
 						return model.name;
@@ -1670,19 +1760,38 @@
 	 */
 	public ForkModel getForkNetwork(String repository) {
 		if (settings.getBoolean(Keys.git.cacheRepositoryList, true)) {
-			// find the root
+			// find the root, cached
 			RepositoryModel model = repositoryListCache.get(repository.toLowerCase());
 			while (model.originRepository != null) {
 				model = repositoryListCache.get(model.originRepository);
 			}
+			ForkModel root = getForkModelFromCache(model.name);
+			return root;
+		} else {
+			// find the root, non-cached
+			RepositoryModel model = getRepositoryModel(repository.toLowerCase());
+			while (model.originRepository != null) {
+				model = getRepositoryModel(model.originRepository);
+			}
 			ForkModel root = getForkModel(model.name);
 			return root;
 		}
-		return null;
+	}
+	
+	private ForkModel getForkModelFromCache(String repository) {
+		RepositoryModel model = repositoryListCache.get(repository.toLowerCase());
+		ForkModel fork = new ForkModel(model);
+		if (!ArrayUtils.isEmpty(model.forks)) {
+			for (String aFork : model.forks) {
+				ForkModel fm = getForkModelFromCache(aFork);
+				fork.forks.add(fm);
+			}
+		}
+		return fork;
 	}
 	
 	private ForkModel getForkModel(String repository) {
-		RepositoryModel model = repositoryListCache.get(repository.toLowerCase());
+		RepositoryModel model = getRepositoryModel(repository.toLowerCase());
 		ForkModel fork = new ForkModel(model);
 		if (!ArrayUtils.isEmpty(model.forks)) {
 			for (String aFork : model.forks) {
@@ -1858,7 +1967,7 @@
 			if (!repository.name.toLowerCase().endsWith(org.eclipse.jgit.lib.Constants.DOT_GIT_EXT)) {
 				repository.name += org.eclipse.jgit.lib.Constants.DOT_GIT_EXT;
 			}
-			if (new File(repositoriesFolder, repository.name).exists()) {
+			if (hasRepository(repository.name)) {
 				throw new GitBlitException(MessageFormat.format(
 						"Can not create repository ''{0}'' because it already exists.",
 						repository.name));
@@ -1990,9 +2099,20 @@
 				repository.federationStrategy.name());
 		config.setBoolean(Constants.CONFIG_GITBLIT, null, "isFederated", repository.isFederated);
 		config.setString(Constants.CONFIG_GITBLIT, null, "gcThreshold", repository.gcThreshold);
-		config.setInt(Constants.CONFIG_GITBLIT, null, "gcPeriod", repository.gcPeriod);
+		if (repository.gcPeriod == settings.getInteger(Keys.git.defaultGarbageCollectionPeriod, 7)) {
+			// use default from config
+			config.unset(Constants.CONFIG_GITBLIT, null, "gcPeriod");
+		} else {
+			config.setInt(Constants.CONFIG_GITBLIT, null, "gcPeriod", repository.gcPeriod);
+		}
 		if (repository.lastGC != null) {
 			config.setString(Constants.CONFIG_GITBLIT, null, "lastGC", new SimpleDateFormat(Constants.ISO8601).format(repository.lastGC));
+		}
+		if (repository.maxActivityCommits == settings.getInteger(Keys.web.maxActivityCommits, 0)) {
+			// use default from config
+			config.unset(Constants.CONFIG_GITBLIT, null, "maxActivityCommits");
+		} else {
+			config.setInt(Constants.CONFIG_GITBLIT, null, "maxActivityCommits", repository.maxActivityCommits);
 		}
 
 		updateList(config, "federationSets", repository.federationSets);
@@ -2954,22 +3074,20 @@
 			ServletContext context = contextEvent.getServletContext();
 			WebXmlSettings webxmlSettings = new WebXmlSettings(context);
 
-			// 0.7.0 web.properties in the deployed war folder
-			String webProps = context.getRealPath("/WEB-INF/web.properties");
+			// gitblit.properties file located within the webapp
+			String webProps = context.getRealPath("/WEB-INF/gitblit.properties");
 			if (!StringUtils.isEmpty(webProps)) {
 				File overrideFile = new File(webProps);
-				if (overrideFile.exists()) {
-					webxmlSettings.applyOverrides(overrideFile);
-				}
+				webxmlSettings.applyOverrides(overrideFile);
 			}
 			
-
-			// 0.8.0 gitblit.properties file located outside the deployed war
+			// gitblit.properties file located outside the deployed war
 			// folder lie, for example, on RedHat OpenShift.
 			File overrideFile = getFileOrFolder("gitblit.properties");
 			if (!overrideFile.getPath().equals("gitblit.properties")) {
 				webxmlSettings.applyOverrides(overrideFile);
 			}
+			
 			configureContext(webxmlSettings, true);
 
 			// Copy the included scripts to the configured groovy folder

--
Gitblit v1.9.1