From 06fa257080ab8de7986ad5debbf317eddf5608e7 Mon Sep 17 00:00:00 2001 From: Alex Lewis <alex.lewis001@gmail.com> Date: Tue, 10 Dec 2013 11:41:36 -0500 Subject: [PATCH] issue-350: Fixes issue when an apostrophe is present in a User's name --- src/main/java/com/gitblit/models/TeamModel.java | 119 ++++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 93 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..aaa3d54 100644 --- a/src/main/java/com/gitblit/models/TeamModel.java +++ b/src/main/java/com/gitblit/models/TeamModel.java @@ -27,6 +27,7 @@ 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; @@ -35,9 +36,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> { @@ -48,6 +49,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,6 +61,7 @@ public TeamModel(String name) { this.name = name; + this.accountType = AccountType.LOCAL; } /** @@ -77,7 +80,7 @@ public void addRepository(String name) { addRepositoryPermission(name); } - + @Deprecated @Unused public void addRepositories(Collection<String> names) { @@ -90,10 +93,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 +120,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 +146,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 +158,7 @@ String repository = AccessPermission.repositoryFromRole(name).toLowerCase(); return permissions.containsKey(repository); } - + /** * Adds a repository permission to the team. * <p> @@ -178,37 +181,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 +251,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 +300,7 @@ } return true; } - + public boolean canView(RepositoryModel repository) { return canAccess(repository, AccessRestrictionType.VIEW, AccessPermission.VIEW); } @@ -298,6 +361,10 @@ } } + public boolean isLocalTeam() { + return accountType.isLocal(); + } + @Override public String toString() { return name; -- Gitblit v1.9.1