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,141 +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
- def register_services( container )
22
- container.namespace_define :userauth do |b|
23
-
24
- b.require 'net/ssh/userauth/methods/services', "#{self}::Methods"
25
-
26
- b.agent_socket_factory do
27
- if File::ALT_SEPARATOR
28
- require 'net/ssh/userauth/pageant'
29
- Pageant::Socket
30
- else
31
- require 'socket'
32
- defined?( UNIXSocket ) ? UNIXSocket : nil
33
- end
34
- end
35
-
36
- b.default_agent_socket_name { ENV['SSH_AUTH_SOCK'] }
37
-
38
- b.default_agent_version { 2 }
39
-
40
- b.agent( :model => :prototype ) do |c,p|
41
- socket_factory = c[:agent_socket_factory]
42
- socket_name = c[:default_agent_socket_name]
43
-
44
- if (File::ALT_SEPARATOR || socket_name) && socket_factory
45
- require 'net/ssh/userauth/agent'
46
- require 'net/ssh/transport/services'
47
-
48
- agent = Agent.new
49
- agent.socket_factory = socket_factory
50
- agent.socket_name = socket_name
51
- agent.version = c[:default_agent_version]
52
- agent.buffers = c[:transport][:buffers]
53
- agent.keys = c[:transport][:keys]
54
-
55
- begin
56
- agent.connect!
57
- rescue Net::SSH::Exception
58
- # if there was an error connecting to the agent, swallow the
59
- # error and move on, without the agent
60
- agent = nil
61
- end
62
- end
63
-
64
- agent
65
- end
66
-
67
- b.agent_factory do |c,p|
68
- factory = Object.new
69
- klass = class << factory; self; end
70
- klass.send( :define_method, :open ) { c[:agent] }
71
- factory
72
- end
73
-
74
- b.default_user_key_locations do
75
- [ "#{ENV['HOME']}/.ssh/id_dsa",
76
- "#{ENV['HOME']}/.ssh2/id_dsa",
77
- "#{ENV['HOME']}/.ssh/id_rsa",
78
- "#{ENV['HOME']}/.ssh2/id_rsa" ]
79
- end
80
-
81
- b.default_host_key_locations do
82
- [ "/etc/ssh/ssh_host_dsa_key",
83
- "/etc/ssh/ssh_host_rsa_key" ]
84
- end
85
-
86
- b.key_existence_tester { File }
87
-
88
- b.user_keys do |c,p|
89
- require 'net/ssh/userauth/userkeys'
90
-
91
- userkeys = UserKeyManager.new
92
- userkeys.agent_factory = c[:agent_factory]
93
- userkeys.keys = c[:transport][:keys]
94
- userkeys.buffers = c[:transport][:buffers]
95
- userkeys.log = c[:log_for, p]
96
- userkeys.key_existence_tester = b.key_existence_tester
97
-
98
- b.default_user_key_locations.each { |f| userkeys.add f }
99
- b.default_host_key_locations.each { |f| userkeys.add_host_key f }
100
-
101
- userkeys
102
- end
103
-
104
- b.authentication_method_order do
105
- [ "publickey",
106
- "hostbased",
107
- "password",
108
- "keyboard-interactive" ]
109
- end
110
-
111
- b.driver do |c,p|
112
- require 'net/ssh/userauth/driver'
113
-
114
- driver = Driver.new( c[:log_for, p],
115
- c[:transport][:buffers],
116
- c[:methods],
117
- c[:authentication_method_order] )
118
-
119
- driver.key_manager = c[:user_keys]
120
- driver.session = c[:transport][:session]
121
-
122
- if c.knows_key?(:userauth_keys) && c[:userauth_keys]
123
- driver.set_key_files c[:userauth_keys]
124
- end
125
- if c.knows_key?(:userauth_host_keys) && c[:userauth_host_keys]
126
- driver.set_host_key_files c[:userauth_host_keys]
127
- end
128
- if c.knows_key?(:userauth_method_order) && c[:userauth_method_order]
129
- driver.set_auth_method_order(*c[:userauth_method_order])
130
- end
131
-
132
- driver
133
- end
134
-
135
- end
136
- end
137
- module_function :register_services
138
-
139
- end
140
- end
141
- end
@@ -1,258 +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
-
19
- module Net
20
- module SSH
21
- module UserAuth
22
-
23
- # A trivial exception class used to report errors in the key manager.
24
- class UserKeyManagerError < Net::SSH::Exception; end
25
-
26
- # This class encapsulates all operations done by clients on a user's
27
- # private keys. In practice, the client should never need a reference
28
- # to a private key; instead, they grab a list of "identities" (public
29
- # keys) that are available from the UserKeyManager, and then use
30
- # the UserKeyManager to do various private key operations using those
31
- # identities.
32
- #
33
- # The UserKeyManager also uses the Agent class to encapsulate the
34
- # ssh-agent. Thus, from a client's perspective it is completely
35
- # hidden whether an identity comes from the ssh-agent or from a file
36
- # on disk.
37
- class UserKeyManager
38
-
39
- # The agent factory to use when a new agent instance is needed.
40
- attr_writer :agent_factory
41
-
42
- # The key manager instance to use for managing keys
43
- attr_writer :keys
44
-
45
- # The logger instance to use for logging messages
46
- attr_writer :log
47
-
48
- # The buffer manager to use for providing new buffer instances.
49
- attr_writer :buffers
50
-
51
- # The object that will be used to test whether a given key file is
52
- # readable. This object must only respond to "readable?" with one
53
- # parameter, the file to test the readability of.
54
- attr_writer :key_existence_tester
55
-
56
- # The list of user key files that will be examined
57
- attr_reader :key_files
58
-
59
- # The list of host key files that will be examined
60
- attr_reader :host_key_files
61
-
62
- # Create a new UserKeyManager. By default, the manager will
63
- # use the ssh-agent (if it is running).
64
- def initialize
65
- @key_files = []
66
- @host_key_files = []
67
- @use_agent = true
68
- @agent = nil
69
- end
70
-
71
- # Clear all knowledge of any loaded user keys. This also clears the list
72
- # of default identity files that are to be loaded, thus making it
73
- # appropriate to use if a client wishes to NOT use the default identity
74
- # files.
75
- def clear!
76
- @key_files = []
77
- @known_identities = nil
78
- self
79
- end
80
-
81
- # Clear all knowledge of any loaded host keys. This also clears the list
82
- # of default identity files that are to be loaded, thus making it
83
- # appropriate to use if a client wishes to NOT use the default identity
84
- # files.
85
- def clear_host!
86
- @host_key_files = []
87
- @known_host_identities = nil
88
- self
89
- end
90
-
91
- # Add the given key_file to the list of key files that will be used.
92
- def add( key_file )
93
- @key_files.push( key_file ).uniq!
94
- self
95
- end
96
-
97
- alias :<< :add
98
-
99
- # Add the given key_file to the list of host key files that will be
100
- # used.
101
- def add_host_key( key_file )
102
- @host_key_files.push( key_file ).uniq!
103
- self
104
- end
105
-
106
- # This is used as a hint to the UserKeyManager indicating that the agent
107
- # connection is no longer needed. Any other open resources may be closed
108
- # at this time.
109
- #
110
- # Calling this does NOT indicate that the UserKeyManager will no longer
111
- # be used. Identities may still be requested and operations done on
112
- # loaded identities, in which case, the agent will be automatically
113
- # reconnected. This method simply allows the client connection to be
114
- # closed when it will not be used in the immediate future.
115
- def finish
116
- close_agent
117
- end
118
-
119
- # Returns an array of identities (public keys) known to this manager.
120
- # The origin of the identities may be from files on disk or from an
121
- # ssh-agent. Note that identities from an ssh-agent are always listed
122
- # first in the array, with other identities coming after.
123
- def identities
124
- identities = []
125
- @known_identities = Hash.new
126
-
127
- ensure_agent
128
- if @agent
129
- @agent.identities.each do |key|
130
- identities.push key
131
- @known_identities[ key ] = { :from => :agent }
132
- end
133
- end
134
-
135
- @key_files.each do |file|
136
- if @key_existence_tester.readable?( file )
137
- begin
138
- key = @keys.load_public_key( file + ".pub" )
139
- identities.push key
140
- @known_identities[ key ] = { :from => :file, :file => file }
141
- rescue Exception => e
142
- @log.warn "could not load public key file " +
143
- "'#{file}.pub' (#{e.message} [#{e.class}])" if @log.warn?
144
- end
145
- end
146
- end
147
-
148
- identities
149
- end
150
-
151
- # Returns an array of host identities (public keys) known to this
152
- # manager. Host identities are those that identify the current host,
153
- # and are used (typically) for hostbased authentication.
154
- def host_identities
155
- identities = []
156
- @known_host_identities = Hash.new
157
-
158
- @host_key_files.each do |file|
159
- if @key_existence_tester.readable?( file )
160
- begin
161
- key = @keys.load_public_key( file + ".pub" )
162
- identities.push key
163
- @known_host_identities[ key ] =
164
- { :from => :file, :file => file }
165
- rescue Exception => e
166
- @log.warn "could not load public host key file " +
167
- "'#{file}.pub' (#{e.message} [#{e.class}])" if @log.warn?
168
- end
169
- end
170
- end
171
-
172
- identities
173
- end
174
-
175
- # Sign the given data, using the corresponding private key of the given
176
- # identity. If the identity was originally obtained from an ssh-agent,
177
- # then the ssh-agent will be used to sign the data, otherwise the
178
- # private key for the identity will be loaded from disk (if it hasn't
179
- # been loaded already) and will then be used to sign the data.
180
- #
181
- # Regardless of the identity's origin or who does the signing, this
182
- # will always return the signature in an SSH2-specified "signature
183
- # blob" format.
184
- def sign( identity, data )
185
- info = find_identity( identity )
186
-
187
- if info[:key].nil? && info[:from] == :file
188
- begin
189
- info[:key] = @keys.load_private_key( info[:file] )
190
- rescue Exception => e
191
- raise UserKeyManagerError,
192
- "the given identity is known, " +
193
- "but the private key could not be loaded " +
194
- "(#{e.message} [#{e.class}])"
195
- end
196
- end
197
-
198
- if info[:key]
199
- sig_blob = @buffers.writer
200
- sig_blob.write_string identity.ssh_type
201
- sig_blob.write_string info[:key].ssh_do_sign( data.to_s )
202
- return sig_blob.to_s
203
- end
204
-
205
- if info[:from] == :agent
206
- raise UserKeyManagerError,
207
- "the agent is no longer available" unless @agent
208
- return @agent.sign( identity, data.to_s )
209
- end
210
-
211
- raise UserKeyManagerError,
212
- "[BUG] can't determine identity origin (#{info.inspect})"
213
- end
214
-
215
- # Identifies whether the ssh-agent will be used or not.
216
- def use_agent?
217
- @use_agent
218
- end
219
-
220
- # Toggles whether the ssh-agent will be used or not. If true, an
221
- # attempt will be made to use the ssh-agent. If false, any existing
222
- # connection to an agent is closed and the agent will not be used.
223
- def use_agent=( use_agent )
224
- close_agent if !use_agent
225
- @use_agent = use_agent
226
- end
227
-
228
- # Ensures that a connection to the agent has been made, if an agent is
229
- # to be used.
230
- def ensure_agent
231
- return if @agent || !@use_agent
232
- @agent = @agent_factory.open
233
- end
234
- private :ensure_agent
235
-
236
- # Closes any open connection to an ssh-agent.
237
- def close_agent
238
- @agent.close if @agent
239
- @agent = nil
240
- end
241
- private :close_agent
242
-
243
- def find_identity( identity )
244
- info = @known_identities[ identity ] if @known_identities
245
- if !info && @known_host_identities[ identity ]
246
- info = @known_host_identities[ identity ]
247
- end
248
- raise UserKeyManagerError,
249
- "the given identity is unknown to the key manager" unless info
250
- return info
251
- end
252
- private :find_identity
253
-
254
- end
255
-
256
- end
257
- end
258
- end
@@ -1,274 +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
-
20
- module Util
21
-
22
- # The abstract ancestor module of both ReaderBufferImpl and
23
- # WriterBufferImpl. It defines the common interface for both submodules.
24
- module BufferBase
25
-
26
- # exposes the content of the buffer
27
- attr_reader :content
28
-
29
- # the length of the buffer's content.
30
- def length
31
- @content.length
32
- end
33
-
34
- # returns a copy of the buffer's content.
35
- def to_s
36
- ( @content || "" ).dup
37
- end
38
-
39
- # Compares the contents of the two buffers.
40
- def ==( buffer )
41
- to_s == buffer.to_s
42
- end
43
-
44
- # Resets the buffer, making it empty.
45
- def clear!
46
- @content = ""
47
- end
48
-
49
- def init_BufferBase( content="" )
50
- @content = content
51
- end
52
- private :init_BufferBase
53
-
54
- end
55
-
56
- # A convenience module for representing a string of encoded data. It
57
- # provides an interface for easily reading and decoding the buffer.
58
- module ReaderBufferImpl
59
-
60
- # the current position of the pointer in the buffer
61
- attr_reader :position
62
-
63
- # used by derived modules and classes to perform any
64
- # reader-buffer-specific initialization.
65
- def init_ReaderBufferImpl
66
- @position = 0
67
- end
68
- private :init_ReaderBufferImpl
69
-
70
- # Appends the given text to the end of the buffer.
71
- def append( text )
72
- @content << text
73
- end
74
-
75
- # Returns all text from the current pointer to the end of the buffer as
76
- # a new buffer as the same class as the receiver.
77
- def remainder_as_buffer
78
- self.class.new( @content[ @position..-1 ] )
79
- end
80
-
81
- # Reads +count+ bytes from the buffer. If +count+ is +nil+, this will
82
- # return all remaining text in the buffer. This method will increment
83
- # the pointer.
84
- def read( count = nil )
85
- count = length - @position unless count
86
- return nil if @position + count > length
87
-
88
- @position += count
89
- @content[ @position-count, count ]
90
- end
91
-
92
- # Return the next 8 bytes as a 64-bit integer (in network byte order).
93
- def read_int64
94
- hi = read_long
95
- lo = read_long
96
- return ( hi << 32 ) + lo
97
- end
98
-
99
- # Return the next four bytes as a long integer (in network byte order).
100
- def read_long
101
- b = read( 4 ) or return nil
102
- b.unpack( "N" ).first
103
- end
104
-
105
- # Read the next two bytes as a short integer (in network byte order).
106
- def read_short
107
- b = read( 2 ) or return nil
108
- b.unpack( "n" ).first
109
- end
110
-
111
- # Read and return the next byte in the buffer.
112
- def read_byte
113
- b = read( 1 ) or return nil
114
- b[0]
115
- end
116
-
117
- # Read and return an SSH2-encoded string. The string starts with a long
118
- # integer that describes the number of bytes remaining in the string.
119
- def read_string
120
- length = read_long or return nil
121
- read( length )
122
- end
123
-
124
- # Read a single byte and convert it into a boolean, using 'C' rules
125
- # (i.e., zero is false, non-zero is true).
126
- def read_bool
127
- b = read( 1 ) or return nil
128
- b[0] != 0
129
- end
130
-
131
- # Resets the pointer to the start of the buffer.
132
- def reset!
133
- @position = 0
134
- end
135
-
136
- # Returns true if the pointer is at the end of the buffer.
137
- def eof?
138
- @position >= length
139
- end
140
-
141
- # Resets the buffer, making it empty.
142
- def clear!
143
- @content = ""
144
- @position = 0
145
- end
146
-
147
- end # ReaderBufferImpl
148
-
149
- # A convenience module for writing a string of encoded data. It provides
150
- # an interface for easily writing and encoding data.
151
- module WriterBufferImpl
152
-
153
- def init_WriterBufferImpl
154
- # nothing
155
- end
156
- private :init_WriterBufferImpl
157
-
158
- # Writes the given data literally into the string.
159
- def write( *data )
160
- @content << data.join
161
- end
162
-
163
- # Writes each argument to the buffer as a network-byte-order-encoded
164
- # 64-bit integer (8 bytes).
165
- def write_int64( *n )
166
- n.each do |i|
167
- hi = ( i >> 32 ) & 0xFFFFFFFF
168
- lo = i & 0xFFFFFFFF
169
- @content << [ hi, lo ].pack( "N2" )
170
- end
171
- end
172
-
173
- # Writes each argument to the buffer as a network-byte-order-encoded
174
- # long (4-byte) integer.
175
- def write_long( *n )
176
- @content << n.pack( "N*" )
177
- end
178
-
179
- # Writes each argument to the buffer as a network-byte-order-encoded
180
- # short (2-byte) integer.
181
- def write_short( *n )
182
- @content << n.pack( "n*" )
183
- end
184
-
185
- # Writes each argument to the buffer as a byte.
186
- def write_byte( *n )
187
- @content << n.map { |c| c.chr }.join
188
- end
189
-
190
- # Writes each argument to the buffer as an SSH2-encoded string. Each
191
- # string is prefixed by its length, encoded as a 4-byte long integer.
192
- def write_string( *text )
193
- text.each do |string|
194
- write_long( string.length )
195
- write( string )
196
- end
197
- end
198
-
199
- # Writes each argument to the buffer as a (C-style) boolean, with 1
200
- # meaning true, and 0 meaning false.
201
- def write_bool( *b )
202
- @content << b.map { |v| ( v ? 1 : 0 ).chr }.join
203
- end
204
-
205
- # Writes each argument to the buffer as a bignum (SSH2-style). No
206
- # checking is done to ensure that the arguments are, in fact, bignums.
207
- def write_bignum( *n )
208
- @content << n.map { |b| b.to_ssh }.join
209
- end
210
-
211
- # Writes the given arguments to the buffer as SSH2-encoded keys.
212
- def write_key( *key )
213
- key.each do |k|
214
- write_string( k.ssh_type )
215
-
216
- case k.ssh_type
217
- when "ssh-dss"
218
- write_bignum( k.p )
219
- write_bignum( k.q )
220
- write_bignum( k.g )
221
- write_bignum( k.pub_key )
222
-
223
- when "ssh-rsa"
224
- write_bignum( k.e )
225
- write_bignum( k.n )
226
-
227
- else
228
- raise NotImplementedError,
229
- "unsupported key type '#{k.ssh_type}'"
230
- end
231
- end
232
- end
233
-
234
- end # class WriterBufferImpl
235
-
236
- # A convenience class for a read-only buffer.
237
- class ReaderBuffer
238
- include BufferBase
239
- include ReaderBufferImpl
240
-
241
- def initialize( content )
242
- init_BufferBase( content )
243
- init_ReaderBufferImpl
244
- end
245
- end
246
-
247
- # A convenience class for a write-only buffer.
248
- class WriterBuffer
249
- include BufferBase
250
- include WriterBufferImpl
251
-
252
- def initialize( content="" )
253
- init_BufferBase( content )
254
- init_WriterBufferImpl
255
- end
256
- end
257
-
258
- # A convenience class for a read/write buffer.
259
- class Buffer
260
- include BufferBase
261
- include ReaderBufferImpl
262
- include WriterBufferImpl
263
-
264
- def initialize( content="" )
265
- init_BufferBase( content )
266
- init_ReaderBufferImpl
267
- init_WriterBufferImpl
268
- end
269
- end
270
-
271
- end # module Util
272
-
273
- end # module SSH
274
- end # module Net