From 30f164ce5a2b258353fb6f4d1560a815ae36409e Mon Sep 17 00:00:00 2001 From: Matej Vasek Date: Wed, 5 Jan 2022 18:54:46 +0100 Subject: [PATCH 1/5] fix: ssh-agent connection on Windows Signed-off-by: Matej Vasek --- go.mod | 1 + go.sum | 2 ++ internal/sshdialer/posix_test.go | 9 ++++++++- internal/sshdialer/ssh_agent_unix.go | 10 ++++++++++ internal/sshdialer/ssh_agent_windows.go | 16 ++++++++++++++++ internal/sshdialer/ssh_dialer.go | 2 +- internal/sshdialer/ssh_dialer_test.go | 21 ++++++++++++++++----- internal/sshdialer/windows_test.go | 11 +++++++++++ 8 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 internal/sshdialer/ssh_agent_unix.go create mode 100644 internal/sshdialer/ssh_agent_windows.go diff --git a/go.mod b/go.mod index a2d96d0fc..43d71cd37 100644 --- a/go.mod +++ b/go.mod @@ -31,6 +31,7 @@ require ( golang.org/x/mod v0.5.1 golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce gopkg.in/src-d/go-git.v4 v4.13.1 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b ) diff --git a/go.sum b/go.sum index 996fa8bba..f3d0673a3 100644 --- a/go.sum +++ b/go.sum @@ -1446,6 +1446,8 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= diff --git a/internal/sshdialer/posix_test.go b/internal/sshdialer/posix_test.go index 5114d7e4a..a97037349 100644 --- a/internal/sshdialer/posix_test.go +++ b/internal/sshdialer/posix_test.go @@ -3,7 +3,10 @@ package sshdialer_test -import "os" +import ( + "net" + "os" +) func fixupPrivateKeyMod(path string) { err := os.Chmod(path, 0400) @@ -11,3 +14,7 @@ func fixupPrivateKeyMod(path string) { panic(err) } } + +func listen(addr string) (net.Listener, error) { + return net.Listen("unix", addr) +} diff --git a/internal/sshdialer/ssh_agent_unix.go b/internal/sshdialer/ssh_agent_unix.go new file mode 100644 index 000000000..7e11b725f --- /dev/null +++ b/internal/sshdialer/ssh_agent_unix.go @@ -0,0 +1,10 @@ +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package sshdialer + +import "net" + +func dialSSHAgent(addr string) (net.Conn, error) { + return net.Dial("unix", addr) +} diff --git a/internal/sshdialer/ssh_agent_windows.go b/internal/sshdialer/ssh_agent_windows.go new file mode 100644 index 000000000..226f5835f --- /dev/null +++ b/internal/sshdialer/ssh_agent_windows.go @@ -0,0 +1,16 @@ +package sshdialer + +import ( + "net" + "strings" + + "gopkg.in/natefinch/npipe.v2" +) + +func dialSSHAgent(addr string) (net.Conn, error) { + if strings.Contains(addr, "\\pipe\\") { + return npipe.Dial(addr) + } else { + return net.Dial("unix", addr) + } +} diff --git a/internal/sshdialer/ssh_dialer.go b/internal/sshdialer/ssh_dialer.go index 83c247c10..5769a29a0 100644 --- a/internal/sshdialer/ssh_dialer.go +++ b/internal/sshdialer/ssh_dialer.go @@ -284,7 +284,7 @@ func getSignersFromAgent() ([]ssh.Signer, error) { var err error var agentSigners []ssh.Signer var agentConn net.Conn - agentConn, err = net.Dial("unix", sock) + agentConn, err = dialSSHAgent(sock) if err != nil { return nil, fmt.Errorf("failed to connect to ssh-agent's socket: %w", err) } diff --git a/internal/sshdialer/ssh_dialer_test.go b/internal/sshdialer/ssh_dialer_test.go index 8708d7077..10172287b 100644 --- a/internal/sshdialer/ssh_dialer_test.go +++ b/internal/sshdialer/ssh_dialer_test.go @@ -770,12 +770,21 @@ func withBadSSHAgent(t *testing.T) func() { } func withSSHAgent(t *testing.T, ag agent.Agent) func() { + var err error t.Helper() - tmpDirForSocket, err := ioutil.TempDir("", "forAuthSock") - th.AssertNil(t, err) - agentSocketPath := filepath.Join(tmpDirForSocket, "agent.sock") - unixListener, err := net.Listen("unix", agentSocketPath) + var tmpDirForSocket string + var agentSocketPath string + if runtime.GOOS == "windows" { + agentSocketPath = `\\.\pipe\openssh-ssh-agent-test` + } else { + tmpDirForSocket, err = ioutil.TempDir("", "forAuthSock") + th.AssertNil(t, err) + + agentSocketPath = filepath.Join(tmpDirForSocket, "agent.sock") + } + + unixListener, err := listen(agentSocketPath) th.AssertNil(t, err) os.Setenv("SSH_AUTH_SOCK", agentSocketPath) @@ -823,7 +832,9 @@ func withSSHAgent(t *testing.T, ag agent.Agent) func() { } cancel() wg.Wait() - os.RemoveAll(tmpDirForSocket) + if tmpDirForSocket != "" { + os.RemoveAll(tmpDirForSocket) + } } } diff --git a/internal/sshdialer/windows_test.go b/internal/sshdialer/windows_test.go index 70ff93b28..798a8766b 100644 --- a/internal/sshdialer/windows_test.go +++ b/internal/sshdialer/windows_test.go @@ -4,7 +4,10 @@ package sshdialer_test import ( + "gopkg.in/natefinch/npipe.v2" + "net" "os/user" + "strings" "github.com/hectane/go-acl" ) @@ -25,3 +28,11 @@ func fixupPrivateKeyMod(path string) { panic(err) } } + +func listen(addr string) (net.Listener, error) { + if strings.Contains(addr, "\\pipe\\") { + return npipe.Listen(addr) + } else { + return net.Listen("unix", addr) + } +} From 3201cf8d168b35e8487cecc2be9c2101d2a84030 Mon Sep 17 00:00:00 2001 From: Matej Vasek Date: Wed, 5 Jan 2022 18:57:48 +0100 Subject: [PATCH 2/5] fixup: style Signed-off-by: Matej Vasek --- internal/sshdialer/windows_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/sshdialer/windows_test.go b/internal/sshdialer/windows_test.go index 798a8766b..c686ff1f3 100644 --- a/internal/sshdialer/windows_test.go +++ b/internal/sshdialer/windows_test.go @@ -4,12 +4,12 @@ package sshdialer_test import ( - "gopkg.in/natefinch/npipe.v2" "net" "os/user" "strings" "github.com/hectane/go-acl" + "gopkg.in/natefinch/npipe.v2" ) func fixupPrivateKeyMod(path string) { From dce2084b9af557c954fa4e2a623b6170d2da2218 Mon Sep 17 00:00:00 2001 From: Matej Vasek Date: Wed, 5 Jan 2022 18:59:36 +0100 Subject: [PATCH 3/5] fixup: style Signed-off-by: Matej Vasek --- internal/sshdialer/ssh_agent_windows.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/sshdialer/ssh_agent_windows.go b/internal/sshdialer/ssh_agent_windows.go index 226f5835f..b6000ef8a 100644 --- a/internal/sshdialer/ssh_agent_windows.go +++ b/internal/sshdialer/ssh_agent_windows.go @@ -10,7 +10,6 @@ import ( func dialSSHAgent(addr string) (net.Conn, error) { if strings.Contains(addr, "\\pipe\\") { return npipe.Dial(addr) - } else { - return net.Dial("unix", addr) } + return net.Dial("unix", addr) } From c6ed5641c80698d152b004af46e60bc16150e898 Mon Sep 17 00:00:00 2001 From: Matej Vasek Date: Wed, 5 Jan 2022 19:01:27 +0100 Subject: [PATCH 4/5] fixup: style Signed-off-by: Matej Vasek --- internal/sshdialer/windows_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/sshdialer/windows_test.go b/internal/sshdialer/windows_test.go index c686ff1f3..12b9545fc 100644 --- a/internal/sshdialer/windows_test.go +++ b/internal/sshdialer/windows_test.go @@ -32,7 +32,6 @@ func fixupPrivateKeyMod(path string) { func listen(addr string) (net.Listener, error) { if strings.Contains(addr, "\\pipe\\") { return npipe.Listen(addr) - } else { - return net.Listen("unix", addr) } + return net.Listen("unix", addr) } From 3f08eb56a1f7cfb0bcf774dbc49cc182b78fb12a Mon Sep 17 00:00:00 2001 From: Matej Vasek Date: Wed, 5 Jan 2022 19:14:00 +0100 Subject: [PATCH 5/5] fixup: error type checking Signed-off-by: Matej Vasek --- internal/sshdialer/posix_test.go | 5 +++++ internal/sshdialer/ssh_dialer_test.go | 4 ++-- internal/sshdialer/windows_test.go | 5 +++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/internal/sshdialer/posix_test.go b/internal/sshdialer/posix_test.go index a97037349..a296894f9 100644 --- a/internal/sshdialer/posix_test.go +++ b/internal/sshdialer/posix_test.go @@ -4,6 +4,7 @@ package sshdialer_test import ( + "errors" "net" "os" ) @@ -18,3 +19,7 @@ func fixupPrivateKeyMod(path string) { func listen(addr string) (net.Listener, error) { return net.Listen("unix", addr) } + +func isErrClosed(err error) bool { + return errors.Is(err, net.ErrClosed) +} diff --git a/internal/sshdialer/ssh_dialer_test.go b/internal/sshdialer/ssh_dialer_test.go index 10172287b..654f12266 100644 --- a/internal/sshdialer/ssh_dialer_test.go +++ b/internal/sshdialer/ssh_dialer_test.go @@ -811,7 +811,7 @@ func withSSHAgent(t *testing.T, ag agent.Agent) func() { }() err := agent.ServeAgent(ag, conn) if err != nil { - if !errors.Is(err, net.ErrClosed) { + if !isErrClosed(err) { fmt.Fprintf(os.Stderr, "agent.ServeAgent() failed: %v\n", err) } } @@ -827,7 +827,7 @@ func withSSHAgent(t *testing.T, ag agent.Agent) func() { err = <-errChan - if !errors.Is(err, net.ErrClosed) { + if !isErrClosed(err) { t.Fatal(err) } cancel() diff --git a/internal/sshdialer/windows_test.go b/internal/sshdialer/windows_test.go index 12b9545fc..304549d96 100644 --- a/internal/sshdialer/windows_test.go +++ b/internal/sshdialer/windows_test.go @@ -4,6 +4,7 @@ package sshdialer_test import ( + "errors" "net" "os/user" "strings" @@ -35,3 +36,7 @@ func listen(addr string) (net.Listener, error) { } return net.Listen("unix", addr) } + +func isErrClosed(err error) bool { + return errors.Is(err, net.ErrClosed) || errors.Is(err, npipe.ErrClosed) +}