From a4231d30c4d2765c80f57df79cd1d4d39a9795ea Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Tue, 30 Oct 2012 17:05:30 -0400
Subject: [PATCH] Added null checkinng and logging for edit user permissions (issue 155)

---
 src/com/gitblit/client/GitblitClient.java |   69 +++++++++++++++++++++++++++++++---
 1 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/src/com/gitblit/client/GitblitClient.java b/src/com/gitblit/client/GitblitClient.java
index 9e31c79..b7047d7 100644
--- a/src/com/gitblit/client/GitblitClient.java
+++ b/src/com/gitblit/client/GitblitClient.java
@@ -28,18 +28,20 @@
 import java.util.TreeSet;
 
 import com.gitblit.Constants;
+import com.gitblit.Constants.AccessPermission;
 import com.gitblit.Constants.AccessRestrictionType;
 import com.gitblit.Constants.AuthorizationControl;
+import com.gitblit.Constants.PermissionType;
 import com.gitblit.Constants.RegistrantType;
 import com.gitblit.GitBlitException.ForbiddenException;
 import com.gitblit.GitBlitException.NotAllowedException;
 import com.gitblit.GitBlitException.UnauthorizedException;
 import com.gitblit.GitBlitException.UnknownRequestException;
 import com.gitblit.Keys;
-import com.gitblit.models.RegistrantAccessPermission;
 import com.gitblit.models.FederationModel;
 import com.gitblit.models.FeedEntryModel;
 import com.gitblit.models.FeedModel;
+import com.gitblit.models.RegistrantAccessPermission;
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.ServerSettings;
 import com.gitblit.models.ServerStatus;
@@ -339,6 +341,7 @@
 		List<UserModel> users = RpcUtils.getUsers(url, account, password);
 		allUsers.clear();
 		allUsers.addAll(users);
+		Collections.sort(users);
 		return allUsers;
 	}
 
@@ -346,6 +349,7 @@
 		List<TeamModel> teams = RpcUtils.getTeams(url, account, password);
 		allTeams.clear();
 		allTeams.addAll(teams);
+		Collections.sort(teams);
 		return allTeams;
 	}
 
@@ -474,6 +478,15 @@
 	public List<UserModel> getUsers() {
 		return allUsers;
 	}
+	
+	public UserModel getUser(String username) {
+		for (UserModel user : getUsers()) {
+			if (user.username.equalsIgnoreCase(username)) {
+				return user;
+			}
+		}
+		return null;
+	}
 
 	public List<String> getUsernames() {
 		List<String> usernames = new ArrayList<String>();
@@ -495,13 +508,38 @@
 	}
 	
 	public List<RegistrantAccessPermission> getUserAccessPermissions(RepositoryModel repository) {
-		List<RegistrantAccessPermission> list = new ArrayList<RegistrantAccessPermission>();
-		for (UserModel user : allUsers) {
-			if (user.hasRepositoryPermission(repository.name)) {
-				list.add(new RegistrantAccessPermission(user.username, user.permissions.get(repository.name), RegistrantType.USER));
+		Set<RegistrantAccessPermission> list = new LinkedHashSet<RegistrantAccessPermission>();
+		if (!StringUtils.isEmpty(repository.owner)) {
+			UserModel owner = getUser(repository.owner);
+			if (owner != null) {
+				list.add(new RegistrantAccessPermission(owner.username, AccessPermission.REWIND, PermissionType.OWNER, RegistrantType.USER, false));
 			}
 		}
-		return list;
+		if (repository.isPersonalRepository()) {
+			UserModel owner = getUser(repository.projectPath.substring(1));
+			if (owner != null) {
+				list.add(new RegistrantAccessPermission(owner.username, AccessPermission.REWIND, PermissionType.OWNER, RegistrantType.USER, false));
+			}
+		}
+		for (UserModel user : getUsers()) {
+			if (user.hasRepositoryPermission(repository.name)) {
+				AccessPermission ap = user.getRepositoryPermission(repository);
+				PermissionType pType = PermissionType.REGEX;
+				boolean editable = false;
+				if (repository.isOwner(user.username)) {
+					pType = PermissionType.OWNER;
+				} else if (repository.isUsersPersonalRepository(user.username)) {
+					pType = PermissionType.OWNER;
+				} else if (user.hasExplicitRepositoryPermission(repository.name)) {
+					pType = PermissionType.EXPLICIT;
+					editable = true;
+				}			
+				list.add(new RegistrantAccessPermission(user.username, ap, pType, RegistrantType.USER, editable));
+			}
+		}
+		List<RegistrantAccessPermission> raps = new ArrayList<RegistrantAccessPermission>(list);
+		Collections.sort(raps);
+		return raps;
 	}
 
 	public boolean setUserAccessPermissions(RepositoryModel repository, List<RegistrantAccessPermission> permissions) throws IOException {
@@ -535,9 +573,17 @@
 		List<RegistrantAccessPermission> list = new ArrayList<RegistrantAccessPermission>();
 		for (TeamModel team : allTeams) {
 			if (team.hasRepositoryPermission(repository.name)) {
-				list.add(new RegistrantAccessPermission(team.name, team.permissions.get(repository.name), RegistrantType.TEAM));
+				AccessPermission ap = team.getRepositoryPermission(repository);
+				PermissionType pType = PermissionType.REGEX;
+				boolean editable = false;
+				if (team.hasExplicitRepositoryPermission(repository.name)) {
+					pType = PermissionType.EXPLICIT;
+					editable = true;
+				}
+				list.add(new RegistrantAccessPermission(team.name, ap, pType, RegistrantType.TEAM, editable));
 			}
 		}
+		Collections.sort(list);
 		return list;
 	}
 
@@ -561,6 +607,15 @@
 	public List<RepositoryModel> getRepositories() {
 		return allRepositories;
 	}
+	
+	public RepositoryModel getRepository(String name) {
+		for (RepositoryModel repository : allRepositories) {
+			if (repository.name.equalsIgnoreCase(name)) {
+				return repository;
+			}
+		}
+		return null;
+	}
 
 	public boolean createRepository(RepositoryModel repository, List<RegistrantAccessPermission> userPermissions)
 			throws IOException {

--
Gitblit v1.9.1