mirror of
https://github.com/scm-manager/scm-manager.git
synced 2026-04-01 18:00:12 +02:00
merge with brach issue-42
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user