From c7cc0fabb04ddd31375b5678522fd68ebc50ccfc Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 30 Apr 2013 16:23:40 +0200 Subject: [PATCH] pass available permissions to the state object, if the current user has the administrator role --- .../src/main/java/sonia/scm/ScmState.java | 56 +++++++++++++++++++ .../resources/AuthenticationResource.java | 29 ++++++++-- 2 files changed, 80 insertions(+), 5 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/ScmState.java b/scm-core/src/main/java/sonia/scm/ScmState.java index 8508d90c67..a04413f199 100644 --- a/scm-core/src/main/java/sonia/scm/ScmState.java +++ b/scm-core/src/main/java/sonia/scm/ScmState.java @@ -35,12 +35,14 @@ package sonia.scm; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.security.PermissionDescriptor; import sonia.scm.user.User; import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ import java.util.Collection; +import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -122,6 +124,29 @@ public class ScmState public ScmState(SCMContextProvider provider, User user, Collection groups, Collection repositoryTypes, String defaultUserType, ScmClientConfig clientConfig) + { + this(provider, user, groups, repositoryTypes, defaultUserType, + clientConfig, null); + } + + /** + * Constructs {@link ScmState} object. + * + * + * @param provider context provider + * @param user current user + * @param groups groups of the current user + * @param repositoryTypes available repository types + * @param defaultUserType default user type + * @param clientConfig client configuration + * @param availablePermissions list of available permissions + * + * @since 1.31 + */ + public ScmState(SCMContextProvider provider, User user, + Collection groups, Collection repositoryTypes, + String defaultUserType, ScmClientConfig clientConfig, + List availablePermissions) { this.version = provider.getVersion(); this.user = user; @@ -129,10 +154,23 @@ public class ScmState this.repositoryTypes = repositoryTypes; this.clientConfig = clientConfig; this.defaultUserType = defaultUserType; + this.availablePermissions = availablePermissions; } //~--- get methods ---------------------------------------------------------- + /** + * Returns a list of available global permissions. + * + * + * @return available global permissions + * @since 1.31 + */ + public List getAvailablePermissions() + { + return availablePermissions; + } + /** * Returns configuration for SCM-Manager clients. * @@ -215,6 +253,18 @@ public class ScmState //~--- set methods ---------------------------------------------------------- + /** + * Sets a list of available global permissions. + * + * + * @param permissions list of available global permisisons + * @since 1.31 + */ + public void setAvailablePermissions(List permissions) + { + this.availablePermissions = permissions; + } + /** * Setter for the client configuration * @@ -299,6 +349,12 @@ public class ScmState //~--- fields --------------------------------------------------------------- + /** + * Avaliable global permission + * @since 1.31 + */ + private List availablePermissions; + /** Field description */ private ScmClientConfig clientConfig; diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java index 150d352219..cc5b60e821 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java @@ -56,6 +56,9 @@ import sonia.scm.ScmState; import sonia.scm.config.ScmConfiguration; import sonia.scm.group.GroupNames; import sonia.scm.repository.RepositoryManager; +import sonia.scm.security.PermissionDescriptor; +import sonia.scm.security.Role; +import sonia.scm.security.SecuritySystem; import sonia.scm.security.Tokens; import sonia.scm.user.User; import sonia.scm.user.UserManager; @@ -64,6 +67,7 @@ import sonia.scm.user.UserManager; import java.util.Collection; import java.util.Collections; +import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -104,16 +108,18 @@ public class AuthenticationResource * @param repositoryManger * @param userManager * @param securityContextProvider + * @param securitySystem */ @Inject public AuthenticationResource(SCMContextProvider contextProvider, ScmConfiguration configuration, RepositoryManager repositoryManger, - UserManager userManager) + UserManager userManager, SecuritySystem securitySystem) { this.contextProvider = contextProvider; this.configuration = configuration; this.repositoryManger = repositoryManger; this.userManager = userManager; + this.securitySystem = securitySystem; } //~--- methods -------------------------------------------------------------- @@ -287,7 +293,8 @@ public class AuthenticationResource */ private ScmState createAnonymousState() { - return createState(SCMContext.ANONYMOUS, Collections.EMPTY_LIST); + return createState(SCMContext.ANONYMOUS, Collections.EMPTY_LIST, + Collections.EMPTY_LIST); } /** @@ -306,7 +313,14 @@ public class AuthenticationResource User user = collection.oneByType(User.class); GroupNames groups = collection.oneByType(GroupNames.class); - return createState(user, groups.getCollection()); + List ap = Collections.EMPTY_LIST; + + if (subject.hasRole(Role.ADMIN)) + { + ap = securitySystem.getAvailablePermissions(); + } + + return createState(user, groups.getCollection(), ap); } /** @@ -315,14 +329,16 @@ public class AuthenticationResource * * @param user * @param groups + * @param availablePermissions * * @return */ - private ScmState createState(User user, Collection groups) + private ScmState createState(User user, Collection groups, + List availablePermissions) { return new ScmState(contextProvider, user, groups, repositoryManger.getConfiguredTypes(), userManager.getDefaultType(), - new ScmClientConfig(configuration)); + new ScmClientConfig(configuration), availablePermissions); } //~--- fields --------------------------------------------------------------- @@ -336,6 +352,9 @@ public class AuthenticationResource /** Field description */ private RepositoryManager repositoryManger; + /** Field description */ + private SecuritySystem securitySystem; + /** Field description */ private UserManager userManager; }