From a2ce62e1f360e9cdb2221cfa3b091c02bda857eb Mon Sep 17 00:00:00 2001
From: Laurens Vrijnsen <laurens.vrijnsen@sioux.eu>
Date: Fri, 22 Mar 2013 07:36:52 -0400
Subject: [PATCH] Added enforced HTTP Basic Authentication

---
 src/com/gitblit/GitblitUserService.java |   51 +++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/src/com/gitblit/GitblitUserService.java b/src/com/gitblit/GitblitUserService.java
index 16d01b9..fe35db9 100644
--- a/src/com/gitblit/GitblitUserService.java
+++ b/src/com/gitblit/GitblitUserService.java
@@ -24,9 +24,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
@@ -49,6 +51,8 @@
 public class GitblitUserService implements IUserService {
 
 	protected IUserService serviceImpl;
+	
+	protected final String ExternalAccount = "#externalAccount";
 
 	private final Logger logger = LoggerFactory.getLogger(GitblitUserService.class);
 
@@ -57,7 +61,7 @@
 
 	@Override
 	public void setup(IStoredSettings settings) {
-		File realmFile = GitBlit.getFileOrFolder(Keys.realm.userService, "users.conf");
+		File realmFile = GitBlit.getFileOrFolder(Keys.realm.userService, "${baseFolder}/users.conf");
 		serviceImpl = createUserService(realmFile);
 		logger.info("GUS delegating to " + serviceImpl.toString());
 	}
@@ -145,12 +149,16 @@
 
 	@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
@@ -160,7 +168,9 @@
 
 	@Override
 	public UserModel getUserModel(String username) {
-		return serviceImpl.getUserModel(username);
+		UserModel user = serviceImpl.getUserModel(username);
+		setAccountType(user);
+		return user;
 	}
 
 	@Override
@@ -175,8 +185,8 @@
 
 	@Override
 	public boolean updateUserModel(String username, UserModel model) {
-		if (supportsCredentialChanges()) {
-			if (!supportsTeamMembershipChanges()) {
+		if (model.isLocalAccount() || supportsCredentialChanges()) {
+			if (!model.isLocalAccount() && !supportsTeamMembershipChanges()) {
 				//  teams are externally controlled - copy from original model
 				UserModel existingModel = getUserModel(username);
 				
@@ -189,7 +199,7 @@
 		if (model.username.equals(username)) {
 			// passwords are not persisted by the backing user service
 			model.password = null;
-			if (!supportsTeamMembershipChanges()) {
+			if (!model.isLocalAccount() && !supportsTeamMembershipChanges()) {
 				//  teams are externally controlled- copy from original model
 				UserModel existingModel = getUserModel(username);
 				
@@ -219,7 +229,11 @@
 
 	@Override
 	public List<UserModel> getAllUsers() {
-		return serviceImpl.getAllUsers();
+		List<UserModel> users = serviceImpl.getAllUsers();
+    	for (UserModel user : users) {
+    		setAccountType(user);
+    	}
+		return users; 
 	}
 
 	@Override
@@ -301,4 +315,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