improve git client detection at GitPermissionFilter to include jgit

This commit is contained in:
Sebastian Sdorra
2017-06-01 16:08:07 +02:00
parent ee4a19365e
commit d9486ba8ba
6 changed files with 52 additions and 52 deletions

View File

@@ -70,6 +70,7 @@ import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import sonia.scm.web.GitUserAgentProvider;
/** /**
* *
@@ -77,6 +78,8 @@ import javax.servlet.http.HttpServletRequest;
*/ */
public final class GitUtil public final class GitUtil
{ {
private static final GitUserAgentProvider GIT_USER_AGENT_PROVIDER = new GitUserAgentProvider();
/** Field description */ /** Field description */
public static final String REF_HEAD = "HEAD"; public static final String REF_HEAD = "HEAD";
@@ -698,7 +701,7 @@ public final class GitUtil
*/ */
public static boolean isGitClient(HttpServletRequest request) public static boolean isGitClient(HttpServletRequest request)
{ {
return HttpUtil.userAgentStartsWith(request, USERAGENT_GIT); return GIT_USER_AGENT_PROVIDER.parseUserAgent(request.getHeader(HttpUtil.HEADER_USERAGENT)) != null;
} }
/** /**

View File

@@ -55,80 +55,49 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
/** /**
* * GitPermissionFilter decides if a git request requires write or read privileges.
*
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
@Singleton @Singleton
public class GitPermissionFilter extends ProviderPermissionFilter public class GitPermissionFilter extends ProviderPermissionFilter
{ {
/** Field description */ private static final String PARAMETER_SERVICE = "service";
public static final String PARAMETER_SERVICE = "service";
/** Field description */ private static final String PARAMETER_VALUE_RECEIVE = "git-receive-pack";
public static final String PARAMETER_VALUE_RECEIVE = "git-receive-pack";
/** Field description */ private static final String URI_RECEIVE_PACK = "git-receive-pack";
public static final String URI_RECEIVE_PACK = "git-receive-pack";
/** Field description */ private static final String URI_REF_INFO = "/info/refs";
public static final String URI_REF_INFO = "/info/refs";
public static final String METHOD_LFS_UPLOAD = "PUT"; private static final String METHOD_LFS_UPLOAD = "PUT";
//~--- constructors --------------------------------------------------------- //~--- constructors ---------------------------------------------------------
/** /**
* Constructs ... * Constructs a new instance of the GitPermissionFilter.
* *
* @param configuration * @param configuration scm main configuration
* @param repositoryProvider * @param repositoryProvider repository provider
*/ */
@Inject @Inject
public GitPermissionFilter(ScmConfiguration configuration, public GitPermissionFilter(ScmConfiguration configuration, RepositoryProvider repositoryProvider) {
RepositoryProvider repositoryProvider)
{
super(configuration, repositoryProvider); super(configuration, repositoryProvider);
} }
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param request
* @param response
*
* @throws IOException
*/
@Override @Override
protected void sendNotEnoughPrivilegesError(HttpServletRequest request, protected void sendNotEnoughPrivilegesError(HttpServletRequest request, HttpServletResponse response)
HttpServletResponse response) throws IOException {
throws IOException if (GitUtil.isGitClient(request)) {
{
if (GitUtil.isGitClient(request))
{
GitSmartHttpTools.sendError(request, response, GitSmartHttpTools.sendError(request, response,
HttpServletResponse.SC_FORBIDDEN, HttpServletResponse.SC_FORBIDDEN,
ClientMessages.get(request).notEnoughPrivileges()); ClientMessages.get(request).notEnoughPrivileges());
} } else {
else
{
super.sendNotEnoughPrivilegesError(request, response); super.sendNotEnoughPrivilegesError(request, response);
} }
} }
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param request
*
* @return
*/
@Override @Override
protected boolean isWriteRequest(HttpServletRequest request) { protected boolean isWriteRequest(HttpServletRequest request) {
return isReceivePackRequest(request) || return isReceivePackRequest(request) ||

View File

@@ -41,7 +41,7 @@ import java.util.Locale;
import sonia.scm.plugin.ext.Extension; import sonia.scm.plugin.ext.Extension;
/** /**
* UserAgent provider for git related clients. * UserAgent provider for git related clients.
* @author Sebastian Sdorra <sebastian.sdorra@gmail.com> * @author Sebastian Sdorra <sebastian.sdorra@gmail.com>
* @since 1.45 * @since 1.45
*/ */

View File

@@ -42,8 +42,10 @@ import static org.mockito.Mockito.*;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import sonia.scm.util.HttpUtil;
/** /**
* Unit tests for {@link GitUtil}. * Unit tests for {@link GitUtil}.
@@ -114,4 +116,22 @@ public class GitUtilTest
return repo; return repo;
} }
@Test
public void testIsGitClient() {
HttpServletRequest request = mockRequestWithUserAgent("Git/2.9.3");
assertTrue(GitUtil.isGitClient(request));
request = mockRequestWithUserAgent("JGit/2.9.3");
assertTrue(GitUtil.isGitClient(request));
request = mockRequestWithUserAgent("Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) ...");
assertFalse(GitUtil.isGitClient(request));
}
private HttpServletRequest mockRequestWithUserAgent(String userAgent) {
HttpServletRequest request = mock(HttpServletRequest.class);
when(request.getHeader(HttpUtil.HEADER_USERAGENT)).thenReturn(userAgent);
return request;
}
} }

View File

@@ -17,6 +17,7 @@ import static org.mockito.Mockito.*;
import org.mockito.runners.MockitoJUnitRunner; import org.mockito.runners.MockitoJUnitRunner;
import sonia.scm.config.ScmConfiguration; import sonia.scm.config.ScmConfiguration;
import sonia.scm.repository.RepositoryProvider; import sonia.scm.repository.RepositoryProvider;
import sonia.scm.util.HttpUtil;
/** /**
* Unit tests for {@link GitPermissionFilter}. * Unit tests for {@link GitPermissionFilter}.
@@ -84,8 +85,17 @@ public class GitPermissionFilterTest {
@Test @Test
public void testSendNotEnoughPrivilegesErrorAsGitClient() throws IOException { public void testSendNotEnoughPrivilegesErrorAsGitClient() throws IOException {
verifySendNotEnoughPrivilegesErrorAsGitClient("git/2.9.3");
}
@Test
public void testSendNotEnoughPrivilegesErrorAsJGitClient() throws IOException {
verifySendNotEnoughPrivilegesErrorAsGitClient("JGit/4.2");
}
private void verifySendNotEnoughPrivilegesErrorAsGitClient(String userAgent) throws IOException {
HttpServletRequest request = mockGitReceivePackServiceRequest(); HttpServletRequest request = mockGitReceivePackServiceRequest();
when(request.getHeader("User-Agent")).thenReturn("git/2.9.3"); when(request.getHeader(HttpUtil.HEADER_USERAGENT)).thenReturn(userAgent);
CapturingServletOutputStream stream = new CapturingServletOutputStream(); CapturingServletOutputStream stream = new CapturingServletOutputStream();
when(response.getOutputStream()).thenReturn(stream); when(response.getOutputStream()).thenReturn(stream);
@@ -93,7 +103,7 @@ public class GitPermissionFilterTest {
permissionFilter.sendNotEnoughPrivilegesError(request, response); permissionFilter.sendNotEnoughPrivilegesError(request, response);
verify(response).setStatus(HttpServletResponse.SC_OK); verify(response).setStatus(HttpServletResponse.SC_OK);
assertThat(stream.toString(), containsString("privileges")); assertThat(stream.toString(), containsString("privileges"));
} }
private HttpServletRequest mockGitReceivePackServiceRequest() { private HttpServletRequest mockGitReceivePackServiceRequest() {

View File

@@ -33,8 +33,6 @@ package sonia.scm.web;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Strings;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.*; import static org.junit.Assert.*;