check permission in RepositoryManager

This commit is contained in:
Sebastian Sdorra
2010-11-26 17:57:05 +01:00
parent 2fdc1d3a7e
commit 0bf318e0fa
13 changed files with 187 additions and 36 deletions

View File

@@ -42,7 +42,7 @@ import com.google.inject.Singleton;
import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
import sonia.scm.web.filter.RegexPermissionFilter; import sonia.scm.web.filter.RegexPermissionFilter;
import sonia.scm.web.security.SecurityContext; import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -70,7 +70,7 @@ public class GitPermissionFilter extends RegexPermissionFilter
* @param repositoryManager * @param repositoryManager
*/ */
@Inject @Inject
public GitPermissionFilter(Provider<SecurityContext> securityContextProvider, public GitPermissionFilter(Provider<WebSecurityContext> securityContextProvider,
RepositoryManager repositoryManager) RepositoryManager repositoryManager)
{ {
super(securityContextProvider, repositoryManager); super(securityContextProvider, repositoryManager);

View File

@@ -44,7 +44,7 @@ import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
import sonia.scm.web.filter.PermissionFilter; import sonia.scm.web.filter.PermissionFilter;
import sonia.scm.web.filter.RegexPermissionFilter; import sonia.scm.web.filter.RegexPermissionFilter;
import sonia.scm.web.security.SecurityContext; import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -66,7 +66,7 @@ public class HgPermissionFilter extends RegexPermissionFilter
* @param repositoryManager * @param repositoryManager
*/ */
@Inject @Inject
public HgPermissionFilter(Provider<SecurityContext> securityContextProvider, public HgPermissionFilter(Provider<WebSecurityContext> securityContextProvider,
RepositoryManager repositoryManager) RepositoryManager repositoryManager)
{ {
super(securityContextProvider, repositoryManager); super(securityContextProvider, repositoryManager);

View File

@@ -44,7 +44,7 @@ import sonia.scm.repository.RepositoryManager;
import sonia.scm.repository.SvnRepositoryHandler; import sonia.scm.repository.SvnRepositoryHandler;
import sonia.scm.web.filter.PermissionFilter; import sonia.scm.web.filter.PermissionFilter;
import sonia.scm.web.filter.RegexPermissionFilter; import sonia.scm.web.filter.RegexPermissionFilter;
import sonia.scm.web.security.SecurityContext; import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -79,7 +79,7 @@ public class SvnPermissionFilter extends RegexPermissionFilter
* @param repositoryManager * @param repositoryManager
*/ */
@Inject @Inject
public SvnPermissionFilter(Provider<SecurityContext> securityContextProvider, public SvnPermissionFilter(Provider<WebSecurityContext> securityContextProvider,
RepositoryManager repositoryManager) RepositoryManager repositoryManager)
{ {
super(securityContextProvider, repositoryManager); super(securityContextProvider, repositoryManager);

View File

@@ -36,6 +36,7 @@ package sonia.scm.repository.xml;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -47,11 +48,15 @@ import sonia.scm.SCMContext;
import sonia.scm.SCMContextProvider; import sonia.scm.SCMContextProvider;
import sonia.scm.Type; import sonia.scm.Type;
import sonia.scm.repository.AbstractRepositoryManager; import sonia.scm.repository.AbstractRepositoryManager;
import sonia.scm.repository.PermissionType;
import sonia.scm.repository.PermissionUtil;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryAllreadyExistExeption; import sonia.scm.repository.RepositoryAllreadyExistExeption;
import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryException;
import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryHandler;
import sonia.scm.repository.RepositoryHandlerNotFoundException; import sonia.scm.repository.RepositoryHandlerNotFoundException;
import sonia.scm.security.SecurityContext;
import sonia.scm.user.User;
import sonia.scm.util.AssertUtil; import sonia.scm.util.AssertUtil;
import sonia.scm.util.IOUtil; import sonia.scm.util.IOUtil;
@@ -92,11 +97,16 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
* Constructs ... * Constructs ...
* *
* *
*
* @param securityContextProvider
* @param handlerSet * @param handlerSet
*/ */
@Inject @Inject
public XmlRepositoryManager(Set<RepositoryHandler> handlerSet) public XmlRepositoryManager(
Provider<SecurityContext> securityContextProvider,
Set<RepositoryHandler> handlerSet)
{ {
this.securityContextProvider = securityContextProvider;
handlerMap = new HashMap<String, RepositoryHandler>(); handlerMap = new HashMap<String, RepositoryHandler>();
types = new HashSet<Type>(); types = new HashSet<Type>();
@@ -142,6 +152,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
repository.getType()); repository.getType());
} }
assertIsAdmin();
AssertUtil.assertIsValid(repository); AssertUtil.assertIsValid(repository);
if (repositoryDB.contains(repository)) if (repositoryDB.contains(repository))
@@ -181,6 +192,8 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
repository.getType()); repository.getType());
} }
assertIsOwner(repository);
if (repositoryDB.contains(repository)) if (repositoryDB.contains(repository))
{ {
getHandler(repository).delete(repository); getHandler(repository).delete(repository);
@@ -244,6 +257,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
repository.getType()); repository.getType());
} }
assertIsOwner(repository);
AssertUtil.assertIsValid(repository); AssertUtil.assertIsValid(repository);
if (repositoryDB.contains(repository)) if (repositoryDB.contains(repository))
@@ -281,6 +295,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
throws RepositoryException, IOException throws RepositoryException, IOException
{ {
AssertUtil.assertIsNotNull(repository); AssertUtil.assertIsNotNull(repository);
assertIsReader(repository);
Repository fresh = repositoryDB.get(repository.getType(), Repository fresh = repositoryDB.get(repository.getType(),
repository.getName()); repository.getName());
@@ -315,6 +330,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
if (repository != null) if (repository != null)
{ {
assertIsReader(repository);
repository = repository.clone(); repository = repository.clone();
} }
@@ -339,9 +355,16 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
Repository repository = repositoryDB.get(type, name); Repository repository = repositoryDB.get(type, name);
if (repository != null) if (repository != null)
{
if (isReader(repository))
{ {
repository = repository.clone(); repository = repository.clone();
} }
else
{
repository = null;
}
}
return repository; return repository;
} }
@@ -358,9 +381,12 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
LinkedList<Repository> repositories = new LinkedList<Repository>(); LinkedList<Repository> repositories = new LinkedList<Repository>();
for (Repository repository : repositoryDB.values()) for (Repository repository : repositoryDB.values())
{
if (isReader(repository))
{ {
repositories.add(repository.clone()); repositories.add(repository.clone());
} }
}
return repositories; return repositories;
} }
@@ -424,6 +450,44 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
types.add(type); types.add(type);
} }
/**
* Method description
*
*
* @throws RepositoryException
*/
private void assertIsAdmin() throws RepositoryException
{
if (!getCurrentUser().isAdmin())
{
throw new RepositoryException("admin permsission required");
}
}
/**
* Method description
*
*
* @param repository
*/
private void assertIsOwner(Repository repository)
{
PermissionUtil.assertPermission(repository, getCurrentUser(),
PermissionType.OWNER);
}
/**
* Method description
*
*
* @param repository
*/
private void assertIsReader(Repository repository)
{
PermissionUtil.assertPermission(repository, getCurrentUser(),
PermissionType.READ);
}
/** /**
* Method description * Method description
* *
@@ -446,6 +510,25 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
private User getCurrentUser()
{
SecurityContext context = securityContextProvider.get();
AssertUtil.assertIsNotNull(context);
User user = context.getUser();
AssertUtil.assertIsNotNull(user);
return user;
}
/** /**
* Method description * Method description
* *
@@ -476,6 +559,20 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
return handler; return handler;
} }
/**
* Method description
*
*
* @param repository
*
* @return
*/
private boolean isReader(Repository repository)
{
return PermissionUtil.hasPermission(repository, getCurrentUser(),
PermissionType.READ);
}
//~--- fields --------------------------------------------------------------- //~--- fields ---------------------------------------------------------------
/** Field description */ /** Field description */
@@ -487,6 +584,9 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
/** Field description */ /** Field description */
private File repositoryDBFile; private File repositoryDBFile;
/** Field description */
private Provider<SecurityContext> securityContextProvider;
/** Field description */ /** Field description */
private Set<Type> types; private Set<Type> types;
} }

View File

@@ -0,0 +1,54 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.user.User;
/**
*
* @author Sebastian Sdorra
*/
public interface SecurityContext
{
/**
* Method description
*
*
* @return
*/
public User getUser();
}

View File

@@ -39,7 +39,7 @@ import com.google.inject.Singleton;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.util.Util; import sonia.scm.util.Util;
import sonia.scm.web.security.SecurityContext; import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -91,7 +91,7 @@ public class BasicAuthenticationFilter extends HttpFilter
*/ */
@Inject @Inject
public BasicAuthenticationFilter( public BasicAuthenticationFilter(
Provider<SecurityContext> securityContextProvider) Provider<WebSecurityContext> securityContextProvider)
{ {
this.securityContextProvider = securityContextProvider; this.securityContextProvider = securityContextProvider;
} }
@@ -114,7 +114,7 @@ public class BasicAuthenticationFilter extends HttpFilter
HttpServletResponse response, FilterChain chain) HttpServletResponse response, FilterChain chain)
throws IOException, ServletException throws IOException, ServletException
{ {
SecurityContext securityContext = securityContextProvider.get(); WebSecurityContext securityContext = securityContextProvider.get();
User user = null; User user = null;
if (securityContext != null) if (securityContext != null)
@@ -179,5 +179,5 @@ public class BasicAuthenticationFilter extends HttpFilter
//~--- fields --------------------------------------------------------------- //~--- fields ---------------------------------------------------------------
/** Field description */ /** Field description */
private Provider<SecurityContext> securityContextProvider; private Provider<WebSecurityContext> securityContextProvider;
} }

View File

@@ -45,7 +45,7 @@ import sonia.scm.repository.PermissionUtil;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.util.AssertUtil; import sonia.scm.util.AssertUtil;
import sonia.scm.web.security.SecurityContext; import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -75,7 +75,7 @@ public abstract class PermissionFilter extends HttpFilter
* *
* @param securityContextProvider * @param securityContextProvider
*/ */
public PermissionFilter(Provider<SecurityContext> securityContextProvider) public PermissionFilter(Provider<WebSecurityContext> securityContextProvider)
{ {
this.securityContextProvider = securityContextProvider; this.securityContextProvider = securityContextProvider;
} }
@@ -120,7 +120,7 @@ public abstract class PermissionFilter extends HttpFilter
HttpServletResponse response, FilterChain chain) HttpServletResponse response, FilterChain chain)
throws IOException, ServletException throws IOException, ServletException
{ {
SecurityContext securityContext = securityContextProvider.get(); WebSecurityContext securityContext = securityContextProvider.get();
AssertUtil.assertIsNotNull(securityContext); AssertUtil.assertIsNotNull(securityContext);
@@ -179,5 +179,5 @@ public abstract class PermissionFilter extends HttpFilter
//~--- fields --------------------------------------------------------------- //~--- fields ---------------------------------------------------------------
/** Field description */ /** Field description */
protected Provider<SecurityContext> securityContextProvider; protected Provider<WebSecurityContext> securityContextProvider;
} }

View File

@@ -39,7 +39,7 @@ import com.google.inject.Provider;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
import sonia.scm.web.security.SecurityContext; import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -69,7 +69,7 @@ public abstract class RegexPermissionFilter extends PermissionFilter
* @param repositoryManager * @param repositoryManager
*/ */
public RegexPermissionFilter( public RegexPermissionFilter(
Provider<SecurityContext> securityContextProvider, Provider<WebSecurityContext> securityContextProvider,
RepositoryManager repositoryManager) RepositoryManager repositoryManager)
{ {
super(securityContextProvider); super(securityContextProvider);

View File

@@ -48,7 +48,7 @@ import javax.servlet.http.HttpServletResponse;
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
@SessionScoped @SessionScoped
public class BasicSecurityContext implements SecurityContext public class BasicSecurityContext implements WebSecurityContext
{ {
/** /**

View File

@@ -29,10 +29,13 @@
* *
*/ */
package sonia.scm.web.security; package sonia.scm.web.security;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import sonia.scm.security.SecurityContext;
import sonia.scm.user.User; import sonia.scm.user.User;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -44,7 +47,7 @@ import javax.servlet.http.HttpServletResponse;
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
public interface SecurityContext public interface WebSecurityContext extends SecurityContext
{ {
/** /**
@@ -73,14 +76,6 @@ public interface SecurityContext
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
public User getUser();
/** /**
* Method description * Method description
* *

View File

@@ -62,7 +62,7 @@ import sonia.scm.web.plugin.ScmWebPluginContext;
import sonia.scm.web.plugin.SecurityConfig; import sonia.scm.web.plugin.SecurityConfig;
import sonia.scm.web.security.Authenticator; import sonia.scm.web.security.Authenticator;
import sonia.scm.web.security.BasicSecurityContext; import sonia.scm.web.security.BasicSecurityContext;
import sonia.scm.web.security.SecurityContext; import sonia.scm.web.security.WebSecurityContext;
import sonia.scm.web.security.XmlAuthenticator; import sonia.scm.web.security.XmlAuthenticator;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -81,6 +81,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.xml.bind.JAXB; import javax.xml.bind.JAXB;
import sonia.scm.security.SecurityContext;
/** /**
* *
@@ -161,6 +162,7 @@ public class ScmServletModule extends ServletModule
// bind(EncryptionHandler.class).to(MessageDigestEncryptionHandler.class); // bind(EncryptionHandler.class).to(MessageDigestEncryptionHandler.class);
// bind(Authenticator.class).to(XmlAuthenticator.class); // bind(Authenticator.class).to(XmlAuthenticator.class);
bind(SecurityContext.class).to(BasicSecurityContext.class); bind(SecurityContext.class).to(BasicSecurityContext.class);
bind(WebSecurityContext.class).to(BasicSecurityContext.class);
loadPlugins(pluginManager); loadPlugins(pluginManager);
bind(CacheManager.class).to(EhCacheManager.class); bind(CacheManager.class).to(EhCacheManager.class);

View File

@@ -45,7 +45,7 @@ import sonia.scm.ScmState;
import sonia.scm.Type; import sonia.scm.Type;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.web.security.SecurityContext; import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -193,5 +193,5 @@ public class AuthenticationResource
/** Field description */ /** Field description */
@Inject @Inject
private SecurityContext securityContext; private WebSecurityContext securityContext;
} }

View File

@@ -39,7 +39,7 @@ import com.google.inject.Singleton;
import sonia.scm.web.filter.HttpFilter; import sonia.scm.web.filter.HttpFilter;
import sonia.scm.web.filter.SecurityHttpServletRequestWrapper; import sonia.scm.web.filter.SecurityHttpServletRequestWrapper;
import sonia.scm.web.security.SecurityContext; import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -70,7 +70,7 @@ public class SecurityFilter extends HttpFilter
* @param securityContextProvider * @param securityContextProvider
*/ */
@Inject @Inject
public SecurityFilter(Provider<SecurityContext> securityContextProvider) public SecurityFilter(Provider<WebSecurityContext> securityContextProvider)
{ {
this.securityContextProvider = securityContextProvider; this.securityContextProvider = securityContextProvider;
} }
@@ -93,7 +93,7 @@ public class SecurityFilter extends HttpFilter
HttpServletResponse response, FilterChain chain) HttpServletResponse response, FilterChain chain)
throws IOException, ServletException throws IOException, ServletException
{ {
SecurityContext securityContext = securityContextProvider.get(); WebSecurityContext securityContext = securityContextProvider.get();
if (securityContext != null) if (securityContext != null)
{ {
@@ -126,5 +126,5 @@ public class SecurityFilter extends HttpFilter
//~--- fields --------------------------------------------------------------- //~--- fields ---------------------------------------------------------------
/** Field description */ /** Field description */
private Provider<SecurityContext> securityContextProvider; private Provider<WebSecurityContext> securityContextProvider;
} }