You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

167 lines
3.8 KiB

  1. // Copyright 2014 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package ssh
  5. import (
  6. "strings"
  7. "testing"
  8. )
  9. func TestClientVersion(t *testing.T) {
  10. for _, tt := range []struct {
  11. name string
  12. version string
  13. multiLine string
  14. wantErr bool
  15. }{
  16. {
  17. name: "default version",
  18. version: packageVersion,
  19. },
  20. {
  21. name: "custom version",
  22. version: "SSH-2.0-CustomClientVersionString",
  23. },
  24. {
  25. name: "good multi line version",
  26. version: packageVersion,
  27. multiLine: strings.Repeat("ignored\r\n", 20),
  28. },
  29. {
  30. name: "bad multi line version",
  31. version: packageVersion,
  32. multiLine: "bad multi line version",
  33. wantErr: true,
  34. },
  35. {
  36. name: "long multi line version",
  37. version: packageVersion,
  38. multiLine: strings.Repeat("long multi line version\r\n", 50)[:256],
  39. wantErr: true,
  40. },
  41. } {
  42. t.Run(tt.name, func(t *testing.T) {
  43. c1, c2, err := netPipe()
  44. if err != nil {
  45. t.Fatalf("netPipe: %v", err)
  46. }
  47. defer c1.Close()
  48. defer c2.Close()
  49. go func() {
  50. if tt.multiLine != "" {
  51. c1.Write([]byte(tt.multiLine))
  52. }
  53. NewClientConn(c1, "", &ClientConfig{
  54. ClientVersion: tt.version,
  55. HostKeyCallback: InsecureIgnoreHostKey(),
  56. })
  57. c1.Close()
  58. }()
  59. conf := &ServerConfig{NoClientAuth: true}
  60. conf.AddHostKey(testSigners["rsa"])
  61. conn, _, _, err := NewServerConn(c2, conf)
  62. if err == nil == tt.wantErr {
  63. t.Fatalf("got err %v; wantErr %t", err, tt.wantErr)
  64. }
  65. if tt.wantErr {
  66. // Don't verify the version on an expected error.
  67. return
  68. }
  69. if got := string(conn.ClientVersion()); got != tt.version {
  70. t.Fatalf("got %q; want %q", got, tt.version)
  71. }
  72. })
  73. }
  74. }
  75. func TestHostKeyCheck(t *testing.T) {
  76. for _, tt := range []struct {
  77. name string
  78. wantError string
  79. key PublicKey
  80. }{
  81. {"no callback", "must specify HostKeyCallback", nil},
  82. {"correct key", "", testSigners["rsa"].PublicKey()},
  83. {"mismatch", "mismatch", testSigners["ecdsa"].PublicKey()},
  84. } {
  85. c1, c2, err := netPipe()
  86. if err != nil {
  87. t.Fatalf("netPipe: %v", err)
  88. }
  89. defer c1.Close()
  90. defer c2.Close()
  91. serverConf := &ServerConfig{
  92. NoClientAuth: true,
  93. }
  94. serverConf.AddHostKey(testSigners["rsa"])
  95. go NewServerConn(c1, serverConf)
  96. clientConf := ClientConfig{
  97. User: "user",
  98. }
  99. if tt.key != nil {
  100. clientConf.HostKeyCallback = FixedHostKey(tt.key)
  101. }
  102. _, _, _, err = NewClientConn(c2, "", &clientConf)
  103. if err != nil {
  104. if tt.wantError == "" || !strings.Contains(err.Error(), tt.wantError) {
  105. t.Errorf("%s: got error %q, missing %q", tt.name, err.Error(), tt.wantError)
  106. }
  107. } else if tt.wantError != "" {
  108. t.Errorf("%s: succeeded, but want error string %q", tt.name, tt.wantError)
  109. }
  110. }
  111. }
  112. func TestBannerCallback(t *testing.T) {
  113. c1, c2, err := netPipe()
  114. if err != nil {
  115. t.Fatalf("netPipe: %v", err)
  116. }
  117. defer c1.Close()
  118. defer c2.Close()
  119. serverConf := &ServerConfig{
  120. PasswordCallback: func(conn ConnMetadata, password []byte) (*Permissions, error) {
  121. return &Permissions{}, nil
  122. },
  123. BannerCallback: func(conn ConnMetadata) string {
  124. return "Hello World"
  125. },
  126. }
  127. serverConf.AddHostKey(testSigners["rsa"])
  128. go NewServerConn(c1, serverConf)
  129. var receivedBanner string
  130. var bannerCount int
  131. clientConf := ClientConfig{
  132. Auth: []AuthMethod{
  133. Password("123"),
  134. },
  135. User: "user",
  136. HostKeyCallback: InsecureIgnoreHostKey(),
  137. BannerCallback: func(message string) error {
  138. bannerCount++
  139. receivedBanner = message
  140. return nil
  141. },
  142. }
  143. _, _, _, err = NewClientConn(c2, "", &clientConf)
  144. if err != nil {
  145. t.Fatal(err)
  146. }
  147. if bannerCount != 1 {
  148. t.Errorf("got %d banners; want 1", bannerCount)
  149. }
  150. expected := "Hello World"
  151. if receivedBanner != expected {
  152. t.Fatalf("got %s; want %s", receivedBanner, expected)
  153. }
  154. }