From 9e186eedf1a09ca7ac4fbdea32b00e7e5331f7eb Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sat, 05 Jan 2013 17:52:36 -0500
Subject: [PATCH] Updated documentation

---
 src/com/gitblit/GitblitUserService.java |  119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 112 insertions(+), 7 deletions(-)

diff --git a/src/com/gitblit/GitblitUserService.java b/src/com/gitblit/GitblitUserService.java
index 7462af0..db450cf 100644
--- a/src/com/gitblit/GitblitUserService.java
+++ b/src/com/gitblit/GitblitUserService.java
@@ -23,8 +23,11 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.gitblit.Constants.AccountType;
 import com.gitblit.models.TeamModel;
 import com.gitblit.models.UserModel;
+import com.gitblit.utils.DeepCopier;
+import com.gitblit.utils.StringUtils;
 
 /**
  * This class wraps the default user service and is recommended as the starting
@@ -47,6 +50,8 @@
 public class GitblitUserService implements IUserService {
 
 	protected IUserService serviceImpl;
+	
+	protected final String ExternalAccount = "#externalAccount";
 
 	private final Logger logger = LoggerFactory.getLogger(GitblitUserService.class);
 
@@ -112,28 +117,59 @@
 	}
 
 	@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() {
 		return serviceImpl.supportsCookies();
 	}
 
 	@Override
-	public char[] getCookie(UserModel model) {
+	public String getCookie(UserModel model) {
 		return serviceImpl.getCookie(model);
 	}
 
 	@Override
 	public UserModel authenticate(char[] cookie) {
-		return serviceImpl.authenticate(cookie);
+		UserModel user = serviceImpl.authenticate(cookie);
+		setAccountType(user);
+		return user;
 	}
 
 	@Override
 	public UserModel authenticate(String username, char[] password) {
-		return serviceImpl.authenticate(username, password);
+		UserModel user = serviceImpl.authenticate(username, password);
+		setAccountType(user);
+		return user;
+	}
+	
+	@Override
+	public void logout(UserModel user) {
+		serviceImpl.logout(user);
 	}
 
 	@Override
 	public UserModel getUserModel(String username) {
-		return serviceImpl.getUserModel(username);
+		UserModel user = serviceImpl.getUserModel(username);
+		setAccountType(user);
+		return user;
 	}
 
 	@Override
@@ -142,10 +178,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 (model.isLocalAccount() || supportsCredentialChanges()) {
+			if (!model.isLocalAccount() && !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 (!model.isLocalAccount() && !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);
@@ -163,7 +228,11 @@
 
 	@Override
 	public List<UserModel> getAllUsers() {
-		return serviceImpl.getAllUsers();
+		List<UserModel> users = serviceImpl.getAllUsers();
+    	for (UserModel user : users) {
+    		setAccountType(user);
+    	}
+		return users; 
 	}
 
 	@Override
@@ -182,6 +251,7 @@
 	}
 
 	@Override
+	@Deprecated
 	public boolean setTeamnamesForRepositoryRole(String role, List<String> teamnames) {
 		return serviceImpl.setTeamnamesForRepositoryRole(role, teamnames);
 	}
@@ -197,7 +267,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);
 	}
 
@@ -217,6 +300,7 @@
 	}
 
 	@Override
+	@Deprecated
 	public boolean setUsernamesForRepositoryRole(String role, List<String> usernames) {
 		return serviceImpl.setUsernamesForRepositoryRole(role, usernames);
 	}
@@ -230,4 +314,25 @@
 	public boolean deleteRepositoryRole(String role) {
 		return serviceImpl.deleteRepositoryRole(role);
 	}
+	
+	protected boolean isLocalAccount(String username) {
+		UserModel user = getUserModel(username);
+		return user != null && user.isLocalAccount();
+	}
+	
+	protected void setAccountType(UserModel user) {
+		if (user != null) {
+			if (!StringUtils.isEmpty(user.password)
+					&& !ExternalAccount.equalsIgnoreCase(user.password)
+					&& !"StoredInLDAP".equalsIgnoreCase(user.password)) {
+				user.accountType = AccountType.LOCAL;
+			} else {
+				user.accountType = getAccountType();
+			}
+		}
+	}
+	
+	protected AccountType getAccountType() {
+		return AccountType.LOCAL;
+	}
 }

--
Gitblit v1.9.1