ddollar-net-ssh 2.0.1

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 (103) hide show
  1. data/CHANGELOG.rdoc +42 -0
  2. data/Manifest +101 -0
  3. data/README.rdoc +110 -0
  4. data/Rakefile +26 -0
  5. data/THANKS.rdoc +16 -0
  6. data/lib/net/ssh.rb +199 -0
  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 +169 -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 +127 -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 +625 -0
  21. data/lib/net/ssh/connection/constants.rb +33 -0
  22. data/lib/net/ssh/connection/session.rb +569 -0
  23. data/lib/net/ssh/connection/term.rb +178 -0
  24. data/lib/net/ssh/errors.rb +85 -0
  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 +14 -0
  31. data/lib/net/ssh/proxy/http.rb +94 -0
  32. data/lib/net/ssh/proxy/socks4.rb +70 -0
  33. data/lib/net/ssh/proxy/socks5.rb +128 -0
  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 +30 -0
  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/transport/openssl.rb +128 -0
  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 +262 -0
  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 +60 -0
  67. data/net-ssh.gemspec +56 -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 +222 -0
data/test/test_all.rb ADDED
@@ -0,0 +1,6 @@
1
+ Dir.chdir(File.dirname(__FILE__)) do
2
+ test_files = Dir['**/test_*.rb']
3
+ test_files = test_files.select { |f| f =~ Regexp.new(ENV['ONLY']) } if ENV['ONLY']
4
+ test_files = test_files.reject { |f| f =~ Regexp.new(ENV['EXCEPT']) } if ENV['EXCEPT']
5
+ test_files.each { |file| require(file) }
6
+ end
@@ -0,0 +1,336 @@
1
+ require 'common'
2
+ require 'net/ssh/buffer'
3
+
4
+ class TestBuffer < Test::Unit::TestCase
5
+ def test_constructor_should_initialize_buffer_to_empty_by_default
6
+ buffer = new
7
+ assert buffer.empty?
8
+ assert_equal 0, buffer.position
9
+ end
10
+
11
+ def test_constructor_with_string_should_initialize_buffer_to_the_string
12
+ buffer = new("hello")
13
+ assert !buffer.empty?
14
+ assert_equal "hello", buffer.to_s
15
+ assert_equal 0, buffer.position
16
+ end
17
+
18
+ def test_from_should_require_an_even_number_of_arguments
19
+ assert_raises(ArgumentError) { Net::SSH::Buffer.from("this") }
20
+ end
21
+
22
+ def test_from_should_build_new_buffer_from_definition
23
+ buffer = Net::SSH::Buffer.from(:byte, 1, :long, 2, :int64, 3, :string, "4", :bool, true, :bool, false, :bignum, OpenSSL::BN.new("1234567890", 10), :raw, "something")
24
+ assert_equal "\1\0\0\0\2\0\0\0\0\0\0\0\3\0\0\0\0014\1\0\000\000\000\004I\226\002\322something", buffer.to_s
25
+ end
26
+
27
+ def test_from_with_array_argument_should_write_multiple_of_the_given_type
28
+ buffer = Net::SSH::Buffer.from(:byte, [1,2,3,4,5])
29
+ assert_equal "\1\2\3\4\5", buffer.to_s
30
+ end
31
+
32
+ def test_read_without_argument_should_read_to_end
33
+ buffer = new("hello world")
34
+ assert_equal "hello world", buffer.read
35
+ assert buffer.eof?
36
+ assert_equal 11, buffer.position
37
+ end
38
+
39
+ def test_read_with_argument_that_is_less_than_length_should_read_that_many_bytes
40
+ buffer = new "hello world"
41
+ assert_equal "hello", buffer.read(5)
42
+ assert_equal 5, buffer.position
43
+ end
44
+
45
+ def test_read_with_argument_that_is_more_than_length_should_read_no_more_than_length
46
+ buffer = new "hello world"
47
+ assert_equal "hello world", buffer.read(500)
48
+ assert_equal 11, buffer.position
49
+ end
50
+
51
+ def test_read_at_eof_should_return_empty_string
52
+ buffer = new "hello"
53
+ buffer.position = 5
54
+ assert_equal "", buffer.read
55
+ end
56
+
57
+ def test_consume_without_argument_should_resize_buffer_to_start_at_position
58
+ buffer = new "hello world"
59
+ buffer.read(5)
60
+ assert_equal 5, buffer.position
61
+ assert_equal 11, buffer.length
62
+ buffer.consume!
63
+ assert_equal 0, buffer.position
64
+ assert_equal 6, buffer.length
65
+ assert_equal " world", buffer.to_s
66
+ end
67
+
68
+ def test_consume_with_argument_should_resize_buffer_starting_at_n
69
+ buffer = new "hello world"
70
+ assert_equal 0, buffer.position
71
+ buffer.consume!(5)
72
+ assert_equal 0, buffer.position
73
+ assert_equal 6, buffer.length
74
+ assert_equal " world", buffer.to_s
75
+ end
76
+
77
+ def test_read_bang_should_read_and_consume_and_return_read_portion
78
+ buffer = new "hello world"
79
+ assert_equal "hello", buffer.read!(5)
80
+ assert_equal 0, buffer.position
81
+ assert_equal 6, buffer.length
82
+ assert_equal " world", buffer.to_s
83
+ end
84
+
85
+ def test_available_should_return_length_after_position_to_end_of_string
86
+ buffer = new "hello world"
87
+ buffer.read(5)
88
+ assert_equal 6, buffer.available
89
+ end
90
+
91
+ def test_clear_bang_should_reset_buffer_contents_and_counters
92
+ buffer = new "hello world"
93
+ buffer.read(5)
94
+ buffer.clear!
95
+ assert_equal 0, buffer.length
96
+ assert_equal 0, buffer.position
97
+ assert_equal "", buffer.to_s
98
+ end
99
+
100
+ def test_append_should_append_argument_without_changing_position_and_should_return_self
101
+ buffer = new "hello world"
102
+ buffer.read(5)
103
+ buffer.append(" again")
104
+ assert_equal 5, buffer.position
105
+ assert_equal 12, buffer.available
106
+ assert_equal 17, buffer.length
107
+ assert_equal "hello world again", buffer.to_s
108
+ end
109
+
110
+ def test_remainder_as_buffer_should_return_a_new_buffer_filled_with_the_text_after_the_current_position
111
+ buffer = new "hello world"
112
+ buffer.read(6)
113
+ b2 = buffer.remainder_as_buffer
114
+ assert_equal 6, buffer.position
115
+ assert_equal 0, b2.position
116
+ assert_equal "world", b2.to_s
117
+ end
118
+
119
+ def test_read_int64_should_return_8_byte_integer
120
+ buffer = new "\xff\xee\xdd\xcc\xbb\xaa\x99\x88"
121
+ assert_equal 0xffeeddccbbaa9988, buffer.read_int64
122
+ assert_equal 8, buffer.position
123
+ end
124
+
125
+ def test_read_int64_should_return_nil_on_partial_read
126
+ buffer = new "\0\0\0\0\0\0\0"
127
+ assert_nil buffer.read_int64
128
+ assert buffer.eof?
129
+ end
130
+
131
+ def test_read_long_should_return_4_byte_integer
132
+ buffer = new "\xff\xee\xdd\xcc\xbb\xaa\x99\x88"
133
+ assert_equal 0xffeeddcc, buffer.read_long
134
+ assert_equal 4, buffer.position
135
+ end
136
+
137
+ def test_read_long_should_return_nil_on_partial_read
138
+ buffer = new "\0\0\0"
139
+ assert_nil buffer.read_long
140
+ assert buffer.eof?
141
+ end
142
+
143
+ def test_read_byte_should_return_single_byte_integer
144
+ buffer = new "\xfe\xdc"
145
+ assert_equal 0xfe, buffer.read_byte
146
+ assert_equal 1, buffer.position
147
+ end
148
+
149
+ def test_read_byte_should_return_nil_at_eof
150
+ assert_nil new.read_byte
151
+ end
152
+
153
+ def test_read_string_should_read_length_and_data_from_buffer
154
+ buffer = new "\0\0\0\x0bhello world"
155
+ assert_equal "hello world", buffer.read_string
156
+ end
157
+
158
+ def test_read_string_should_return_nil_if_4_byte_length_cannot_be_read
159
+ assert_nil new("\0\1").read_string
160
+ end
161
+
162
+ def test_read_bool_should_return_true_if_non_zero_byte_is_read
163
+ buffer = new "\1\2\3\4\5\6"
164
+ 6.times { assert_equal true, buffer.read_bool }
165
+ end
166
+
167
+ def test_read_bool_should_return_false_if_zero_byte_is_read
168
+ buffer = new "\0"
169
+ assert_equal false, buffer.read_bool
170
+ end
171
+
172
+ def test_read_bool_should_return_nil_at_eof
173
+ assert_nil new.read_bool
174
+ end
175
+
176
+ def test_read_bignum_should_read_openssl_formatted_bignum
177
+ buffer = new("\000\000\000\004I\226\002\322")
178
+ assert_equal OpenSSL::BN.new("1234567890", 10), buffer.read_bignum
179
+ end
180
+
181
+ def test_read_bignum_should_return_nil_if_length_cannot_be_read
182
+ assert_nil new("\0\1\2").read_bignum
183
+ end
184
+
185
+ def test_read_key_blob_should_read_dsa_keys
186
+ random_dss { |buffer| buffer.read_keyblob("ssh-dss") }
187
+ end
188
+
189
+ def test_read_key_blob_should_read_rsa_keys
190
+ random_rsa { |buffer| buffer.read_keyblob("ssh-rsa") }
191
+ end
192
+
193
+ def test_read_key_should_read_dsa_key_type_and_keyblob
194
+ random_dss do |buffer|
195
+ b2 = Net::SSH::Buffer.from(:string, "ssh-dss", :raw, buffer)
196
+ b2.read_key
197
+ end
198
+ end
199
+
200
+ def test_read_key_should_read_rsa_key_type_and_keyblob
201
+ random_rsa do |buffer|
202
+ b2 = Net::SSH::Buffer.from(:string, "ssh-rsa", :raw, buffer)
203
+ b2.read_key
204
+ end
205
+ end
206
+
207
+ def test_read_buffer_should_read_a_string_and_return_it_wrapped_in_a_buffer
208
+ buffer = new("\0\0\0\x0bhello world")
209
+ b2 = buffer.read_buffer
210
+ assert_equal 0, b2.position
211
+ assert_equal 11, b2.length
212
+ assert_equal "hello world", b2.read
213
+ end
214
+
215
+ def test_read_to_should_return_nil_if_pattern_does_not_exist_in_buffer
216
+ buffer = new("one two three")
217
+ assert_nil buffer.read_to("\n")
218
+ end
219
+
220
+ def test_read_to_should_grok_string_patterns
221
+ buffer = new("one two three")
222
+ assert_equal "one tw", buffer.read_to("tw")
223
+ assert_equal 6, buffer.position
224
+ end
225
+
226
+ def test_read_to_should_grok_regex_patterns
227
+ buffer = new("one two three")
228
+ assert_equal "one tw", buffer.read_to(/tw/)
229
+ assert_equal 6, buffer.position
230
+ end
231
+
232
+ def test_read_to_should_grok_fixnum_patterns
233
+ buffer = new("one two three")
234
+ assert_equal "one tw", buffer.read_to(?w)
235
+ assert_equal 6, buffer.position
236
+ end
237
+
238
+ def test_reset_bang_should_reset_position_to_0
239
+ buffer = new("hello world")
240
+ buffer.read(5)
241
+ assert_equal 5, buffer.position
242
+ buffer.reset!
243
+ assert_equal 0, buffer.position
244
+ end
245
+
246
+ def test_write_should_write_arguments_directly_to_end_buffer
247
+ buffer = new("start")
248
+ buffer.write "hello", " ", "world"
249
+ assert_equal "starthello world", buffer.to_s
250
+ assert_equal 0, buffer.position
251
+ end
252
+
253
+ def test_write_int64_should_write_arguments_as_8_byte_integers_to_end_of_buffer
254
+ buffer = new("start")
255
+ buffer.write_int64 0xffeeddccbbaa9988, 0x7766554433221100
256
+ assert_equal "start\xff\xee\xdd\xcc\xbb\xaa\x99\x88\x77\x66\x55\x44\x33\x22\x11\x00", buffer.to_s
257
+ end
258
+
259
+ def test_write_long_should_write_arguments_as_4_byte_integers_to_end_of_buffer
260
+ buffer = new("start")
261
+ buffer.write_long 0xffeeddcc, 0xbbaa9988
262
+ assert_equal "start\xff\xee\xdd\xcc\xbb\xaa\x99\x88", buffer.to_s
263
+ end
264
+
265
+ def test_write_byte_should_write_arguments_as_1_byte_integers_to_end_of_buffer
266
+ buffer = new("start")
267
+ buffer.write_byte 1, 2, 3, 4, 5
268
+ assert_equal "start\1\2\3\4\5", buffer.to_s
269
+ end
270
+
271
+ def test_write_bool_should_write_arguments_as_1_byte_boolean_values_to_end_of_buffer
272
+ buffer = new("start")
273
+ buffer.write_bool nil, false, true, 1, Object.new
274
+ assert_equal "start\0\0\1\1\1", buffer.to_s
275
+ end
276
+
277
+ def test_write_bignum_should_write_arguments_as_ssh_formatted_bignum_values_to_end_of_buffer
278
+ buffer = new("start")
279
+ buffer.write_bignum OpenSSL::BN.new('1234567890', 10)
280
+ assert_equal "start\000\000\000\004I\226\002\322", buffer.to_s
281
+ end
282
+
283
+ def test_write_dss_key_should_write_argument_to_end_of_buffer
284
+ buffer = new("start")
285
+
286
+ key = OpenSSL::PKey::DSA.new
287
+ key.p = 0xffeeddccbbaa9988
288
+ key.q = 0x7766554433221100
289
+ key.g = 0xffddbb9977553311
290
+ key.pub_key = 0xeeccaa8866442200
291
+
292
+ buffer.write_key(key)
293
+ assert_equal "start\0\0\0\7ssh-dss\0\0\0\011\0\xff\xee\xdd\xcc\xbb\xaa\x99\x88\0\0\0\010\x77\x66\x55\x44\x33\x22\x11\x00\0\0\0\011\0\xff\xdd\xbb\x99\x77\x55\x33\x11\0\0\0\011\0\xee\xcc\xaa\x88\x66\x44\x22\x00", buffer.to_s
294
+ end
295
+
296
+ def test_write_rsa_key_should_write_argument_to_end_of_buffer
297
+ buffer = new("start")
298
+
299
+ key = OpenSSL::PKey::RSA.new
300
+ key.e = 0xffeeddccbbaa9988
301
+ key.n = 0x7766554433221100
302
+
303
+ buffer.write_key(key)
304
+ assert_equal "start\0\0\0\7ssh-rsa\0\0\0\011\0\xff\xee\xdd\xcc\xbb\xaa\x99\x88\0\0\0\010\x77\x66\x55\x44\x33\x22\x11\x00", buffer.to_s
305
+ end
306
+
307
+ private
308
+
309
+ def random_rsa
310
+ n1 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
311
+ n2 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
312
+ buffer = Net::SSH::Buffer.from(:bignum, [n1, n2])
313
+ key = yield(buffer)
314
+ assert_equal "ssh-rsa", key.ssh_type
315
+ assert_equal n1, key.e
316
+ assert_equal n2, key.n
317
+ end
318
+
319
+ def random_dss
320
+ n1 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
321
+ n2 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
322
+ n3 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
323
+ n4 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
324
+ buffer = Net::SSH::Buffer.from(:bignum, [n1, n2, n3, n4])
325
+ key = yield(buffer)
326
+ assert_equal "ssh-dss", key.ssh_type
327
+ assert_equal n1, key.p
328
+ assert_equal n2, key.q
329
+ assert_equal n3, key.g
330
+ assert_equal n4, key.pub_key
331
+ end
332
+
333
+ def new(*args)
334
+ Net::SSH::Buffer.new(*args)
335
+ end
336
+ end
@@ -0,0 +1,63 @@
1
+ require 'common'
2
+ require 'net/ssh/buffered_io'
3
+
4
+ class TestBufferedIo < Test::Unit::TestCase
5
+ def test_fill_should_pull_from_underlying_io
6
+ io.expects(:recv).with(8192).returns("here is some data")
7
+ assert_equal 17, io.fill
8
+ assert_equal 17, io.available
9
+ assert_equal "here is some data", io.read_available(20)
10
+ end
11
+
12
+ def test_enqueue_should_not_write_to_underlying_io
13
+ assert !io.pending_write?
14
+ io.expects(:send).never
15
+ io.enqueue("here is some data")
16
+ assert io.pending_write?
17
+ end
18
+
19
+ def test_send_pending_should_not_fail_when_no_writes_are_pending
20
+ assert !io.pending_write?
21
+ io.expects(:send).never
22
+ assert_nothing_raised { io.send_pending }
23
+ end
24
+
25
+ def test_send_pending_with_pending_writes_should_write_to_underlying_io
26
+ io.enqueue("here is some data")
27
+ io.expects(:send).with("here is some data", 0).returns(17)
28
+ assert io.pending_write?
29
+ assert_nothing_raised { io.send_pending }
30
+ assert !io.pending_write?
31
+ end
32
+
33
+ def test_wait_for_pending_sends_should_write_only_once_if_all_can_be_written_at_once
34
+ io.enqueue("here is some data")
35
+ io.expects(:send).with("here is some data", 0).returns(17)
36
+ assert io.pending_write?
37
+ assert_nothing_raised { io.wait_for_pending_sends }
38
+ assert !io.pending_write?
39
+ end
40
+
41
+ def test_wait_for_pending_sends_should_write_multiple_times_if_first_write_was_partial
42
+ io.enqueue("here is some data")
43
+
44
+ io.expects(:send).with("here is some data", 0).returns(10)
45
+ io.expects(:send).with("me data", 0).returns(4)
46
+ io.expects(:send).with("ata", 0).returns(3)
47
+
48
+ IO.expects(:select).times(2).with(nil, [io]).returns([[], [io]])
49
+
50
+ assert_nothing_raised { io.wait_for_pending_sends }
51
+ assert !io.pending_write?
52
+ end
53
+
54
+ private
55
+
56
+ def io
57
+ @io ||= begin
58
+ io = mock("io")
59
+ io.extend(Net::SSH::BufferedIo)
60
+ io
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,78 @@
1
+ require 'common'
2
+ require 'net/ssh/config'
3
+
4
+ class TestConfig < Test::Unit::TestCase
5
+ def test_load_for_non_existant_file_should_return_empty_hash
6
+ File.expects(:readable?).with("/bogus/file").returns(false)
7
+ assert_equal({}, Net::SSH::Config.load("/bogus/file", "host.name"))
8
+ end
9
+
10
+ def test_load_should_expand_path
11
+ expected = File.expand_path("~/.ssh/config")
12
+ File.expects(:readable?).with(expected).returns(false)
13
+ Net::SSH::Config.load("~/.ssh/config", "host.name")
14
+ end
15
+
16
+ def test_load_with_exact_host_match_should_load_that_section
17
+ config = Net::SSH::Config.load(config(:exact_match), "test.host")
18
+ assert config['compression']
19
+ assert config['forwardagent']
20
+ assert_equal 1234, config['port']
21
+ end
22
+
23
+ def test_load_with_wild_card_matches_should_load_all_matches_with_first_match_taking_precedence
24
+ config = Net::SSH::Config.load(config(:wild_cards), "test.host")
25
+ assert_equal 1234, config['port']
26
+ assert !config['compression']
27
+ assert config['forwardagent']
28
+ assert_equal %w(~/.ssh/id_dsa), config['identityfile']
29
+ assert !config.key?('rekeylimit')
30
+ end
31
+
32
+ def test_for_should_load_all_files_and_translate_to_net_ssh_options
33
+ config = Net::SSH::Config.for("test.host", [config(:exact_match), config(:wild_cards)])
34
+ assert_equal 1234, config[:port]
35
+ assert config[:compression]
36
+ assert config[:forward_agent]
37
+ assert_equal %w(~/.ssh/id_dsa), config[:keys]
38
+ assert !config.key?(:rekey_limit)
39
+ end
40
+
41
+ def test_translate_should_correctly_translate_from_openssh_to_net_ssh_names
42
+ open_ssh = {
43
+ 'ciphers' => "a,b,c",
44
+ 'compression' => true,
45
+ 'compressionlevel' => 6,
46
+ 'connecttimeout' => 100,
47
+ 'forwardagent' => true,
48
+ 'hostbasedauthentication' => true,
49
+ 'hostkeyalgorithms' => "d,e,f",
50
+ 'identityfile' => %w(g h i),
51
+ 'macs' => "j,k,l",
52
+ 'passwordauthentication' => true,
53
+ 'port' => 1234,
54
+ 'pubkeyauthentication' => true,
55
+ 'rekeylimit' => 1024
56
+ }
57
+
58
+ net_ssh = Net::SSH::Config.translate(open_ssh)
59
+
60
+ assert_equal %w(a b c), net_ssh[:encryption]
61
+ assert_equal true, net_ssh[:compression]
62
+ assert_equal 6, net_ssh[:compression_level]
63
+ assert_equal 100, net_ssh[:timeout]
64
+ assert_equal true, net_ssh[:forward_agent]
65
+ assert_equal %w(hostbased password publickey), net_ssh[:auth_methods].sort
66
+ assert_equal %w(d e f), net_ssh[:host_key]
67
+ assert_equal %w(g h i), net_ssh[:keys]
68
+ assert_equal %w(j k l), net_ssh[:hmac]
69
+ assert_equal 1234, net_ssh[:port]
70
+ assert_equal 1024, net_ssh[:rekey_limit]
71
+ end
72
+
73
+ private
74
+
75
+ def config(name)
76
+ "test/configs/#{name}"
77
+ end
78
+ end