From 4eb75bc621bf0769236256b1727ae6d5f85e19ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 6 Sep 2018 15:33:24 +0200 Subject: [PATCH] Initialize servlet and fix paths --- .../scm/repository/spi/HttpScmProtocol.java | 3 +- .../InitializingHttpScmProtocolWrapper.java | 44 ++++++++++++ .../repository/api/RepositoryServiceTest.java | 3 +- .../spi/GitRepositoryServiceProvider.java | 10 ++- .../spi/GitRepositoryServiceResolver.java | 8 +-- .../scm/web/GitBasicAuthenticationFilter.java | 69 ------------------- .../sonia/scm/web/GitPermissionFilter.java | 17 ++--- .../sonia/scm/web/GitRepositoryResolver.java | 3 +- .../web/GitScmProtocolProviderWrapper.java | 15 ++++ .../java/sonia/scm/web/GitServletModule.java | 2 +- .../java/sonia/scm/web/ScmGitServlet.java | 18 +---- .../web/lfs/servlet/LfsServletFactory.java | 2 +- .../main/java/sonia/scm/web/HgCGIServlet.java | 3 +- .../java/sonia/scm/web/SvnDAVServlet.java | 3 +- .../scm/web/protocol/HttpProtocolServlet.java | 2 +- 15 files changed, 87 insertions(+), 115 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java delete mode 100644 scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitBasicAuthenticationFilter.java create mode 100644 scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitScmProtocolProviderWrapper.java diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java b/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java index 2bf46c384d..c19205c1e7 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java @@ -2,6 +2,7 @@ package sonia.scm.repository.spi; import sonia.scm.repository.api.ScmProtocol; +import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -13,5 +14,5 @@ public interface HttpScmProtocol extends ScmProtocol { return "http"; } - void serve(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; + void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java b/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java new file mode 100644 index 0000000000..ad0e7cb513 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java @@ -0,0 +1,44 @@ +package sonia.scm.repository.spi; + +import sonia.scm.repository.Repository; + +import javax.inject.Provider; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.UriInfo; +import java.io.IOException; +import java.net.URI; + +public abstract class InitializingHttpScmProtocolWrapper implements HttpScmProtocol { + + private final Provider delegateProvider; + + private volatile boolean isInitialized = false; + + + protected InitializingHttpScmProtocolWrapper(Provider delegateProvider) { + this.delegateProvider = delegateProvider; + } + + @Override + public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException { + if (!isInitialized) { + synchronized (this) { + if (!isInitialized) { + delegateProvider.get().init(config); + isInitialized = true; + } + } + } + delegateProvider.get().service(request, response); + } + + + @Override + public String getUrl(Repository repository, UriInfo uriInfo) { + return uriInfo.getBaseUri().resolve(URI.create("../../repo/" + repository.getNamespace() + "/" + repository.getName())).toASCIIString(); + } +} diff --git a/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java b/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java index 7addb448f6..8d37c0e187 100644 --- a/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java @@ -5,6 +5,7 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.spi.HttpScmProtocol; import sonia.scm.repository.spi.RepositoryServiceProvider; +import javax.servlet.ServletConfig; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.UriInfo; @@ -60,7 +61,7 @@ public class RepositoryServiceTest { } @Override - public void serve(HttpServletRequest request, HttpServletResponse response) { + public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) { } } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java index 45a0ad5347..4874247785 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceProvider.java @@ -40,9 +40,7 @@ import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.Repository; import sonia.scm.repository.api.Command; import sonia.scm.repository.api.ScmProtocol; -import sonia.scm.web.ScmGitServlet; -import javax.inject.Provider; import java.io.IOException; import java.util.Collections; import java.util.Set; @@ -76,11 +74,11 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider //~--- constructors --------------------------------------------------------- public GitRepositoryServiceProvider(GitRepositoryHandler handler, - Repository repository, Provider servletProvider) + Repository repository, HttpScmProtocol httpScmProtocol) { this.handler = handler; this.repository = repository; - this.servletProvider = servletProvider; + this.httpScmProtocol = httpScmProtocol; this.context = new GitContext(handler.getDirectory(repository)); } @@ -246,7 +244,7 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider @Override public Set getSupportedProtocols() { - return Collections.singleton(servletProvider.get()); + return Collections.singleton(httpScmProtocol); } //~--- fields --------------------------------------------------------------- @@ -260,5 +258,5 @@ public class GitRepositoryServiceProvider extends RepositoryServiceProvider /** Field description */ private Repository repository; - private final Provider servletProvider; + private final HttpScmProtocol httpScmProtocol; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceResolver.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceResolver.java index 2cecb964fe..39ea4f761a 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceResolver.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceResolver.java @@ -38,9 +38,7 @@ import com.google.inject.Inject; import sonia.scm.plugin.Extension; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.Repository; -import sonia.scm.web.ScmGitServlet; - -import javax.inject.Provider; +import sonia.scm.web.GitScmProtocolProviderWrapper; /** * @@ -56,7 +54,7 @@ public class GitRepositoryServiceResolver implements RepositoryServiceResolver //~--- constructors --------------------------------------------------------- @Inject - public GitRepositoryServiceResolver(GitRepositoryHandler handler, Provider servletProvider) + public GitRepositoryServiceResolver(GitRepositoryHandler handler, GitScmProtocolProviderWrapper servletProvider) { this.handler = handler; this.servletProvider = servletProvider; @@ -89,5 +87,5 @@ public class GitRepositoryServiceResolver implements RepositoryServiceResolver /** Field description */ private final GitRepositoryHandler handler; - private final Provider servletProvider; + private final HttpScmProtocol servletProvider; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitBasicAuthenticationFilter.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitBasicAuthenticationFilter.java deleted file mode 100644 index f06fcfcd39..0000000000 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitBasicAuthenticationFilter.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. 2. Redistributions in - * binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. 3. Neither the name of SCM-Manager; - * nor the names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - - -package sonia.scm.web; - -//~--- non-JDK imports -------------------------------------------------------- - -import com.google.inject.Inject; - -import sonia.scm.Priority; -import sonia.scm.config.ScmConfiguration; -import sonia.scm.filter.Filters; -import sonia.scm.filter.WebElement; -import sonia.scm.web.filter.AuthenticationFilter; - -import java.util.Set; - - -/** - * Handles git specific basic authentication. - * - * @author Sebastian Sdorra - */ -@Priority(Filters.PRIORITY_AUTHENTICATION) -@WebElement(value = GitServletModule.PATTERN_GIT) -public class GitBasicAuthenticationFilter extends AuthenticationFilter -{ - - /** - * Constructs a new instance. - * - * @param configuration scm-manager main configuration - * @param webTokenGenerators web token generators - */ - @Inject - public GitBasicAuthenticationFilter(ScmConfiguration configuration, - Set webTokenGenerators) - { - super(configuration, webTokenGenerators); - } -} 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 1f07753f1e..068284188d 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 @@ -37,25 +37,20 @@ package sonia.scm.web; import com.google.common.annotations.VisibleForTesting; import com.google.inject.Inject; -import com.google.inject.Singleton; - import org.eclipse.jgit.http.server.GitSmartHttpTools; - import sonia.scm.ClientMessages; +import sonia.scm.Priority; import sonia.scm.config.ScmConfiguration; +import sonia.scm.filter.Filters; import sonia.scm.repository.GitUtil; import sonia.scm.repository.RepositoryProvider; import sonia.scm.web.filter.ProviderPermissionFilter; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import sonia.scm.Priority; -import sonia.scm.filter.Filters; -import sonia.scm.filter.WebElement; +import java.io.IOException; + +//~--- JDK imports ------------------------------------------------------------ /** * GitPermissionFilter decides if a git request requires write or read privileges. @@ -63,7 +58,7 @@ import sonia.scm.filter.WebElement; * @author Sebastian Sdorra */ @Priority(Filters.PRIORITY_AUTHORIZATION) -@WebElement(value = GitServletModule.PATTERN_GIT) +//@WebElement(value = GitServletModule.PATTERN_GIT) public class GitPermissionFilter extends ProviderPermissionFilter { 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 76e742a71a..7f04bb3a54 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 @@ -125,8 +125,9 @@ public class GitRepositoryResolver implements RepositoryResolver servletProvider) { + super(servletProvider); + } +} diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitServletModule.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitServletModule.java index 94e772123e..9b8d53caf2 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitServletModule.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitServletModule.java @@ -51,7 +51,7 @@ import sonia.scm.web.lfs.LfsBlobStoreFactory; public class GitServletModule extends ServletModule { - public static final String GIT_PATH = "/git"; + public static final String GIT_PATH = "/repo"; /** Field description */ public static final String PATTERN_GIT = GIT_PATH + "/*"; 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 5efffec523..261e67c185 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 @@ -44,7 +44,6 @@ import org.slf4j.Logger; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider; import sonia.scm.repository.RepositoryRequestListenerUtil; -import sonia.scm.repository.spi.HttpScmProtocol; import sonia.scm.util.HttpUtil; import sonia.scm.web.lfs.servlet.LfsServletFactory; @@ -52,9 +51,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.UriInfo; import java.io.IOException; -import java.net.URI; import java.util.regex.Pattern; import static org.eclipse.jgit.lfs.lib.Constants.CONTENT_TYPE_GIT_LFS_JSON; @@ -67,12 +64,12 @@ import static org.slf4j.LoggerFactory.getLogger; * @author Sebastian Sdorra */ @Singleton -public class ScmGitServlet extends GitServlet implements HttpScmProtocol +public class ScmGitServlet extends GitServlet { /** Field description */ public static final Pattern REGEX_GITHTTPBACKEND = Pattern.compile( - "(?x)^/git/(.*/(HEAD|info/refs|objects/(info/[^/]+|[0-9a-f]{2}/[0-9a-f]{38}|pack/pack-[0-9a-f]{40}\\.(pack|idx))|git-(upload|receive)-pack))$" + "(?x)^/repo/(.*/(HEAD|info/refs|objects/(info/[^/]+|[0-9a-f]{2}/[0-9a-f]{38}|pack/pack-[0-9a-f]{40}\\.(pack|idx))|git-(upload|receive)-pack))$" ); /** Field description */ @@ -287,17 +284,6 @@ public class ScmGitServlet extends GitServlet implements HttpScmProtocol return false; } - @Override - public void serve(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - service(request, response); - } - - @Override - public String getUrl(Repository repository, UriInfo uriInfo) { - return uriInfo.getBaseUri().resolve(URI.create("../../git/" + repository.getNamespace() + "/" + repository.getName())).toASCIIString(); - } - - //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/lfs/servlet/LfsServletFactory.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/lfs/servlet/LfsServletFactory.java index 58bdb2fcf1..f4eed34678 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/lfs/servlet/LfsServletFactory.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/lfs/servlet/LfsServletFactory.java @@ -70,7 +70,7 @@ public class LfsServletFactory { */ @VisibleForTesting static String buildBaseUri(Repository repository, HttpServletRequest request) { - return String.format("%s/git/%s/%s.git/info/lfs/objects/", HttpUtil.getCompleteUrl(request), repository.getNamespace(), repository.getName()); + return String.format("%s/repo/%s/%s.git/info/lfs/objects/", HttpUtil.getCompleteUrl(request), repository.getNamespace(), repository.getName()); } } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java index a8fbf0431e..ae0f259f97 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java @@ -59,6 +59,7 @@ import sonia.scm.web.cgi.CGIExecutor; import sonia.scm.web.cgi.CGIExecutorFactory; import sonia.scm.web.cgi.EnvList; +import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -363,7 +364,7 @@ public class HgCGIServlet extends HttpServlet implements HttpScmProtocol } @Override - public void serve(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException { service(request, response); } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java index c968763955..44c544bd68 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java @@ -49,6 +49,7 @@ import sonia.scm.repository.spi.HttpScmProtocol; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; +import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; @@ -287,7 +288,7 @@ public class SvnDAVServlet extends DAVServlet implements HttpScmProtocol } @Override - public void serve(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException { service(request, response); } diff --git a/scm-webapp/src/main/java/sonia/scm/web/protocol/HttpProtocolServlet.java b/scm-webapp/src/main/java/sonia/scm/web/protocol/HttpProtocolServlet.java index 7991cbb596..15536db19a 100644 --- a/scm-webapp/src/main/java/sonia/scm/web/protocol/HttpProtocolServlet.java +++ b/scm-webapp/src/main/java/sonia/scm/web/protocol/HttpProtocolServlet.java @@ -66,7 +66,7 @@ public class HttpProtocolServlet extends HttpServlet { try (RepositoryService repositoryService = serviceFactory.create(namespaceAndName)) { requestProvider.get().setAttribute(DefaultRepositoryProvider.ATTRIBUTE_NAME, repositoryService.getRepository()); HttpScmProtocol protocol = repositoryService.getProtocol(HttpScmProtocol.class); - protocol.serve(req, resp); + protocol.serve(req, resp, getServletConfig()); } catch (RepositoryNotFoundException e) { resp.setStatus(404); }