From 38f3c27a63bf8d9928ce230b01cab346d1756e88 Mon Sep 17 00:00:00 2001 From: povsister Date: Mon, 29 Mar 2021 05:11:09 +0000 Subject: [PATCH] ssh: return missing user field in NewClientConn Fix golang/go#45249 Change-Id: I27ef2976586ad481d832c6e46695a91f1bb50373 GitHub-Last-Rev: 9f631b80925719a0fb77576f7983cd7c8d0b5056 GitHub-Pull-Request: golang/crypto#180 Reviewed-on: https://go-review.googlesource.com/c/crypto/+/304990 Reviewed-by: Emmanuel Odeke Reviewed-by: Katie Hockman Trust: Emmanuel Odeke Trust: Katie Hockman Run-TryBot: Emmanuel Odeke TryBot-Result: Go Bot --- ssh/client.go | 2 +- ssh/client_test.go | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/ssh/client.go b/ssh/client.go index 7b00bff..99f68bd 100644 --- a/ssh/client.go +++ b/ssh/client.go @@ -77,7 +77,7 @@ func NewClientConn(c net.Conn, addr string, config *ClientConfig) (Conn, <-chan } conn := &connection{ - sshConn: sshConn{conn: c}, + sshConn: sshConn{conn: c, user: fullConf.User}, } if err := conn.clientHandshake(addr, &fullConf); err != nil { diff --git a/ssh/client_test.go b/ssh/client_test.go index 81f9599..6aaa003 100644 --- a/ssh/client_test.go +++ b/ssh/client_test.go @@ -164,3 +164,52 @@ func TestBannerCallback(t *testing.T) { t.Fatalf("got %s; want %s", receivedBanner, expected) } } + +func TestNewClientConn(t *testing.T) { + for _, tt := range []struct { + name string + user string + }{ + { + name: "good user field for ConnMetadata", + user: "testuser", + }, + { + name: "empty user field for ConnMetadata", + user: "", + }, + } { + t.Run(tt.name, func(t *testing.T) { + c1, c2, err := netPipe() + if err != nil { + t.Fatalf("netPipe: %v", err) + } + defer c1.Close() + defer c2.Close() + + serverConf := &ServerConfig{ + PasswordCallback: func(conn ConnMetadata, password []byte) (*Permissions, error) { + return &Permissions{}, nil + }, + } + serverConf.AddHostKey(testSigners["rsa"]) + go NewServerConn(c1, serverConf) + + clientConf := &ClientConfig{ + User: tt.user, + Auth: []AuthMethod{ + Password("testpw"), + }, + HostKeyCallback: InsecureIgnoreHostKey(), + } + clientConn, _, _, err := NewClientConn(c2, "", clientConf) + if err != nil { + t.Fatal(err) + } + + if userGot := clientConn.User(); userGot != tt.user { + t.Errorf("got user %q; want user %q", userGot, tt.user) + } + }) + } +}