net-ssh 2.7.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.dockerignore +6 -0
  4. data/.github/FUNDING.yml +1 -0
  5. data/.github/config/rubocop_linter_action.yml +4 -0
  6. data/.github/workflows/ci-with-docker.yml +44 -0
  7. data/.github/workflows/ci.yml +94 -0
  8. data/.github/workflows/rubocop.yml +16 -0
  9. data/.gitignore +15 -0
  10. data/.rubocop.yml +22 -0
  11. data/.rubocop_todo.yml +1081 -0
  12. data/CHANGES.txt +387 -0
  13. data/DEVELOPMENT.md +23 -0
  14. data/Dockerfile +29 -0
  15. data/Dockerfile.openssl3 +17 -0
  16. data/Gemfile +13 -0
  17. data/Gemfile.noed25519 +12 -0
  18. data/Gemfile.norbnacl +12 -0
  19. data/ISSUE_TEMPLATE.md +30 -0
  20. data/Manifest +4 -5
  21. data/README.md +303 -0
  22. data/Rakefile +174 -40
  23. data/SECURITY.md +4 -0
  24. data/THANKS.txt +25 -0
  25. data/appveyor.yml +58 -0
  26. data/docker-compose.yml +25 -0
  27. data/lib/net/ssh/authentication/agent.rb +279 -18
  28. data/lib/net/ssh/authentication/certificate.rb +183 -0
  29. data/lib/net/ssh/authentication/constants.rb +17 -15
  30. data/lib/net/ssh/authentication/ed25519.rb +184 -0
  31. data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
  32. data/lib/net/ssh/authentication/key_manager.rb +125 -54
  33. data/lib/net/ssh/authentication/methods/abstract.rb +67 -48
  34. data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
  35. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +19 -12
  36. data/lib/net/ssh/authentication/methods/none.rb +16 -19
  37. data/lib/net/ssh/authentication/methods/password.rb +56 -19
  38. data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
  39. data/lib/net/ssh/authentication/pageant.rb +483 -246
  40. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  41. data/lib/net/ssh/authentication/session.rb +138 -120
  42. data/lib/net/ssh/buffer.rb +399 -300
  43. data/lib/net/ssh/buffered_io.rb +154 -150
  44. data/lib/net/ssh/config.rb +361 -166
  45. data/lib/net/ssh/connection/channel.rb +640 -596
  46. data/lib/net/ssh/connection/constants.rb +29 -29
  47. data/lib/net/ssh/connection/event_loop.rb +123 -0
  48. data/lib/net/ssh/connection/keepalive.rb +59 -0
  49. data/lib/net/ssh/connection/session.rb +628 -548
  50. data/lib/net/ssh/connection/term.rb +125 -123
  51. data/lib/net/ssh/errors.rb +101 -95
  52. data/lib/net/ssh/key_factory.rb +198 -100
  53. data/lib/net/ssh/known_hosts.rb +221 -98
  54. data/lib/net/ssh/loggable.rb +50 -49
  55. data/lib/net/ssh/packet.rb +83 -79
  56. data/lib/net/ssh/prompt.rb +50 -81
  57. data/lib/net/ssh/proxy/command.rb +108 -60
  58. data/lib/net/ssh/proxy/errors.rb +12 -10
  59. data/lib/net/ssh/proxy/http.rb +82 -78
  60. data/lib/net/ssh/proxy/https.rb +50 -0
  61. data/lib/net/ssh/proxy/jump.rb +54 -0
  62. data/lib/net/ssh/proxy/socks4.rb +5 -8
  63. data/lib/net/ssh/proxy/socks5.rb +18 -20
  64. data/lib/net/ssh/service/forward.rb +383 -255
  65. data/lib/net/ssh/test/channel.rb +145 -136
  66. data/lib/net/ssh/test/extensions.rb +131 -110
  67. data/lib/net/ssh/test/kex.rb +34 -32
  68. data/lib/net/ssh/test/local_packet.rb +46 -44
  69. data/lib/net/ssh/test/packet.rb +89 -70
  70. data/lib/net/ssh/test/remote_packet.rb +32 -30
  71. data/lib/net/ssh/test/script.rb +156 -142
  72. data/lib/net/ssh/test/socket.rb +49 -48
  73. data/lib/net/ssh/test.rb +82 -77
  74. data/lib/net/ssh/transport/aes128_gcm.rb +40 -0
  75. data/lib/net/ssh/transport/aes256_gcm.rb +40 -0
  76. data/lib/net/ssh/transport/algorithms.rb +472 -348
  77. data/lib/net/ssh/transport/chacha20_poly1305_cipher.rb +117 -0
  78. data/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb +17 -0
  79. data/lib/net/ssh/transport/cipher_factory.rb +124 -100
  80. data/lib/net/ssh/transport/constants.rb +32 -24
  81. data/lib/net/ssh/transport/ctr.rb +42 -22
  82. data/lib/net/ssh/transport/gcm_cipher.rb +207 -0
  83. data/lib/net/ssh/transport/hmac/abstract.rb +97 -63
  84. data/lib/net/ssh/transport/hmac/md5.rb +0 -2
  85. data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
  86. data/lib/net/ssh/transport/hmac/none.rb +0 -2
  87. data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
  88. data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
  89. data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
  90. data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
  91. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
  92. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  93. data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
  94. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
  95. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  96. data/lib/net/ssh/transport/hmac.rb +14 -12
  97. data/lib/net/ssh/transport/identity_cipher.rb +54 -44
  98. data/lib/net/ssh/transport/kex/abstract.rb +130 -0
  99. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  100. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  101. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  102. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
  103. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  104. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +119 -213
  105. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -61
  106. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
  107. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
  108. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
  109. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
  110. data/lib/net/ssh/transport/kex.rb +15 -12
  111. data/lib/net/ssh/transport/key_expander.rb +24 -20
  112. data/lib/net/ssh/transport/openssl.rb +161 -124
  113. data/lib/net/ssh/transport/openssl_cipher_extensions.rb +8 -0
  114. data/lib/net/ssh/transport/packet_stream.rb +246 -183
  115. data/lib/net/ssh/transport/server_version.rb +57 -51
  116. data/lib/net/ssh/transport/session.rb +307 -235
  117. data/lib/net/ssh/transport/state.rb +178 -176
  118. data/lib/net/ssh/verifiers/accept_new.rb +33 -0
  119. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  120. data/lib/net/ssh/verifiers/always.rb +58 -0
  121. data/lib/net/ssh/verifiers/never.rb +19 -0
  122. data/lib/net/ssh/version.rb +57 -51
  123. data/lib/net/ssh.rb +140 -40
  124. data/net-ssh-public_cert.pem +21 -0
  125. data/net-ssh.gemspec +39 -184
  126. data/support/ssh_tunnel_bug.rb +5 -5
  127. data.tar.gz.sig +0 -0
  128. metadata +205 -99
  129. metadata.gz.sig +0 -0
  130. data/README.rdoc +0 -219
  131. data/Rudyfile +0 -96
  132. data/gem-public_cert.pem +0 -20
  133. data/lib/net/ssh/authentication/agent/java_pageant.rb +0 -85
  134. data/lib/net/ssh/authentication/agent/socket.rb +0 -170
  135. data/lib/net/ssh/ruby_compat.rb +0 -51
  136. data/lib/net/ssh/verifiers/lenient.rb +0 -30
  137. data/lib/net/ssh/verifiers/null.rb +0 -12
  138. data/lib/net/ssh/verifiers/secure.rb +0 -54
  139. data/lib/net/ssh/verifiers/strict.rb +0 -24
  140. data/setup.rb +0 -1585
  141. data/support/arcfour_check.rb +0 -20
  142. data/test/README.txt +0 -47
  143. data/test/authentication/methods/common.rb +0 -28
  144. data/test/authentication/methods/test_abstract.rb +0 -51
  145. data/test/authentication/methods/test_hostbased.rb +0 -114
  146. data/test/authentication/methods/test_keyboard_interactive.rb +0 -100
  147. data/test/authentication/methods/test_none.rb +0 -41
  148. data/test/authentication/methods/test_password.rb +0 -52
  149. data/test/authentication/methods/test_publickey.rb +0 -148
  150. data/test/authentication/test_agent.rb +0 -205
  151. data/test/authentication/test_key_manager.rb +0 -218
  152. data/test/authentication/test_session.rb +0 -108
  153. data/test/common.rb +0 -108
  154. data/test/configs/eqsign +0 -3
  155. data/test/configs/exact_match +0 -8
  156. data/test/configs/host_plus +0 -10
  157. data/test/configs/multihost +0 -4
  158. data/test/configs/nohost +0 -19
  159. data/test/configs/numeric_host +0 -4
  160. data/test/configs/send_env +0 -2
  161. data/test/configs/substitutes +0 -8
  162. data/test/configs/wild_cards +0 -14
  163. data/test/connection/test_channel.rb +0 -467
  164. data/test/connection/test_session.rb +0 -526
  165. data/test/known_hosts/github +0 -1
  166. data/test/manual/test_forward.rb +0 -223
  167. data/test/start/test_options.rb +0 -36
  168. data/test/start/test_transport.rb +0 -28
  169. data/test/test_all.rb +0 -11
  170. data/test/test_buffer.rb +0 -433
  171. data/test/test_buffered_io.rb +0 -63
  172. data/test/test_config.rb +0 -151
  173. data/test/test_key_factory.rb +0 -173
  174. data/test/test_known_hosts.rb +0 -13
  175. data/test/transport/hmac/test_md5.rb +0 -41
  176. data/test/transport/hmac/test_md5_96.rb +0 -27
  177. data/test/transport/hmac/test_none.rb +0 -34
  178. data/test/transport/hmac/test_ripemd160.rb +0 -36
  179. data/test/transport/hmac/test_sha1.rb +0 -36
  180. data/test/transport/hmac/test_sha1_96.rb +0 -27
  181. data/test/transport/hmac/test_sha2_256.rb +0 -37
  182. data/test/transport/hmac/test_sha2_256_96.rb +0 -27
  183. data/test/transport/hmac/test_sha2_512.rb +0 -37
  184. data/test/transport/hmac/test_sha2_512_96.rb +0 -27
  185. data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
  186. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -146
  187. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -92
  188. data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -34
  189. data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
  190. data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
  191. data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
  192. data/test/transport/test_algorithms.rb +0 -330
  193. data/test/transport/test_cipher_factory.rb +0 -443
  194. data/test/transport/test_hmac.rb +0 -34
  195. data/test/transport/test_identity_cipher.rb +0 -40
  196. data/test/transport/test_packet_stream.rb +0 -1755
  197. data/test/transport/test_server_version.rb +0 -78
  198. data/test/transport/test_session.rb +0 -319
  199. data/test/transport/test_state.rb +0 -181
@@ -1,20 +0,0 @@
1
-
2
- require 'net/ssh'
3
-
4
- # ARCFOUR CHECK
5
- #
6
- # Usage:
7
- # $ ruby support/arcfour_check.rb
8
- #
9
- # Expected Output:
10
- # arcfour128: [16, 8] OpenSSL::Cipher::Cipher
11
- # arcfour256: [32, 8] OpenSSL::Cipher::Cipher
12
- # arcfour512: [64, 8] OpenSSL::Cipher::Cipher
13
-
14
- [['arcfour128', 16], ['arcfour256', 32], ['arcfour512', 64]].each do |cipher|
15
- print "#{cipher[0]}: "
16
- a = Net::SSH::Transport::CipherFactory.get_lengths(cipher[0])
17
- b = Net::SSH::Transport::CipherFactory.get(cipher[0], :key => ([].fill('x', 0, cipher[1]).join))
18
- puts "#{a} #{b.class}"
19
- end
20
-
data/test/README.txt DELETED
@@ -1,47 +0,0 @@
1
- 2011-01-19
2
-
3
- RUNNING TESTS
4
-
5
- Run the test suite from the net-ssh directory with the following command:
6
-
7
- ruby -Ilib -Itest -rrubygems test/test_all.rb
8
-
9
- Run a single test file like this:
10
-
11
- ruby -Ilib -Itest -rrubygems test/transport/test_server_version.rb
12
-
13
-
14
- EXPECTED RESULTS
15
-
16
- * Ruby 1.9: all tests pass
17
-
18
- * Ruby 1.8: all tests pass (up until version 2.5)
19
-
20
- * JRuby 1.7: 98% test pass (510 tests, 1914 assertions, 2 failures, 9 errors)
21
-
22
- * JRuby 1.6: 98% test pass (510 tests, 1914 assertions, 4 failures, 5 errors)
23
-
24
- * JRuby 1.5: 98% tests pass (510 tests, 1914 assertions, 5 failures, 5 errors)
25
-
26
-
27
- PORT FORWARDING TESTS
28
-
29
- ruby -Ilib -Itest -rrubygems test/manual/test_forward.rb
30
-
31
- test_forward.rb must be run separately from the test suite because
32
- it requires authorizing your public SSH keys on you localhost.
33
-
34
- If you already have keys you can do this:
35
-
36
- cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
37
-
38
- If you don't have keys see:
39
-
40
- http://kimmo.suominen.com/docs/ssh/#ssh-keygen
41
-
42
- You should now be able to login to your localhost with out
43
- bring prompted for a password:
44
-
45
- ssh localhost
46
-
47
- -Delano
@@ -1,28 +0,0 @@
1
- module Authentication; module Methods
2
-
3
- module Common
4
- include Net::SSH::Authentication::Constants
5
-
6
- private
7
-
8
- def socket(options={})
9
- @socket ||= stub("socket", :client_name => "me.ssh.test")
10
- end
11
-
12
- def transport(options={})
13
- @transport ||= MockTransport.new(options.merge(:socket => socket))
14
- end
15
-
16
- def session(options={})
17
- @session ||= begin
18
- sess = stub("auth-session", :logger => nil, :transport => transport(options))
19
- def sess.next_message
20
- transport.next_message
21
- end
22
- sess
23
- end
24
- end
25
-
26
- end
27
-
28
- end; end
@@ -1,51 +0,0 @@
1
- require 'common'
2
- require 'authentication/methods/common'
3
- require 'net/ssh/authentication/methods/abstract'
4
-
5
- module Authentication; module Methods
6
-
7
- class TestAbstract < Test::Unit::TestCase
8
- include Common
9
-
10
- def test_constructor_should_set_defaults
11
- assert_nil subject.key_manager
12
- end
13
-
14
- def test_constructor_should_honor_options
15
- assert_equal :manager, subject(:key_manager => :manager).key_manager
16
- end
17
-
18
- def test_session_id_should_query_session_id_from_key_exchange
19
- transport.stubs(:algorithms).returns(stub("algorithms", :session_id => "abcxyz123"))
20
- assert_equal "abcxyz123", subject.session_id
21
- end
22
-
23
- def test_send_message_should_delegate_to_transport
24
- transport.expects(:send_message).with("abcxyz123")
25
- subject.send_message("abcxyz123")
26
- end
27
-
28
- def test_userauth_request_should_build_well_formed_userauth_packet
29
- packet = subject.userauth_request("jamis", "ssh-connection", "password")
30
- assert_equal "\062\0\0\0\005jamis\0\0\0\016ssh-connection\0\0\0\010password", packet.to_s
31
- end
32
-
33
- def test_userauth_request_should_translate_extra_booleans_onto_end
34
- packet = subject.userauth_request("jamis", "ssh-connection", "password", true, false)
35
- assert_equal "\062\0\0\0\005jamis\0\0\0\016ssh-connection\0\0\0\010password\1\0", packet.to_s
36
- end
37
-
38
- def test_userauth_request_should_translate_extra_strings_onto_end
39
- packet = subject.userauth_request("jamis", "ssh-connection", "password", "foo", "bar")
40
- assert_equal "\062\0\0\0\005jamis\0\0\0\016ssh-connection\0\0\0\010password\0\0\0\3foo\0\0\0\3bar", packet.to_s
41
- end
42
-
43
- private
44
-
45
- def subject(options={})
46
- @subject ||= Net::SSH::Authentication::Methods::Abstract.new(session(options), options)
47
- end
48
-
49
- end
50
-
51
- end; end
@@ -1,114 +0,0 @@
1
- require 'common'
2
- require 'net/ssh/authentication/methods/hostbased'
3
- require 'authentication/methods/common'
4
-
5
- module Authentication; module Methods
6
-
7
- class TestHostbased < Test::Unit::TestCase
8
- include Common
9
-
10
- def test_authenticate_should_return_false_when_no_key_manager_has_been_set
11
- assert_equal false, subject(:key_manager => nil).authenticate("ssh-connection", "jamis")
12
- end
13
-
14
- def test_authenticate_should_return_false_when_key_manager_has_no_keys
15
- assert_equal false, subject(:keys => []).authenticate("ssh-connection", "jamis")
16
- end
17
-
18
- def test_authenticate_should_return_false_if_no_keys_can_authenticate
19
- ENV.stubs(:[]).with('USER').returns(nil)
20
- key_manager.expects(:sign).with(&signature_parameters(keys.first)).returns("sig-one")
21
- key_manager.expects(:sign).with(&signature_parameters(keys.last)).returns("sig-two")
22
-
23
- transport.expect do |t, packet|
24
- assert_equal USERAUTH_REQUEST, packet.type
25
- assert verify_userauth_request_packet(packet, keys.first)
26
- assert_equal "sig-one", packet.read_string
27
- t.return(USERAUTH_FAILURE, :string, "hostbased,password")
28
-
29
- t.expect do |t2, packet2|
30
- assert_equal USERAUTH_REQUEST, packet2.type
31
- assert verify_userauth_request_packet(packet2, keys.last)
32
- assert_equal "sig-two", packet2.read_string
33
- t2.return(USERAUTH_FAILURE, :string, "hostbased,password")
34
- end
35
- end
36
-
37
- assert_equal false, subject.authenticate("ssh-connection", "jamis")
38
- end
39
-
40
- def test_authenticate_should_return_true_if_any_key_can_authenticate
41
- ENV.stubs(:[]).with('USER').returns(nil)
42
- key_manager.expects(:sign).with(&signature_parameters(keys.first)).returns("sig-one")
43
-
44
- transport.expect do |t, packet|
45
- assert_equal USERAUTH_REQUEST, packet.type
46
- assert verify_userauth_request_packet(packet, keys.first)
47
- assert_equal "sig-one", packet.read_string
48
- t.return(USERAUTH_SUCCESS)
49
- end
50
-
51
- assert subject.authenticate("ssh-connection", "jamis")
52
- end
53
-
54
- private
55
-
56
- def signature_parameters(key)
57
- Proc.new do |given_key, data|
58
- next false unless given_key.to_blob == key.to_blob
59
- buffer = Net::SSH::Buffer.new(data)
60
- buffer.read_string == "abcxyz123" && # session-id
61
- buffer.read_byte == USERAUTH_REQUEST && # type
62
- verify_userauth_request_packet(buffer, key)
63
- end
64
- end
65
-
66
- def verify_userauth_request_packet(packet, key)
67
- packet.read_string == "jamis" && # user-name
68
- packet.read_string == "ssh-connection" && # next service
69
- packet.read_string == "hostbased" && # auth-method
70
- packet.read_string == key.ssh_type && # key type
71
- packet.read_buffer.read_key.to_blob == key.to_blob && # key
72
- packet.read_string == "me.ssh.test." && # client hostname
73
- packet.read_string == "jamis" # client username
74
- end
75
-
76
- @@keys = nil
77
- def keys
78
- @@keys ||= [OpenSSL::PKey::RSA.new(512), OpenSSL::PKey::DSA.new(512)]
79
- end
80
-
81
- def key_manager(options={})
82
- @key_manager ||= begin
83
- manager = stub("key_manager")
84
- manager.stubs(:each_identity).multiple_yields(*(options[:keys] || keys))
85
- manager
86
- end
87
- end
88
-
89
- def subject(options={})
90
- options[:key_manager] = key_manager(options) unless options.key?(:key_manager)
91
- @subject ||= Net::SSH::Authentication::Methods::Hostbased.new(session(options), options)
92
- end
93
-
94
- def socket(options={})
95
- @socket ||= stub("socket", :client_name => "me.ssh.test")
96
- end
97
-
98
- def transport(options={})
99
- @transport ||= MockTransport.new(options.merge(:socket => socket))
100
- end
101
-
102
- def session(options={})
103
- @session ||= begin
104
- sess = stub("auth-session", :logger => nil, :transport => transport(options))
105
- def sess.next_message
106
- transport.next_message
107
- end
108
- sess
109
- end
110
- end
111
-
112
- end
113
-
114
- end; end
@@ -1,100 +0,0 @@
1
- require 'common'
2
- require 'net/ssh/authentication/methods/keyboard_interactive'
3
- require 'authentication/methods/common'
4
-
5
- module Authentication; module Methods
6
-
7
- class TestKeyboardInteractive < Test::Unit::TestCase
8
- include Common
9
-
10
- USERAUTH_INFO_REQUEST = 60
11
- USERAUTH_INFO_RESPONSE = 61
12
-
13
- def test_authenticate_should_raise_if_keyboard_interactive_disallowed
14
- transport.expect do |t,packet|
15
- assert_equal USERAUTH_REQUEST, packet.type
16
- assert_equal "jamis", packet.read_string
17
- assert_equal "ssh-connection", packet.read_string
18
- assert_equal "keyboard-interactive", packet.read_string
19
- assert_equal "", packet.read_string # language tags
20
- assert_equal "", packet.read_string # submethods
21
-
22
- t.return(USERAUTH_FAILURE, :string, "password")
23
- end
24
-
25
- assert_raises Net::SSH::Authentication::DisallowedMethod do
26
- subject.authenticate("ssh-connection", "jamis")
27
- end
28
- end
29
-
30
- def test_authenticate_should_be_false_if_given_password_is_not_accepted
31
- transport.expect do |t,packet|
32
- assert_equal USERAUTH_REQUEST, packet.type
33
- t.return(USERAUTH_INFO_REQUEST, :string, "", :string, "", :string, "", :long, 1, :string, "Password:", :bool, false)
34
- t.expect do |t2,packet2|
35
- assert_equal USERAUTH_INFO_RESPONSE, packet2.type
36
- assert_equal 1, packet2.read_long
37
- assert_equal "the-password", packet2.read_string
38
- t2.return(USERAUTH_FAILURE, :string, "keyboard-interactive")
39
- end
40
- end
41
-
42
- assert_equal false, subject.authenticate("ssh-connection", "jamis", "the-password")
43
- end
44
-
45
- def test_authenticate_should_be_true_if_given_password_is_accepted
46
- transport.expect do |t,packet|
47
- assert_equal USERAUTH_REQUEST, packet.type
48
- t.return(USERAUTH_INFO_REQUEST, :string, "", :string, "", :string, "", :long, 1, :string, "Password:", :bool, false)
49
- t.expect do |t2,packet2|
50
- assert_equal USERAUTH_INFO_RESPONSE, packet2.type
51
- t2.return(USERAUTH_SUCCESS)
52
- end
53
- end
54
-
55
- assert subject.authenticate("ssh-connection", "jamis", "the-password")
56
- end
57
-
58
- def test_authenticate_should_duplicate_password_as_needed_to_fill_request
59
- transport.expect do |t,packet|
60
- assert_equal USERAUTH_REQUEST, packet.type
61
- t.return(USERAUTH_INFO_REQUEST, :string, "", :string, "", :string, "", :long, 2, :string, "Password:", :bool, false, :string, "Again:", :bool, false)
62
- t.expect do |t2,packet2|
63
- assert_equal USERAUTH_INFO_RESPONSE, packet2.type
64
- assert_equal 2, packet2.read_long
65
- assert_equal "the-password", packet2.read_string
66
- assert_equal "the-password", packet2.read_string
67
- t2.return(USERAUTH_SUCCESS)
68
- end
69
- end
70
-
71
- assert subject.authenticate("ssh-connection", "jamis", "the-password")
72
- end
73
-
74
- def test_authenticate_should_prompt_for_input_when_password_is_not_given
75
- subject.expects(:prompt).with("Name:", true).returns("name")
76
- subject.expects(:prompt).with("Password:", false).returns("password")
77
-
78
- transport.expect do |t,packet|
79
- assert_equal USERAUTH_REQUEST, packet.type
80
- t.return(USERAUTH_INFO_REQUEST, :string, "", :string, "", :string, "", :long, 2, :string, "Name:", :bool, true, :string, "Password:", :bool, false)
81
- t.expect do |t2,packet2|
82
- assert_equal USERAUTH_INFO_RESPONSE, packet2.type
83
- assert_equal 2, packet2.read_long
84
- assert_equal "name", packet2.read_string
85
- assert_equal "password", packet2.read_string
86
- t2.return(USERAUTH_SUCCESS)
87
- end
88
- end
89
-
90
- assert subject.authenticate("ssh-connection", "jamis", nil)
91
- end
92
-
93
- private
94
-
95
- def subject(options={})
96
- @subject ||= Net::SSH::Authentication::Methods::KeyboardInteractive.new(session(options), options)
97
- end
98
- end
99
-
100
- end; end
@@ -1,41 +0,0 @@
1
- require 'common'
2
- require 'net/ssh/authentication/methods/none'
3
- require 'authentication/methods/common'
4
-
5
- module Authentication; module Methods
6
-
7
- class TestNone < Test::Unit::TestCase
8
- include Common
9
-
10
- def test_authenticate_should_raise_if_none_disallowed
11
- transport.expect do |t,packet|
12
- assert_equal USERAUTH_REQUEST, packet.type
13
- assert_equal "jamis", packet.read_string
14
- assert_equal "ssh-connection", packet.read_string
15
- assert_equal "none", packet.read_string
16
-
17
- t.return(USERAUTH_FAILURE, :string, "publickey")
18
- end
19
-
20
- assert_raises Net::SSH::Authentication::DisallowedMethod do
21
- subject.authenticate("ssh-connection", "jamis", "pass")
22
- end
23
- end
24
-
25
- def test_authenticate_should_return_true
26
- transport.expect do |t,packet|
27
- assert_equal USERAUTH_REQUEST, packet.type
28
- t.return(USERAUTH_SUCCESS)
29
- end
30
-
31
- assert subject.authenticate("ssh-connection", "", "")
32
- end
33
-
34
- private
35
-
36
- def subject(options={})
37
- @subject ||= Net::SSH::Authentication::Methods::None.new(session(options), options)
38
- end
39
- end
40
-
41
- end; end
@@ -1,52 +0,0 @@
1
- require 'common'
2
- require 'net/ssh/authentication/methods/password'
3
- require 'authentication/methods/common'
4
-
5
- module Authentication; module Methods
6
-
7
- class TestPassword < Test::Unit::TestCase
8
- include Common
9
-
10
- def test_authenticate_should_raise_if_password_disallowed
11
- transport.expect do |t,packet|
12
- assert_equal USERAUTH_REQUEST, packet.type
13
- assert_equal "jamis", packet.read_string
14
- assert_equal "ssh-connection", packet.read_string
15
- assert_equal "password", packet.read_string
16
- assert_equal false, packet.read_bool
17
- assert_equal "the-password", packet.read_string
18
-
19
- t.return(USERAUTH_FAILURE, :string, "publickey")
20
- end
21
-
22
- assert_raises Net::SSH::Authentication::DisallowedMethod do
23
- subject.authenticate("ssh-connection", "jamis", "the-password")
24
- end
25
- end
26
-
27
- def test_authenticate_when_password_is_acceptible_should_return_true
28
- transport.expect do |t,packet|
29
- assert_equal USERAUTH_REQUEST, packet.type
30
- t.return(USERAUTH_SUCCESS)
31
- end
32
-
33
- assert subject.authenticate("ssh-connection", "jamis", "the-password")
34
- end
35
-
36
- def test_authenticate_should_return_false_if_password_change_request_is_received
37
- transport.expect do |t,packet|
38
- assert_equal USERAUTH_REQUEST, packet.type
39
- t.return(USERAUTH_PASSWD_CHANGEREQ, :string, "Change your password:", :string, "")
40
- end
41
-
42
- assert !subject.authenticate("ssh-connection", "jamis", "the-password")
43
- end
44
-
45
- private
46
-
47
- def subject(options={})
48
- @subject ||= Net::SSH::Authentication::Methods::Password.new(session(options), options)
49
- end
50
- end
51
-
52
- end; end
@@ -1,148 +0,0 @@
1
- require 'common'
2
- require 'net/ssh/authentication/methods/publickey'
3
- require 'authentication/methods/common'
4
-
5
- module Authentication; module Methods
6
-
7
- class TestPublickey < Test::Unit::TestCase
8
- include Common
9
-
10
- def test_authenticate_should_return_false_when_no_key_manager_has_been_set
11
- assert_equal false, subject(:key_manager => nil).authenticate("ssh-connection", "jamis")
12
- end
13
-
14
- def test_authenticate_should_return_false_when_key_manager_has_no_keys
15
- assert_equal false, subject(:keys => []).authenticate("ssh-connection", "jamis")
16
- end
17
-
18
- def test_authenticate_should_return_false_if_no_keys_can_authenticate
19
- transport.expect do |t, packet|
20
- assert_equal USERAUTH_REQUEST, packet.type
21
- assert verify_userauth_request_packet(packet, keys.first, false)
22
- t.return(USERAUTH_FAILURE, :string, "hostbased,password")
23
-
24
- t.expect do |t2, packet2|
25
- assert_equal USERAUTH_REQUEST, packet2.type
26
- assert verify_userauth_request_packet(packet2, keys.last, false)
27
- t2.return(USERAUTH_FAILURE, :string, "hostbased,password")
28
- end
29
- end
30
-
31
- assert_equal false, subject.authenticate("ssh-connection", "jamis")
32
- end
33
-
34
- def test_authenticate_should_raise_if_publickey_disallowed
35
- key_manager.expects(:sign).with(&signature_parameters(keys.first)).returns("sig-one")
36
-
37
- transport.expect do |t, packet|
38
- assert_equal USERAUTH_REQUEST, packet.type
39
- assert verify_userauth_request_packet(packet, keys.first, false)
40
- t.return(USERAUTH_PK_OK, :string, keys.first.ssh_type, :string, Net::SSH::Buffer.from(:key, keys.first))
41
-
42
- t.expect do |t2,packet2|
43
- assert_equal USERAUTH_REQUEST, packet2.type
44
- assert verify_userauth_request_packet(packet2, keys.first, true)
45
- assert_equal "sig-one", packet2.read_string
46
- t2.return(USERAUTH_FAILURE, :string, "hostbased,password")
47
- end
48
- end
49
-
50
- assert_raises Net::SSH::Authentication::DisallowedMethod do
51
- subject.authenticate("ssh-connection", "jamis")
52
- end
53
- end
54
-
55
- def test_authenticate_should_return_false_if_signature_exchange_fails
56
- key_manager.expects(:sign).with(&signature_parameters(keys.first)).returns("sig-one")
57
- key_manager.expects(:sign).with(&signature_parameters(keys.last)).returns("sig-two")
58
-
59
- transport.expect do |t, packet|
60
- assert_equal USERAUTH_REQUEST, packet.type
61
- assert verify_userauth_request_packet(packet, keys.first, false)
62
- t.return(USERAUTH_PK_OK, :string, keys.first.ssh_type, :string, Net::SSH::Buffer.from(:key, keys.first))
63
-
64
- t.expect do |t2,packet2|
65
- assert_equal USERAUTH_REQUEST, packet2.type
66
- assert verify_userauth_request_packet(packet2, keys.first, true)
67
- assert_equal "sig-one", packet2.read_string
68
- t2.return(USERAUTH_FAILURE, :string, "publickey")
69
-
70
- t2.expect do |t3, packet3|
71
- assert_equal USERAUTH_REQUEST, packet3.type
72
- assert verify_userauth_request_packet(packet3, keys.last, false)
73
- t3.return(USERAUTH_PK_OK, :string, keys.last.ssh_type, :string, Net::SSH::Buffer.from(:key, keys.last))
74
-
75
- t3.expect do |t4,packet4|
76
- assert_equal USERAUTH_REQUEST, packet4.type
77
- assert verify_userauth_request_packet(packet4, keys.last, true)
78
- assert_equal "sig-two", packet4.read_string
79
- t4.return(USERAUTH_FAILURE, :string, "publickey")
80
- end
81
- end
82
- end
83
- end
84
-
85
- assert !subject.authenticate("ssh-connection", "jamis")
86
- end
87
-
88
- def test_authenticate_should_return_true_if_any_key_can_authenticate
89
- key_manager.expects(:sign).with(&signature_parameters(keys.first)).returns("sig-one")
90
-
91
- transport.expect do |t, packet|
92
- assert_equal USERAUTH_REQUEST, packet.type
93
- assert verify_userauth_request_packet(packet, keys.first, false)
94
- t.return(USERAUTH_PK_OK, :string, keys.first.ssh_type, :string, Net::SSH::Buffer.from(:key, keys.first))
95
-
96
- t.expect do |t2,packet2|
97
- assert_equal USERAUTH_REQUEST, packet2.type
98
- assert verify_userauth_request_packet(packet2, keys.first, true)
99
- assert_equal "sig-one", packet2.read_string
100
- t2.return(USERAUTH_SUCCESS)
101
- end
102
- end
103
-
104
- assert subject.authenticate("ssh-connection", "jamis")
105
- end
106
-
107
- private
108
-
109
- def signature_parameters(key)
110
- Proc.new do |given_key, data|
111
- next false unless given_key.to_blob == key.to_blob
112
- buffer = Net::SSH::Buffer.new(data)
113
- buffer.read_string == "abcxyz123" && # session-id
114
- buffer.read_byte == USERAUTH_REQUEST && # type
115
- verify_userauth_request_packet(buffer, key, true)
116
- end
117
- end
118
-
119
- def verify_userauth_request_packet(packet, key, has_sig)
120
- packet.read_string == "jamis" && # user-name
121
- packet.read_string == "ssh-connection" && # next service
122
- packet.read_string == "publickey" && # auth-method
123
- packet.read_bool == has_sig && # whether a signature is appended
124
- packet.read_string == key.ssh_type && # ssh key type
125
- packet.read_buffer.read_key.to_blob == key.to_blob # key
126
- end
127
-
128
- @@keys = nil
129
- def keys
130
- @@keys ||= [OpenSSL::PKey::RSA.new(512), OpenSSL::PKey::DSA.new(512)]
131
- end
132
-
133
- def key_manager(options={})
134
- @key_manager ||= begin
135
- manager = stub("key_manager")
136
- manager.stubs(:each_identity).multiple_yields(*(options[:keys] || keys))
137
- manager
138
- end
139
- end
140
-
141
- def subject(options={})
142
- options[:key_manager] = key_manager(options) unless options.key?(:key_manager)
143
- @subject ||= Net::SSH::Authentication::Methods::Publickey.new(session(options), options)
144
- end
145
-
146
- end
147
-
148
- end; end