mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Enable cloning via Git Wire Protocol v2 over HTTP (#12170)
* Enable Git Wire Protocol v2 over HTTP * use RunInDirTimeoutEnv * pass $HOME environment variable to git upload-pack
This commit is contained in:
		@@ -483,6 +483,9 @@ var routes = []route{
 | 
				
			|||||||
	{regexp.MustCompile(`(.*?)/objects/pack/pack-[0-9a-f]{40}\.idx$`), "GET", getIdxFile},
 | 
						{regexp.MustCompile(`(.*?)/objects/pack/pack-[0-9a-f]{40}\.idx$`), "GET", getIdxFile},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// one or more key=value pairs separated by colons
 | 
				
			||||||
 | 
					var safeGitProtocolHeader = regexp.MustCompile(`^[0-9a-zA-Z]+=[0-9a-zA-Z]+(:[0-9a-zA-Z]+=[0-9a-zA-Z]+)*$`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getGitConfig(option, dir string) string {
 | 
					func getGitConfig(option, dir string) string {
 | 
				
			||||||
	out, err := git.NewCommand("config", option).RunInDir(dir)
 | 
						out, err := git.NewCommand("config", option).RunInDir(dir)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -553,14 +556,16 @@ func serviceRPC(h serviceHandler, service string) {
 | 
				
			|||||||
	// set this for allow pre-receive and post-receive execute
 | 
						// set this for allow pre-receive and post-receive execute
 | 
				
			||||||
	h.environ = append(h.environ, "SSH_ORIGINAL_COMMAND="+service)
 | 
						h.environ = append(h.environ, "SSH_ORIGINAL_COMMAND="+service)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if protocol := h.r.Header.Get("Git-Protocol"); protocol != "" && safeGitProtocolHeader.MatchString(protocol) {
 | 
				
			||||||
 | 
							h.environ = append(h.environ, "GIT_PROTOCOL="+protocol)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx, cancel := gocontext.WithCancel(git.DefaultContext)
 | 
						ctx, cancel := gocontext.WithCancel(git.DefaultContext)
 | 
				
			||||||
	defer cancel()
 | 
						defer cancel()
 | 
				
			||||||
	var stderr bytes.Buffer
 | 
						var stderr bytes.Buffer
 | 
				
			||||||
	cmd := exec.CommandContext(ctx, git.GitExecutable, service, "--stateless-rpc", h.dir)
 | 
						cmd := exec.CommandContext(ctx, git.GitExecutable, service, "--stateless-rpc", h.dir)
 | 
				
			||||||
	cmd.Dir = h.dir
 | 
						cmd.Dir = h.dir
 | 
				
			||||||
	if service == "receive-pack" {
 | 
						cmd.Env = append(os.Environ(), h.environ...)
 | 
				
			||||||
		cmd.Env = append(os.Environ(), h.environ...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	cmd.Stdout = h.w
 | 
						cmd.Stdout = h.w
 | 
				
			||||||
	cmd.Stdin = reqBody
 | 
						cmd.Stdin = reqBody
 | 
				
			||||||
	cmd.Stderr = &stderr
 | 
						cmd.Stderr = &stderr
 | 
				
			||||||
@@ -610,7 +615,13 @@ func getInfoRefs(h serviceHandler) {
 | 
				
			|||||||
	h.setHeaderNoCache()
 | 
						h.setHeaderNoCache()
 | 
				
			||||||
	if hasAccess(getServiceType(h.r), h, false) {
 | 
						if hasAccess(getServiceType(h.r), h, false) {
 | 
				
			||||||
		service := getServiceType(h.r)
 | 
							service := getServiceType(h.r)
 | 
				
			||||||
		refs, err := git.NewCommand(service, "--stateless-rpc", "--advertise-refs", ".").RunInDirBytes(h.dir)
 | 
					
 | 
				
			||||||
 | 
							if protocol := h.r.Header.Get("Git-Protocol"); protocol != "" && safeGitProtocolHeader.MatchString(protocol) {
 | 
				
			||||||
 | 
								h.environ = append(h.environ, "GIT_PROTOCOL="+protocol)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							h.environ = append(os.Environ(), h.environ...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							refs, err := git.NewCommand(service, "--stateless-rpc", "--advertise-refs", ".").RunInDirTimeoutEnv(h.environ, -1, h.dir)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Error(fmt.Sprintf("%v - %s", err, string(refs)))
 | 
								log.Error(fmt.Sprintf("%v - %s", err, string(refs)))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user