From a6c2a1a117547d5709e06fd956e169fdb375804d Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 2 Aug 2022 09:58:57 +0200 Subject: [PATCH] Enable Wire 2 for Internal SSH Server (#20616) (#20617) - Backport of #20616 - Git only decides to use the Wire 2 protocol when `git {receive,upload}-pack` receive the `GIT_PROTOCOL` environment with as value `version=2`. Currently the internal SSH Server wasn't passing this environment through. The `gitea serv` code already passed all received environments to the git command, so no code changes there. - This is mentioned in Git manual, https://git-scm.com/docs/git#Documentation/git.txt-codeGITPROTOCOLcode --- modules/ssh/ssh.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/ssh/ssh.go b/modules/ssh/ssh.go index bffe29f4c..5cc011e58 100644 --- a/modules/ssh/ssh.go +++ b/modules/ssh/ssh.go @@ -75,11 +75,21 @@ func sessionHandler(session ssh.Session) { ctx, cancel := context.WithCancel(session.Context()) defer cancel() + gitProtocol := "" + for _, env := range session.Environ() { + if strings.HasPrefix(env, "GIT_PROTOCOL=") { + // The value would be version=2, so using normal split doesn't work here. + gitProtocol = strings.SplitN(env, "=", 2)[1] + break + } + } + cmd := exec.CommandContext(ctx, setting.AppPath, args...) cmd.Env = append( os.Environ(), "SSH_ORIGINAL_COMMAND="+command, "SKIP_MINWINSVC=1", + "GIT_PROTOCOL="+gitProtocol, ) stdout, err := cmd.StdoutPipe()