archived repositories are not writable

This commit is contained in:
Sebastian Sdorra
2012-03-30 11:38:13 +02:00
parent 6a342067ff
commit b3719f7e0d
8 changed files with 153 additions and 20 deletions

View File

@@ -37,6 +37,10 @@ package sonia.scm.repository;
import com.google.inject.Provider; import com.google.inject.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.config.ScmConfiguration;
import sonia.scm.security.ScmSecurityException; import sonia.scm.security.ScmSecurityException;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.util.AssertUtil; import sonia.scm.util.AssertUtil;
@@ -54,6 +58,14 @@ import java.util.List;
public class PermissionUtil public class PermissionUtil
{ {
/**
* the logger for PermissionUtil
*/
private static final Logger logger =
LoggerFactory.getLogger(PermissionUtil.class);
//~--- methods --------------------------------------------------------------
/** /**
* Method description * Method description
* *
@@ -151,6 +163,40 @@ public class PermissionUtil
return result; return result;
} }
/**
* Returns true if the repository is writable.
*
*
* @param configuration SCM-Manager main configuration
* @param repository repository to check
* @param securityContext current user security context
*
* @return true if the repository is writable
* @since 1.14
*/
public static boolean isWritable(ScmConfiguration configuration,
Repository repository,
WebSecurityContext securityContext)
{
boolean permitted = false;
if (configuration.isEnableRepositoryArchive() && repository.isArchived())
{
if (logger.isWarnEnabled())
{
logger.warn("{} is archived and is not writeable",
repository.getName());
}
}
else
{
permitted = PermissionUtil.hasPermission(repository, securityContext,
PermissionType.WRITE);
}
return permitted;
}
/** /**
* Method description * Method description
* *

View File

@@ -41,6 +41,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.SCMContext; import sonia.scm.SCMContext;
import sonia.scm.config.ScmConfiguration;
import sonia.scm.repository.PermissionType; import sonia.scm.repository.PermissionType;
import sonia.scm.repository.PermissionUtil; import sonia.scm.repository.PermissionUtil;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
@@ -76,10 +77,14 @@ public abstract class PermissionFilter extends HttpFilter
* Constructs ... * Constructs ...
* *
* *
*
* @param configuration
* @param securityContextProvider * @param securityContextProvider
*/ */
public PermissionFilter(Provider<WebSecurityContext> securityContextProvider) public PermissionFilter(ScmConfiguration configuration,
Provider<WebSecurityContext> securityContextProvider)
{ {
this.configuration = configuration;
this.securityContextProvider = securityContextProvider; this.securityContextProvider = securityContextProvider;
} }
@@ -139,10 +144,7 @@ public abstract class PermissionFilter extends HttpFilter
{ {
boolean writeRequest = isWriteRequest(request); boolean writeRequest = isWriteRequest(request);
if (PermissionUtil.hasPermission(repository, securityContext, if (hasPermission(repository, securityContext, writeRequest))
writeRequest
? PermissionType.WRITE
: PermissionType.READ))
{ {
chain.doFilter(request, response); chain.doFilter(request, response);
} }
@@ -213,8 +215,43 @@ public abstract class PermissionFilter extends HttpFilter
} }
} }
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repository
* @param securityContext
* @param writeRequest
*
* @return
*/
private boolean hasPermission(Repository repository,
WebSecurityContext securityContext,
boolean writeRequest)
{
boolean permitted = false;
if (writeRequest)
{
permitted = PermissionUtil.isWritable(configuration, repository,
securityContext);
}
else
{
permitted = PermissionUtil.hasPermission(repository, securityContext,
PermissionType.READ);
}
return permitted;
}
//~--- fields --------------------------------------------------------------- //~--- fields ---------------------------------------------------------------
/** Field description */ /** Field description */
protected Provider<WebSecurityContext> securityContextProvider; protected Provider<WebSecurityContext> securityContextProvider;
/** Field description */
private ScmConfiguration configuration;
} }

View File

@@ -44,6 +44,7 @@ import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import sonia.scm.config.ScmConfiguration;
/** /**
* *
@@ -61,10 +62,11 @@ public abstract class ProviderPermissionFilter extends PermissionFilter
* @param repositoryProvider * @param repositoryProvider
*/ */
public ProviderPermissionFilter( public ProviderPermissionFilter(
ScmConfiguration configuration,
Provider<WebSecurityContext> securityContextProvider, Provider<WebSecurityContext> securityContextProvider,
RepositoryProvider repositoryProvider) RepositoryProvider repositoryProvider)
{ {
super(securityContextProvider); super(configuration, securityContextProvider);
this.repositoryProvider = repositoryProvider; this.repositoryProvider = repositoryProvider;
} }

View File

@@ -37,6 +37,7 @@ package sonia.scm.web.filter;
import com.google.inject.Provider; import com.google.inject.Provider;
import sonia.scm.config.ScmConfiguration;
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.WebSecurityContext; import sonia.scm.web.security.WebSecurityContext;
@@ -65,14 +66,17 @@ public abstract class RegexPermissionFilter extends PermissionFilter
* Constructs ... * Constructs ...
* *
* *
*
* @param configuration
* @param securityContextProvider * @param securityContextProvider
* @param repositoryManager * @param repositoryManager
*/ */
public RegexPermissionFilter( public RegexPermissionFilter(
ScmConfiguration configuration,
Provider<WebSecurityContext> securityContextProvider, Provider<WebSecurityContext> securityContextProvider,
RepositoryManager repositoryManager) RepositoryManager repositoryManager)
{ {
super(securityContextProvider); super(configuration, securityContextProvider);
this.repositoryManager = repositoryManager; this.repositoryManager = repositoryManager;
} }

View File

@@ -35,8 +35,10 @@ package sonia.scm.repository;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import sonia.scm.config.ScmConfiguration;
import sonia.scm.security.ScmSecurityException; import sonia.scm.security.ScmSecurityException;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.web.security.WebSecurityContext; import sonia.scm.web.security.WebSecurityContext;
@@ -65,17 +67,7 @@ public class PermissionUtilTest
*/ */
public PermissionUtilTest() public PermissionUtilTest()
{ {
repository = new Repository();
admams.getUser().setAdmin(true); admams.getUser().setAdmin(true);
Permission[] permissions = new Permission[] {
new Permission("dent", PermissionType.READ),
new Permission("perfect",
PermissionType.WRITE),
new Permission("marvin",
PermissionType.OWNER) };
repository.setPermissions(Arrays.asList(permissions));
} }
//~--- methods -------------------------------------------------------------- //~--- methods --------------------------------------------------------------
@@ -108,6 +100,25 @@ public class PermissionUtilTest
PermissionUtil.assertPermission(repository, admams, PermissionType.OWNER); PermissionUtil.assertPermission(repository, admams, PermissionType.OWNER);
} }
/**
* Method description
*
*/
@Before
public void before()
{
repository = new Repository();
Permission[] permissions = new Permission[] {
new Permission("dent", PermissionType.READ),
new Permission("perfect",
PermissionType.WRITE),
new Permission("marvin",
PermissionType.OWNER) };
repository.setPermissions(Arrays.asList(permissions));
}
/** /**
* Method description * Method description
* *
@@ -161,6 +172,31 @@ public class PermissionUtilTest
PermissionType.OWNER)); PermissionType.OWNER));
} }
/**
* Method description
*
*/
@Test
public void testIsWritable()
{
ScmConfiguration configuration = new ScmConfiguration();
configuration.setEnableRepositoryArchive(true);
assertTrue(PermissionUtil.isWritable(configuration, repository, perfect));
repository.setArchived(true);
assertFalse(PermissionUtil.isWritable(configuration, repository, perfect));
assertFalse(PermissionUtil.isWritable(configuration, repository, admams));
configuration.setEnableRepositoryArchive(false);
assertTrue(PermissionUtil.isWritable(configuration, repository, perfect));
assertTrue(PermissionUtil.isWritable(configuration, repository, admams));
assertFalse(PermissionUtil.isWritable(configuration, repository, dent));
configuration.setEnableRepositoryArchive(true);
repository.setArchived(false);
assertTrue(PermissionUtil.isWritable(configuration, repository, perfect));
assertTrue(PermissionUtil.isWritable(configuration, repository, admams));
assertFalse(PermissionUtil.isWritable(configuration, repository, dent));
}
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------
/** /**

View File

@@ -46,6 +46,7 @@ import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import sonia.scm.config.ScmConfiguration;
/** /**
* *
@@ -79,10 +80,11 @@ public class GitPermissionFilter extends ProviderPermissionFilter
*/ */
@Inject @Inject
public GitPermissionFilter( public GitPermissionFilter(
ScmConfiguration configuration,
Provider<WebSecurityContext> securityContextProvider, Provider<WebSecurityContext> securityContextProvider,
RepositoryProvider repositoryProvider) RepositoryProvider repositoryProvider)
{ {
super(securityContextProvider, repositoryProvider); super(configuration, securityContextProvider, repositoryProvider);
} }
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------

View File

@@ -46,6 +46,7 @@ import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import sonia.scm.config.ScmConfiguration;
/** /**
* *
@@ -64,10 +65,11 @@ public class HgPermissionFilter extends ProviderPermissionFilter
*/ */
@Inject @Inject
public HgPermissionFilter( public HgPermissionFilter(
ScmConfiguration configuration,
Provider<WebSecurityContext> securityContextProvider, Provider<WebSecurityContext> securityContextProvider,
RepositoryProvider repositoryProvider) RepositoryProvider repositoryProvider)
{ {
super(securityContextProvider, repositoryProvider); super(configuration, securityContextProvider, repositoryProvider);
} }
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------

View File

@@ -39,6 +39,7 @@ import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import sonia.scm.config.ScmConfiguration;
import sonia.scm.repository.RepositoryProvider; import sonia.scm.repository.RepositoryProvider;
import sonia.scm.web.filter.ProviderPermissionFilter; import sonia.scm.web.filter.ProviderPermissionFilter;
import sonia.scm.web.security.WebSecurityContext; import sonia.scm.web.security.WebSecurityContext;
@@ -72,15 +73,18 @@ public class SvnPermissionFilter extends ProviderPermissionFilter
* *
* *
* *
*
* @param configuration
* @param securityContextProvider * @param securityContextProvider
* @param repository * @param repository
*/ */
@Inject @Inject
public SvnPermissionFilter( public SvnPermissionFilter(
ScmConfiguration configuration,
Provider<WebSecurityContext> securityContextProvider, Provider<WebSecurityContext> securityContextProvider,
RepositoryProvider repository) RepositoryProvider repository)
{ {
super(securityContextProvider, repository); super(configuration, securityContextProvider, repository);
} }
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------