mirror of
				https://github.com/scm-manager/scm-manager.git
				synced 2025-11-03 20:15:52 +01:00 
			
		
		
		
	added option to disallow non fast-forward git pushes
This commit is contained in:
		@@ -51,9 +51,18 @@ public class GitConfig extends SimpleRepositoryConfig {
 | 
			
		||||
  @XmlElement(name = "gc-expression")
 | 
			
		||||
  private String gcExpression;
 | 
			
		||||
 | 
			
		||||
  public String getGcExpression()
 | 
			
		||||
  {
 | 
			
		||||
  @XmlElement(name = "disallow-non-fast-forward")
 | 
			
		||||
  private boolean nonFastForwardDisallowed;
 | 
			
		||||
 | 
			
		||||
  public String getGcExpression() {
 | 
			
		||||
    return gcExpression;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  public boolean isNonFastForwardDisallowed() {
 | 
			
		||||
    return nonFastForwardDisallowed;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void setNonFastForwardDisallowed(boolean nonFastForwardDisallowed) {
 | 
			
		||||
    this.nonFastForwardDisallowed = nonFastForwardDisallowed;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -35,79 +35,63 @@ package sonia.scm.web;
 | 
			
		||||
 | 
			
		||||
//~--- non-JDK imports --------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import com.google.common.annotations.VisibleForTesting;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory;
 | 
			
		||||
import org.eclipse.jgit.lib.Repository;
 | 
			
		||||
import org.eclipse.jgit.transport.ReceivePack;
 | 
			
		||||
import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
 | 
			
		||||
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
 | 
			
		||||
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 | 
			
		||||
 | 
			
		||||
import sonia.scm.repository.GitRepositoryHandler;
 | 
			
		||||
import sonia.scm.repository.spi.HookEventFacade;
 | 
			
		||||
 | 
			
		||||
//~--- JDK imports ------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
 | 
			
		||||
//~--- JDK imports ------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * GitReceivePackFactory creates {@link ReceivePack} objects and assigns the required
 | 
			
		||||
 * Hook components.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Sebastian Sdorra
 | 
			
		||||
 */
 | 
			
		||||
public class GitReceivePackFactory
 | 
			
		||||
  implements ReceivePackFactory<HttpServletRequest>
 | 
			
		||||
public class GitReceivePackFactory implements ReceivePackFactory<HttpServletRequest>
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Constructs ...
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param hookEventFacade
 | 
			
		||||
   * @param handler
 | 
			
		||||
   */
 | 
			
		||||
  private final GitRepositoryHandler handler;
 | 
			
		||||
 | 
			
		||||
  private ReceivePackFactory wrapped;
 | 
			
		||||
 | 
			
		||||
  private final GitReceiveHook hook;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  public GitReceivePackFactory(HookEventFacade hookEventFacade,
 | 
			
		||||
    GitRepositoryHandler handler)
 | 
			
		||||
  {
 | 
			
		||||
    hook = new GitReceiveHook(hookEventFacade, handler);
 | 
			
		||||
  public GitReceivePackFactory(GitRepositoryHandler handler, HookEventFacade hookEventFacade) {
 | 
			
		||||
    this.handler = handler;
 | 
			
		||||
    this.hook = new GitReceiveHook(hookEventFacade, handler);
 | 
			
		||||
    this.wrapped =  new DefaultReceivePackFactory();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //~--- methods --------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Method description
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param request
 | 
			
		||||
   * @param repository
 | 
			
		||||
   *
 | 
			
		||||
   * @return
 | 
			
		||||
   *
 | 
			
		||||
   * @throws ServiceNotAuthorizedException
 | 
			
		||||
   * @throws ServiceNotEnabledException
 | 
			
		||||
   */
 | 
			
		||||
  @Override
 | 
			
		||||
  public ReceivePack create(HttpServletRequest request, Repository repository)
 | 
			
		||||
    throws ServiceNotEnabledException, ServiceNotAuthorizedException
 | 
			
		||||
  {
 | 
			
		||||
    ReceivePack rpack = defaultFactory.create(request, repository);
 | 
			
		||||
    throws ServiceNotEnabledException, ServiceNotAuthorizedException {
 | 
			
		||||
    ReceivePack receivePack = wrapped.create(request, repository);
 | 
			
		||||
    receivePack.setAllowNonFastForwards(isNonFastForwardAllowed());
 | 
			
		||||
 | 
			
		||||
    rpack.setPreReceiveHook(hook);
 | 
			
		||||
    rpack.setPostReceiveHook(hook);
 | 
			
		||||
    receivePack.setPreReceiveHook(hook);
 | 
			
		||||
    receivePack.setPostReceiveHook(hook);
 | 
			
		||||
    // apply collecting listener, to be able to check which commits are new
 | 
			
		||||
    CollectingPackParserListener.set(rpack);
 | 
			
		||||
    CollectingPackParserListener.set(receivePack);
 | 
			
		||||
    
 | 
			
		||||
    return rpack;
 | 
			
		||||
    return receivePack;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //~--- fields ---------------------------------------------------------------
 | 
			
		||||
  private boolean isNonFastForwardAllowed() {
 | 
			
		||||
    return ! handler.getConfig().isNonFastForwardDisallowed();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /** Field description */
 | 
			
		||||
  private DefaultReceivePackFactory defaultFactory =
 | 
			
		||||
    new DefaultReceivePackFactory();
 | 
			
		||||
 | 
			
		||||
  /** Field description */
 | 
			
		||||
  private GitReceiveHook hook;
 | 
			
		||||
  @VisibleForTesting
 | 
			
		||||
  void setWrapped(ReceivePackFactory wrapped) {
 | 
			
		||||
    this.wrapped = wrapped;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user