From abcb146f0c4e5c99e5e44349a65e6fd49e9296d9 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Tue, 30 Oct 2012 17:03:02 -0400 Subject: [PATCH] Moved owner field onto access permissions tab --- src/com/gitblit/models/UserModel.java | 56 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/com/gitblit/models/UserModel.java b/src/com/gitblit/models/UserModel.java index 7733704..22f250c 100644 --- a/src/com/gitblit/models/UserModel.java +++ b/src/com/gitblit/models/UserModel.java @@ -19,8 +19,8 @@ import java.security.Principal; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -28,6 +28,7 @@ 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.Constants.Unused; import com.gitblit.utils.ArrayUtils; @@ -60,7 +61,7 @@ // retained for backwards-compatibility with RPC clients @Deprecated public final Set<String> repositories = new HashSet<String>(); - public final Map<String, AccessPermission> permissions = new HashMap<String, AccessPermission>(); + public final Map<String, AccessPermission> permissions = new LinkedHashMap<String, AccessPermission>(); public final Set<TeamModel> teams = new HashSet<TeamModel>(); // non-persisted fields @@ -137,7 +138,17 @@ public List<RegistrantAccessPermission> getRepositoryPermissions() { List<RegistrantAccessPermission> list = new ArrayList<RegistrantAccessPermission>(); for (Map.Entry<String, AccessPermission> entry : permissions.entrySet()) { - list.add(new RegistrantAccessPermission(entry.getKey(), entry.getValue(), RegistrantType.REPOSITORY)); + String registrant = entry.getKey(); + boolean editable = true; + PermissionType pType = PermissionType.EXPLICIT; + if (isMyPersonalRepository(registrant)) { + pType = PermissionType.OWNER; + editable = false; + } else if (StringUtils.findInvalidCharacter(registrant) != null) { + // a regex will have at least 1 invalid character + pType = PermissionType.REGEX; + } + list.add(new RegistrantAccessPermission(registrant, entry.getValue(), pType, RegistrantType.REPOSITORY, editable)); } Collections.sort(list); return list; @@ -167,6 +178,18 @@ } } return false; + } + + /** + * Returns true if the user has an explicitly specified access permission for + * this repository. + * + * @param name + * @return if the user has an explicitly specified access permission + */ + public boolean hasExplicitRepositoryPermission(String name) { + String repository = AccessPermission.repositoryFromRole(name).toLowerCase(); + return permissions.containsKey(repository); } /** @@ -205,8 +228,8 @@ return AccessPermission.REWIND; } - // determine best permission available based on user's personal permissions - // and the permissions of teams of which the user belongs + // explicit user permission OR user regex match is used + // if that fails, then the best team permission is used AccessPermission permission = AccessPermission.NONE; if (permissions.containsKey(repository.name.toLowerCase())) { // exact repository permission specified, use it @@ -215,22 +238,26 @@ return p; } } else { - // search for regex permission match + // search for case-insensitive regex permission match for (String key : permissions.keySet()) { - if (repository.name.matches(key)) { + if (StringUtils.matchesIgnoreCase(repository.name, key)) { AccessPermission p = permissions.get(key); if (p != null) { + // take first match permission = p; + break; } } } } - for (TeamModel team : teams) { - AccessPermission p = team.getRepositoryPermission(repository); - if (permission == null || p.exceeds(permission)) { - // use team permission - permission = p; + if (AccessPermission.NONE.equals(permission)) { + for (TeamModel team : teams) { + AccessPermission p = team.getRepositoryPermission(repository); + if (p.exceeds(permission)) { + // use highest team permission + permission = p; + } } } return permission; @@ -478,4 +505,9 @@ // Default UserModel doesn't implement branch-level security. Other Realms (i.e. Gerrit) may override this method. return hasRepositoryPermission(repositoryName); } + + public boolean isMyPersonalRepository(String repository) { + String projectPath = StringUtils.getFirstPathElement(repository); + return !StringUtils.isEmpty(projectPath) && projectPath.equalsIgnoreCase("~" + username); + } } -- Gitblit v1.9.1