From a502d96a860456ec5e8c96761db70f7cabb74751 Mon Sep 17 00:00:00 2001 From: Paul Martin <paul@paulsputer.com> Date: Sat, 30 Apr 2016 04:19:14 -0400 Subject: [PATCH] Merge pull request #1073 from gitblit/1062-DocEditorUpdates --- src/main/java/com/gitblit/models/TeamModel.java | 116 ++++++++++++++++++++++++++++++---------------------------- 1 files changed, 60 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/gitblit/models/TeamModel.java b/src/main/java/com/gitblit/models/TeamModel.java index 8e0d5d5..f4a484c 100644 --- a/src/main/java/com/gitblit/models/TeamModel.java +++ b/src/main/java/com/gitblit/models/TeamModel.java @@ -27,17 +27,17 @@ import com.gitblit.Constants.AccessPermission; import com.gitblit.Constants.AccessRestrictionType; +import com.gitblit.Constants.AccountType; import com.gitblit.Constants.PermissionType; import com.gitblit.Constants.RegistrantType; -import com.gitblit.Constants.Unused; import com.gitblit.utils.StringUtils; /** * 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> { @@ -48,6 +48,7 @@ public boolean canAdmin; public boolean canFork; public boolean canCreate; + public AccountType accountType; public final Set<String> users = new HashSet<String>(); // retained for backwards-compatibility with RPC clients @Deprecated @@ -59,41 +60,12 @@ public TeamModel(String name) { this.name = name; + this.accountType = AccountType.LOCAL; } - /** - * @use hasRepositoryPermission - * @param name - * @return - */ - @Deprecated - @Unused - public boolean hasRepository(String name) { - return hasRepositoryPermission(name); - } - - @Deprecated - @Unused - public void addRepository(String name) { - addRepositoryPermission(name); - } - - @Deprecated - @Unused - public void addRepositories(Collection<String> names) { - addRepositoryPermissions(names); - } - - @Deprecated - @Unused - public void removeRepository(String name) { - removeRepositoryPermission(name); - } - - /** * Returns a list of repository permissions for this team. - * + * * @return the team's list of permissions */ public List<RegistrantAccessPermission> getRepositoryPermissions() { @@ -117,11 +89,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 +115,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 +127,7 @@ String repository = AccessPermission.repositoryFromRole(name).toLowerCase(); return permissions.containsKey(repository); } - + /** * Adds a repository permission to the team. * <p> @@ -178,44 +150,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; - + + // 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; - ap.permission = AccessPermission.REWIND; + if (AccessPermission.REWIND.atMost(maxPermission)) { + ap.permission = AccessPermission.REWIND; + } else { + ap.permission = maxPermission; + } return ap; } - + if (canAdmin) { ap.permissionType = PermissionType.ADMINISTRATOR; - ap.permission = AccessPermission.REWIND; + 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 && 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; } @@ -227,14 +223,18 @@ 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) { @@ -252,8 +252,8 @@ ap.permissionType = PermissionType.ANONYMOUS; break; case NONE: - // implied REWIND or CLONE if frozen - ap.permission = repository.isFrozen ? AccessPermission.CLONE : AccessPermission.REWIND; + // implied REWIND or CLONE + ap.permission = maxPermission; ap.permissionType = PermissionType.ANONYMOUS; break; } @@ -261,7 +261,7 @@ return ap; } - + protected boolean canAccess(RepositoryModel repository, AccessRestrictionType ifRestriction, AccessPermission requirePermission) { if (repository.accessRestriction.atLeast(ifRestriction)) { RegistrantAccessPermission ap = getRepositoryPermission(repository); @@ -269,7 +269,7 @@ } return true; } - + public boolean canView(RepositoryModel repository) { return canAccess(repository, AccessRestrictionType.VIEW, AccessPermission.VIEW); } @@ -330,6 +330,10 @@ } } + public boolean isLocalTeam() { + return accountType.isLocal(); + } + @Override public String toString() { return name; -- Gitblit v1.9.1