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.
- data/CHANGELOG.rdoc +42 -0
- data/Manifest +101 -0
- data/README.rdoc +110 -0
- data/Rakefile +26 -0
- data/THANKS.rdoc +16 -0
- data/lib/net/ssh.rb +199 -0
- data/lib/net/ssh/authentication/agent.rb +175 -0
- data/lib/net/ssh/authentication/constants.rb +18 -0
- data/lib/net/ssh/authentication/key_manager.rb +169 -0
- data/lib/net/ssh/authentication/methods/abstract.rb +60 -0
- data/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
- data/lib/net/ssh/authentication/methods/password.rb +39 -0
- data/lib/net/ssh/authentication/methods/publickey.rb +92 -0
- data/lib/net/ssh/authentication/pageant.rb +176 -0
- data/lib/net/ssh/authentication/session.rb +127 -0
- data/lib/net/ssh/buffer.rb +339 -0
- data/lib/net/ssh/buffered_io.rb +149 -0
- data/lib/net/ssh/config.rb +173 -0
- data/lib/net/ssh/connection/channel.rb +625 -0
- data/lib/net/ssh/connection/constants.rb +33 -0
- data/lib/net/ssh/connection/session.rb +569 -0
- data/lib/net/ssh/connection/term.rb +178 -0
- data/lib/net/ssh/errors.rb +85 -0
- data/lib/net/ssh/key_factory.rb +85 -0
- data/lib/net/ssh/known_hosts.rb +129 -0
- data/lib/net/ssh/loggable.rb +61 -0
- data/lib/net/ssh/packet.rb +102 -0
- data/lib/net/ssh/prompt.rb +93 -0
- data/lib/net/ssh/proxy/errors.rb +14 -0
- data/lib/net/ssh/proxy/http.rb +94 -0
- data/lib/net/ssh/proxy/socks4.rb +70 -0
- data/lib/net/ssh/proxy/socks5.rb +128 -0
- data/lib/net/ssh/service/forward.rb +267 -0
- data/lib/net/ssh/test.rb +89 -0
- data/lib/net/ssh/test/channel.rb +129 -0
- data/lib/net/ssh/test/extensions.rb +152 -0
- data/lib/net/ssh/test/kex.rb +44 -0
- data/lib/net/ssh/test/local_packet.rb +51 -0
- data/lib/net/ssh/test/packet.rb +81 -0
- data/lib/net/ssh/test/remote_packet.rb +38 -0
- data/lib/net/ssh/test/script.rb +157 -0
- data/lib/net/ssh/test/socket.rb +59 -0
- data/lib/net/ssh/transport/algorithms.rb +384 -0
- data/lib/net/ssh/transport/cipher_factory.rb +72 -0
- data/lib/net/ssh/transport/constants.rb +30 -0
- data/lib/net/ssh/transport/hmac.rb +31 -0
- data/lib/net/ssh/transport/hmac/abstract.rb +48 -0
- data/lib/net/ssh/transport/hmac/md5.rb +12 -0
- data/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
- data/lib/net/ssh/transport/hmac/none.rb +15 -0
- data/lib/net/ssh/transport/hmac/sha1.rb +13 -0
- data/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
- data/lib/net/ssh/transport/identity_cipher.rb +40 -0
- data/lib/net/ssh/transport/kex.rb +13 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
- data/lib/net/ssh/transport/openssl.rb +128 -0
- data/lib/net/ssh/transport/packet_stream.rb +230 -0
- data/lib/net/ssh/transport/server_version.rb +61 -0
- data/lib/net/ssh/transport/session.rb +262 -0
- data/lib/net/ssh/transport/state.rb +170 -0
- data/lib/net/ssh/verifiers/lenient.rb +30 -0
- data/lib/net/ssh/verifiers/null.rb +12 -0
- data/lib/net/ssh/verifiers/strict.rb +53 -0
- data/lib/net/ssh/version.rb +60 -0
- data/net-ssh.gemspec +56 -0
- data/setup.rb +1585 -0
- data/test/authentication/methods/common.rb +28 -0
- data/test/authentication/methods/test_abstract.rb +51 -0
- data/test/authentication/methods/test_hostbased.rb +108 -0
- data/test/authentication/methods/test_keyboard_interactive.rb +98 -0
- data/test/authentication/methods/test_password.rb +50 -0
- data/test/authentication/methods/test_publickey.rb +123 -0
- data/test/authentication/test_agent.rb +205 -0
- data/test/authentication/test_key_manager.rb +100 -0
- data/test/authentication/test_session.rb +93 -0
- data/test/common.rb +106 -0
- data/test/configs/exact_match +8 -0
- data/test/configs/wild_cards +14 -0
- data/test/connection/test_channel.rb +452 -0
- data/test/connection/test_session.rb +483 -0
- data/test/test_all.rb +6 -0
- data/test/test_buffer.rb +336 -0
- data/test/test_buffered_io.rb +63 -0
- data/test/test_config.rb +78 -0
- data/test/test_key_factory.rb +67 -0
- data/test/transport/hmac/test_md5.rb +34 -0
- data/test/transport/hmac/test_md5_96.rb +25 -0
- data/test/transport/hmac/test_none.rb +34 -0
- data/test/transport/hmac/test_sha1.rb +34 -0
- data/test/transport/hmac/test_sha1_96.rb +25 -0
- data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
- data/test/transport/test_algorithms.rb +302 -0
- data/test/transport/test_cipher_factory.rb +163 -0
- data/test/transport/test_hmac.rb +34 -0
- data/test/transport/test_identity_cipher.rb +40 -0
- data/test/transport/test_packet_stream.rb +433 -0
- data/test/transport/test_server_version.rb +55 -0
- data/test/transport/test_session.rb +312 -0
- data/test/transport/test_state.rb +173 -0
- 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
|
data/test/test_buffer.rb
ADDED
@@ -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
|
data/test/test_config.rb
ADDED
@@ -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
|