From 79dd0bddbd939c85f002f3a33b95ae84d0bf38cb Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 24 Jun 2013 09:36:19 -0400
Subject: [PATCH] Implemented commit cache for the dashboards, activity, and project pages
---
src/main/java/com/gitblit/GitBlit.java | 72 +++++++++++++++++++++++++++++++-----
1 files changed, 62 insertions(+), 10 deletions(-)
diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java
index df17edd..6fd168a 100644
--- a/src/main/java/com/gitblit/GitBlit.java
+++ b/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;
}
@@ -3009,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);
@@ -3059,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);
@@ -3353,6 +3403,8 @@
configureFanout();
configureGitDaemon();
+ CommitCache.instance().setCacheDays(settings.getInteger(Keys.web.activityCacheDays, 14));
+
ContainerUtils.CVE_2007_0450.test();
}
--
Gitblit v1.9.1