Merge branch 'stable-3.4' into stable-3.5

* stable-3.4:
  Fix update HEAD action detection from BearerAuthenticationFilter

Change-Id: I138734fae309b1f1a0af66bb165abacc1905ce2b
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/BearerAuthenticationFilter.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/BearerAuthenticationFilter.java
index be71946..68dac6a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/BearerAuthenticationFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/BearerAuthenticationFilter.java
@@ -85,7 +85,7 @@
 
     if (isBasicAuthenticationRequest(requestURI)) {
       filterChain.doFilter(servletRequest, servletResponse);
-    } else if (isPullReplicationApiRequest(requestURI)
+    } else if (isPullReplicationApiRequest(httpRequest.getMethod(), requestURI)
         || (isGitUploadPackRequest(httpRequest)
             && isAuthenticationHeaderWithBearerToken(authorizationHeader))) {
       if (isBearerTokenAuthenticated(authorizationHeader, bearerToken))
@@ -121,14 +121,15 @@
     return requestURI.startsWith("/a/");
   }
 
-  private boolean isPullReplicationApiRequest(String requestURI) {
+  private boolean isPullReplicationApiRequest(String requestMethod, String requestURI) {
     return (requestURI.contains(pluginName)
             && (requestURI.endsWith(String.format("/%s~apply-object", pluginName))
                 || requestURI.endsWith(String.format("/%s~apply-objects", pluginName))
                 || requestURI.endsWith(String.format("/%s~fetch", pluginName))
                 || requestURI.endsWith(String.format("/%s~delete-project", pluginName))
                 || requestURI.contains(String.format("/%s/init-project/", pluginName))))
-        || requestURI.matches(".*/projects/[^/]+/HEAD");
+        || (requestURI.matches(String.format(".*/projects/[^/]+/%s~HEAD", pluginName))
+            && "PUT".equals(requestMethod));
   }
 
   private Optional<String> extractBearerToken(String authorizationHeader) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/BearerAuthenticationFilterTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/BearerAuthenticationFilterTest.java
index ca69f06..72aee76 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/BearerAuthenticationFilterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/BearerAuthenticationFilterTest.java
@@ -52,6 +52,12 @@
   @Mock private FilterChain filterChain;
   private final String pluginName = "pull-replication";
 
+  private void authenticateAndFilter(String method, String uri, Optional<String> queryStringMaybe)
+      throws ServletException, IOException {
+    when(httpServletRequest.getMethod()).thenReturn(method);
+    authenticateAndFilter(uri, queryStringMaybe);
+  }
+
   private void authenticateAndFilter(String uri, Optional<String> queryStringMaybe)
       throws ServletException, IOException {
     final String bearerToken = "some-bearer-token";
@@ -97,7 +103,8 @@
 
   @Test
   public void shouldAuthenticateWhenUpdateHead() throws ServletException, IOException {
-    authenticateAndFilter("any-prefix/projects/my-project/HEAD", NO_QUERY_PARAMETERS);
+    authenticateAndFilter(
+        "PUT", "any-prefix/projects/my-project/pull-replication~HEAD", NO_QUERY_PARAMETERS);
   }
 
   @Test