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,104 +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 "keyboard-interactive" SSH authentication method.
26
- class KeyboardInteractive
27
- include Net::SSH::UserAuth::Constants
28
-
29
- # Represents an information request from the server
30
- InfoRequest = Struct.new( :name, :instruction, :password, :prompts )
31
-
32
- # Represents a single prompt in an InfoRequest.
33
- Prompt = Struct.new( :prompt, :echo )
34
-
35
- USERAUTH_INFO_REQUEST = 60
36
- USERAUTH_INFO_RESPONSE = 61
37
-
38
- # The messenger to use when communicating.
39
- attr_writer :messenger
40
-
41
- # Create a new Password authenticator. It will use the given buffers
42
- # factory to create new buffer instances. The +callback+ should be
43
- # a proc object to use to specialize the behavior of this
44
- # authentication method.
45
- def initialize( buffers, callback )
46
- @buffers = buffers
47
- @callback = callback
48
- end
49
-
50
- # Attempt to authenticate the given user for the given service. The
51
- # data hash must specify a <tt>:password</tt> value, otherwise this
52
- # will always return false.
53
- def authenticate( next_service, username, data={} )
54
- password = data[:password]
55
-
56
- msg = @buffers.writer
57
- msg.write_byte USERAUTH_REQUEST
58
- msg.write_string username
59
- msg.write_string next_service
60
- msg.write_string "keyboard-interactive"
61
- msg.write_string ""
62
- msg.write_string ""
63
- @messenger.send_message msg
64
-
65
- loop do
66
- message = @messenger.wait_for_message
67
-
68
- case message.message_type
69
- when USERAUTH_SUCCESS
70
- return true
71
- when USERAUTH_FAILURE
72
- return false
73
- when USERAUTH_INFO_REQUEST
74
- name = message.buffer.read_string
75
- instruction = message.buffer.read_string
76
- req = InfoRequest.new( name, instruction, password, [] )
77
- password = nil # only use the given password once
78
-
79
- lang_tag = message.buffer.read_string
80
- message.buffer.read_long.times do
81
- prompt = message.buffer.read_string
82
- echo = message.buffer.read_bool
83
- req.prompts << Prompt.new( prompt, echo )
84
- end
85
-
86
- responses = @callback.call( req )
87
- msg = @buffers.writer
88
- msg.write_byte USERAUTH_INFO_RESPONSE
89
- msg.write_long responses.length
90
- msg.write_string(*responses)
91
- @messenger.send_message msg
92
- else
93
- raise Net::SSH::Exception,
94
- "unexpected reply in keyboard interactive: " +
95
- message.inspect
96
- end
97
- end
98
- end
99
- end
100
-
101
- end
102
- end
103
- end
104
- end
@@ -1,70 +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 "password" SSH authentication method.
26
- class Password
27
- include Net::SSH::UserAuth::Constants
28
-
29
- # The messenger to use when communicating.
30
- attr_writer :messenger
31
-
32
- # Create a new Password authenticator. It will use the given buffers
33
- # factory to create new buffer instances.
34
- def initialize( buffers )
35
- @buffers = buffers
36
- end
37
-
38
- # Attempt to authenticate the given user for the given service. The
39
- # data hash must specify a <tt>:password</tt> value, otherwise this
40
- # will always return false.
41
- def authenticate( next_service, username, data={} )
42
- return false unless data[:password]
43
-
44
- msg = @buffers.writer
45
- msg.write_byte USERAUTH_REQUEST
46
- msg.write_string username
47
- msg.write_string next_service
48
- msg.write_string "password"
49
- msg.write_bool false
50
- msg.write_string data[:password]
51
- @messenger.send_message msg
52
-
53
- message = @messenger.wait_for_message
54
-
55
- case message.message_type
56
- when USERAUTH_SUCCESS
57
- return true
58
- when USERAUTH_FAILURE, USERAUTH_PASSWD_CHANGEREQ
59
- return false
60
- else
61
- raise Net::SSH::Exception,
62
- "unexpected reply to USERAUTH_REQUEST: #{message.inspect}"
63
- end
64
- end
65
- end
66
-
67
- end
68
- end
69
- end
70
- end
@@ -1,137 +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 "publickey" SSH authentication method.
26
- class PublicKey
27
- include Net::SSH::UserAuth::Constants
28
-
29
- # The messenger instance 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
- # Create a new PublicKey instance that uses the given buffer
36
- # factory to produce new buffer instances.
37
- def initialize( buffers )
38
- @buffers = buffers
39
- end
40
-
41
- # Attempts to perform public-key authentication for the given
42
- # username, trying each identity known to the key manager. If any of
43
- # them succeed, returns +true+, otherwise returns +false+. The data
44
- # hash must contain a UserKeyManager instance under the
45
- # <tt>:key_manager</tt> key.
46
- def authenticate( next_service, username, data={} )
47
- key_manager = data[:key_manager]
48
- return false unless key_manager
49
-
50
- key_manager.identities.each do |identity|
51
- return true if authenticate_with( identity, next_service,
52
- username, key_manager )
53
- end
54
-
55
- return false
56
-
57
- ensure
58
- key_manager.finish if key_manager
59
- end
60
-
61
- # Builds a Net::SSH::Util::WriterBuffer that contains the request
62
- # formatted for sending a public-key request to the server.
63
- def build_request( pub_key, username, next_service, has_sig,
64
- buffer=nil )
65
- # begin
66
- buffer ||= @buffers.writer
67
-
68
- buffer.write_byte USERAUTH_REQUEST
69
- buffer.write_string username
70
- buffer.write_string next_service
71
- buffer.write_string "publickey"
72
- buffer.write_bool has_sig
73
- buffer.write_string pub_key.ssh_type
74
-
75
- blob = @buffers.writer
76
- blob.write_key pub_key
77
- buffer.write_string blob.to_s
78
-
79
- return buffer
80
- end
81
- private :build_request
82
-
83
- # Builds and sends a request formatted for a public-key
84
- # authentication request.
85
- def send_request( pub_key, username, next_service, signature=nil )
86
- msg = build_request( pub_key, username, next_service, signature )
87
- msg.write_string signature if signature
88
- @messenger.send_message msg
89
- end
90
- private :send_request
91
-
92
- # Attempts to perform public-key authentication for the given
93
- # username, with the given identity (public key). Returns +true+ if
94
- # successful, or +false+ otherwise.
95
- def authenticate_with( identity, next_service, username, key_manager )
96
- send_request identity, username, next_service
97
-
98
- message = @messenger.wait_for_message
99
-
100
- case message.message_type
101
- when USERAUTH_PK_OK
102
- sig_data = @buffers.writer
103
- sig_data.write_string @session_id
104
- build_request identity, username, next_service, true, sig_data
105
-
106
- sig_blob = key_manager.sign( identity, sig_data )
107
-
108
- send_request identity, username, next_service, sig_blob.to_s
109
- message = @messenger.wait_for_message
110
-
111
- case message.message_type
112
- when USERAUTH_SUCCESS
113
- return true
114
- when USERAUTH_FAILURE
115
- return false
116
- else
117
- raise Net::SSH::Exception,
118
- "unexpected server response to USERAUTH_REQUEST: " +
119
- message.inspect
120
- end
121
-
122
- when USERAUTH_FAILURE
123
- return false
124
-
125
- else
126
- raise Net::SSH::Exception,
127
- "unexpected reply to USERAUTH_REQUEST: #{message.inspect}"
128
- end
129
- end
130
- private :authenticate_with
131
-
132
- end
133
-
134
- end
135
- end
136
- end
137
- end
@@ -1,90 +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
- module Methods
21
-
22
- def register_services( container )
23
- container.namespace_define :methods do |b|
24
-
25
- b.password do |c,p|
26
- require 'net/ssh/userauth/methods/password'
27
- method = Password.new( c[:transport][:buffers] )
28
- method.messenger = c[:userauth][:driver]
29
- method
30
- end
31
-
32
- b.keyboard_interactive do |c,p|
33
- require 'net/ssh/userauth/methods/keyboard-interactive'
34
- method = KeyboardInteractive.new( c[:transport][:buffers],
35
- c[:keyboard_interactive_callback] )
36
- method.messenger = c[:userauth][:driver]
37
- method
38
- end
39
-
40
- b.keyboard_interactive_prompter do
41
- require 'net/ssh/util/prompter'
42
- Net::SSH::Util::Prompter.new
43
- end
44
-
45
- b.keyboard_interactive_callback do |c,p|
46
- proc do |req|
47
- if req.password
48
- [ req.password ] * req.prompts.length
49
- else
50
- responses = []
51
- puts req.name unless req.name.empty?
52
- puts req.instruction unless req.instruction.empty?
53
- req.prompts.each do |prompt|
54
- response = prompt.echo ?
55
- gets.chomp :
56
- c[:keyboard_interactive_prompter].
57
- password( prompt.prompt )
58
- responses << response
59
- end
60
- responses
61
- end
62
- end
63
- end
64
-
65
- b.publickey do |c,p|
66
- require 'net/ssh/userauth/methods/publickey'
67
- method = PublicKey.new( c[:transport][:buffers] )
68
- method.messenger = c[:userauth][:driver]
69
- method.session_id = c[:transport][:session].session_id
70
- method
71
- end
72
-
73
- b.hostbased do |c,p|
74
- require 'net/ssh/userauth/methods/hostbased'
75
- method = HostBased.new( c[:transport][:buffers] )
76
- session = c[:transport][:session]
77
- method.messenger = c[:userauth][:driver]
78
- method.hostname = session.client_name
79
- method.session_id = session.session_id
80
- method
81
- end
82
-
83
- end
84
- end
85
- module_function :register_services
86
-
87
- end
88
- end
89
- end
90
- end
@@ -1,197 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004, Guillaume Mar�ais (guillaume.marcais@free.fr),
4
- # Jamis Buck (jamis@37signals.com)
5
- # All rights reserved.
6
- #
7
- # This source file is distributed as part of the Net::SSH Secure Shell Client
8
- # library for Ruby. This file (and the library as a whole) may be used only as
9
- # allowed by either the BSD license, or the Ruby license (or, by association
10
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
11
- # distribution for the texts of these licenses.
12
- # -----------------------------------------------------------------------------
13
- # net-ssh website : http://net-ssh.rubyforge.org
14
- # project website: http://rubyforge.org/projects/net-ssh
15
- # =============================================================================
16
- #++
17
-
18
- require 'dl/import'
19
- require 'dl/struct'
20
-
21
- require 'net/ssh/errors'
22
-
23
- module Net
24
- module SSH
25
- module UserAuth
26
-
27
- # This module encapsulates the implementation of a socket factory that
28
- # uses the PuTTY "pageant" utility to obtain information about SSH
29
- # identities.
30
- #
31
- # This code is a slightly modified version of the original implementation
32
- # by Guillaume Mar�ais (guillaume.marcais@free.fr). It is used and
33
- # relicensed by permission.
34
- module Pageant
35
-
36
- # From Putty pageant.c
37
- AGENT_MAX_MSGLEN = 8192
38
- AGENT_COPYDATA_ID = 0x804e50ba
39
-
40
- # The definition of the Windows methods and data structures used in
41
- # communicating with the pageant process.
42
- module Win
43
- extend DL::Importable
44
-
45
- dlload 'user32'
46
- dlload 'kernel32'
47
-
48
- typealias("LPCTSTR", "char *") # From winnt.h
49
- typealias("LPVOID", "void *") # From winnt.h
50
- typealias("LPCVOID", "const void *") # From windef.h
51
- typealias("LRESULT", "long") # From windef.h
52
- typealias("WPARAM", "unsigned int *") # From windef.h
53
- typealias("LPARAM", "long *") # From windef.h
54
- typealias("PDWORD_PTR", "long *") # From basetsd.h
55
-
56
- # From winbase.h, winnt.h
57
- INVALID_HANDLE_VALUE = -1
58
- NULL = nil
59
- PAGE_READWRITE = 0x0004
60
- FILE_MAP_WRITE = 2
61
- WM_COPYDATA = 74
62
-
63
- SMTO_NORMAL = 0 # From winuser.h
64
-
65
- # args: lpClassName, lpWindowName
66
- extern 'HWND FindWindow(LPCTSTR, LPCTSTR)'
67
-
68
- # args: none
69
- extern 'DWORD GetCurrentThreadId()'
70
-
71
- # args: hFile, (ignored), flProtect, dwMaximumSizeHigh,
72
- # dwMaximumSizeLow, lpName
73
- extern 'HANDLE CreateFileMapping(HANDLE, void *, DWORD, DWORD, ' +
74
- 'DWORD, LPCTSTR)'
75
-
76
- # args: hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh,
77
- # dwfileOffsetLow, dwNumberOfBytesToMap
78
- extern 'LPVOID MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, DWORD)'
79
-
80
- # args: lpBaseAddress
81
- extern 'BOOL UnmapViewOfFile(LPCVOID)'
82
-
83
- # args: hObject
84
- extern 'BOOL CloseHandle(HANDLE)'
85
-
86
- # args: hWnd, Msg, wParam, lParam, fuFlags, uTimeout, lpdwResult
87
- extern 'LRESULT SendMessageTimeout(HWND, UINT, WPARAM, LPARAM, ' +
88
- 'UINT, UINT, PDWORD_PTR)'
89
- end
90
-
91
- # This is the pseudo-socket implementation that mimics the interface of
92
- # a socket, translating each request into a Windows messaging call to
93
- # the pageant daemon. This allows pageant support to be implemented
94
- # simply by replacing the socket factory used by the Agent class.
95
- class Socket
96
-
97
- private_class_method :new
98
-
99
- # The factory method for creating a new Socket instance. The location
100
- # parameter is ignored, and is only needed for compatibility with
101
- # the general Socket interface.
102
- def self.open( location=nil )
103
- new
104
- end
105
-
106
- # Create a new instance that communicates with the running pageant
107
- # instance. If no such instance is running, this will cause an error.
108
- def initialize
109
- @win = Win.findWindow( "Pageant", "Pageant" )
110
-
111
- if @win == 0
112
- raise Net::SSH::Exception,
113
- "pageant process not running"
114
- end
115
-
116
- @res = nil
117
- @pos = 0
118
- end
119
-
120
- # Forwards the data to #send_query, ignoring any arguments after
121
- # the first. Returns 0.
122
- def send( data, *args )
123
- @res = send_query( data )
124
- @pos = 0
125
- end
126
-
127
- # Packages the given query string and sends it to the pageant
128
- # process via the Windows messaging subsystem. The result is
129
- # cached, to be returned piece-wise when #read is called.
130
- def send_query( query )
131
- res = nil
132
- filemap = 0
133
- ptr = nil
134
- id = DL::PtrData.malloc( DL.sizeof("L") )
135
-
136
- mapname = "PageantRequest%08x\000" % Win.getCurrentThreadId()
137
- filemap = Win.createFileMapping(Win::INVALID_HANDLE_VALUE,
138
- Win::NULL,
139
- Win::PAGE_READWRITE, 0,
140
- AGENT_MAX_MSGLEN, mapname)
141
- if filemap == 0
142
- raise Net::SSH::Exception,
143
- "Creation of file mapping failed"
144
- end
145
-
146
- ptr = Win.mapViewOfFile( filemap, Win::FILE_MAP_WRITE, 0, 0,
147
- AGENT_MAX_MSGLEN )
148
-
149
- if ptr.nil? || ptr.null?
150
- raise Net::SSH::Exception, "Mapping of file failed"
151
- end
152
-
153
- ptr[0] = query
154
-
155
- cds = [AGENT_COPYDATA_ID, mapname.size + 1, mapname].
156
- pack("LLp").to_ptr
157
- succ = Win.sendMessageTimeout( @win, Win::WM_COPYDATA, Win::NULL,
158
- cds, Win::SMTO_NORMAL, 5000, id )
159
-
160
- if succ > 0
161
- retlen = 4 + ptr.to_s(4).unpack("N")[0]
162
- res = ptr.to_s(retlen)
163
- end
164
-
165
- return res
166
- ensure
167
- Win.unmapViewOfFile( ptr ) unless ptr.nil? || ptr.null?
168
- Win.closeHandle( filemap ) if filemap != 0
169
- end
170
-
171
- # Conceptually close the socket. This doesn't really do anthing
172
- # significant, but merely complies with the Socket interface.
173
- def close
174
- @res = nil
175
- @pos = 0
176
- end
177
-
178
- # Reads +n+ bytes from the cached result of the last query. If +n+
179
- # is +nil+, returns all remaining data from the last query.
180
- def read(n = nil)
181
- return nil unless @res
182
- if n.nil?
183
- start, @pos = @pos, @res.size
184
- return @res[start..-1]
185
- else
186
- start, @pos = @pos, @pos + n
187
- return @res[start, n]
188
- end
189
- end
190
-
191
- end
192
-
193
- end
194
-
195
- end
196
- end
197
- end