merge with brach issue-42

This commit is contained in:
Sebastian Sdorra
2012-04-04 19:24:05 +02:00
18 changed files with 564 additions and 68 deletions

View File

@@ -33,6 +33,10 @@
package sonia.scm;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.config.ScmConfiguration;
/**
* Configuration object for a SCM-Manager
* client (WebInterface, RestClient, ...).
@@ -48,6 +52,20 @@ public class ScmClientConfig
*/
public ScmClientConfig() {}
/**
* Constructs {@link ScmClientConfig} object
*
*
* @param configuration SCM-Manager main configuration
* @since 1.14
*/
public ScmClientConfig(ScmConfiguration configuration)
{
this.dateFormat = configuration.getDateFormat();
this.disableGroupingGrid = configuration.isDisableGroupingGrid();
this.enableRepositoryArchive = configuration.isEnableRepositoryArchive();
}
/**
* Constructs {@link ScmClientConfig} object
*
@@ -100,6 +118,18 @@ public class ScmClientConfig
return disableGroupingGrid;
}
/**
* Returns true if the repository archive is disabled.
*
*
* @return true if the repository archive is disabled
* @since 1.14
*/
public boolean isEnableRepositoryArchive()
{
return enableRepositoryArchive;
}
//~--- set methods ----------------------------------------------------------
/**
@@ -127,11 +157,26 @@ public class ScmClientConfig
this.disableGroupingGrid = disableGroupingGrid;
}
/**
* Enable or disable the repository archive. Default is disabled.
*
*
* @param enableRepositoryArchive true to disable the repository archive
* @since 1.14
*/
public void setEnableRepositoryArchive(boolean enableRepositoryArchive)
{
this.enableRepositoryArchive = enableRepositoryArchive;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private String dateFormat;
/** Field description */
private boolean enableRepositoryArchive = true;
/** Field description */
private boolean disableGroupingGrid = true;
}

View File

@@ -165,6 +165,7 @@ public class ScmConfiguration
this.forceBaseUrl = other.forceBaseUrl;
this.baseUrl = other.baseUrl;
this.disableGroupingGrid = other.disableGroupingGrid;
this.enableRepositoryArchive = other.enableRepositoryArchive;
// deprecated fields
this.sslPort = other.sslPort;
@@ -381,6 +382,18 @@ public class ScmConfiguration
return enableProxy;
}
/**
* Returns true if the repository archive is enabled.
*
*
* @return true if the repository archive is enabled
* @since 1.14
*/
public boolean isEnableRepositoryArchive()
{
return enableRepositoryArchive;
}
/**
* Returns true if ssl is enabled.
*
@@ -499,6 +512,18 @@ public class ScmConfiguration
this.enableProxy = enableProxy;
}
/**
* Enable or disable the repository archive. Default is disabled.
*
*
* @param enableRepositoryArchive true to disable the repository archive
* @since 1.14
*/
public void setEnableRepositoryArchive(boolean enableRepositoryArchive)
{
this.enableRepositoryArchive = enableRepositoryArchive;
}
/**
* Method description
*
@@ -682,6 +707,9 @@ public class ScmConfiguration
private Set<ConfigChangedListener> listeners =
new HashSet<ConfigChangedListener>();
/** Field description */
private boolean enableRepositoryArchive = false;
/** Field description */
private boolean disableGroupingGrid = false;

View File

@@ -37,6 +37,10 @@ package sonia.scm.repository;
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.user.User;
import sonia.scm.util.AssertUtil;
@@ -54,6 +58,14 @@ import java.util.List;
public class PermissionUtil
{
/**
* the logger for PermissionUtil
*/
private static final Logger logger =
LoggerFactory.getLogger(PermissionUtil.class);
//~--- methods --------------------------------------------------------------
/**
* Method description
*
@@ -151,6 +163,40 @@ public class PermissionUtil
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
*

View File

@@ -345,6 +345,18 @@ public class Repository extends BasicPropertiesAware implements ModelObject
return url;
}
/**
* Returns true if the repository is archived.
*
*
* @return true if the repository is archived
* @since 1.14
*/
public boolean isArchived()
{
return archived;
}
/**
* Returns true if the {@link Repository} is public readable.
*
@@ -377,6 +389,18 @@ public class Repository extends BasicPropertiesAware implements ModelObject
//~--- set methods ----------------------------------------------------------
/**
* Archive or un archive this repository.
*
*
* @param archived true to enable archive
* @since 1.14
*/
public void setArchived(boolean archived)
{
this.archived = archived;
}
/**
* Sets the contact of the {@link Repository}. The contact address should be
* a email address of a person who is responsible for the {@link Repository}.
@@ -516,6 +540,9 @@ public class Repository extends BasicPropertiesAware implements ModelObject
@XmlElement(name = "public")
private boolean publicReadable = false;
/** Field description */
private boolean archived = false;
/** Field description */
private String type;

View File

@@ -41,6 +41,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.SCMContext;
import sonia.scm.config.ScmConfiguration;
import sonia.scm.repository.PermissionType;
import sonia.scm.repository.PermissionUtil;
import sonia.scm.repository.Repository;
@@ -76,10 +77,14 @@ public abstract class PermissionFilter extends HttpFilter
* Constructs ...
*
*
*
* @param configuration
* @param securityContextProvider
*/
public PermissionFilter(Provider<WebSecurityContext> securityContextProvider)
public PermissionFilter(ScmConfiguration configuration,
Provider<WebSecurityContext> securityContextProvider)
{
this.configuration = configuration;
this.securityContextProvider = securityContextProvider;
}
@@ -139,10 +144,7 @@ public abstract class PermissionFilter extends HttpFilter
{
boolean writeRequest = isWriteRequest(request);
if (PermissionUtil.hasPermission(repository, securityContext,
writeRequest
? PermissionType.WRITE
: PermissionType.READ))
if (hasPermission(repository, securityContext, writeRequest))
{
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 ---------------------------------------------------------------
/** Field description */
protected Provider<WebSecurityContext> securityContextProvider;
/** Field description */
private ScmConfiguration configuration;
}

View File

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

View File

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