From 13417cf9c6eec555b51da49742e47939d2f5715b Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 19 Oct 2012 22:47:33 -0400
Subject: [PATCH] Exclude submodules from zip downloads (issue 151)

---
 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