net-ssh 1.1.4 → 2.0.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 (297) hide show
  1. data/CHANGELOG.rdoc +37 -0
  2. data/Manifest +101 -0
  3. data/README.rdoc +110 -0
  4. data/Rakefile +26 -0
  5. data/{THANKS → THANKS.rdoc} +2 -5
  6. data/lib/net/ssh.rb +189 -57
  7. data/lib/net/ssh/authentication/agent.rb +175 -0
  8. data/lib/net/ssh/authentication/constants.rb +18 -0
  9. data/lib/net/ssh/authentication/key_manager.rb +166 -0
  10. data/lib/net/ssh/authentication/methods/abstract.rb +60 -0
  11. data/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
  12. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
  13. data/lib/net/ssh/authentication/methods/password.rb +39 -0
  14. data/lib/net/ssh/authentication/methods/publickey.rb +92 -0
  15. data/lib/net/ssh/authentication/pageant.rb +176 -0
  16. data/lib/net/ssh/authentication/session.rb +116 -0
  17. data/lib/net/ssh/buffer.rb +339 -0
  18. data/lib/net/ssh/buffered_io.rb +149 -0
  19. data/lib/net/ssh/config.rb +173 -0
  20. data/lib/net/ssh/connection/channel.rb +575 -454
  21. data/lib/net/ssh/connection/constants.rb +31 -45
  22. data/lib/net/ssh/connection/session.rb +569 -0
  23. data/lib/net/ssh/connection/term.rb +176 -88
  24. data/lib/net/ssh/errors.rb +83 -61
  25. data/lib/net/ssh/key_factory.rb +85 -0
  26. data/lib/net/ssh/known_hosts.rb +129 -0
  27. data/lib/net/ssh/loggable.rb +61 -0
  28. data/lib/net/ssh/packet.rb +102 -0
  29. data/lib/net/ssh/prompt.rb +93 -0
  30. data/lib/net/ssh/proxy/errors.rb +8 -28
  31. data/lib/net/ssh/proxy/http.rb +75 -107
  32. data/lib/net/ssh/proxy/socks4.rb +35 -48
  33. data/lib/net/ssh/proxy/socks5.rb +76 -108
  34. data/lib/net/ssh/service/forward.rb +267 -0
  35. data/lib/net/ssh/test.rb +89 -0
  36. data/lib/net/ssh/test/channel.rb +129 -0
  37. data/lib/net/ssh/test/extensions.rb +152 -0
  38. data/lib/net/ssh/test/kex.rb +44 -0
  39. data/lib/net/ssh/test/local_packet.rb +51 -0
  40. data/lib/net/ssh/test/packet.rb +81 -0
  41. data/lib/net/ssh/test/remote_packet.rb +38 -0
  42. data/lib/net/ssh/test/script.rb +157 -0
  43. data/lib/net/ssh/test/socket.rb +59 -0
  44. data/lib/net/ssh/transport/algorithms.rb +384 -0
  45. data/lib/net/ssh/transport/cipher_factory.rb +72 -0
  46. data/lib/net/ssh/transport/constants.rb +22 -58
  47. data/lib/net/ssh/transport/hmac.rb +31 -0
  48. data/lib/net/ssh/transport/hmac/abstract.rb +48 -0
  49. data/lib/net/ssh/transport/hmac/md5.rb +12 -0
  50. data/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
  51. data/lib/net/ssh/transport/hmac/none.rb +15 -0
  52. data/lib/net/ssh/transport/hmac/sha1.rb +13 -0
  53. data/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
  54. data/lib/net/ssh/transport/identity_cipher.rb +40 -0
  55. data/lib/net/ssh/transport/kex.rb +13 -0
  56. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
  57. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
  58. data/lib/net/ssh/{util → transport}/openssl.rb +22 -40
  59. data/lib/net/ssh/transport/packet_stream.rb +230 -0
  60. data/lib/net/ssh/transport/server_version.rb +61 -0
  61. data/lib/net/ssh/transport/session.rb +225 -303
  62. data/lib/net/ssh/transport/state.rb +170 -0
  63. data/lib/net/ssh/verifiers/lenient.rb +30 -0
  64. data/lib/net/ssh/verifiers/null.rb +12 -0
  65. data/lib/net/ssh/verifiers/strict.rb +53 -0
  66. data/lib/net/ssh/version.rb +57 -26
  67. data/net-ssh.gemspec +54 -0
  68. data/setup.rb +1585 -0
  69. data/test/authentication/methods/common.rb +28 -0
  70. data/test/authentication/methods/test_abstract.rb +51 -0
  71. data/test/authentication/methods/test_hostbased.rb +108 -0
  72. data/test/authentication/methods/test_keyboard_interactive.rb +98 -0
  73. data/test/authentication/methods/test_password.rb +50 -0
  74. data/test/authentication/methods/test_publickey.rb +123 -0
  75. data/test/authentication/test_agent.rb +205 -0
  76. data/test/authentication/test_key_manager.rb +100 -0
  77. data/test/authentication/test_session.rb +93 -0
  78. data/test/common.rb +106 -0
  79. data/test/configs/exact_match +8 -0
  80. data/test/configs/wild_cards +14 -0
  81. data/test/connection/test_channel.rb +452 -0
  82. data/test/connection/test_session.rb +483 -0
  83. data/test/test_all.rb +6 -0
  84. data/test/test_buffer.rb +336 -0
  85. data/test/test_buffered_io.rb +63 -0
  86. data/test/test_config.rb +78 -0
  87. data/test/test_key_factory.rb +67 -0
  88. data/test/transport/hmac/test_md5.rb +34 -0
  89. data/test/transport/hmac/test_md5_96.rb +25 -0
  90. data/test/transport/hmac/test_none.rb +34 -0
  91. data/test/transport/hmac/test_sha1.rb +34 -0
  92. data/test/transport/hmac/test_sha1_96.rb +25 -0
  93. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
  94. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
  95. data/test/transport/test_algorithms.rb +302 -0
  96. data/test/transport/test_cipher_factory.rb +163 -0
  97. data/test/transport/test_hmac.rb +34 -0
  98. data/test/transport/test_identity_cipher.rb +40 -0
  99. data/test/transport/test_packet_stream.rb +433 -0
  100. data/test/transport/test_server_version.rb +55 -0
  101. data/test/transport/test_session.rb +312 -0
  102. data/test/transport/test_state.rb +173 -0
  103. metadata +102 -253
  104. data/ChangeLog +0 -560
  105. data/LICENSE +0 -7
  106. data/NEWS +0 -152
  107. data/README +0 -14
  108. data/bin/rb-keygen +0 -210
  109. data/doc/LICENSE-BSD +0 -27
  110. data/doc/LICENSE-GPL +0 -280
  111. data/doc/LICENSE-RUBY +0 -56
  112. data/doc/manual-html/chapter-1.html +0 -388
  113. data/doc/manual-html/chapter-2.html +0 -552
  114. data/doc/manual-html/chapter-3.html +0 -470
  115. data/doc/manual-html/chapter-4.html +0 -413
  116. data/doc/manual-html/chapter-5.html +0 -525
  117. data/doc/manual-html/chapter-6.html +0 -456
  118. data/doc/manual-html/chapter-7.html +0 -343
  119. data/doc/manual-html/index.html +0 -235
  120. data/doc/manual-html/stylesheets/manual.css +0 -270
  121. data/doc/manual-html/stylesheets/ruby.css +0 -17
  122. data/doc/manual/chapter.erb +0 -38
  123. data/doc/manual/example.erb +0 -18
  124. data/doc/manual/index.erb +0 -29
  125. data/doc/manual/manual.rb +0 -311
  126. data/doc/manual/manual.yml +0 -73
  127. data/doc/manual/page.erb +0 -87
  128. data/doc/manual/parts/0000.txt +0 -5
  129. data/doc/manual/parts/0001.txt +0 -3
  130. data/doc/manual/parts/0002.txt +0 -40
  131. data/doc/manual/parts/0003.txt +0 -6
  132. data/doc/manual/parts/0004.txt +0 -7
  133. data/doc/manual/parts/0005.txt +0 -1
  134. data/doc/manual/parts/0006.txt +0 -49
  135. data/doc/manual/parts/0007.txt +0 -67
  136. data/doc/manual/parts/0008.txt +0 -43
  137. data/doc/manual/parts/0009.txt +0 -14
  138. data/doc/manual/parts/0010.txt +0 -7
  139. data/doc/manual/parts/0011.txt +0 -14
  140. data/doc/manual/parts/0012.txt +0 -3
  141. data/doc/manual/parts/0013.txt +0 -20
  142. data/doc/manual/parts/0014.txt +0 -32
  143. data/doc/manual/parts/0015.txt +0 -14
  144. data/doc/manual/parts/0016.txt +0 -28
  145. data/doc/manual/parts/0017.txt +0 -50
  146. data/doc/manual/parts/0018.txt +0 -35
  147. data/doc/manual/parts/0019.txt +0 -7
  148. data/doc/manual/parts/0020.txt +0 -72
  149. data/doc/manual/parts/0021.txt +0 -50
  150. data/doc/manual/parts/0022.txt +0 -42
  151. data/doc/manual/parts/0023.txt +0 -51
  152. data/doc/manual/parts/0024.txt +0 -18
  153. data/doc/manual/parts/0025.txt +0 -18
  154. data/doc/manual/parts/0026.txt +0 -15
  155. data/doc/manual/parts/0027.txt +0 -37
  156. data/doc/manual/parts/0028.txt +0 -16
  157. data/doc/manual/parts/0029.txt +0 -1
  158. data/doc/manual/parts/0030.txt +0 -52
  159. data/doc/manual/parts/0031.txt +0 -25
  160. data/doc/manual/stylesheets/manual.css +0 -270
  161. data/doc/manual/stylesheets/ruby.css +0 -17
  162. data/doc/manual/tutorial.erb +0 -30
  163. data/examples/auth-forward.rb +0 -41
  164. data/examples/channel-demo.rb +0 -81
  165. data/examples/port-forward.rb +0 -51
  166. data/examples/process-demo.rb +0 -91
  167. data/examples/remote-net-port-forward.rb +0 -45
  168. data/examples/remote-port-forward.rb +0 -80
  169. data/examples/shell-demo.rb +0 -46
  170. data/examples/ssh-client.rb +0 -67
  171. data/examples/sync-shell-demo.rb +0 -69
  172. data/examples/tail-demo.rb +0 -49
  173. data/lib/net/ssh/connection/driver.rb +0 -446
  174. data/lib/net/ssh/connection/services.rb +0 -72
  175. data/lib/net/ssh/host-key-verifier.rb +0 -52
  176. data/lib/net/ssh/known-hosts.rb +0 -96
  177. data/lib/net/ssh/lenient-host-key-verifier.rb +0 -25
  178. data/lib/net/ssh/null-host-key-verifier.rb +0 -14
  179. data/lib/net/ssh/service/agentforward/driver.rb +0 -78
  180. data/lib/net/ssh/service/agentforward/services.rb +0 -41
  181. data/lib/net/ssh/service/forward/driver.rb +0 -319
  182. data/lib/net/ssh/service/forward/local-network-handler.rb +0 -71
  183. data/lib/net/ssh/service/forward/remote-network-handler.rb +0 -83
  184. data/lib/net/ssh/service/forward/services.rb +0 -76
  185. data/lib/net/ssh/service/process/driver.rb +0 -153
  186. data/lib/net/ssh/service/process/open.rb +0 -193
  187. data/lib/net/ssh/service/process/popen3.rb +0 -178
  188. data/lib/net/ssh/service/process/services.rb +0 -66
  189. data/lib/net/ssh/service/services.rb +0 -60
  190. data/lib/net/ssh/service/shell/driver.rb +0 -86
  191. data/lib/net/ssh/service/shell/services.rb +0 -54
  192. data/lib/net/ssh/service/shell/shell.rb +0 -222
  193. data/lib/net/ssh/service/shell/sync.rb +0 -114
  194. data/lib/net/ssh/session.rb +0 -305
  195. data/lib/net/ssh/transport/algorithm-negotiator.rb +0 -275
  196. data/lib/net/ssh/transport/compress/compressor.rb +0 -53
  197. data/lib/net/ssh/transport/compress/decompressor.rb +0 -53
  198. data/lib/net/ssh/transport/compress/none-compressor.rb +0 -39
  199. data/lib/net/ssh/transport/compress/none-decompressor.rb +0 -39
  200. data/lib/net/ssh/transport/compress/services.rb +0 -68
  201. data/lib/net/ssh/transport/compress/zlib-compressor.rb +0 -60
  202. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +0 -52
  203. data/lib/net/ssh/transport/errors.rb +0 -47
  204. data/lib/net/ssh/transport/identity-cipher.rb +0 -61
  205. data/lib/net/ssh/transport/kex/dh-gex.rb +0 -106
  206. data/lib/net/ssh/transport/kex/dh.rb +0 -249
  207. data/lib/net/ssh/transport/kex/services.rb +0 -62
  208. data/lib/net/ssh/transport/ossl/buffer-factory.rb +0 -52
  209. data/lib/net/ssh/transport/ossl/buffer.rb +0 -87
  210. data/lib/net/ssh/transport/ossl/cipher-factory.rb +0 -98
  211. data/lib/net/ssh/transport/ossl/digest-factory.rb +0 -51
  212. data/lib/net/ssh/transport/ossl/hmac-factory.rb +0 -71
  213. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +0 -62
  214. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +0 -44
  215. data/lib/net/ssh/transport/ossl/hmac/md5.rb +0 -46
  216. data/lib/net/ssh/transport/ossl/hmac/none.rb +0 -46
  217. data/lib/net/ssh/transport/ossl/hmac/services.rb +0 -68
  218. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +0 -44
  219. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +0 -45
  220. data/lib/net/ssh/transport/ossl/key-factory.rb +0 -116
  221. data/lib/net/ssh/transport/ossl/services.rb +0 -149
  222. data/lib/net/ssh/transport/packet-stream.rb +0 -236
  223. data/lib/net/ssh/transport/services.rb +0 -146
  224. data/lib/net/ssh/transport/version-negotiator.rb +0 -73
  225. data/lib/net/ssh/userauth/agent.rb +0 -222
  226. data/lib/net/ssh/userauth/constants.rb +0 -35
  227. data/lib/net/ssh/userauth/driver.rb +0 -183
  228. data/lib/net/ssh/userauth/methods/hostbased.rb +0 -119
  229. data/lib/net/ssh/userauth/methods/keyboard-interactive.rb +0 -104
  230. data/lib/net/ssh/userauth/methods/password.rb +0 -70
  231. data/lib/net/ssh/userauth/methods/publickey.rb +0 -137
  232. data/lib/net/ssh/userauth/methods/services.rb +0 -90
  233. data/lib/net/ssh/userauth/pageant.rb +0 -197
  234. data/lib/net/ssh/userauth/services.rb +0 -141
  235. data/lib/net/ssh/userauth/userkeys.rb +0 -258
  236. data/lib/net/ssh/util/buffer.rb +0 -274
  237. data/lib/net/ssh/util/prompter.rb +0 -73
  238. data/test/ALL-TESTS.rb +0 -18
  239. data/test/connection/tc_channel.rb +0 -136
  240. data/test/connection/tc_driver.rb +0 -287
  241. data/test/connection/tc_integration.rb +0 -87
  242. data/test/proxy/tc_http.rb +0 -209
  243. data/test/proxy/tc_socks4.rb +0 -148
  244. data/test/proxy/tc_socks5.rb +0 -214
  245. data/test/service/agentforward/tc_driver.rb +0 -138
  246. data/test/service/forward/tc_driver.rb +0 -289
  247. data/test/service/forward/tc_local_network_handler.rb +0 -123
  248. data/test/service/forward/tc_remote_network_handler.rb +0 -111
  249. data/test/service/process/tc_driver.rb +0 -79
  250. data/test/service/process/tc_integration.rb +0 -119
  251. data/test/service/process/tc_open.rb +0 -179
  252. data/test/service/process/tc_popen3.rb +0 -164
  253. data/test/tc_integration.rb +0 -80
  254. data/test/transport/compress/tc_none_compress.rb +0 -41
  255. data/test/transport/compress/tc_none_decompress.rb +0 -45
  256. data/test/transport/compress/tc_zlib_compress.rb +0 -61
  257. data/test/transport/compress/tc_zlib_decompress.rb +0 -48
  258. data/test/transport/kex/tc_dh.rb +0 -312
  259. data/test/transport/kex/tc_dh_gex.rb +0 -71
  260. data/test/transport/ossl/fixtures/dsa-encrypted +0 -15
  261. data/test/transport/ossl/fixtures/dsa-encrypted-bad +0 -15
  262. data/test/transport/ossl/fixtures/dsa-unencrypted +0 -12
  263. data/test/transport/ossl/fixtures/dsa-unencrypted-bad +0 -12
  264. data/test/transport/ossl/fixtures/dsa-unencrypted.pub +0 -1
  265. data/test/transport/ossl/fixtures/not-a-private-key +0 -4
  266. data/test/transport/ossl/fixtures/not-supported +0 -2
  267. data/test/transport/ossl/fixtures/rsa-encrypted +0 -18
  268. data/test/transport/ossl/fixtures/rsa-encrypted-bad +0 -18
  269. data/test/transport/ossl/fixtures/rsa-unencrypted +0 -15
  270. data/test/transport/ossl/fixtures/rsa-unencrypted-bad +0 -15
  271. data/test/transport/ossl/fixtures/rsa-unencrypted.pub +0 -1
  272. data/test/transport/ossl/hmac/tc_hmac.rb +0 -58
  273. data/test/transport/ossl/hmac/tc_md5.rb +0 -50
  274. data/test/transport/ossl/hmac/tc_md5_96.rb +0 -50
  275. data/test/transport/ossl/hmac/tc_none.rb +0 -50
  276. data/test/transport/ossl/hmac/tc_sha1.rb +0 -50
  277. data/test/transport/ossl/hmac/tc_sha1_96.rb +0 -50
  278. data/test/transport/ossl/tc_buffer.rb +0 -97
  279. data/test/transport/ossl/tc_buffer_factory.rb +0 -67
  280. data/test/transport/ossl/tc_cipher_factory.rb +0 -84
  281. data/test/transport/ossl/tc_digest_factory.rb +0 -39
  282. data/test/transport/ossl/tc_hmac_factory.rb +0 -72
  283. data/test/transport/ossl/tc_key_factory.rb +0 -199
  284. data/test/transport/tc_algorithm_negotiator.rb +0 -170
  285. data/test/transport/tc_identity_cipher.rb +0 -52
  286. data/test/transport/tc_integration.rb +0 -115
  287. data/test/transport/tc_packet_stream.rb +0 -184
  288. data/test/transport/tc_session.rb +0 -296
  289. data/test/transport/tc_version_negotiator.rb +0 -86
  290. data/test/userauth/methods/tc_hostbased.rb +0 -136
  291. data/test/userauth/methods/tc_password.rb +0 -89
  292. data/test/userauth/methods/tc_publickey.rb +0 -167
  293. data/test/userauth/tc_agent.rb +0 -223
  294. data/test/userauth/tc_driver.rb +0 -190
  295. data/test/userauth/tc_integration.rb +0 -97
  296. data/test/userauth/tc_userkeys.rb +0 -265
  297. data/test/util/tc_buffer.rb +0 -217
@@ -1,89 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- $:.unshift "#{File.dirname(__FILE__)}/../../../lib"
18
-
19
- require 'net/ssh/userauth/methods/password'
20
- require 'net/ssh/util/buffer'
21
- require 'test/unit'
22
- require 'ostruct'
23
-
24
- class TC_Methods_Password < Test::Unit::TestCase
25
-
26
- class Buffers
27
- def writer
28
- Net::SSH::Util::WriterBuffer.new
29
- end
30
- end
31
-
32
- class Messenger
33
- attr_reader :data
34
- attr_reader :messages
35
-
36
- def initialize
37
- @data = []
38
- @messages = []
39
- end
40
-
41
- def send_message( msg )
42
- @messages << msg.to_s
43
- end
44
-
45
- def wait_for_message
46
- @data.shift
47
- end
48
- end
49
-
50
- def setup
51
- buffers = Buffers.new
52
- @messenger = Messenger.new
53
- @password = Net::SSH::UserAuth::Methods::Password.new( buffers )
54
- @password.messenger = @messenger
55
- end
56
-
57
- def test_authenticate_no_password
58
- assert !@password.authenticate( "test", "test_user" )
59
- assert @messenger.messages.empty?
60
- end
61
-
62
- def test_authenticate_success
63
- @messenger.data << OpenStruct.new( :message_type => 52 )
64
- assert @password.authenticate( "test", "test_user", :password => "passwd" )
65
- assert_equal 1, @messenger.messages.length
66
- assert_equal "#{50.chr}\0\0\0\11test_user\0\0\0\4test\0\0\0\10password\0\0\0\0\6passwd",
67
- @messenger.messages.last
68
- end
69
-
70
- def test_authenticate_failure
71
- @messenger.data << OpenStruct.new( :message_type => 51 )
72
- assert !@password.authenticate( "test", "test_user", :password => "passwd" )
73
- assert !@messenger.messages.empty?
74
- end
75
-
76
- def test_authenticate_passwd_changereq
77
- @messenger.data << OpenStruct.new( :message_type => 60 )
78
- assert !@password.authenticate( "test", "test_user", :password => "passwd" )
79
- assert !@messenger.messages.empty?
80
- end
81
-
82
- def test_authenticate_bad_reply
83
- @messenger.data << OpenStruct.new( :message_type => 0 )
84
- assert_raise( Net::SSH::Exception ) do
85
- @password.authenticate( "test", "test_user", :password=>"passwd" )
86
- end
87
- end
88
-
89
- end
@@ -1,167 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- $:.unshift "#{File.dirname(__FILE__)}/../../../lib"
18
-
19
- require 'net/ssh/userauth/methods/publickey'
20
- require 'net/ssh/util/buffer'
21
- require 'test/unit'
22
- require 'ostruct'
23
-
24
- class TC_Methods_PublicKey < Test::Unit::TestCase
25
-
26
- class Buffers
27
- def writer
28
- Net::SSH::Util::WriterBuffer.new
29
- end
30
- end
31
-
32
- class Key < OpenStruct
33
- def initialize( e, n )
34
- super( :ssh_type => "ssh-rsa",
35
- :e => OpenStruct.new( :to_ssh => [ e ].pack("N") ),
36
- :n => OpenStruct.new( :to_ssh => [ n ].pack("N") ) )
37
- end
38
- end
39
-
40
- class Messenger
41
- attr_reader :data
42
- attr_reader :messages
43
-
44
- def initialize
45
- @data = []
46
- @messages = []
47
- end
48
-
49
- def send_message( msg )
50
- @messages << msg.to_s
51
- end
52
-
53
- def wait_for_message
54
- @data.shift
55
- end
56
- end
57
-
58
- class KeyManager
59
- attr_reader :identities
60
- attr_reader :state
61
- attr_reader :sigdata
62
-
63
- def initialize( *identities )
64
- @identities = identities.flatten
65
- @state = :open
66
- end
67
-
68
- def sign( identity, data )
69
- @sigdata = [ identity, data.to_s ]
70
- "<signature>"
71
- end
72
-
73
- def finish
74
- @state = :finished
75
- end
76
- end
77
-
78
- def setup
79
- buffers = Buffers.new
80
- @messenger = Messenger.new
81
- @method = Net::SSH::UserAuth::Methods::PublicKey.new( buffers )
82
- @method.messenger = @messenger
83
- @method.session_id = "test"
84
- end
85
-
86
- def test_authenticate_no_key_manager
87
- assert !@method.authenticate( "test", "test_user" )
88
- assert @messenger.messages.empty?
89
- end
90
-
91
- def test_authenticate_no_identities
92
- manager = KeyManager.new
93
- assert !@method.authenticate( "test", "test_user", :key_manager => manager )
94
- assert_equal :finished, manager.state
95
- end
96
-
97
- def test_authenticate_no_acceptible_identities
98
- manager = KeyManager.new( Key.new( 0x01010101, 0x02020202 ),
99
- Key.new( 0x03030303, 0x04040404 ) )
100
- @messenger.data.concat [ OpenStruct.new( :message_type => 51 ),
101
- OpenStruct.new( :message_type => 51 ) ]
102
- assert !@method.authenticate( "test", "test_user", :key_manager => manager )
103
- assert_equal :finished, manager.state
104
- assert_equal 2, @messenger.messages.length
105
-
106
- packet1 = "#{50.chr}\0\0\0\11test_user\0\0\0\4test\0\0\0\11publickey\0\0\0\0\7ssh-rsa" +
107
- "\0\0\0\23\0\0\0\7ssh-rsa\1\1\1\1\2\2\2\2"
108
- assert_equal packet1, @messenger.messages[0]
109
-
110
- packet2 = "#{50.chr}\0\0\0\11test_user\0\0\0\4test\0\0\0\11publickey\0\0\0\0\7ssh-rsa" +
111
- "\0\0\0\23\0\0\0\7ssh-rsa\3\3\3\3\4\4\4\4"
112
- assert_equal packet2, @messenger.messages[1]
113
- end
114
-
115
- def test_authenticate_unexpected_reply
116
- manager = KeyManager.new( Key.new( 0x01010101, 0x02020202 ) )
117
- @messenger.data.concat [ OpenStruct.new( :message_type => 0 ) ]
118
- assert_raise( Net::SSH::Exception ) do
119
- @method.authenticate( "test", "test_user", :key_manager => manager )
120
- end
121
- assert_equal :finished, manager.state
122
- end
123
-
124
- def test_authenticate_acceptible_identities_fail
125
- manager = KeyManager.new( Key.new( 0x01010101, 0x02020202 ) )
126
- @messenger.data.concat [ OpenStruct.new( :message_type => 60 ),
127
- OpenStruct.new( :message_type => 51 ) ]
128
- assert !@method.authenticate( "test", "test_user", :key_manager => manager )
129
- assert_equal :finished, manager.state
130
- assert_equal 2, @messenger.messages.length
131
-
132
- packet1 = "#{50.chr}\0\0\0\11test_user\0\0\0\4test\0\0\0\11publickey\0\0\0\0\7ssh-rsa" +
133
- "\0\0\0\23\0\0\0\7ssh-rsa\1\1\1\1\2\2\2\2"
134
- assert_equal packet1, @messenger.messages[0]
135
-
136
- packet2 = "#{50.chr}\0\0\0\11test_user\0\0\0\4test\0\0\0\11publickey\1\0\0\0\7ssh-rsa" +
137
- "\0\0\0\23\0\0\0\7ssh-rsa\1\1\1\1\2\2\2\2" +
138
- "\0\0\0\13<signature>"
139
- assert_equal packet2, @messenger.messages[1]
140
-
141
- sigdata = manager.sigdata
142
- signature = "\0\0\0\4test" +
143
- "#{50.chr}\0\0\0\11test_user\0\0\0\4test\0\0\0\11publickey\1\0\0\0\7ssh-rsa" +
144
- "\0\0\0\23\0\0\0\7ssh-rsa\1\1\1\1\2\2\2\2"
145
- assert_equal signature, sigdata[1]
146
- end
147
-
148
- def test_authenticate_acceptible_identities_error
149
- manager = KeyManager.new( Key.new( 0x01010101, 0x02020202 ) )
150
- @messenger.data.concat [ OpenStruct.new( :message_type => 60 ),
151
- OpenStruct.new( :message_type => 0 ) ]
152
- assert_raise( Net::SSH::Exception ) do
153
- @method.authenticate( "test", "test_user", :key_manager => manager )
154
- end
155
- assert_equal 2, @messenger.messages.length
156
- end
157
-
158
- def test_authenticate_acceptible_identities_success
159
- manager = KeyManager.new( Key.new( 0x01010101, 0x02020202 ) )
160
- @messenger.data.concat [ OpenStruct.new( :message_type => 60 ),
161
- OpenStruct.new( :message_type => 52 ) ]
162
- assert @method.authenticate( "test", "test_user", :key_manager => manager )
163
- assert_equal :finished, manager.state
164
- assert_equal 2, @messenger.messages.length
165
- end
166
-
167
- end
@@ -1,223 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- $:.unshift "#{File.dirname(__FILE__)}/../../lib"
18
-
19
- require 'net/ssh/userauth/agent'
20
- require 'net/ssh/util/buffer'
21
- require 'test/unit'
22
-
23
- class TC_Agent < Test::Unit::TestCase
24
-
25
- class MockReader < Net::SSH::Util::ReaderBuffer
26
- def read_bignum
27
- read_long
28
- end
29
-
30
- def read_key
31
- OpenStruct.new(
32
- :e => read_bignum,
33
- :n => read_bignum )
34
- end
35
- end
36
-
37
- class Buffers
38
- def writer
39
- Net::SSH::Util::WriterBuffer.new
40
- end
41
-
42
- def reader( text )
43
- MockReader.new( text )
44
- end
45
- end
46
-
47
- class SocketFactory
48
- attr_reader :socket_name
49
- attr_reader :events
50
-
51
- def initialize( data )
52
- @data = Net::SSH::Util::ReaderBuffer.new( data.to_s )
53
- end
54
-
55
- def open( name )
56
- @socket_name = name
57
- @events = []
58
- self
59
- end
60
-
61
- def close
62
- @events << :close
63
- end
64
-
65
- def send( data, flags )
66
- @events << data.to_s
67
- end
68
-
69
- def read( bytes )
70
- @data.read( bytes )
71
- end
72
- end
73
-
74
- class Keys
75
- def get( type )
76
- require 'ostruct'
77
- OpenStruct.new
78
- end
79
- end
80
-
81
- def setup
82
- @agent = Net::SSH::UserAuth::Agent.new
83
- @agent.socket_name = "test"
84
- @agent.version = 2
85
- @agent.buffers = Buffers.new
86
- @agent.keys = Keys.new
87
- end
88
-
89
- CONNECT_STR = "\0\0\0\1\2"
90
-
91
- def test_connect_bad_version
92
- @agent.socket_factory = SocketFactory.new( "\0\0\0\1\147" )
93
- assert_raise( NotImplementedError ) { @agent.connect! }
94
- end
95
-
96
- def test_connect_bad_response
97
- @agent.socket_factory = SocketFactory.new( "\0\0\0\1\0" )
98
- assert_raise( Net::SSH::UserAuth::AgentError ) { @agent.connect! }
99
- end
100
-
101
- def test_connect_success
102
- @agent.socket_factory = SocketFactory.new( CONNECT_STR )
103
- assert_nothing_raised { @agent.connect! }
104
- end
105
-
106
- IDENTITIES = { 1 => 1,
107
- 2 => 11 }
108
-
109
- [ 1, 2 ].each do |version|
110
- [ 5, 30, 102 ].each do |error_code|
111
- define_method( "test_identities_v#{version}_c#{error_code}" ) do
112
- @agent.version = version
113
- @agent.socket_factory = factory = SocketFactory.new( CONNECT_STR + "\0\0\0\1#{error_code.chr}" )
114
- @agent.connect!
115
- assert_raise( Net::SSH::UserAuth::AgentError ) { @agent.identities }
116
- assert_equal [ "\0\0\0\1#{IDENTITIES[version].chr}" ], factory.events[1..-1]
117
- end
118
- end
119
-
120
- define_method( "test_identities_v#{version}_bad_auth_code" ) do
121
- @agent.version = version
122
- @agent.socket_factory = factory = SocketFactory.new( CONNECT_STR + "\0\0\0\1\0" )
123
- @agent.connect!
124
- assert_raise( Net::SSH::UserAuth::AgentError ) { @agent.identities }
125
- assert_equal [ "\0\0\0\1#{IDENTITIES[version].chr}" ], factory.events[1..-1]
126
- end
127
- end
128
-
129
- def test_identities_v1_single
130
- @agent.version = 1
131
- @agent.socket_factory = SocketFactory.new( CONNECT_STR + "\0\0\0\32\2\0\0\0\1\1\2\3\4\1\1\1\1\2\2\2\2\0\0\0\5hello" )
132
- @agent.connect!
133
- identities = nil
134
- assert_nothing_raised { identities = @agent.identities }
135
- assert_equal [ OpenStruct.new( :e => 0x01010101, :n => 0x02020202 ) ], identities
136
- assert_equal "hello", identities.first.comment
137
- end
138
-
139
- def test_identities_v1_multiple
140
- @agent.version = 1
141
- @agent.socket_factory = SocketFactory.new( CONNECT_STR +
142
- "\0\0\0\57\2" +
143
- "\0\0\0\2" +
144
- "\1\2\3\4\1\1\1\1\2\2\2\2\0\0\0\5hello" +
145
- "\2\3\4\5\3\3\3\3\4\4\4\4\0\0\0\5howdy" )
146
- @agent.connect!
147
- identities = nil
148
- assert_nothing_raised { identities = @agent.identities }
149
- assert_equal [ OpenStruct.new( :e => 0x01010101, :n => 0x02020202 ),
150
- OpenStruct.new( :e => 0x03030303, :n => 0x04040404 ) ], identities
151
- assert_equal "hello", identities.first.comment
152
- assert_equal "howdy", identities.last.comment
153
- end
154
-
155
- def test_identities_v2_single
156
- @agent.version = 2
157
- @agent.socket_factory = SocketFactory.new( CONNECT_STR +
158
- "\0\0\0\32\14" +
159
- "\0\0\0\1" +
160
- "\0\0\0\10\1\1\1\1\2\2\2\2\0\0\0\5hello" )
161
- @agent.connect!
162
- identities = nil
163
- assert_nothing_raised { identities = @agent.identities }
164
- assert_equal [ OpenStruct.new( :e => 0x01010101, :n => 0x02020202 ) ], identities
165
- assert_equal "hello", identities.first.comment
166
- end
167
-
168
- def test_identities_v2_multiple
169
- @agent.version = 2
170
- @agent.socket_factory = SocketFactory.new( CONNECT_STR +
171
- "\0\0\0\57\14" +
172
- "\0\0\0\2" +
173
- "\0\0\0\10\1\1\1\1\2\2\2\2\0\0\0\5hello" +
174
- "\0\0\0\10\3\3\3\3\4\4\4\4\0\0\0\5howdy" )
175
- @agent.connect!
176
- identities = nil
177
- assert_nothing_raised { identities = @agent.identities }
178
- assert_equal [ OpenStruct.new( :e => 0x01010101, :n => 0x02020202 ),
179
- OpenStruct.new( :e => 0x03030303, :n => 0x04040404 ) ], identities
180
- assert_equal "hello", identities.first.comment
181
- assert_equal "howdy", identities.last.comment
182
- end
183
-
184
- def test_close
185
- @agent.socket_factory = factory = SocketFactory.new( CONNECT_STR )
186
- @agent.connect!
187
- @agent.close
188
- assert_equal :close, factory.events.last
189
- end
190
-
191
- [ 5, 30, 102 ].each do |error_code|
192
- define_method( "test_sign_error_#{error_code}" ) do
193
- @agent.socket_factory = SocketFactory.new( CONNECT_STR + "\0\0\0\1#{error_code.chr}" )
194
- @agent.connect!
195
- key = OpenStruct.new( :ssh_type => "ssh-rsa",
196
- :e => OpenStruct.new( :to_ssh => "e" ),
197
- :n => OpenStruct.new( :to_ssh => "n" ) )
198
- assert_raise( Net::SSH::UserAuth::AgentError ) { @agent.sign( key, "test" ) }
199
- end
200
- end
201
-
202
- def test_sign_bad_response
203
- @agent.socket_factory = SocketFactory.new( CONNECT_STR + "\0\0\0\1\0" )
204
- @agent.connect!
205
- key = OpenStruct.new( :ssh_type => "ssh-rsa",
206
- :e => OpenStruct.new( :to_ssh => "e" ),
207
- :n => OpenStruct.new( :to_ssh => "n" ) )
208
- assert_raise( Net::SSH::UserAuth::AgentError ) { @agent.sign( key, "test" ) }
209
- end
210
-
211
- def test_sign
212
- @agent.socket_factory = factory = SocketFactory.new( CONNECT_STR + "\0\0\0\12\16\0\0\0\5howdy" )
213
- @agent.connect!
214
- key = OpenStruct.new( :ssh_type => "ssh-rsa",
215
- :e => OpenStruct.new( :to_ssh => "e" ),
216
- :n => OpenStruct.new( :to_ssh => "n" ) )
217
- sig = nil
218
- assert_nothing_raised { sig = @agent.sign( key, "test" ) }
219
- assert_equal "howdy", sig
220
- assert_equal "\0\0\0\36\15\0\0\0\15\0\0\0\7ssh-rsaen\0\0\0\4test\0\0\0\0", factory.events.last
221
- end
222
-
223
- end