From 27ae9095639bb228a1b7ff86a3ebe4264abf05be Mon Sep 17 00:00:00 2001
From: mschaefers <mschaefers@scoop-gmbh.de>
Date: Thu, 29 Nov 2012 12:33:09 -0500
Subject: [PATCH] feature: when using LdapUserService one can configure Gitblit to fetch all users from ldap that can possibly login. This allows to see newly generated LDAP users instantly in Gitblit. By now an LDAP user had to log in once to appear in GitBlit.

---
 src/com/gitblit/RpcServlet.java |   54 +++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/src/com/gitblit/RpcServlet.java b/src/com/gitblit/RpcServlet.java
index 115d553..f6368dd 100644
--- a/src/com/gitblit/RpcServlet.java
+++ b/src/com/gitblit/RpcServlet.java
@@ -30,6 +30,7 @@
 import org.eclipse.jgit.lib.Repository;
 
 import com.gitblit.Constants.RpcRequest;
+import com.gitblit.models.RegistrantAccessPermission;
 import com.gitblit.models.RefModel;
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.ServerSettings;
@@ -49,7 +50,7 @@
 
 	private static final long serialVersionUID = 1L;
 
-	public static final int PROTOCOL_VERSION = 2;
+	public static final int PROTOCOL_VERSION = 5;
 
 	public RpcServlet() {
 		super();
@@ -73,10 +74,10 @@
 
 		UserModel user = (UserModel) request.getUserPrincipal();
 
-		boolean allowManagement = user != null && user.canAdmin
+		boolean allowManagement = user != null && user.canAdmin()
 				&& GitBlit.getBoolean(Keys.web.enableRpcManagement, false);
 
-		boolean allowAdmin = user != null && user.canAdmin
+		boolean allowAdmin = user != null && user.canAdmin()
 				&& GitBlit.getBoolean(Keys.web.enableRpcAdministration, false);
 
 		Object result = null;
@@ -107,6 +108,11 @@
 			for (RepositoryModel model : models) {
 				if (!model.hasCommits) {
 					// skip empty repository
+					continue;
+				}
+				if (model.isCollectingGarbage) {
+					// skip garbage collecting repository
+					logger.warn(MessageFormat.format("Temporarily excluding {0} from RPC, busy collecting garbage", model.name));
 					continue;
 				}
 				// get local branches
@@ -226,25 +232,33 @@
 			RepositoryModel model = GitBlit.self().getRepositoryModel(objectName);
 			result = GitBlit.self().getRepositoryUsers(model);
 		} else if (RpcRequest.SET_REPOSITORY_MEMBERS.equals(reqType)) {
-			// update repository access list
+			// rejected since 1.2.0
+			response.setStatus(failureCode);
+		} else if (RpcRequest.LIST_REPOSITORY_MEMBER_PERMISSIONS.equals(reqType)) {
+			// get repository member permissions
 			RepositoryModel model = GitBlit.self().getRepositoryModel(objectName);
-			Collection<String> names = deserialize(request, response, RpcUtils.NAMES_TYPE);
-			List<String> users = new ArrayList<String>(names);
-			if (!GitBlit.self().setRepositoryUsers(model, users)) {
-				response.setStatus(failureCode);
-			}
+			result = GitBlit.self().getUserAccessPermissions(model);
+		} else if (RpcRequest.SET_REPOSITORY_MEMBER_PERMISSIONS.equals(reqType)) {
+			// set the repository permissions for the specified users
+			RepositoryModel model = GitBlit.self().getRepositoryModel(objectName);
+			Collection<RegistrantAccessPermission> permissions = deserialize(request, response, RpcUtils.REGISTRANT_PERMISSIONS_TYPE);
+			result = GitBlit.self().setUserAccessPermissions(model, permissions);
 		} else if (RpcRequest.LIST_REPOSITORY_TEAMS.equals(reqType)) {
 			// get repository teams
 			RepositoryModel model = GitBlit.self().getRepositoryModel(objectName);
 			result = GitBlit.self().getRepositoryTeams(model);
 		} else if (RpcRequest.SET_REPOSITORY_TEAMS.equals(reqType)) {
-			// update repository team access list
+			// rejected since 1.2.0
+			response.setStatus(failureCode);
+		} else if (RpcRequest.LIST_REPOSITORY_TEAM_PERMISSIONS.equals(reqType)) {
+			// get repository team permissions
 			RepositoryModel model = GitBlit.self().getRepositoryModel(objectName);
-			Collection<String> names = deserialize(request, response, RpcUtils.NAMES_TYPE);
-			List<String> teams = new ArrayList<String>(names);
-			if (!GitBlit.self().setRepositoryTeams(model, teams)) {
-				response.setStatus(failureCode);
-			}
+			result = GitBlit.self().getTeamAccessPermissions(model);
+		} else if (RpcRequest.SET_REPOSITORY_TEAM_PERMISSIONS.equals(reqType)) {
+			// set the repository permissions for the specified teams
+			RepositoryModel model = GitBlit.self().getRepositoryModel(objectName);
+			Collection<RegistrantAccessPermission> permissions = deserialize(request, response, RpcUtils.REGISTRANT_PERMISSIONS_TYPE);
+			result = GitBlit.self().setTeamAccessPermissions(model, permissions);
 		} else if (RpcRequest.LIST_FEDERATION_REGISTRATIONS.equals(reqType)) {
 			// return the list of federation registrations
 			if (allowAdmin) {
@@ -298,6 +312,9 @@
 				for (String key : keys) {
 					managementSettings.add(settings.get(key));
 				}
+				if (allowManagement) {
+					managementSettings.pushScripts = settings.pushScripts;
+				}
 				result = managementSettings;
 			}
 		} else if (RpcRequest.EDIT_SETTINGS.equals(reqType)) {
@@ -316,6 +333,13 @@
 			} else {
 				response.sendError(notAllowedCode);
 			}
+		} else if (RpcRequest.CLEAR_REPOSITORY_CACHE.equals(reqType)) {
+			// clear the repository list cache
+			if (allowManagement) {
+				GitBlit.self().resetRepositoryListCache();
+			} else {
+				response.sendError(notAllowedCode);
+			}
 		}
 
 		// send the result of the request

--
Gitblit v1.9.1