From 76c5c4ce40be069845944cbfb37bd6ff64dc79cb Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 23 Oct 2011 16:49:44 +0200 Subject: [PATCH] git support for directory structures --- .../sonia/scm/web/GitPermissionFilter.java | 25 ++------ .../sonia/scm/web/GitRepositoryResolver.java | 55 ------------------ .../java/sonia/scm/web/ScmGitServlet.java | 58 +++++++++---------- 3 files changed, 32 insertions(+), 106 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java index 6c1181021e..d9c24a59bf 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java @@ -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 securityContextProvider, - RepositoryManager repositoryManager) + Provider repositoryProvider) { - super(securityContextProvider, repositoryManager); + super(securityContextProvider, repositoryProvider); } //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - */ - @Override - protected String getType() - { - return GitRepositoryHandler.TYPE_NAME; - } - /** * Method description * diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java index daec3add99..5ddd000490 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java @@ -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(); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java index a4d13cae93..5eb1c1b0c5 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java @@ -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 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 repositoryProvider; + /** Field description */ private RepositoryResolver resolver; }