Add UploadPackInitializer extension point
I suggested to Luca at the hackathon that he could use this mechanism to limit refs advertised to Jenkins, instead of writing a custom PermissionBackend. Getting this in 2.15 means people using his plugin won't have to wait for the next release to stop using the PermissionBackend hack. Change-Id: I8c38eef94d6e505b926b3da6c470e34f6613ca2c
This commit is contained in:
		@@ -500,6 +500,19 @@ notified when JGit successfully receives a pack. This may be useful
 | 
				
			|||||||
for those plugins which would like to monitor changes in Git
 | 
					for those plugins which would like to monitor changes in Git
 | 
				
			||||||
repositories.
 | 
					repositories.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[upload-pack]]
 | 
				
			||||||
 | 
					== Upload Pack Initializers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Plugins may provide UploadPackInitializer instances, which will be
 | 
				
			||||||
 | 
					invoked by Gerrit just before a UploadPack instance will be used.
 | 
				
			||||||
 | 
					Usually, plugins will make use of the setXXX methods on the UploadPack
 | 
				
			||||||
 | 
					to set additional properties on it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The interactions with the core Gerrit UploadPack initialization and
 | 
				
			||||||
 | 
					between UploadPackInitializers can be complex. Please read the
 | 
				
			||||||
 | 
					UploadPack Javadoc and Gerrit Upload/UploadFactory implementations
 | 
				
			||||||
 | 
					carefully.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[pre-upload-hook]]
 | 
					[[pre-upload-hook]]
 | 
				
			||||||
== Pre Upload-Pack Hooks
 | 
					== Pre Upload-Pack Hooks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,6 +32,7 @@ import com.google.gerrit.server.config.GerritRequestModule;
 | 
				
			|||||||
import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
 | 
					import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
 | 
				
			||||||
import com.google.gerrit.server.git.ReceivePackInitializer;
 | 
					import com.google.gerrit.server.git.ReceivePackInitializer;
 | 
				
			||||||
import com.google.gerrit.server.git.TransferConfig;
 | 
					import com.google.gerrit.server.git.TransferConfig;
 | 
				
			||||||
 | 
					import com.google.gerrit.server.git.UploadPackInitializer;
 | 
				
			||||||
import com.google.gerrit.server.git.VisibleRefFilter;
 | 
					import com.google.gerrit.server.git.VisibleRefFilter;
 | 
				
			||||||
import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
 | 
					import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
 | 
				
			||||||
import com.google.gerrit.server.git.validators.UploadValidators;
 | 
					import com.google.gerrit.server.git.validators.UploadValidators;
 | 
				
			||||||
@@ -211,6 +212,7 @@ class InProcessProtocol extends TestProtocol<Context> {
 | 
				
			|||||||
    private final Provider<CurrentUser> userProvider;
 | 
					    private final Provider<CurrentUser> userProvider;
 | 
				
			||||||
    private final VisibleRefFilter.Factory refFilterFactory;
 | 
					    private final VisibleRefFilter.Factory refFilterFactory;
 | 
				
			||||||
    private final TransferConfig transferConfig;
 | 
					    private final TransferConfig transferConfig;
 | 
				
			||||||
 | 
					    private final DynamicSet<UploadPackInitializer> uploadPackInitializers;
 | 
				
			||||||
    private final DynamicSet<PreUploadHook> preUploadHooks;
 | 
					    private final DynamicSet<PreUploadHook> preUploadHooks;
 | 
				
			||||||
    private final UploadValidators.Factory uploadValidatorsFactory;
 | 
					    private final UploadValidators.Factory uploadValidatorsFactory;
 | 
				
			||||||
    private final ThreadLocalRequestContext threadContext;
 | 
					    private final ThreadLocalRequestContext threadContext;
 | 
				
			||||||
@@ -222,6 +224,7 @@ class InProcessProtocol extends TestProtocol<Context> {
 | 
				
			|||||||
        Provider<CurrentUser> userProvider,
 | 
					        Provider<CurrentUser> userProvider,
 | 
				
			||||||
        VisibleRefFilter.Factory refFilterFactory,
 | 
					        VisibleRefFilter.Factory refFilterFactory,
 | 
				
			||||||
        TransferConfig transferConfig,
 | 
					        TransferConfig transferConfig,
 | 
				
			||||||
 | 
					        DynamicSet<UploadPackInitializer> uploadPackInitializers,
 | 
				
			||||||
        DynamicSet<PreUploadHook> preUploadHooks,
 | 
					        DynamicSet<PreUploadHook> preUploadHooks,
 | 
				
			||||||
        UploadValidators.Factory uploadValidatorsFactory,
 | 
					        UploadValidators.Factory uploadValidatorsFactory,
 | 
				
			||||||
        ThreadLocalRequestContext threadContext,
 | 
					        ThreadLocalRequestContext threadContext,
 | 
				
			||||||
@@ -230,6 +233,7 @@ class InProcessProtocol extends TestProtocol<Context> {
 | 
				
			|||||||
      this.userProvider = userProvider;
 | 
					      this.userProvider = userProvider;
 | 
				
			||||||
      this.refFilterFactory = refFilterFactory;
 | 
					      this.refFilterFactory = refFilterFactory;
 | 
				
			||||||
      this.transferConfig = transferConfig;
 | 
					      this.transferConfig = transferConfig;
 | 
				
			||||||
 | 
					      this.uploadPackInitializers = uploadPackInitializers;
 | 
				
			||||||
      this.preUploadHooks = preUploadHooks;
 | 
					      this.preUploadHooks = preUploadHooks;
 | 
				
			||||||
      this.uploadValidatorsFactory = uploadValidatorsFactory;
 | 
					      this.uploadValidatorsFactory = uploadValidatorsFactory;
 | 
				
			||||||
      this.threadContext = threadContext;
 | 
					      this.threadContext = threadContext;
 | 
				
			||||||
@@ -273,6 +277,9 @@ class InProcessProtocol extends TestProtocol<Context> {
 | 
				
			|||||||
      List<PreUploadHook> hooks = Lists.newArrayList(preUploadHooks);
 | 
					      List<PreUploadHook> hooks = Lists.newArrayList(preUploadHooks);
 | 
				
			||||||
      hooks.add(uploadValidatorsFactory.create(projectState.getProject(), repo, "localhost-test"));
 | 
					      hooks.add(uploadValidatorsFactory.create(projectState.getProject(), repo, "localhost-test"));
 | 
				
			||||||
      up.setPreUploadHook(PreUploadHookChain.newChain(hooks));
 | 
					      up.setPreUploadHook(PreUploadHookChain.newChain(hooks));
 | 
				
			||||||
 | 
					      for (UploadPackInitializer initializer : uploadPackInitializers) {
 | 
				
			||||||
 | 
					        initializer.init(req.project, up);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      return up;
 | 
					      return up;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,6 +27,7 @@ import com.google.gerrit.server.CurrentUser;
 | 
				
			|||||||
import com.google.gerrit.server.cache.CacheModule;
 | 
					import com.google.gerrit.server.cache.CacheModule;
 | 
				
			||||||
import com.google.gerrit.server.git.GitRepositoryManager;
 | 
					import com.google.gerrit.server.git.GitRepositoryManager;
 | 
				
			||||||
import com.google.gerrit.server.git.TransferConfig;
 | 
					import com.google.gerrit.server.git.TransferConfig;
 | 
				
			||||||
 | 
					import com.google.gerrit.server.git.UploadPackInitializer;
 | 
				
			||||||
import com.google.gerrit.server.git.VisibleRefFilter;
 | 
					import com.google.gerrit.server.git.VisibleRefFilter;
 | 
				
			||||||
import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
 | 
					import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
 | 
				
			||||||
import com.google.gerrit.server.git.validators.UploadValidators;
 | 
					import com.google.gerrit.server.git.validators.UploadValidators;
 | 
				
			||||||
@@ -209,15 +210,18 @@ public class GitOverHttpServlet extends GitServlet {
 | 
				
			|||||||
    private final TransferConfig config;
 | 
					    private final TransferConfig config;
 | 
				
			||||||
    private final DynamicSet<PreUploadHook> preUploadHooks;
 | 
					    private final DynamicSet<PreUploadHook> preUploadHooks;
 | 
				
			||||||
    private final DynamicSet<PostUploadHook> postUploadHooks;
 | 
					    private final DynamicSet<PostUploadHook> postUploadHooks;
 | 
				
			||||||
 | 
					    private final DynamicSet<UploadPackInitializer> uploadPackInitializers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Inject
 | 
					    @Inject
 | 
				
			||||||
    UploadFactory(
 | 
					    UploadFactory(
 | 
				
			||||||
        TransferConfig tc,
 | 
					        TransferConfig tc,
 | 
				
			||||||
        DynamicSet<PreUploadHook> preUploadHooks,
 | 
					        DynamicSet<PreUploadHook> preUploadHooks,
 | 
				
			||||||
        DynamicSet<PostUploadHook> postUploadHooks) {
 | 
					        DynamicSet<PostUploadHook> postUploadHooks,
 | 
				
			||||||
 | 
					        DynamicSet<UploadPackInitializer> uploadPackInitializers) {
 | 
				
			||||||
      this.config = tc;
 | 
					      this.config = tc;
 | 
				
			||||||
      this.preUploadHooks = preUploadHooks;
 | 
					      this.preUploadHooks = preUploadHooks;
 | 
				
			||||||
      this.postUploadHooks = postUploadHooks;
 | 
					      this.postUploadHooks = postUploadHooks;
 | 
				
			||||||
 | 
					      this.uploadPackInitializers = uploadPackInitializers;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
@@ -227,6 +231,10 @@ public class GitOverHttpServlet extends GitServlet {
 | 
				
			|||||||
      up.setTimeout(config.getTimeout());
 | 
					      up.setTimeout(config.getTimeout());
 | 
				
			||||||
      up.setPreUploadHook(PreUploadHookChain.newChain(Lists.newArrayList(preUploadHooks)));
 | 
					      up.setPreUploadHook(PreUploadHookChain.newChain(Lists.newArrayList(preUploadHooks)));
 | 
				
			||||||
      up.setPostUploadHook(PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks)));
 | 
					      up.setPostUploadHook(PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks)));
 | 
				
			||||||
 | 
					      ProjectControl pc = (ProjectControl) req.getAttribute(ATT_CONTROL);
 | 
				
			||||||
 | 
					      for (UploadPackInitializer initializer : uploadPackInitializers) {
 | 
				
			||||||
 | 
					        initializer.init(pc.getProject().getNameKey(), up);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      return up;
 | 
					      return up;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					// Copyright (C) 2017 The Android Open Source Project
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					// you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					// You may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					// distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					// See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package com.google.gerrit.server.git;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.gerrit.extensions.annotations.ExtensionPoint;
 | 
				
			||||||
 | 
					import com.google.gerrit.reviewdb.client.Project;
 | 
				
			||||||
 | 
					import org.eclipse.jgit.transport.UploadPack;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@ExtensionPoint
 | 
				
			||||||
 | 
					public interface UploadPackInitializer {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * UploadPack initialization.
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * <p>Invoked by Gerrit when a new UploadPack instance is created and just before it is used.
 | 
				
			||||||
 | 
					   * Implementors will usually call setXXX methods on the uploadPack parameter in order to set
 | 
				
			||||||
 | 
					   * additional properties on it.
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param project project for which the UploadPack is created
 | 
				
			||||||
 | 
					   * @param uploadPack the UploadPack instance which is being initialized
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  void init(Project.NameKey project, UploadPack uploadPack);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -18,6 +18,7 @@ import com.google.common.collect.Lists;
 | 
				
			|||||||
import com.google.gerrit.extensions.registration.DynamicSet;
 | 
					import com.google.gerrit.extensions.registration.DynamicSet;
 | 
				
			||||||
import com.google.gerrit.extensions.restapi.AuthException;
 | 
					import com.google.gerrit.extensions.restapi.AuthException;
 | 
				
			||||||
import com.google.gerrit.server.git.TransferConfig;
 | 
					import com.google.gerrit.server.git.TransferConfig;
 | 
				
			||||||
 | 
					import com.google.gerrit.server.git.UploadPackInitializer;
 | 
				
			||||||
import com.google.gerrit.server.git.VisibleRefFilter;
 | 
					import com.google.gerrit.server.git.VisibleRefFilter;
 | 
				
			||||||
import com.google.gerrit.server.git.validators.UploadValidationException;
 | 
					import com.google.gerrit.server.git.validators.UploadValidationException;
 | 
				
			||||||
import com.google.gerrit.server.git.validators.UploadValidators;
 | 
					import com.google.gerrit.server.git.validators.UploadValidators;
 | 
				
			||||||
@@ -41,6 +42,7 @@ final class Upload extends AbstractGitCommand {
 | 
				
			|||||||
  @Inject private VisibleRefFilter.Factory refFilterFactory;
 | 
					  @Inject private VisibleRefFilter.Factory refFilterFactory;
 | 
				
			||||||
  @Inject private DynamicSet<PreUploadHook> preUploadHooks;
 | 
					  @Inject private DynamicSet<PreUploadHook> preUploadHooks;
 | 
				
			||||||
  @Inject private DynamicSet<PostUploadHook> postUploadHooks;
 | 
					  @Inject private DynamicSet<PostUploadHook> postUploadHooks;
 | 
				
			||||||
 | 
					  @Inject private DynamicSet<UploadPackInitializer> uploadPackInitializers;
 | 
				
			||||||
  @Inject private UploadValidators.Factory uploadValidatorsFactory;
 | 
					  @Inject private UploadValidators.Factory uploadValidatorsFactory;
 | 
				
			||||||
  @Inject private SshSession session;
 | 
					  @Inject private SshSession session;
 | 
				
			||||||
  @Inject private PermissionBackend permissionBackend;
 | 
					  @Inject private PermissionBackend permissionBackend;
 | 
				
			||||||
@@ -68,6 +70,9 @@ final class Upload extends AbstractGitCommand {
 | 
				
			|||||||
    allPreUploadHooks.add(
 | 
					    allPreUploadHooks.add(
 | 
				
			||||||
        uploadValidatorsFactory.create(project, repo, session.getRemoteAddressAsString()));
 | 
					        uploadValidatorsFactory.create(project, repo, session.getRemoteAddressAsString()));
 | 
				
			||||||
    up.setPreUploadHook(PreUploadHookChain.newChain(allPreUploadHooks));
 | 
					    up.setPreUploadHook(PreUploadHookChain.newChain(allPreUploadHooks));
 | 
				
			||||||
 | 
					    for (UploadPackInitializer initializer : uploadPackInitializers) {
 | 
				
			||||||
 | 
					      initializer.init(projectControl.getProject().getNameKey(), up);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      up.upload(in, out, err);
 | 
					      up.upload(in, out, err);
 | 
				
			||||||
      session.setPeerAgent(up.getPeerUserAgent());
 | 
					      session.setPeerAgent(up.getPeerUserAgent());
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user