From f22a0633d08e38ac4bf92b5165a708e11b4d6598 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 03 Oct 2012 17:31:37 -0400 Subject: [PATCH] Implemented support for toggling User.canFork in Manager --- src/com/gitblit/models/UserModel.java | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 53 insertions(+), 1 deletions(-) diff --git a/src/com/gitblit/models/UserModel.java b/src/com/gitblit/models/UserModel.java index 6632c61..6d5de3b 100644 --- a/src/com/gitblit/models/UserModel.java +++ b/src/com/gitblit/models/UserModel.java @@ -20,6 +20,8 @@ import java.util.HashSet; import java.util.Set; +import com.gitblit.Constants.AccessRestrictionType; +import com.gitblit.Constants.AuthorizationControl; import com.gitblit.utils.StringUtils; /** @@ -34,6 +36,8 @@ private static final long serialVersionUID = 1L; + public static final UserModel ANONYMOUS = new UserModel(); + // field names are reflectively mapped in EditUser page public String username; public String password; @@ -41,12 +45,22 @@ public String displayName; public String emailAddress; public boolean canAdmin; + public boolean canFork; public boolean excludeFromFederation; public final Set<String> repositories = new HashSet<String>(); public final Set<TeamModel> teams = new HashSet<TeamModel>(); + // non-persisted fields + public boolean isAuthenticated; + public UserModel(String username) { this.username = username; + this.isAuthenticated = true; + } + + private UserModel() { + this.username = "anonymous"; + this.isAuthenticated = false; } /** @@ -65,8 +79,9 @@ public boolean canAccessRepository(RepositoryModel repository) { boolean isOwner = !StringUtils.isEmpty(repository.owner) && repository.owner.equals(username); + boolean allowAuthenticated = isAuthenticated && AuthorizationControl.AUTHENTICATED.equals(repository.authorizationControl); return canAdmin || isOwner || repositories.contains(repository.name.toLowerCase()) - || hasTeamAccess(repository.name); + || hasTeamAccess(repository.name) || allowAuthenticated; } public boolean hasTeamAccess(String repositoryName) { @@ -77,6 +92,43 @@ } return false; } + + public boolean canViewRepository(RepositoryModel repository) { + if (canAdmin) { + return true; + } + if (repository.accessRestriction.atLeast(AccessRestrictionType.VIEW)) { + return canAccessRepository(repository); + } + return true; + } + + public boolean canForkRepository(RepositoryModel repository) { + if (canAdmin) { + return true; + } + if (!canFork) { + // user has been prohibited from forking + return false; + } + if (!isAuthenticated) { + // unauthenticated user model + return false; + } + if (("~" + username).equalsIgnoreCase(repository.projectPath)) { + // this repository is already a personal repository + return false; + } + if (!repository.allowForks) { + // repository prohibits forks + return false; + } + if (repository.accessRestriction.atLeast(AccessRestrictionType.CLONE)) { + return canAccessRepository(repository); + } + // repository is not clone-restricted + return true; + } public boolean hasRepository(String name) { return repositories.contains(name.toLowerCase()); -- Gitblit v1.9.1