git support for directory structures

This commit is contained in:
Sebastian Sdorra
2011-10-23 16:49:44 +02:00
parent 09dc9af0cb
commit 76c5c4ce40
3 changed files with 32 additions and 106 deletions

View File

@@ -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
*

View File

@@ -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();

View File

@@ -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;
}