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,222 +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
- require 'net/ssh/errors'
18
- require 'net/ssh/transport/session'
19
-
20
- module Net
21
- module SSH
22
- module UserAuth
23
-
24
- # A trivial exception class for representing agent-specific errors.
25
- class AgentError < Net::SSH::Exception; end
26
-
27
- # This class implements a simple client for the ssh-agent protocol. It
28
- # does not implement any specific protocol, but instead copies the
29
- # behavior of the ssh-agent functions in the OpenSSH library (3.8).
30
- #
31
- # This means that although it behaves like a SSH1 client, it also has
32
- # some SSH2 functionality (like signing data).
33
- class Agent
34
- SSH2_AGENT_REQUEST_VERSION = 1
35
- SSH2_AGENT_REQUEST_IDENTITIES = 11
36
- SSH2_AGENT_IDENTITIES_ANSWER = 12
37
- SSH2_AGENT_SIGN_REQUEST = 13
38
- SSH2_AGENT_SIGN_RESPONSE = 14
39
- SSH2_AGENT_FAILURE = 30
40
- SSH2_AGENT_VERSION_RESPONSE = 103
41
-
42
- SSH_COM_AGENT2_FAILURE = 102
43
-
44
- SSH_AGENT_REQUEST_RSA_IDENTITIES = 1
45
- SSH_AGENT_RSA_IDENTITIES_ANSWER = 2
46
- SSH_AGENT_FAILURE = 5
47
-
48
- # The socket factory used to connect to the agent process. It must
49
- # respond to #open, and accept a single parameter (the name of the
50
- # socket to open).
51
- attr_writer :socket_factory
52
-
53
- # The name of the socket to open.
54
- attr_writer :socket_name
55
-
56
- # The version of the SSH protocol version to report.
57
- attr_writer :version
58
-
59
- # The buffer factory to use to obtain buffer instances.
60
- attr_writer :buffers
61
-
62
- # The key factory to use to obtain key instances.
63
- attr_writer :keys
64
-
65
- # Connect to the agent process using the socket factory and socket name
66
- # given by the attribute writers. If the agent on the other end of the
67
- # socket reports that it is an SSH2-compatible agent, this will fail
68
- # (it only supports the ssh-agent distributed by OpenSSH).
69
- def connect!
70
- @socket = @socket_factory.open( @socket_name )
71
-
72
- # determine what type of agent we're communicating with
73
- buffer = @buffers.writer
74
- buffer.write_string Net::SSH::Transport::Session.version
75
- type, body = send_with_reply SSH2_AGENT_REQUEST_VERSION, buffer
76
-
77
- if type == SSH2_AGENT_VERSION_RESPONSE
78
- raise NotImplementedError, "SSH2 agents are not yet supported"
79
- elsif type != SSH_AGENT_RSA_IDENTITIES_ANSWER
80
- raise AgentError,
81
- "unknown response from agent: #{type}, #{body.to_s.inspect}"
82
- end
83
- end
84
-
85
- # Return an array of all identities (public keys) known to the agent.
86
- # Each key returned is augmented with a +comment+ property which is set
87
- # to the comment returned by the agent for that key.
88
- def identities
89
- case @version
90
- when 1
91
- code1 = SSH_AGENT_REQUEST_RSA_IDENTITIES
92
- code2 = SSH_AGENT_RSA_IDENTITIES_ANSWER
93
- when 2
94
- code1 = SSH2_AGENT_REQUEST_IDENTITIES
95
- code2 = SSH2_AGENT_IDENTITIES_ANSWER
96
- else
97
- raise NotImplementedError, "SSH version #{@version}"
98
- end
99
-
100
- type, body = send_with_reply code1
101
- raise AgentError,
102
- "could not get identity count" if agent_failed( type )
103
- raise AgentError, "bad authentication reply: #{type}" if type != code2
104
-
105
- identities = []
106
- body.read_long.times do
107
- case @version
108
- when 1
109
- key = @keys.get( "rsa" )
110
- bits = body.read_long
111
- key.e = body.read_bignum
112
- key.n = body.read_bignum
113
- when 2
114
- blob = @buffers.reader( body.read_string )
115
- key = blob.read_key
116
- end
117
-
118
- unless key.respond_to?( :comment= )
119
- key.instance_eval <<-EVAL
120
- def comment=(cmt)
121
- @comment = cmt
122
- end
123
- EVAL
124
- end
125
-
126
- unless key.respond_to?( :comment )
127
- key.instance_eval <<-EVAL
128
- def comment
129
- @comment
130
- end
131
- EVAL
132
- end
133
-
134
- key.comment = body.read_string
135
- identities.push key
136
- end
137
-
138
- return identities
139
- end
140
-
141
- # Closes this socket. This agent reference is no longer able to
142
- # query the agent.
143
- def close
144
- @socket.close
145
- end
146
-
147
- # Using the agent and the given public key, sign the given data. The
148
- # signature is returned in SSH2 format.
149
- def sign( key, data )
150
- blob = @buffers.writer
151
- blob.write_key key
152
-
153
- packet_data = @buffers.writer
154
- packet_data.write_string blob.to_s
155
- packet_data.write_string data.to_s
156
- packet_data.write_long 0
157
-
158
- type, reply = send_with_reply SSH2_AGENT_SIGN_REQUEST, packet_data
159
- if agent_failed( type )
160
- raise AgentError,
161
- "agent could not sign data with requested identity"
162
- elsif type != SSH2_AGENT_SIGN_RESPONSE
163
- raise AgentError, "bad authentication response #{type}"
164
- end
165
-
166
- return reply.read_string
167
- end
168
-
169
- # Send a new packet of the given type, with the associated data.
170
- def send_packet( type, data=nil )
171
- buffer = @buffers.writer
172
- buffer.write_long( ( data ? data.length : 0 ) + 1 )
173
- buffer.write_byte type.to_i
174
- buffer.write data.to_s if data
175
- @socket.send buffer.to_s, 0
176
- end
177
- private :send_packet
178
-
179
- # Read the next packet from the agent. This will return a two-part
180
- # tuple consisting of the packet type, and the packet's body (which
181
- # is returned as a Net::SSH::Util::ReaderBuffer).
182
- def read_packet
183
- length = @socket.read( 4 ).unpack( "N" ).first - 1
184
- type = @socket.read( 1 ).unpack( "C" ).first
185
- reader = @buffers.reader( @socket.read( length ) )
186
- return type, reader
187
- end
188
- private :read_packet
189
-
190
- # Send the given packet and return the subsequent reply from the agent.
191
- # (See #send_packet and #read_packet).
192
- def send_with_reply( type, data=nil )
193
- send_packet type, data
194
- read_packet
195
- end
196
- private :send_with_reply
197
-
198
- # Returns +true+ if the parameter indicates a "failure" response from
199
- # the agent, and +false+ otherwise.
200
- def agent_failed( type )
201
- type == SSH_AGENT_FAILURE ||
202
- type == SSH2_AGENT_FAILURE ||
203
- type == SSH_COM_AGENT2_FAILURE
204
- end
205
- private :agent_failed
206
-
207
- def send_raw_packet( data )
208
- @socket.send data, 0
209
- end
210
-
211
- def read_raw_packet
212
- buffer = @socket.read( 4 )
213
- length = buffer.unpack( "N" ).first
214
- buffer = buffer + @socket.read( length )
215
- buffer
216
- end
217
-
218
- end
219
-
220
- end
221
- end
222
- end
@@ -1,35 +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
- module Net
18
- module SSH
19
- module UserAuth
20
-
21
- module Constants
22
-
23
- USERAUTH_REQUEST = 50
24
- USERAUTH_FAILURE = 51
25
- USERAUTH_SUCCESS = 52
26
- USERAUTH_BANNER = 53
27
-
28
- USERAUTH_PASSWD_CHANGEREQ = 60
29
- USERAUTH_PK_OK = 60
30
-
31
- end
32
-
33
- end
34
- end
35
- end
@@ -1,183 +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
- require 'net/ssh/errors'
18
- require 'net/ssh/userauth/constants'
19
- require 'net/ssh/transport/constants'
20
- require 'ostruct'
21
-
22
- module Net
23
- module SSH
24
- module UserAuth
25
-
26
- # A wrapper around the transport layer that represents the functionality
27
- # of user authentication.
28
- class Driver
29
-
30
- include Net::SSH::UserAuth::Constants
31
- include Net::SSH::Transport::Constants
32
-
33
- # The UserKeyManager instance used by the auth service.
34
- attr_writer :key_manager
35
-
36
- # The SSH (transport) session to use for communication.
37
- attr_writer :session
38
-
39
- # The array of auth-method names (as strings), giving the order in
40
- # which each auth-method will be tried.
41
- attr_reader :order
42
-
43
- # Create a new user-auth service on top of the given session.
44
- def initialize( log, buffers, methods, order )
45
- @log = log
46
- @buffers = buffers
47
- @methods = methods
48
- @on_banner = proc { |msg,lang| }
49
- @order = order.dup
50
- @allowed_auth_methods = nil
51
- end
52
-
53
- # Causes the set of on-disk key files to be used to be set to the
54
- # given array. Any key files that were specified previously are
55
- # lost.
56
- def set_key_files( files )
57
- @key_manager.clear!
58
- files.each { |file| @key_manager << file }
59
- end
60
-
61
- # Causes the set of on-disk host key files to be used to be set to the
62
- # given array. Any host key files that were specified previously are
63
- # lost.
64
- def set_host_key_files( files )
65
- @key_manager.clear_host!
66
- files.each { |file| @key_manager.add_host_key file }
67
- end
68
-
69
- # Changes the set of authentication methods to try to the given array.
70
- # Methods are tried in the order in which they are listed in the
71
- # array.
72
- def set_auth_method_order( *methods )
73
- @order = methods.flatten
74
- end
75
-
76
- # Specify the callback to use when the server sends a banner message
77
- # at login time.
78
- def on_banner( &block )
79
- @on_banner = block
80
- end
81
-
82
- # Sends the message by delegating to the session's #send_message
83
- # method. (This is a convenience method for the authentication
84
- # implementations.)
85
- def send_message( message )
86
- @session.send_message message
87
- end
88
-
89
- # Wraps the Net::SSH::Transport::Session#wait_for_message method,
90
- # doing special checking for authentication-related messages.
91
- def wait_for_message
92
- loop do
93
- type, buffer = @session.wait_for_message
94
-
95
- case type
96
- when USERAUTH_BANNER
97
- message = buffer.read_string
98
- language = buffer.read_string
99
-
100
- if @log.debug?
101
- @log.debug "got USERAUTH_BANNER (#{message}:#{language})"
102
- end
103
-
104
- @on_banner.call( message, language )
105
-
106
- when USERAUTH_FAILURE
107
- authentications = buffer.read_string
108
- @allowed_auth_methods = authentications.split(/,/)
109
- partial_success = buffer.read_bool
110
- return OpenStruct.new( :message_type => type,
111
- :authentications => authentications,
112
- :partial_success => partial_success )
113
-
114
- when USERAUTH_SUCCESS
115
- return OpenStruct.new( :message_type => type )
116
-
117
- when SERVICE_ACCEPT
118
- return OpenStruct.new( :message_type => type,
119
- :service_name => buffer.read_string )
120
-
121
- # authmethod-specific codes
122
- when 60..79
123
- return OpenStruct.new( :message_type => type,
124
- :buffer => buffer )
125
-
126
- else
127
- raise Net::SSH::Exception,
128
- "unexpected message type '#{type}' (#{buffer.to_s})"
129
- end
130
- end
131
- end
132
-
133
- # Processes the authentication of the given username. The
134
- # 'next_service' parameter should be set to the SSH service that will
135
- # be requested once the authentication succeeds (usually
136
- # 'ssh-connection').
137
- #
138
- # This will return +true+ if the user is accepted by the server, and
139
- # +false+ otherwise.
140
- def authenticate( next_service, username, password=nil )
141
- msg = @buffers.writer
142
- msg.write_byte SERVICE_REQUEST
143
- msg.write_string "ssh-userauth"
144
- send_message msg
145
-
146
- message = wait_for_message
147
- unless message.message_type == SERVICE_ACCEPT
148
- raise Net::SSH::Exception,
149
- "expected SERVICE_ACCEPT, got #{message.inspect}"
150
- end
151
-
152
- data = { :password => password,
153
- :key_manager => @key_manager }
154
-
155
- @order.each do |auth_method|
156
- # if the server has reported a list of auth methods that are
157
- # allowed to continue, only consider those auth methods.
158
- next if @allowed_auth_methods &&
159
- !@allowed_auth_methods.include?( auth_method )
160
-
161
- @log.debug "trying #{auth_method.inspect}" if @log.debug?
162
-
163
- impl = @methods[ auth_method.downcase.gsub(/-/,"_").intern ]
164
- if impl.nil?
165
- raise NotImplementedError,
166
- "`#{auth_method}' authentication is not implemented"
167
- end
168
-
169
- return true if impl.authenticate( next_service, username, data )
170
- end
171
-
172
- @log.debug "all authorization methods failed" if @log.debug?
173
- return false
174
-
175
- ensure
176
- @key_manager.finish
177
- end
178
-
179
- end
180
-
181
- end
182
- end
183
- end
@@ -1,119 +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
- require 'net/ssh/errors'
18
- require 'net/ssh/userauth/constants'
19
-
20
- module Net
21
- module SSH
22
- module UserAuth
23
- module Methods
24
-
25
- # Implements the host-based SSH authentication method.
26
- class HostBased
27
- include Net::SSH::UserAuth::Constants
28
-
29
- # The messenger to use to send and receive messages.
30
- attr_writer :messenger
31
-
32
- # The session-id of the current SSH session.
33
- attr_writer :session_id
34
-
35
- # The hostname to report to the server.
36
- attr_writer :hostname
37
-
38
- # Create a new
39
- def initialize( buffers )
40
- @buffers = buffers
41
- end
42
-
43
- # Attempts to perform host-based authorization of the user. The data
44
- # hash must contain a <tt>:key_manager</tt> key or the call will
45
- # fail.
46
- def authenticate( next_service, username, data={} )
47
- key_manager = data[:key_manager] or return false
48
-
49
- key_manager.host_identities.each do |identity|
50
- return true if authenticate_with( identity, next_service,
51
- username, key_manager )
52
- end
53
-
54
- return false
55
-
56
- ensure
57
- key_manager.finish if key_manager
58
- end
59
-
60
- # Attempts to perform host-based authentication of the user, using
61
- # the given host identity (key).
62
- def authenticate_with( identity, next_service, username, key_manager )
63
- client_username = ENV['USER'] || username
64
-
65
- req = build_request identity, next_service, username,
66
- @hostname+".", client_username
67
-
68
- sig_data = @buffers.writer
69
- sig_data.write_string @session_id
70
- sig_data.write req
71
-
72
- sig = key_manager.sign( identity, sig_data.to_s )
73
-
74
- message = @buffers.writer
75
- message.write req
76
- message.write_string sig
77
-
78
- @messenger.send_message message
79
- message = @messenger.wait_for_message
80
-
81
- case message.message_type
82
- when USERAUTH_SUCCESS
83
- return true
84
- when USERAUTH_FAILURE
85
- return false
86
- else
87
- raise Net::SSH::Exception,
88
- "unexpected server response to USERAUTH_REQUEST: " +
89
- message.inspect
90
- end
91
- end
92
- private :authenticate_with
93
-
94
- # Build the "core" hostbased request string.
95
- def build_request( identity, next_service, username, hostname,
96
- client_username )
97
- # begin
98
- buf = @buffers.writer
99
- buf.write_byte USERAUTH_REQUEST
100
- buf.write_string username
101
- buf.write_string next_service
102
- buf.write_string "hostbased"
103
-
104
- buf.write_string identity.ssh_type
105
- blob = @buffers.writer
106
- blob.write_key identity
107
- buf.write_string blob.to_s
108
-
109
- buf.write_string hostname
110
- buf.write_string client_username
111
- return buf.to_s
112
- end
113
-
114
- end
115
-
116
- end
117
- end
118
- end
119
- end