diff options
author | Santiago M. Mola <santi@mola.io> | 2017-06-01 17:45:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-01 17:45:49 +0200 |
commit | 87d2475dd70169bbcb49a70d79ca6cfdff492c38 (patch) | |
tree | 3e2f94bf00d04ec2d2610028ff531313b971b906 /plumbing/transport/ssh | |
parent | 7e249dfcf28765939bde8f38784b3274b522f880 (diff) | |
parent | f9dc7b130fcd8fa1ff0f086de89744c8c194c1e5 (diff) | |
download | go-git-87d2475dd70169bbcb49a70d79ca6cfdff492c38.tar.gz |
Merge pull request #405 from ekyoung/support-ssh-agent-on-windows
Support SSH Agent Auth on Windows
Diffstat (limited to 'plumbing/transport/ssh')
-rw-r--r-- | plumbing/transport/ssh/auth_method.go | 17 | ||||
-rw-r--r-- | plumbing/transport/ssh/auth_method_test.go | 12 |
2 files changed, 15 insertions, 14 deletions
diff --git a/plumbing/transport/ssh/auth_method.go b/plumbing/transport/ssh/auth_method.go index 84dfe14..f95235b 100644 --- a/plumbing/transport/ssh/auth_method.go +++ b/plumbing/transport/ssh/auth_method.go @@ -3,25 +3,21 @@ package ssh import ( "crypto/x509" "encoding/pem" - "errors" "fmt" "io/ioutil" - "net" "os" "os/user" "path/filepath" "gopkg.in/src-d/go-git.v4/plumbing/transport" + "github.com/xanzy/ssh-agent" "golang.org/x/crypto/ssh" - "golang.org/x/crypto/ssh/agent" "golang.org/x/crypto/ssh/knownhosts" ) const DefaultUsername = "git" -var ErrEmptySSHAgentAddr = errors.New("SSH_AUTH_SOCK env variable is required") - // AuthMethod is the interface all auth methods for the ssh client // must implement. The clientConfig method returns the ssh client // configuration needed to establish an ssh connection. @@ -189,19 +185,14 @@ func NewSSHAgentAuth(u string) (AuthMethod, error) { u = usr.Username } - sshAgentAddr := os.Getenv("SSH_AUTH_SOCK") - if sshAgentAddr == "" { - return nil, ErrEmptySSHAgentAddr - } - - pipe, err := net.Dial("unix", sshAgentAddr) + a, _, err := sshagent.New() if err != nil { - return nil, fmt.Errorf("error connecting to SSH agent: %q", err) + return nil, fmt.Errorf("error creating SSH agent: %q", err) } return &PublicKeysCallback{ User: u, - Callback: agent.NewClient(pipe).Signers, + Callback: a.Signers, }, nil } diff --git a/plumbing/transport/ssh/auth_method_test.go b/plumbing/transport/ssh/auth_method_test.go index 6f3d82f..aa05f7f 100644 --- a/plumbing/transport/ssh/auth_method_test.go +++ b/plumbing/transport/ssh/auth_method_test.go @@ -94,6 +94,16 @@ func (s *SuiteCommon) TestPublicKeysCallbackString(c *C) { c.Assert(a.String(), Equals, fmt.Sprintf("user: test, name: %s", PublicKeysCallbackName)) } func (s *SuiteCommon) TestNewSSHAgentAuth(c *C) { + if os.Getenv("SSH_AUTH_SOCK") == "" { + c.Skip("SSH_AUTH_SOCK or SSH_TEST_PRIVATE_KEY are required") + } + + auth, err := NewSSHAgentAuth("foo") + c.Assert(err, IsNil) + c.Assert(auth, NotNil) +} + +func (s *SuiteCommon) TestNewSSHAgentAuthNoAgent(c *C) { addr := os.Getenv("SSH_AUTH_SOCK") err := os.Unsetenv("SSH_AUTH_SOCK") c.Assert(err, IsNil) @@ -105,7 +115,7 @@ func (s *SuiteCommon) TestNewSSHAgentAuth(c *C) { k, err := NewSSHAgentAuth("foo") c.Assert(k, IsNil) - c.Assert(err, Equals, ErrEmptySSHAgentAddr) + c.Assert(err, ErrorMatches, ".*SSH_AUTH_SOCK.*") } func (*SuiteCommon) TestNewPublicKeys(c *C) { |