From 4fcac9d2cbdafb51e3ee9ca3b3da64fd86103174 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Tue, 26 Nov 2013 15:58:15 -0500 Subject: [PATCH] Remove artifact setting from manager dialog --- src/main/java/com/gitblit/models/TeamModel.java | 112 +++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 86 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/gitblit/models/TeamModel.java b/src/main/java/com/gitblit/models/TeamModel.java index 9587ca7..a192828 100644 --- a/src/main/java/com/gitblit/models/TeamModel.java +++ b/src/main/java/com/gitblit/models/TeamModel.java @@ -35,9 +35,9 @@ /** * TeamModel is a serializable model class that represents a group of users and * a list of accessible repositories. - * + * * @author James Moger - * + * */ public class TeamModel implements Serializable, Comparable<TeamModel> { @@ -77,7 +77,7 @@ public void addRepository(String name) { addRepositoryPermission(name); } - + @Deprecated @Unused public void addRepositories(Collection<String> names) { @@ -90,10 +90,10 @@ removeRepositoryPermission(name); } - + /** * Returns a list of repository permissions for this team. - * + * * @return the team's list of permissions */ public List<RegistrantAccessPermission> getRepositoryPermissions() { @@ -117,11 +117,11 @@ Collections.sort(list); return list; } - + /** * Returns true if the team has any type of specified access permission for * this repository. - * + * * @param name * @return true if team has a specified access permission for the repository */ @@ -143,11 +143,11 @@ } return false; } - + /** * Returns true if the team has an explicitly specified access permission for * this repository. - * + * * @param name * @return if the team has an explicitly specified access permission */ @@ -155,7 +155,7 @@ String repository = AccessPermission.repositoryFromRole(name).toLowerCase(); return permissions.containsKey(repository); } - + /** * Adds a repository permission to the team. * <p> @@ -178,37 +178,68 @@ addRepositoryPermission(role); } } - + public AccessPermission removeRepositoryPermission(String name) { String repository = AccessPermission.repositoryFromRole(name).toLowerCase(); repositories.remove(repository); return permissions.remove(repository); } - + public void setRepositoryPermission(String repository, AccessPermission permission) { - permissions.put(repository.toLowerCase(), permission); - repositories.add(repository.toLowerCase()); + if (permission == null) { + // remove the permission + permissions.remove(repository.toLowerCase()); + repositories.remove(repository.toLowerCase()); + } else { + // set the new permission + permissions.put(repository.toLowerCase(), permission); + repositories.add(repository.toLowerCase()); + } } - + public RegistrantAccessPermission getRepositoryPermission(RepositoryModel repository) { RegistrantAccessPermission ap = new RegistrantAccessPermission(); ap.registrant = name; ap.registrantType = RegistrantType.TEAM; ap.permission = AccessPermission.NONE; ap.mutable = false; - - if (canAdmin) { - ap.permissionType = PermissionType.ADMINISTRATOR; - ap.permission = AccessPermission.REWIND; + + // determine maximum permission for the repository + final AccessPermission maxPermission = + (repository.isFrozen || !repository.isBare || repository.isMirror) ? + AccessPermission.CLONE : AccessPermission.REWIND; + + if (AccessRestrictionType.NONE.equals(repository.accessRestriction)) { + // anonymous rewind + ap.permissionType = PermissionType.ANONYMOUS; + if (AccessPermission.REWIND.atMost(maxPermission)) { + ap.permission = AccessPermission.REWIND; + } else { + ap.permission = maxPermission; + } return ap; } - + + if (canAdmin) { + ap.permissionType = PermissionType.ADMINISTRATOR; + if (AccessPermission.REWIND.atMost(maxPermission)) { + ap.permission = AccessPermission.REWIND; + } else { + ap.permission = maxPermission; + } + return ap; + } + if (permissions.containsKey(repository.name.toLowerCase())) { // exact repository permission specified AccessPermission p = permissions.get(repository.name.toLowerCase()); - if (p != null) { + if (p != null && repository.accessRestriction.isValidPermission(p)) { ap.permissionType = PermissionType.EXPLICIT; - ap.permission = p; + if (p.atMost(maxPermission)) { + ap.permission = p; + } else { + ap.permission = maxPermission; + } ap.mutable = true; return ap; } @@ -217,19 +248,48 @@ for (String key : permissions.keySet()) { if (StringUtils.matchesIgnoreCase(repository.name, key)) { AccessPermission p = permissions.get(key); - if (p != null) { + if (p != null && repository.accessRestriction.isValidPermission(p)) { // take first match ap.permissionType = PermissionType.REGEX; - ap.permission = p; + if (p.atMost(maxPermission)) { + ap.permission = p; + } else { + ap.permission = maxPermission; + } ap.source = key; return ap; } } } } + + // still no explicit or regex, check for implicit permissions + if (AccessPermission.NONE == ap.permission) { + switch (repository.accessRestriction) { + case VIEW: + // no implicit permissions possible + break; + case CLONE: + // implied view permission + ap.permission = AccessPermission.VIEW; + ap.permissionType = PermissionType.ANONYMOUS; + break; + case PUSH: + // implied clone permission + ap.permission = AccessPermission.CLONE; + ap.permissionType = PermissionType.ANONYMOUS; + break; + case NONE: + // implied REWIND or CLONE + ap.permission = maxPermission; + ap.permissionType = PermissionType.ANONYMOUS; + break; + } + } + return ap; } - + protected boolean canAccess(RepositoryModel repository, AccessRestrictionType ifRestriction, AccessPermission requirePermission) { if (repository.accessRestriction.atLeast(ifRestriction)) { RegistrantAccessPermission ap = getRepositoryPermission(repository); @@ -237,7 +297,7 @@ } return true; } - + public boolean canView(RepositoryModel repository) { return canAccess(repository, AccessRestrictionType.VIEW, AccessPermission.VIEW); } -- Gitblit v1.9.1