mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-03 03:55:51 +01:00
git support for directory structures
This commit is contained in:
@@ -39,9 +39,8 @@ import com.google.inject.Inject;
|
||||
import com.google.inject.Provider;
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
import sonia.scm.repository.GitRepositoryHandler;
|
||||
import sonia.scm.repository.RepositoryManager;
|
||||
import sonia.scm.web.filter.RegexPermissionFilter;
|
||||
import sonia.scm.repository.Repository;
|
||||
import sonia.scm.web.filter.ProviderPermissionFilter;
|
||||
import sonia.scm.web.security.WebSecurityContext;
|
||||
|
||||
//~--- JDK imports ------------------------------------------------------------
|
||||
@@ -53,7 +52,7 @@ import javax.servlet.http.HttpServletRequest;
|
||||
* @author Sebastian Sdorra
|
||||
*/
|
||||
@Singleton
|
||||
public class GitPermissionFilter extends RegexPermissionFilter
|
||||
public class GitPermissionFilter extends ProviderPermissionFilter
|
||||
{
|
||||
|
||||
/** Field description */
|
||||
@@ -76,30 +75,18 @@ public class GitPermissionFilter extends RegexPermissionFilter
|
||||
*
|
||||
*
|
||||
* @param securityContextProvider
|
||||
* @param repositoryManager
|
||||
* @param repositoryProvider
|
||||
*/
|
||||
@Inject
|
||||
public GitPermissionFilter(
|
||||
Provider<WebSecurityContext> securityContextProvider,
|
||||
RepositoryManager repositoryManager)
|
||||
Provider<Repository> repositoryProvider)
|
||||
{
|
||||
super(securityContextProvider, repositoryManager);
|
||||
super(securityContextProvider, repositoryProvider);
|
||||
}
|
||||
|
||||
//~--- get methods ----------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Method description
|
||||
*
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected String getType()
|
||||
{
|
||||
return GitRepositoryHandler.TYPE_NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method description
|
||||
*
|
||||
|
||||
@@ -86,56 +86,6 @@ public class GitRepositoryResolver
|
||||
this.handler = handler;
|
||||
}
|
||||
|
||||
//~--- get methods ----------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Method description
|
||||
*
|
||||
*
|
||||
* @param name
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private static boolean isUnreasonableName(final String name)
|
||||
{
|
||||
if (name.length() == 0)
|
||||
{
|
||||
return true; // no empty paths
|
||||
}
|
||||
|
||||
if (name.indexOf('\\') >= 0)
|
||||
{
|
||||
return true; // no windows/dos style paths
|
||||
}
|
||||
|
||||
if (new File(name).isAbsolute())
|
||||
{
|
||||
return true; // no absolute paths
|
||||
}
|
||||
|
||||
if (name.startsWith("../"))
|
||||
{
|
||||
return true; // no "l../etc/passwd"
|
||||
}
|
||||
|
||||
if (name.contains("/../"))
|
||||
{
|
||||
return true; // no "foo/../etc/passwd"
|
||||
}
|
||||
|
||||
if (name.contains("/./"))
|
||||
{
|
||||
return true; // "foo/./foo" is insane to ask
|
||||
}
|
||||
|
||||
if (name.contains("//"))
|
||||
{
|
||||
return true; // double slashes is sloppy, don't use it
|
||||
}
|
||||
|
||||
return false; // is a reasonable name
|
||||
}
|
||||
|
||||
//~--- methods --------------------------------------------------------------
|
||||
|
||||
/**
|
||||
@@ -158,11 +108,6 @@ public class GitRepositoryResolver
|
||||
{
|
||||
Repository repository = null;
|
||||
|
||||
if (isUnreasonableName(repositoryName))
|
||||
{
|
||||
throw new RepositoryNotFoundException(repositoryName);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
GitConfig config = handler.getConfig();
|
||||
|
||||
@@ -36,21 +36,20 @@ package sonia.scm.web;
|
||||
//~--- non-JDK imports --------------------------------------------------------
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Provider;
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
import org.eclipse.jgit.http.server.GitServlet;
|
||||
import org.eclipse.jgit.lib.Repository;
|
||||
import org.eclipse.jgit.transport.resolver.RepositoryResolver;
|
||||
|
||||
import sonia.scm.repository.GitUtil;
|
||||
import sonia.scm.util.HttpUtil;
|
||||
|
||||
//~--- JDK imports ------------------------------------------------------------
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
@@ -70,10 +69,6 @@ public class ScmGitServlet extends GitServlet
|
||||
/** Field description */
|
||||
private static final long serialVersionUID = -7712897339207470674L;
|
||||
|
||||
/** Field description */
|
||||
private static final Pattern REGEX_REPOSITORYNAME =
|
||||
Pattern.compile("/git/([^/]+)/?.*");
|
||||
|
||||
//~--- constructors ---------------------------------------------------------
|
||||
|
||||
/**
|
||||
@@ -83,12 +78,16 @@ public class ScmGitServlet extends GitServlet
|
||||
*
|
||||
* @param repositoryResolver
|
||||
* @param receivePackFactory
|
||||
* @param repositoryProvider
|
||||
*/
|
||||
@Inject
|
||||
public ScmGitServlet(GitRepositoryResolver repositoryResolver,
|
||||
GitReceivePackFactory receivePackFactory)
|
||||
public ScmGitServlet(
|
||||
GitRepositoryResolver repositoryResolver,
|
||||
GitReceivePackFactory receivePackFactory,
|
||||
Provider<sonia.scm.repository.Repository> repositoryProvider)
|
||||
{
|
||||
this.resolver = repositoryResolver;
|
||||
this.repositoryProvider = repositoryProvider;
|
||||
setRepositoryResolver(repositoryResolver);
|
||||
setReceivePackFactory(receivePackFactory);
|
||||
}
|
||||
@@ -137,43 +136,38 @@ public class ScmGitServlet extends GitServlet
|
||||
HttpServletResponse response)
|
||||
throws ServletException, IOException
|
||||
{
|
||||
String uri = HttpUtil.getStrippedURI(request);
|
||||
Matcher m = REGEX_REPOSITORYNAME.matcher(uri);
|
||||
String name = null;
|
||||
Repository repository = null;
|
||||
sonia.scm.repository.Repository scmRepository = repositoryProvider.get();
|
||||
|
||||
try
|
||||
if (scmRepository != null)
|
||||
{
|
||||
if (m.matches())
|
||||
{
|
||||
name = m.group(1);
|
||||
repository = resolver.open(request, name);
|
||||
}
|
||||
Repository repository = null;
|
||||
|
||||
if (repository != null)
|
||||
try
|
||||
{
|
||||
new GitRepositoryViewer().handleRequest(response, repository, name);
|
||||
repository = resolver.open(request, scmRepository.getName());
|
||||
new GitRepositoryViewer().handleRequest(response, repository,
|
||||
scmRepository.getName());
|
||||
}
|
||||
else
|
||||
catch (Exception ex)
|
||||
{
|
||||
response.sendError(HttpServletResponse.SC_NOT_FOUND);
|
||||
throw new ServletException(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
GitUtil.close(repository);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
else
|
||||
{
|
||||
throw new ServletException(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (repository != null)
|
||||
{
|
||||
repository.close();
|
||||
}
|
||||
response.sendError(HttpServletResponse.SC_NOT_FOUND);
|
||||
}
|
||||
}
|
||||
|
||||
//~--- fields ---------------------------------------------------------------
|
||||
|
||||
/** Field description */
|
||||
private Provider<sonia.scm.repository.Repository> repositoryProvider;
|
||||
|
||||
/** Field description */
|
||||
private RepositoryResolver<HttpServletRequest> resolver;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user