net-ssh 1.1.4 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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