Make ssh commands used in the git smart transport compatible with libgit2 (#852) (#855)

* Fix ssh commands used in go SmartSubtransport

Before the fix, the commands sent were of the form:

```
git-upload-pack "/bar/test-reponame"
```

This resulted in the git server returning error:
`error parsing command: invalid git command`

This change replaces the double quotes with single quotes:

```
git-upload-pack '/bar/test-reponame'
```

* Update ssh.go

Co-authored-by: lhchavez <lhchavez@lhchavez.com>
(cherry picked from commit 6cea7a7a59)

Co-authored-by: Sunny <darkowlzz@protonmail.com>
Co-authored-by: lhchavez <lhchavez@lhchavez.com>
This commit is contained in:
github-actions[bot] 2021-11-09 06:27:06 -08:00 committed by GitHub
parent 34d31c0438
commit a4d6699c91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 10 additions and 2 deletions

12
ssh.go
View File

@ -17,6 +17,7 @@ import (
"net" "net"
"net/url" "net/url"
"runtime" "runtime"
"strings"
"unsafe" "unsafe"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
@ -74,6 +75,13 @@ func (t *sshSmartSubtransport) Action(urlString string, action SmartServiceActio
return nil, err return nil, err
} }
// Escape \ and '.
uPath := strings.Replace(u.Path, `\`, `\\`, -1)
uPath = strings.Replace(uPath, `'`, `\'`, -1)
// TODO: Add percentage decode similar to libgit2.
// Refer: https://github.com/libgit2/libgit2/blob/358a60e1b46000ea99ef10b4dd709e92f75ff74b/src/str.c#L455-L481
var cmd string var cmd string
switch action { switch action {
case SmartServiceActionUploadpackLs, SmartServiceActionUploadpack: case SmartServiceActionUploadpackLs, SmartServiceActionUploadpack:
@ -83,7 +91,7 @@ func (t *sshSmartSubtransport) Action(urlString string, action SmartServiceActio
} }
t.Close() t.Close()
} }
cmd = fmt.Sprintf("git-upload-pack %q", u.Path) cmd = fmt.Sprintf("git-upload-pack '%s'", uPath)
case SmartServiceActionReceivepackLs, SmartServiceActionReceivepack: case SmartServiceActionReceivepackLs, SmartServiceActionReceivepack:
if t.currentStream != nil { if t.currentStream != nil {
@ -92,7 +100,7 @@ func (t *sshSmartSubtransport) Action(urlString string, action SmartServiceActio
} }
t.Close() t.Close()
} }
cmd = fmt.Sprintf("git-receive-pack %q", u.Path) cmd = fmt.Sprintf("git-receive-pack '%s'", uPath)
default: default:
return nil, fmt.Errorf("unexpected action: %v", action) return nil, fmt.Errorf("unexpected action: %v", action)