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,138 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2007, Chris Andrews (chris@nodnol.org),
4
- # Jamis Buck (jgb3@email.byu.edu)
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
- $:.unshift "#{File.dirname(__FILE__)}/../../../lib"
19
-
20
- require 'net/ssh/service/agentforward/driver'
21
- require 'net/ssh/util/buffer'
22
- require 'test/unit'
23
- require 'socket'
24
-
25
- class TC_AgentForward_Driver < Test::Unit::TestCase
26
-
27
- class Net::SSH::Service::AgentForward::Driver
28
- attr_reader :data
29
- end
30
-
31
- class Buffers
32
- def writer
33
- Net::SSH::Util::WriterBuffer.new
34
- end
35
- end
36
-
37
- class Log
38
- def debug?
39
- true
40
- end
41
- def debug(msg)
42
- end
43
- end
44
-
45
- class Agent
46
- attr_reader :sends
47
- def initialize
48
- @sends = []
49
- end
50
- def read_raw_packet
51
- "raw agent data"
52
- end
53
- def send_raw_packet(data)
54
- @sends.push data
55
- end
56
- end
57
-
58
- class MockObject
59
- attr_reader :events
60
- attr_reader :blocks
61
- attr_reader :returns
62
-
63
- def initialize
64
- @events = []
65
- @blocks = []
66
- @returns = []
67
- end
68
- def method_missing( sym, *args, &block )
69
- @blocks << block
70
- @events << [ sym, args, !block.nil? ]
71
- @returns << MockObject.new
72
- @returns.last
73
- end
74
- def method( sym )
75
- @events << [ :method, [ sym ], false ]
76
- lambda { || }
77
- end
78
- def respond_to?( sym )
79
- true
80
- end
81
- end
82
-
83
- def setup
84
- @connection = MockObject.new
85
- @agent = Agent.new
86
-
87
- @driver = Net::SSH::Service::AgentForward::Driver.new( @connection,
88
- Buffers.new, Log.new, @agent )
89
- end
90
-
91
- def test_initialize
92
- assert_equal [ [:add_channel_open_handler, [ "auth-agent@openssh.com" ], true] ],
93
- @connection.events
94
- end
95
-
96
- def test_request
97
- @driver.request
98
- assert_equal 2, @connection.events.length
99
- assert_equal [:channel_request, ["auth-agent-req@openssh.com"], false],
100
- @connection.events[1]
101
- end
102
-
103
- def test_do_open_channel
104
- connection = MockObject.new
105
- channel = MockObject.new
106
- @driver.do_open_channel(connection, channel, nil)
107
- assert_equal [ [:on_data, [], true] ],
108
- channel.events
109
- end
110
-
111
- def test_do_data_complete_packet
112
- channel = MockObject.new
113
- data = "\000\000\000\001v"
114
- @driver.do_data(channel, data)
115
- assert_equal [ [:send_data, ["raw agent data"], false ] ],
116
- channel.events
117
- assert_equal [ data ],
118
- @agent.sends
119
- assert_equal '', @driver.data
120
- end
121
-
122
- def test_do_data_incomplete_packet
123
- channel = MockObject.new
124
-
125
- @driver.do_data(channel, "\000\000\000\001")
126
- assert_equal 0, channel.events.length
127
- assert_equal 0, @agent.sends.length
128
- assert_equal @driver.data, "\000\000\000\001"
129
-
130
- @driver.do_data(channel, "v")
131
- assert_equal [ [:send_data, ["raw agent data"], false ] ],
132
- channel.events
133
- assert_equal [ "\000\000\000\001v" ],
134
- @agent.sends
135
- assert_equal '', @driver.data
136
- end
137
-
138
- end
@@ -1,289 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- $:.unshift "#{File.dirname(__FILE__)}/../../../lib"
18
-
19
- require 'net/ssh/service/forward/driver'
20
- require 'net/ssh/util/buffer'
21
- require 'test/unit'
22
- require 'socket'
23
-
24
- class TC_Forward_Driver < Test::Unit::TestCase
25
-
26
- class Buffers
27
- def writer
28
- Net::SSH::Util::WriterBuffer.new
29
- end
30
- end
31
-
32
- class Log
33
- def debug?
34
- true
35
- end
36
- def debug(msg)
37
- end
38
- end
39
-
40
- class MockObject
41
- attr_reader :events
42
- attr_reader :blocks
43
- attr_reader :returns
44
-
45
- def initialize
46
- @events = []
47
- @blocks = []
48
- @returns = []
49
- end
50
- def method_missing( sym, *args, &block )
51
- @blocks << block
52
- @events << [ sym, args, !block.nil? ]
53
- @returns << MockObject.new
54
- @returns.last
55
- end
56
- def method( sym )
57
- @events << [ :method, [ sym ], false ]
58
- lambda { || }
59
- end
60
- def respond_to?( sym )
61
- true
62
- end
63
- end
64
-
65
- def setup
66
- @connection = MockObject.new
67
- @handlers = { :local => MockObject.new, :remote => MockObject.new }
68
-
69
- @driver = Net::SSH::Service::Forward::Driver.new( @connection,
70
- Buffers.new, Log.new, @handlers )
71
- end
72
-
73
- def test_initialize
74
- assert_equal 0, @driver.direct_channel_count
75
- assert_equal 0, @driver.open_direct_channel_count
76
- assert_equal [ [ :add_channel_open_handler, [ "forwarded-tcpip" ], true ] ],
77
- @connection.events
78
- end
79
-
80
- def test_direct_channel
81
- handler = MockObject.new
82
- @driver.direct_channel( 1, "remote.host", 2, handler, 3, 4, 5 )
83
-
84
- assert_equal 1, @driver.direct_channel_count
85
- assert_equal 1, @driver.open_direct_channel_count
86
-
87
- assert_equal 2, @connection.events.length
88
- assert_equal [ :open_channel, [ "direct-tcpip",
89
- Net::SSH::Util::WriterBuffer.new(
90
- "\0\0\0\xbremote.host\0\0\0\2\0\0\0\x09127.0.0.1\0\0\0\1" ) ], true ],
91
- @connection.events.last
92
- assert_equal [ [ :on_confirm_failed, [], true ] ],
93
- @connection.returns.last.events
94
-
95
- channel = MockObject.new
96
- @connection.blocks.last.call( channel )
97
-
98
- assert_equal [ [ :method, [ :on_receive ], false ],
99
- [ :method, [ :on_eof ], false ],
100
- [ :confirm, [ channel, 1, "remote.host", 2, 3, 4, 5 ], false ],
101
- [ :process, [ channel ], false ] ], handler.events
102
-
103
- assert_equal [ [ :on_data, [], true ],
104
- [ :on_eof, [], true ],
105
- [ :on_close, [], true ] ], channel.events
106
-
107
- channel.blocks.last.call( channel )
108
- assert_equal 0, @driver.open_direct_channel_count
109
- assert_equal [ :on_close, [ channel ], false ], handler.events.last
110
- end
111
-
112
- def test_local_bad_parm_count
113
- assert_raise( ArgumentError ) do
114
- @driver.local 1, 2
115
- end
116
- assert_raise( ArgumentError ) do
117
- @driver.local 1, 2, 3, 4, 5
118
- end
119
- end
120
-
121
- [
122
- [ :local_with_3, [ 12233, "test.host", 80 ] ],
123
- [ :local_with_4, [ "localhost", 12233, "test.host", 80 ] ]
124
- ].each do |name, args|
125
- define_method "test_#{name}" do
126
- assert_equal 0, @driver.open_direct_channel_count
127
- assert @driver.active_locals.empty?
128
-
129
- @driver.local(*args)
130
-
131
- address = '127.0.0.1'
132
- address = args.shift if args.first.is_a? String
133
- port = args.shift
134
-
135
- sleep 0.1
136
- socket = TCPSocket.new( address, port )
137
- sleep 0.1
138
-
139
- assert_equal 1, @driver.open_direct_channel_count
140
- assert !@driver.active_locals.empty?
141
-
142
- @driver.cancel_local( port, address )
143
- assert @driver.active_locals.empty?
144
- end
145
- end
146
-
147
- [
148
- [ :remote_with_2, [ 80 ] ],
149
- [ :remote_with_zero_port, [ 0 ] ],
150
- [ :remote_with_3, [ 80, 'localhost' ] ]
151
- ].each do |name, args|
152
- define_method "test_#{name}_success" do
153
- handler = MockObject.new
154
-
155
- port = args[0]
156
- host = args.last
157
- host = "127.0.0.1" unless host.is_a?( String )
158
-
159
- assert @driver.active_remotes.empty?
160
- assert_nothing_raised { @driver.remote( handler, *args ) }
161
- assert @driver.active_remotes.empty?
162
-
163
- assert_equal [ :global_request,
164
- [ "tcpip-forward", Net::SSH::Util::WriterBuffer.new(
165
- "\0\0\0#{host.length.chr}#{host}\0\0\0#{port.chr}" ) ], true ],
166
- @connection.events.last
167
-
168
- port = 0300 if port == 0
169
- response = Net::SSH::Util::ReaderBuffer.new( "\0\0\0#{port.chr}" )
170
- @connection.blocks.last.call( true, response )
171
-
172
- assert_equal [ port ], @driver.active_remotes
173
-
174
- assert_equal [ [ :setup, [ port ], false ] ], handler.events
175
- end
176
-
177
- define_method "test_#{name}_fail_handled" do
178
- handler = MockObject.new
179
-
180
- port = args[0]
181
- host = args.last
182
- host = "127.0.0.1" unless host.is_a?( String )
183
-
184
- assert @driver.active_remotes.empty?
185
- assert_nothing_raised { @driver.remote( handler, *args ) }
186
- assert @driver.active_remotes.empty?
187
-
188
- @connection.blocks.last.call( false, nil )
189
-
190
- assert_equal [ [ :error, [ "remote port #{port} could not be forwarded to local host" ], false ] ], handler.events
191
- end
192
-
193
- define_method "test_#{name}_fail_unhandled" do
194
- port = args[0]
195
- host = args.last
196
- host = "127.0.0.1" unless host.is_a?( String )
197
-
198
- assert @driver.active_remotes.empty?
199
- assert_nothing_raised { @driver.remote( nil, *args ) }
200
- assert @driver.active_remotes.empty?
201
-
202
- assert_raise( Net::SSH::Exception ) do
203
- @connection.blocks.last.call( false, nil )
204
- end
205
- end
206
-
207
- define_method "test_#{name}_duplicate" do
208
- handler = MockObject.new
209
- port = args[0]
210
- port = 0300 if port == 0
211
- @driver.remote( handler, *args )
212
- response = Net::SSH::Util::ReaderBuffer.new( "\0\0\0#{port.chr}" )
213
- @connection.blocks.last.call( true, response )
214
-
215
- args = args.dup
216
- args[0] = port
217
- assert_raise( Net::SSH::Exception ) do
218
- @driver.remote( handler, *args )
219
- end
220
- end
221
- end
222
-
223
- def test_remote_to
224
- @driver.remote_to( 1, "test.host", 2 )
225
- assert_equal [ [ :call, [ 1, "test.host" ], false ] ],
226
- @handlers[:remote].events
227
- end
228
-
229
- def test_cancel_remote_success
230
- @driver.remote_to( 1, "test.host", 2 )
231
- @connection.blocks.last.call( true, nil )
232
- assert_equal 1, @driver.active_remotes.length
233
-
234
- @driver.cancel_remote( 2 )
235
- assert_equal [ :global_request, [ "cancel-tcpip-forward",
236
- Net::SSH::Util::WriterBuffer.new( "\0\0\0\x09127.0.0.1\0\0\0\2" ) ],
237
- true ], @connection.events.last
238
-
239
- @connection.blocks.last.call( true, nil )
240
- assert_equal 0, @driver.active_remotes.length
241
- end
242
-
243
- def test_cancel_remote_failure
244
- @driver.remote_to( 1, "test.host", 2 )
245
- @connection.blocks.last.call( true, nil )
246
- assert_equal 1, @driver.active_remotes.length
247
-
248
- @driver.cancel_remote( 2 )
249
- assert_raise( Net::SSH::Exception ) do
250
- @connection.blocks.last.call( false, nil )
251
- end
252
- end
253
-
254
- def test_do_open_channel_valid
255
- handler = MockObject.new
256
- @driver.remote( handler, 80 )
257
- @connection.blocks.last.call( true, nil )
258
- assert_equal 1, @driver.active_remotes.length
259
-
260
- channel = MockObject.new
261
- data = Net::SSH::Util::ReaderBuffer.new(
262
- "\0\0\0\017123.456.789.012\0\0\0\120\0\0\0\017345.678.901.234\0\0\0\2" )
263
-
264
- @driver.do_open_channel( @connection, channel, data )
265
-
266
- assert_equal [
267
- [ :on_open, [ channel, "123.456.789.012", 80, "345.678.901.234", 2 ], false ],
268
- [ :method, [ :on_receive ], false ],
269
- [ :method, [ :on_close ], false ],
270
- [ :method, [ :on_eof ], false ] ], handler.events[1..-1]
271
-
272
- assert_equal [
273
- [ :on_data, [], true ],
274
- [ :on_close, [], true ],
275
- [ :on_eof, [], true ] ], channel.events
276
- end
277
-
278
- def test_do_open_channel_invalid
279
- handler = MockObject.new
280
- channel = MockObject.new
281
- data = Net::SSH::Util::ReaderBuffer.new(
282
- "\0\0\0\017123.456.789.012\0\0\0\120\0\0\0\017345.678.901.234\0\0\0\2" )
283
-
284
- assert_raise( Net::SSH::Exception ) do
285
- @driver.do_open_channel( @connection, channel, data )
286
- end
287
- end
288
-
289
- end
@@ -1,123 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- $:.unshift "#{File.dirname(__FILE__)}/../../../lib"
18
-
19
- require 'net/ssh/service/forward/local-network-handler'
20
- require 'test/unit'
21
-
22
- class TC_LocalNetworkHandler < Test::Unit::TestCase
23
-
24
- class Log
25
- def debug?
26
- true
27
- end
28
-
29
- def debug( msg )
30
- end
31
-
32
- def error( msg )
33
- end
34
- end
35
-
36
- class Client
37
- attr_reader :events
38
- attr_reader :script
39
-
40
- def initialize
41
- @events = []
42
- @script = []
43
- end
44
-
45
- def send( data, code )
46
- @events << [ :send, data, code ]
47
- end
48
-
49
- def recv( block_size )
50
- @events << [ :recv, block_size ]
51
- @script.shift
52
- end
53
- end
54
-
55
- class Channel
56
- attr_reader :events
57
-
58
- def initialize
59
- @values = Hash.new
60
- @events = []
61
- end
62
-
63
- def []( name )
64
- @values[name]
65
- end
66
-
67
- def []=( name, value )
68
- @values[name] = value
69
- end
70
-
71
- def close
72
- @events << :close
73
- end
74
-
75
- def send_data( data )
76
- @events << data
77
- end
78
- end
79
-
80
- def setup
81
- @client = Client.new
82
- @channel = Channel.new
83
- @handler = Net::SSH::Service::Forward::LocalNetworkHandler.new(
84
- Log.new, 16, @client )
85
- end
86
-
87
- def test_on_receive
88
- @handler.on_receive( @channel, "hello" )
89
- assert_equal [ [ :send, "hello", 0 ] ], @client.events
90
- end
91
-
92
- def test_on_eof
93
- assert !@channel[:eof]
94
- @handler.on_eof( @channel )
95
- assert @channel[:eof]
96
- end
97
-
98
- def test_process_no_eof
99
- @client.script << "part 1"
100
- @client.script << "part 2"
101
- @client.script << "part 3"
102
-
103
- @handler.process @channel
104
-
105
- assert_equal [ "part 1", "part 2", "part 3", :close ], @channel.events
106
- assert_equal [ [ :recv, 16 ], [ :recv, 16 ], [ :recv, 16 ], [ :recv, 16 ] ],
107
- @client.events
108
- end
109
-
110
- def test_process_eof
111
- @channel[:eof] = true
112
- @handler.process @channel
113
- assert_equal [ :close ], @channel.events
114
- assert_equal [], @client.events
115
- end
116
-
117
- def test_process_error
118
- assert_nothing_raised do
119
- @handler.process nil
120
- end
121
- end
122
-
123
- end