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/GitblitUserService.java |   98 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 92 insertions(+), 6 deletions(-)

diff --git a/src/com/gitblit/GitblitUserService.java b/src/com/gitblit/GitblitUserService.java
index 97e1a40..141ad8f 100644
--- a/src/com/gitblit/GitblitUserService.java
+++ b/src/com/gitblit/GitblitUserService.java
@@ -25,6 +25,7 @@
 
 import com.gitblit.models.TeamModel;
 import com.gitblit.models.UserModel;
+import com.gitblit.utils.DeepCopier;
 
 /**
  * This class wraps the default user service and is recommended as the starting
@@ -57,6 +58,7 @@
 	public void setup(IStoredSettings settings) {
 		File realmFile = GitBlit.getFileOrFolder(Keys.realm.userService, "users.conf");
 		serviceImpl = createUserService(realmFile);
+		logger.info("GUS delegating to " + serviceImpl.toString());
 	}
 
 	@SuppressWarnings("deprecation")
@@ -72,7 +74,7 @@
 
 		assert service != null;
 
-		if (realmFile.exists()) {
+		if (!realmFile.exists()) {
 			// Create the Administrator account for a new realm file
 			try {
 				realmFile.createNewFile();
@@ -94,8 +96,8 @@
 				logger.info(MessageFormat.format("Automatically creating {0} based on {1}",
 						usersConfig.getAbsolutePath(), realmFile.getAbsolutePath()));
 				ConfigUserService configService = new ConfigUserService(usersConfig);
-				for (String username : serviceImpl.getAllUsernames()) {
-					UserModel userModel = serviceImpl.getUserModel(username);
+				for (String username : service.getAllUsernames()) {
+					UserModel userModel = service.getUserModel(username);
 					configService.updateUserModel(userModel);
 				}
 			}
@@ -104,6 +106,31 @@
 		}
 		return service;
 	}
+	
+	@Override
+	public String toString() {
+		return getClass().getSimpleName();
+	}
+
+	@Override
+	public boolean supportsCredentialChanges() {
+		return serviceImpl.supportsCredentialChanges();
+	}
+
+	@Override
+	public boolean supportsDisplayNameChanges() {
+		return serviceImpl.supportsDisplayNameChanges();
+	}
+
+	@Override
+	public boolean supportsEmailAddressChanges() {
+		return serviceImpl.supportsEmailAddressChanges();
+	}
+
+	@Override
+	public boolean supportsTeamMembershipChanges() {
+		return serviceImpl.supportsTeamMembershipChanges();
+	}
 
 	@Override
 	public boolean supportsCookies() {
@@ -111,7 +138,7 @@
 	}
 
 	@Override
-	public char[] getCookie(UserModel model) {
+	public String getCookie(UserModel model) {
 		return serviceImpl.getCookie(model);
 	}
 
@@ -123,6 +150,11 @@
 	@Override
 	public UserModel authenticate(String username, char[] password) {
 		return serviceImpl.authenticate(username, password);
+	}
+	
+	@Override
+	public void logout(UserModel user) {
+		serviceImpl.logout(user);
 	}
 
 	@Override
@@ -136,10 +168,39 @@
 	}
 
 	@Override
-	public boolean updateUserModel(String username, UserModel model) {
-		return serviceImpl.updateUserModel(username, model);
+	public boolean updateUserModels(List<UserModel> models) {
+		return serviceImpl.updateUserModels(models);
 	}
 
+	@Override
+	public boolean updateUserModel(String username, UserModel model) {
+		if (supportsCredentialChanges()) {
+			if (!supportsTeamMembershipChanges()) {
+				//  teams are externally controlled - copy from original model
+				UserModel existingModel = getUserModel(username);
+				
+				model = DeepCopier.copy(model);
+				model.teams.clear();
+				model.teams.addAll(existingModel.teams);
+			}
+			return serviceImpl.updateUserModel(username, model);
+		}
+		if (model.username.equals(username)) {
+			// passwords are not persisted by the backing user service
+			model.password = null;
+			if (!supportsTeamMembershipChanges()) {
+				//  teams are externally controlled- copy from original model
+				UserModel existingModel = getUserModel(username);
+				
+				model = DeepCopier.copy(model);
+				model.teams.clear();
+				model.teams.addAll(existingModel.teams);
+			}
+			return serviceImpl.updateUserModel(username, model);
+		}
+		logger.error("Users can not be renamed!");
+		return false;
+	}
 	@Override
 	public boolean deleteUserModel(UserModel model) {
 		return serviceImpl.deleteUserModel(model);
@@ -156,8 +217,18 @@
 	}
 
 	@Override
+	public List<UserModel> getAllUsers() {
+		return serviceImpl.getAllUsers();
+	}
+
+	@Override
 	public List<String> getAllTeamNames() {
 		return serviceImpl.getAllTeamNames();
+	}
+
+	@Override
+	public List<TeamModel> getAllTeams() {
+		return serviceImpl.getAllTeams();
 	}
 
 	@Override
@@ -166,6 +237,7 @@
 	}
 
 	@Override
+	@Deprecated
 	public boolean setTeamnamesForRepositoryRole(String role, List<String> teamnames) {
 		return serviceImpl.setTeamnamesForRepositoryRole(role, teamnames);
 	}
@@ -181,7 +253,20 @@
 	}
 
 	@Override
+	public boolean updateTeamModels(List<TeamModel> models) {
+		return serviceImpl.updateTeamModels(models);
+	}
+
+	@Override
 	public boolean updateTeamModel(String teamname, TeamModel model) {
+		if (!supportsTeamMembershipChanges()) {
+			// teams are externally controlled - copy from original model
+			TeamModel existingModel = getTeamModel(teamname);
+			
+			model = DeepCopier.copy(model);
+			model.users.clear();
+			model.users.addAll(existingModel.users);
+		}
 		return serviceImpl.updateTeamModel(teamname, model);
 	}
 
@@ -201,6 +286,7 @@
 	}
 
 	@Override
+	@Deprecated
 	public boolean setUsernamesForRepositoryRole(String role, List<String> usernames) {
 		return serviceImpl.setUsernamesForRepositoryRole(role, usernames);
 	}

--
Gitblit v1.9.1