net-ssh 0.5.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 (179) hide show
  1. data/doc/LICENSE-BSD +27 -0
  2. data/doc/LICENSE-GPL +280 -0
  3. data/doc/LICENSE-RUBY +56 -0
  4. data/doc/README +13 -0
  5. data/doc/manual-html/chapter-1.html +333 -0
  6. data/doc/manual-html/chapter-2.html +455 -0
  7. data/doc/manual-html/chapter-3.html +413 -0
  8. data/doc/manual-html/chapter-4.html +353 -0
  9. data/doc/manual-html/chapter-5.html +393 -0
  10. data/doc/manual-html/chapter-6.html +296 -0
  11. data/doc/manual-html/index.html +217 -0
  12. data/doc/manual-html/manual.css +192 -0
  13. data/doc/manual/chapter.erb +18 -0
  14. data/doc/manual/example.erb +18 -0
  15. data/doc/manual/index.erb +29 -0
  16. data/doc/manual/manual.css +192 -0
  17. data/doc/manual/manual.rb +240 -0
  18. data/doc/manual/manual.yml +67 -0
  19. data/doc/manual/page.erb +87 -0
  20. data/doc/manual/parts/channels_callbacks.txt +32 -0
  21. data/doc/manual/parts/channels_loop.txt +14 -0
  22. data/doc/manual/parts/channels_open.txt +20 -0
  23. data/doc/manual/parts/channels_operations.txt +15 -0
  24. data/doc/manual/parts/channels_types.txt +3 -0
  25. data/doc/manual/parts/channels_what_are.txt +7 -0
  26. data/doc/manual/parts/exec_channels.txt +28 -0
  27. data/doc/manual/parts/exec_open.txt +51 -0
  28. data/doc/manual/parts/exec_popen3.txt +35 -0
  29. data/doc/manual/parts/forward_direct.txt +37 -0
  30. data/doc/manual/parts/forward_handlers.txt +16 -0
  31. data/doc/manual/parts/forward_intro.txt +18 -0
  32. data/doc/manual/parts/forward_local.txt +18 -0
  33. data/doc/manual/parts/forward_remote.txt +14 -0
  34. data/doc/manual/parts/intro_author.txt +1 -0
  35. data/doc/manual/parts/intro_getting.txt +39 -0
  36. data/doc/manual/parts/intro_license.txt +6 -0
  37. data/doc/manual/parts/intro_support.txt +7 -0
  38. data/doc/manual/parts/intro_what_is.txt +7 -0
  39. data/doc/manual/parts/intro_what_is_not.txt +3 -0
  40. data/doc/manual/parts/proxy_http.txt +52 -0
  41. data/doc/manual/parts/proxy_intro.txt +1 -0
  42. data/doc/manual/parts/proxy_socks.txt +23 -0
  43. data/doc/manual/parts/session_key.txt +66 -0
  44. data/doc/manual/parts/session_options.txt +42 -0
  45. data/doc/manual/parts/session_session.txt +14 -0
  46. data/doc/manual/parts/session_start.txt +49 -0
  47. data/doc/manual/tutorial.erb +30 -0
  48. data/examples/channel-demo.rb +81 -0
  49. data/examples/port-forward.rb +51 -0
  50. data/examples/process-demo.rb +91 -0
  51. data/examples/remote-net-port-forward.rb +45 -0
  52. data/examples/remote-port-forward.rb +80 -0
  53. data/examples/tail-demo.rb +49 -0
  54. data/lib/net/ssh.rb +52 -0
  55. data/lib/net/ssh/connection/channel.rb +411 -0
  56. data/lib/net/ssh/connection/constants.rb +47 -0
  57. data/lib/net/ssh/connection/driver.rb +343 -0
  58. data/lib/net/ssh/connection/services.rb +72 -0
  59. data/lib/net/ssh/connection/term.rb +90 -0
  60. data/lib/net/ssh/errors.rb +27 -0
  61. data/lib/net/ssh/proxy/errors.rb +34 -0
  62. data/lib/net/ssh/proxy/http.rb +126 -0
  63. data/lib/net/ssh/proxy/socks4.rb +83 -0
  64. data/lib/net/ssh/proxy/socks5.rb +160 -0
  65. data/lib/net/ssh/service/forward/driver.rb +319 -0
  66. data/lib/net/ssh/service/forward/local-network-handler.rb +74 -0
  67. data/lib/net/ssh/service/forward/remote-network-handler.rb +81 -0
  68. data/lib/net/ssh/service/forward/services.rb +76 -0
  69. data/lib/net/ssh/service/process/driver.rb +153 -0
  70. data/lib/net/ssh/service/process/open.rb +193 -0
  71. data/lib/net/ssh/service/process/popen3.rb +160 -0
  72. data/lib/net/ssh/service/process/services.rb +66 -0
  73. data/lib/net/ssh/service/services.rb +44 -0
  74. data/lib/net/ssh/session.rb +242 -0
  75. data/lib/net/ssh/transport/algorithm-negotiator.rb +267 -0
  76. data/lib/net/ssh/transport/compress/compressor.rb +53 -0
  77. data/lib/net/ssh/transport/compress/decompressor.rb +53 -0
  78. data/lib/net/ssh/transport/compress/none-compressor.rb +39 -0
  79. data/lib/net/ssh/transport/compress/none-decompressor.rb +39 -0
  80. data/lib/net/ssh/transport/compress/services.rb +68 -0
  81. data/lib/net/ssh/transport/compress/zlib-compressor.rb +60 -0
  82. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +52 -0
  83. data/lib/net/ssh/transport/constants.rb +66 -0
  84. data/lib/net/ssh/transport/errors.rb +47 -0
  85. data/lib/net/ssh/transport/identity-cipher.rb +61 -0
  86. data/lib/net/ssh/transport/kex/dh-gex.rb +106 -0
  87. data/lib/net/ssh/transport/kex/dh.rb +231 -0
  88. data/lib/net/ssh/transport/kex/services.rb +60 -0
  89. data/lib/net/ssh/transport/ossl/buffer-factory.rb +52 -0
  90. data/lib/net/ssh/transport/ossl/buffer.rb +87 -0
  91. data/lib/net/ssh/transport/ossl/cipher-factory.rb +98 -0
  92. data/lib/net/ssh/transport/ossl/digest-factory.rb +51 -0
  93. data/lib/net/ssh/transport/ossl/hmac-factory.rb +71 -0
  94. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +62 -0
  95. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +44 -0
  96. data/lib/net/ssh/transport/ossl/hmac/md5.rb +46 -0
  97. data/lib/net/ssh/transport/ossl/hmac/none.rb +46 -0
  98. data/lib/net/ssh/transport/ossl/hmac/services.rb +68 -0
  99. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +44 -0
  100. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +45 -0
  101. data/lib/net/ssh/transport/ossl/key-factory.rb +113 -0
  102. data/lib/net/ssh/transport/ossl/services.rb +149 -0
  103. data/lib/net/ssh/transport/packet-stream.rb +210 -0
  104. data/lib/net/ssh/transport/services.rb +146 -0
  105. data/lib/net/ssh/transport/session.rb +296 -0
  106. data/lib/net/ssh/transport/version-negotiator.rb +73 -0
  107. data/lib/net/ssh/userauth/agent.rb +218 -0
  108. data/lib/net/ssh/userauth/constants.rb +35 -0
  109. data/lib/net/ssh/userauth/driver.rb +176 -0
  110. data/lib/net/ssh/userauth/methods/hostbased.rb +119 -0
  111. data/lib/net/ssh/userauth/methods/password.rb +70 -0
  112. data/lib/net/ssh/userauth/methods/publickey.rb +137 -0
  113. data/lib/net/ssh/userauth/methods/services.rb +63 -0
  114. data/lib/net/ssh/userauth/services.rb +126 -0
  115. data/lib/net/ssh/userauth/userkeys.rb +258 -0
  116. data/lib/net/ssh/util/buffer.rb +274 -0
  117. data/lib/net/ssh/util/openssl.rb +146 -0
  118. data/lib/net/ssh/util/prompter.rb +73 -0
  119. data/lib/net/ssh/version.rb +29 -0
  120. data/test/ALL-TESTS.rb +21 -0
  121. data/test/connection/tc_channel.rb +136 -0
  122. data/test/connection/tc_driver.rb +287 -0
  123. data/test/connection/tc_integration.rb +85 -0
  124. data/test/proxy/tc_http.rb +209 -0
  125. data/test/proxy/tc_socks4.rb +148 -0
  126. data/test/proxy/tc_socks5.rb +214 -0
  127. data/test/service/forward/tc_driver.rb +289 -0
  128. data/test/service/forward/tc_local_network_handler.rb +123 -0
  129. data/test/service/forward/tc_remote_network_handler.rb +108 -0
  130. data/test/service/process/tc_driver.rb +79 -0
  131. data/test/service/process/tc_integration.rb +117 -0
  132. data/test/service/process/tc_open.rb +179 -0
  133. data/test/service/process/tc_popen3.rb +164 -0
  134. data/test/tc_integration.rb +79 -0
  135. data/test/transport/compress/tc_none_compress.rb +41 -0
  136. data/test/transport/compress/tc_none_decompress.rb +45 -0
  137. data/test/transport/compress/tc_zlib_compress.rb +61 -0
  138. data/test/transport/compress/tc_zlib_decompress.rb +48 -0
  139. data/test/transport/kex/tc_dh.rb +304 -0
  140. data/test/transport/kex/tc_dh_gex.rb +70 -0
  141. data/test/transport/ossl/fixtures/dsa-encrypted +15 -0
  142. data/test/transport/ossl/fixtures/dsa-encrypted-bad +15 -0
  143. data/test/transport/ossl/fixtures/dsa-unencrypted +12 -0
  144. data/test/transport/ossl/fixtures/dsa-unencrypted-bad +12 -0
  145. data/test/transport/ossl/fixtures/dsa-unencrypted.pub +1 -0
  146. data/test/transport/ossl/fixtures/not-a-private-key +4 -0
  147. data/test/transport/ossl/fixtures/not-supported +2 -0
  148. data/test/transport/ossl/fixtures/rsa-encrypted +18 -0
  149. data/test/transport/ossl/fixtures/rsa-encrypted-bad +18 -0
  150. data/test/transport/ossl/fixtures/rsa-unencrypted +15 -0
  151. data/test/transport/ossl/fixtures/rsa-unencrypted-bad +15 -0
  152. data/test/transport/ossl/fixtures/rsa-unencrypted.pub +1 -0
  153. data/test/transport/ossl/hmac/tc_hmac.rb +58 -0
  154. data/test/transport/ossl/hmac/tc_md5.rb +50 -0
  155. data/test/transport/ossl/hmac/tc_md5_96.rb +50 -0
  156. data/test/transport/ossl/hmac/tc_none.rb +50 -0
  157. data/test/transport/ossl/hmac/tc_sha1.rb +50 -0
  158. data/test/transport/ossl/hmac/tc_sha1_96.rb +50 -0
  159. data/test/transport/ossl/tc_buffer.rb +97 -0
  160. data/test/transport/ossl/tc_buffer_factory.rb +67 -0
  161. data/test/transport/ossl/tc_cipher_factory.rb +84 -0
  162. data/test/transport/ossl/tc_digest_factory.rb +39 -0
  163. data/test/transport/ossl/tc_hmac_factory.rb +72 -0
  164. data/test/transport/ossl/tc_key_factory.rb +199 -0
  165. data/test/transport/tc_algorithm_negotiator.rb +169 -0
  166. data/test/transport/tc_identity_cipher.rb +52 -0
  167. data/test/transport/tc_integration.rb +110 -0
  168. data/test/transport/tc_packet_stream.rb +183 -0
  169. data/test/transport/tc_session.rb +283 -0
  170. data/test/transport/tc_version_negotiator.rb +86 -0
  171. data/test/userauth/methods/tc_hostbased.rb +136 -0
  172. data/test/userauth/methods/tc_password.rb +89 -0
  173. data/test/userauth/methods/tc_publickey.rb +167 -0
  174. data/test/userauth/tc_agent.rb +223 -0
  175. data/test/userauth/tc_driver.rb +190 -0
  176. data/test/userauth/tc_integration.rb +81 -0
  177. data/test/userauth/tc_userkeys.rb +265 -0
  178. data/test/util/tc_buffer.rb +217 -0
  179. metadata +256 -0
@@ -0,0 +1,289 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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 "../../../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
@@ -0,0 +1,123 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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 "../../../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
@@ -0,0 +1,108 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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 "../../../lib"
18
+
19
+ require 'net/ssh/service/forward/remote-network-handler'
20
+ require 'test/unit'
21
+ require 'socket'
22
+
23
+ class TC_RemoteNetworkHandler < Test::Unit::TestCase
24
+
25
+ class Log
26
+ def debug?
27
+ true
28
+ end
29
+
30
+ def debug( msg )
31
+ end
32
+
33
+ def error( msg )
34
+ end
35
+ end
36
+
37
+ class Channel
38
+ attr_reader :events
39
+
40
+ def initialize
41
+ @values = Hash.new
42
+ @events = []
43
+ end
44
+
45
+ def []( name )
46
+ @values[name]
47
+ end
48
+
49
+ def []=( name, value )
50
+ @values[name] = value
51
+ end
52
+
53
+ def close
54
+ @events << :close
55
+ end
56
+
57
+ def send_data( data )
58
+ @events << data
59
+ end
60
+ end
61
+
62
+ HOST = "127.0.0.1"
63
+ PORT = 12248
64
+
65
+ class ScriptedServer
66
+ attr_reader :script
67
+
68
+ def initialize
69
+ @script = []
70
+ @thread = Thread.new {
71
+ server = TCPServer.new( HOST, PORT )
72
+ client = server.accept
73
+ client.send @script.shift, 0 until @script.empty?
74
+ server.shutdown
75
+ }
76
+ end
77
+
78
+ def join
79
+ @thread.join
80
+ end
81
+ end
82
+
83
+ def setup
84
+ @channel = Channel.new
85
+ @handler = Net::SSH::Service::Forward::RemoteNetworkHandler.new(
86
+ Log.new, 16, PORT, HOST )
87
+ end
88
+
89
+ def test_on_eof
90
+ assert !@channel[:eof]
91
+ @handler.on_eof( @channel )
92
+ assert @channel[:eof]
93
+ end
94
+
95
+ def test_on_open
96
+ server = ScriptedServer.new
97
+ server.script << "1234567890123456"
98
+ server.script << "abcdefghijklmnop"
99
+ sleep 0.1
100
+ @handler.on_open( @channel, nil, nil, nil, nil )
101
+ server.join
102
+ @handler.on_eof( @channel )
103
+ sleep 0.1
104
+ assert_equal [ "1234567890123456", "abcdefghijklmnop", :close ],
105
+ @channel.events
106
+ end
107
+
108
+ end