net-ssh 4.0.0.alpha1 → 4.0.0.alpha2
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.gitignore +6 -0
- data/.travis.yml +10 -7
- data/CHANGES.txt +4 -0
- data/Gemfile +2 -15
- data/README.rdoc +6 -37
- data/Rakefile +5 -57
- data/lib/net/ssh/connection/session.rb +13 -0
- data/lib/net/ssh/ruby_compat.rb +2 -24
- data/lib/net/ssh/version.rb +1 -1
- data/net-ssh.gemspec +34 -225
- metadata +26 -100
- metadata.gz.sig +0 -0
- data/test/README.txt +0 -18
- data/test/authentication/methods/common.rb +0 -28
- data/test/authentication/methods/test_abstract.rb +0 -51
- data/test/authentication/methods/test_hostbased.rb +0 -114
- data/test/authentication/methods/test_keyboard_interactive.rb +0 -121
- data/test/authentication/methods/test_none.rb +0 -41
- data/test/authentication/methods/test_password.rb +0 -95
- data/test/authentication/methods/test_publickey.rb +0 -148
- data/test/authentication/test_agent.rb +0 -224
- data/test/authentication/test_ed25519.rb +0 -77
- data/test/authentication/test_key_manager.rb +0 -240
- data/test/authentication/test_session.rb +0 -107
- data/test/common.rb +0 -109
- data/test/configs/auth_off +0 -5
- data/test/configs/auth_on +0 -4
- data/test/configs/empty +0 -0
- data/test/configs/eqsign +0 -3
- data/test/configs/exact_match +0 -8
- data/test/configs/host_plus +0 -10
- data/test/configs/multihost +0 -4
- data/test/configs/negative_match +0 -6
- data/test/configs/nohost +0 -19
- data/test/configs/numeric_host +0 -4
- data/test/configs/proxy_remote_user +0 -2
- data/test/configs/send_env +0 -2
- data/test/configs/substitutes +0 -8
- data/test/configs/wild_cards +0 -14
- data/test/connection/test_channel.rb +0 -487
- data/test/connection/test_session.rb +0 -563
- data/test/integration/README.md +0 -18
- data/test/integration/Vagrantfile +0 -12
- data/test/integration/common.rb +0 -65
- data/test/integration/playbook.yml +0 -57
- data/test/integration/test_ed25519_pkeys.rb +0 -70
- data/test/integration/test_forward.rb +0 -532
- data/test/integration/test_id_rsa_keys.rb +0 -96
- data/test/integration/test_proxy.rb +0 -93
- data/test/known_hosts/github +0 -1
- data/test/known_hosts/github_hash +0 -1
- data/test/manual/test_pageant.rb +0 -37
- data/test/start/test_connection.rb +0 -53
- data/test/start/test_options.rb +0 -57
- data/test/start/test_transport.rb +0 -28
- data/test/start/test_user_nil.rb +0 -27
- data/test/test_all.rb +0 -12
- data/test/test_buffer.rb +0 -433
- data/test/test_buffered_io.rb +0 -63
- data/test/test_config.rb +0 -268
- data/test/test_key_factory.rb +0 -191
- data/test/test_known_hosts.rb +0 -66
- data/test/transport/hmac/test_md5.rb +0 -41
- data/test/transport/hmac/test_md5_96.rb +0 -27
- data/test/transport/hmac/test_none.rb +0 -34
- data/test/transport/hmac/test_ripemd160.rb +0 -36
- data/test/transport/hmac/test_sha1.rb +0 -36
- data/test/transport/hmac/test_sha1_96.rb +0 -27
- data/test/transport/hmac/test_sha2_256.rb +0 -37
- data/test/transport/hmac/test_sha2_256_96.rb +0 -27
- data/test/transport/hmac/test_sha2_512.rb +0 -37
- data/test/transport/hmac/test_sha2_512_96.rb +0 -27
- data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
- data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -150
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -96
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -19
- data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
- data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
- data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
- data/test/transport/test_algorithms.rb +0 -328
- data/test/transport/test_cipher_factory.rb +0 -324
- data/test/transport/test_hmac.rb +0 -34
- data/test/transport/test_identity_cipher.rb +0 -40
- data/test/transport/test_packet_stream.rb +0 -1186
- data/test/transport/test_server_version.rb +0 -74
- data/test/transport/test_session.rb +0 -331
- data/test/transport/test_state.rb +0 -181
- data/test/verifiers/test_secure.rb +0 -40
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'common'
|
2
|
-
require 'net/ssh/authentication/ed25519'
|
3
|
-
require 'base64'
|
4
|
-
|
5
|
-
module Authentication
|
6
|
-
|
7
|
-
class TestED25519 < Test::Unit::TestCase
|
8
|
-
def test_no_pwd_key
|
9
|
-
pub = Net::SSH::Buffer.new(Base64.decode64(public_key_no_pwd.split(' ')[1]))
|
10
|
-
_type = pub.read_string
|
11
|
-
pub_data = pub.read_string
|
12
|
-
priv = private_key_no_pwd
|
13
|
-
|
14
|
-
pub_key = ED25519::PubKey.new(pub_data)
|
15
|
-
priv_key = ED25519::PrivKey.new(priv,nil)
|
16
|
-
|
17
|
-
shared_secret = "Hello"
|
18
|
-
signed = priv_key.ssh_do_sign(shared_secret)
|
19
|
-
self.assert_equal(true,pub_key.ssh_do_verify(signed,shared_secret))
|
20
|
-
self.assert_equal(priv_key.public_key.fingerprint, pub_key.fingerprint)
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_pwd_key
|
24
|
-
if defined?(JRUBY_VERSION)
|
25
|
-
puts "Skipping password protected ED25519 for JRuby"
|
26
|
-
return
|
27
|
-
end
|
28
|
-
pub = Net::SSH::Buffer.new(Base64.decode64(public_key_pwd.split(' ')[1]))
|
29
|
-
_type = pub.read_string
|
30
|
-
pub_data = pub.read_string
|
31
|
-
priv = private_key_pwd
|
32
|
-
|
33
|
-
pub_key = ED25519::PubKey.new(pub_data)
|
34
|
-
priv_key = ED25519::PrivKey.new(priv,'pwd')
|
35
|
-
|
36
|
-
shared_secret = "Hello"
|
37
|
-
signed = priv_key.ssh_do_sign(shared_secret)
|
38
|
-
self.assert_equal(true,pub_key.ssh_do_verify(signed,shared_secret))
|
39
|
-
self.assert_equal(priv_key.public_key.fingerprint, pub_key.fingerprint)
|
40
|
-
end
|
41
|
-
|
42
|
-
def private_key_pwd
|
43
|
-
@pwd_key = <<-EOF
|
44
|
-
-----BEGIN OPENSSH PRIVATE KEY-----
|
45
|
-
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABBxwCvr3V
|
46
|
-
/8pWhC/xvTnGJhAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAICaHkFaGXqYhUVFc
|
47
|
-
aZ10TPUbkIvmaFXwYRoOS5qE8MciAAAAsNUAhbNQKwNcOr0eNq3nhtjoyeVyH8hRrpWsiY
|
48
|
-
46vPiECi6R6OdYGSd7W3fdzUDeyOYCY9ZVIjAzENG+9FsygYzMi6XCuw00OuDFLUp4fL4K
|
49
|
-
i/coUIVqouB4TPQAmsCVXiIRVTWQtRG0kWfFaV3qRt/bc22ZCvCT6ZZ1UmtulqqfUhSlKM
|
50
|
-
oPcTikV1iWH5Xc+GxRFRRGTN/6HvBf0AKDB1kMXlDhGnBnHGeNH1pk44xG
|
51
|
-
-----END OPENSSH PRIVATE KEY-----
|
52
|
-
EOF
|
53
|
-
end
|
54
|
-
|
55
|
-
def public_key_pwd
|
56
|
-
'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICaHkFaGXqYhUVFcaZ10TPUbkIvmaFXwYRoOS5qE8Mci vagrant@vagrant-ubuntu-trusty-64'
|
57
|
-
end
|
58
|
-
|
59
|
-
def private_key_no_pwd
|
60
|
-
@anonymous_key = <<-EOF
|
61
|
-
-----BEGIN OPENSSH PRIVATE KEY-----
|
62
|
-
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
|
63
|
-
QyNTUxOQAAACAwdjQYeBiTz1DdZFzzLvG+t913L+eVqCgtzpAYxQG8yQAAAKjlHzLo5R8y
|
64
|
-
6AAAAAtzc2gtZWQyNTUxOQAAACAwdjQYeBiTz1DdZFzzLvG+t913L+eVqCgtzpAYxQG8yQ
|
65
|
-
AAAEBPrD+n4901Y+NYJ2sry+EWRdltGFhMISvp91TywJ//mTB2NBh4GJPPUN1kXPMu8b63
|
66
|
-
3Xcv55WoKC3OkBjFAbzJAAAAIHZhZ3JhbnRAdmFncmFudC11YnVudHUtdHJ1c3R5LTY0AQ
|
67
|
-
IDBAU=
|
68
|
-
-----END OPENSSH PRIVATE KEY-----
|
69
|
-
EOF
|
70
|
-
end
|
71
|
-
|
72
|
-
def public_key_no_pwd
|
73
|
-
'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDB2NBh4GJPPUN1kXPMu8b633Xcv55WoKC3OkBjFAbzJ vagrant@vagrant-ubuntu-trusty-64'
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
@@ -1,240 +0,0 @@
|
|
1
|
-
require 'common'
|
2
|
-
require 'net/ssh/authentication/key_manager'
|
3
|
-
|
4
|
-
module Authentication
|
5
|
-
|
6
|
-
class TestKeyManager < Test::Unit::TestCase
|
7
|
-
def test_key_files_and_known_identities_are_empty_by_default
|
8
|
-
assert manager.key_files.empty?
|
9
|
-
assert manager.known_identities.empty?
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_assume_agent_is_available_by_default
|
13
|
-
assert manager.use_agent?
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_add_ensures_list_is_unique
|
17
|
-
manager.add "/first"
|
18
|
-
manager.add "/second"
|
19
|
-
manager.add "/third"
|
20
|
-
manager.add "/second"
|
21
|
-
assert_equal 3, manager.key_files.length
|
22
|
-
final_files = manager.key_files.map {|item| item.split('/').last}
|
23
|
-
assert_equal %w(first second third), final_files
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_use_agent_should_be_set_to_false_if_agent_could_not_be_found
|
27
|
-
Net::SSH::Authentication::Agent.expects(:connect).raises(Net::SSH::Authentication::AgentNotAvailable)
|
28
|
-
assert manager.use_agent?
|
29
|
-
assert_nil manager.agent
|
30
|
-
assert !manager.use_agent?
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_agent_should_be_used_by_default
|
34
|
-
assert manager().use_agent?
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_agent_should_not_be_used_with_no_agent
|
38
|
-
assert !manager(:use_agent => false).use_agent?
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_each_identity_should_load_from_key_files
|
42
|
-
manager.stubs(:agent).returns(nil)
|
43
|
-
first = File.expand_path("/first")
|
44
|
-
second = File.expand_path("/second")
|
45
|
-
stub_file_private_key first, rsa
|
46
|
-
stub_file_private_key second, dsa
|
47
|
-
|
48
|
-
identities = []
|
49
|
-
manager.each_identity { |identity| identities << identity }
|
50
|
-
|
51
|
-
assert_equal 2, identities.length
|
52
|
-
assert_equal rsa.to_blob, identities.first.to_blob
|
53
|
-
assert_equal dsa.to_blob, identities.last.to_blob
|
54
|
-
|
55
|
-
assert_equal({:from => :file, :file => first, :key => rsa}, manager.known_identities[rsa])
|
56
|
-
assert_equal({:from => :file, :file => second, :key => dsa}, manager.known_identities[dsa])
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_each_identity_should_not_prompt_for_passphrase_in_non_interactive_mode
|
60
|
-
manager(:non_interactive => true).stubs(:agent).returns(nil)
|
61
|
-
first = File.expand_path("/first")
|
62
|
-
stub_file_private_key first, rsa, :passphrase => :should_not_be_asked
|
63
|
-
identities = []
|
64
|
-
manager.each_identity { |identity| identities << identity }
|
65
|
-
assert_equal(identities, [])
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_identities_should_load_from_agent
|
69
|
-
manager.stubs(:agent).returns(agent)
|
70
|
-
|
71
|
-
identities = []
|
72
|
-
manager.each_identity { |identity| identities << identity }
|
73
|
-
|
74
|
-
assert_equal 2, identities.length
|
75
|
-
assert_equal rsa.to_blob, identities.first.to_blob
|
76
|
-
assert_equal dsa.to_blob, identities.last.to_blob
|
77
|
-
|
78
|
-
assert_equal({:from => :agent}, manager.known_identities[rsa])
|
79
|
-
assert_equal({:from => :agent}, manager.known_identities[dsa])
|
80
|
-
end
|
81
|
-
|
82
|
-
if defined?(OpenSSL::PKey::EC)
|
83
|
-
def test_identities_with_ecdsa_should_load_from_agent
|
84
|
-
manager.stubs(:agent).returns(agent_with_ecdsa_keys)
|
85
|
-
|
86
|
-
identities = []
|
87
|
-
manager.each_identity { |identity| identities << identity }
|
88
|
-
assert_equal 5, identities.length
|
89
|
-
|
90
|
-
assert_equal rsa.to_blob, identities[0].to_blob
|
91
|
-
assert_equal dsa.to_blob, identities[1].to_blob
|
92
|
-
assert_equal ecdsa_sha2_nistp256.to_blob, identities[2].to_blob
|
93
|
-
assert_equal ecdsa_sha2_nistp384.to_blob, identities[3].to_blob
|
94
|
-
assert_equal ecdsa_sha2_nistp521.to_blob, identities[4].to_blob
|
95
|
-
|
96
|
-
assert_equal({:from => :agent}, manager.known_identities[rsa])
|
97
|
-
assert_equal({:from => :agent}, manager.known_identities[dsa])
|
98
|
-
assert_equal({:from => :agent}, manager.known_identities[ecdsa_sha2_nistp256])
|
99
|
-
assert_equal({:from => :agent}, manager.known_identities[ecdsa_sha2_nistp384])
|
100
|
-
assert_equal({:from => :agent}, manager.known_identities[ecdsa_sha2_nistp521])
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_only_identities_with_key_files_should_load_from_agent_of_keys_only_set
|
105
|
-
manager(:keys_only => true).stubs(:agent).returns(agent)
|
106
|
-
|
107
|
-
first = File.expand_path("/first")
|
108
|
-
stub_file_private_key first, rsa
|
109
|
-
|
110
|
-
identities = []
|
111
|
-
manager.each_identity { |identity| identities << identity }
|
112
|
-
|
113
|
-
assert_equal 1, identities.length
|
114
|
-
assert_equal rsa.to_blob, identities.first.to_blob
|
115
|
-
|
116
|
-
assert_equal({:from => :agent}, manager.known_identities[rsa])
|
117
|
-
assert manager.use_agent?
|
118
|
-
end
|
119
|
-
|
120
|
-
def test_identities_without_public_key_files_should_not_be_touched_if_identity_loaded_from_agent
|
121
|
-
manager.stubs(:agent).returns(agent)
|
122
|
-
|
123
|
-
first = File.expand_path("/first")
|
124
|
-
stub_file_public_key first, rsa
|
125
|
-
second = File.expand_path("/second")
|
126
|
-
stub_file_private_key second, dsa, :passphrase => :should_not_be_asked
|
127
|
-
|
128
|
-
identities = []
|
129
|
-
manager.each_identity do |identity|
|
130
|
-
identities << identity
|
131
|
-
break if manager.known_identities[identity][:from] == :agent
|
132
|
-
end
|
133
|
-
|
134
|
-
assert_equal 1, identities.length
|
135
|
-
assert_equal rsa.to_blob, identities.first.to_blob
|
136
|
-
end
|
137
|
-
|
138
|
-
def test_sign_with_agent_originated_key_should_request_signature_from_agent
|
139
|
-
manager.stubs(:agent).returns(agent)
|
140
|
-
manager.each_identity { |identity| } # preload the known_identities
|
141
|
-
agent.expects(:sign).with(rsa, "hello, world").returns("abcxyz123")
|
142
|
-
assert_equal "abcxyz123", manager.sign(rsa, "hello, world")
|
143
|
-
end
|
144
|
-
|
145
|
-
def test_sign_with_file_originated_key_should_load_private_key_and_sign_with_it
|
146
|
-
manager.stubs(:agent).returns(nil)
|
147
|
-
first = File.expand_path("/first")
|
148
|
-
stub_file_private_key first, rsa(512)
|
149
|
-
rsa.expects(:ssh_do_sign).with("hello, world").returns("abcxyz123")
|
150
|
-
manager.each_identity { |identity| } # preload the known_identities
|
151
|
-
assert_equal "\0\0\0\assh-rsa\0\0\0\011abcxyz123", manager.sign(rsa, "hello, world")
|
152
|
-
end
|
153
|
-
|
154
|
-
def test_sign_with_file_originated_key_should_raise_key_manager_error_if_unloadable
|
155
|
-
manager.known_identities[rsa] = { :from => :file, :file => "/first" }
|
156
|
-
|
157
|
-
Net::SSH::KeyFactory.expects(:load_private_key).raises(OpenSSL::PKey::RSAError)
|
158
|
-
|
159
|
-
assert_raises Net::SSH::Authentication::KeyManagerError do
|
160
|
-
manager.sign(rsa, "hello, world")
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
private
|
165
|
-
|
166
|
-
def stub_file_private_key(name, key, options = {})
|
167
|
-
manager.add(name)
|
168
|
-
File.stubs(:file?).with(name).returns(true)
|
169
|
-
File.stubs(:readable?).with(name).returns(true)
|
170
|
-
File.stubs(:file?).with(name + ".pub").returns(true)
|
171
|
-
File.stubs(:readable?).with(name + ".pub").returns(false)
|
172
|
-
|
173
|
-
case options.fetch(:passphrase, :indifferently)
|
174
|
-
when :should_be_asked
|
175
|
-
Net::SSH::KeyFactory.expects(:load_private_key).with(name, nil, false).raises(OpenSSL::PKey::RSAError).at_least_once
|
176
|
-
Net::SSH::KeyFactory.expects(:load_private_key).with(name, nil, true).returns(key).at_least_once
|
177
|
-
when :should_not_be_asked
|
178
|
-
Net::SSH::KeyFactory.expects(:load_private_key).with(name, nil, false).raises(OpenSSL::PKey::RSAError).at_least_once
|
179
|
-
Net::SSH::KeyFactory.expects(:load_private_key).with(name, nil, true).never
|
180
|
-
else # :indifferently
|
181
|
-
Net::SSH::KeyFactory.expects(:load_private_key).with(name, nil, any_of(true, false)).returns(key).at_least_once
|
182
|
-
end
|
183
|
-
|
184
|
-
# do not override OpenSSL::PKey::EC#public_key
|
185
|
-
# (it will be called in transport/openssl.rb.)
|
186
|
-
unless defined?(OpenSSL::PKey::EC) && key.public_key.kind_of?(OpenSSL::PKey::EC::Point)
|
187
|
-
key.stubs(:public_key).returns(key)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
def stub_file_public_key(name, key)
|
192
|
-
manager.add(name)
|
193
|
-
File.stubs(:file?).with(name).returns(true)
|
194
|
-
File.stubs(:readable?).with(name).returns(true)
|
195
|
-
File.stubs(:file?).with(name + ".pub").returns(true)
|
196
|
-
File.stubs(:readable?).with(name + ".pub").returns(true)
|
197
|
-
|
198
|
-
Net::SSH::KeyFactory.expects(:load_public_key).with(name + ".pub").returns(key).at_least_once
|
199
|
-
end
|
200
|
-
|
201
|
-
def rsa(size=512)
|
202
|
-
@rsa ||= OpenSSL::PKey::RSA.new(size)
|
203
|
-
end
|
204
|
-
|
205
|
-
def dsa
|
206
|
-
@dsa ||= OpenSSL::PKey::DSA.new(512)
|
207
|
-
end
|
208
|
-
|
209
|
-
if defined?(OpenSSL::PKey::EC)
|
210
|
-
def ecdsa_sha2_nistp256
|
211
|
-
@ecdsa_sha2_nistp256 ||= OpenSSL::PKey::EC.new("prime256v1").generate_key
|
212
|
-
end
|
213
|
-
|
214
|
-
def ecdsa_sha2_nistp384
|
215
|
-
@ecdsa_sha2_nistp384 ||= OpenSSL::PKey::EC.new("secp384r1").generate_key
|
216
|
-
end
|
217
|
-
|
218
|
-
def ecdsa_sha2_nistp521
|
219
|
-
@ecdsa_sha2_nistp521 ||= OpenSSL::PKey::EC.new("secp521r1").generate_key
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
def agent
|
224
|
-
@agent ||= stub("agent", :identities => [rsa, dsa])
|
225
|
-
end
|
226
|
-
|
227
|
-
def agent_with_ecdsa_keys
|
228
|
-
@agent ||= stub("agent", :identities => [rsa, dsa,
|
229
|
-
ecdsa_sha2_nistp256,
|
230
|
-
ecdsa_sha2_nistp384,
|
231
|
-
ecdsa_sha2_nistp521])
|
232
|
-
end
|
233
|
-
|
234
|
-
def manager(options = {})
|
235
|
-
@manager ||= Net::SSH::Authentication::KeyManager.new(nil, options)
|
236
|
-
end
|
237
|
-
|
238
|
-
end
|
239
|
-
|
240
|
-
end
|
@@ -1,107 +0,0 @@
|
|
1
|
-
require 'common'
|
2
|
-
require 'net/ssh/authentication/session'
|
3
|
-
|
4
|
-
module Authentication
|
5
|
-
|
6
|
-
class TestSession < Test::Unit::TestCase
|
7
|
-
include Net::SSH::Transport::Constants
|
8
|
-
include Net::SSH::Authentication::Constants
|
9
|
-
|
10
|
-
def test_constructor_should_set_defaults
|
11
|
-
assert_equal %w(none publickey password keyboard-interactive), session.auth_methods
|
12
|
-
assert_equal session.auth_methods, session.allowed_auth_methods
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_authenticate_should_continue_if_method_disallowed
|
16
|
-
transport.expect do |t, packet|
|
17
|
-
assert_equal SERVICE_REQUEST, packet.type
|
18
|
-
assert_equal "ssh-userauth", packet.read_string
|
19
|
-
t.return(SERVICE_ACCEPT)
|
20
|
-
end
|
21
|
-
|
22
|
-
Net::SSH::Authentication::Methods::Publickey.any_instance.expects(:authenticate).with("next service", "username", "password").raises(Net::SSH::Authentication::DisallowedMethod)
|
23
|
-
Net::SSH::Authentication::Methods::Password.any_instance.expects(:authenticate).with("next service", "username", "password").returns(true)
|
24
|
-
Net::SSH::Authentication::Methods::None.any_instance.expects(:authenticate).with("next service", "username", "password").returns(false)
|
25
|
-
|
26
|
-
assert session.authenticate("next service", "username", "password")
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_authenticate_should_raise_error_if_service_request_fails
|
30
|
-
transport.expect do |t, packet|
|
31
|
-
assert_equal SERVICE_REQUEST, packet.type
|
32
|
-
assert_equal "ssh-userauth", packet.read_string
|
33
|
-
t.return(255)
|
34
|
-
end
|
35
|
-
|
36
|
-
assert_raises(Net::SSH::Exception) { session.authenticate("next service", "username", "password") }
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_authenticate_should_return_false_if_all_auth_methods_fail
|
40
|
-
transport.expect do |t, packet|
|
41
|
-
assert_equal SERVICE_REQUEST, packet.type
|
42
|
-
assert_equal "ssh-userauth", packet.read_string
|
43
|
-
t.return(SERVICE_ACCEPT)
|
44
|
-
end
|
45
|
-
|
46
|
-
Net::SSH::Authentication::Methods::Publickey.any_instance.expects(:authenticate).with("next service", "username", "password").returns(false)
|
47
|
-
Net::SSH::Authentication::Methods::Password.any_instance.expects(:authenticate).with("next service", "username", "password").returns(false)
|
48
|
-
Net::SSH::Authentication::Methods::KeyboardInteractive.any_instance.expects(:authenticate).with("next service", "username", "password").returns(false)
|
49
|
-
Net::SSH::Authentication::Methods::None.any_instance.expects(:authenticate).with("next service", "username", "password").returns(false)
|
50
|
-
|
51
|
-
assert_equal false, session.authenticate("next service", "username", "password")
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_next_message_should_silently_handle_USERAUTH_BANNER_packets
|
55
|
-
transport.return(USERAUTH_BANNER, :string, "Howdy, folks!")
|
56
|
-
transport.return(SERVICE_ACCEPT)
|
57
|
-
assert_equal SERVICE_ACCEPT, session.next_message.type
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_next_message_should_understand_USERAUTH_FAILURE
|
61
|
-
transport.return(USERAUTH_FAILURE, :string, "a,b,c", :bool, false)
|
62
|
-
packet = session.next_message
|
63
|
-
assert_equal USERAUTH_FAILURE, packet.type
|
64
|
-
assert_equal %w(a b c), session.allowed_auth_methods
|
65
|
-
end
|
66
|
-
|
67
|
-
(60..79).each do |type|
|
68
|
-
define_method("test_next_message_should_return_packets_of_type_#{type}") do
|
69
|
-
transport.return(type)
|
70
|
-
assert_equal type, session.next_message.type
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_next_message_should_understand_USERAUTH_SUCCESS
|
75
|
-
transport.return(USERAUTH_SUCCESS)
|
76
|
-
assert !transport.hints[:authenticated]
|
77
|
-
assert_equal USERAUTH_SUCCESS, session.next_message.type
|
78
|
-
assert transport.hints[:authenticated]
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_next_message_should_raise_error_on_unrecognized_packet_types
|
82
|
-
transport.return(1)
|
83
|
-
assert_raises(Net::SSH::Exception) { session.next_message }
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_expect_message_should_raise_exception_if_next_packet_is_not_expected_type
|
87
|
-
transport.return(SERVICE_ACCEPT)
|
88
|
-
assert_raises(Net::SSH::Exception) { session.expect_message(USERAUTH_BANNER) }
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_expect_message_should_return_packet_if_next_packet_is_expected_type
|
92
|
-
transport.return(SERVICE_ACCEPT)
|
93
|
-
assert_equal SERVICE_ACCEPT, session.expect_message(SERVICE_ACCEPT).type
|
94
|
-
end
|
95
|
-
|
96
|
-
private
|
97
|
-
|
98
|
-
def session(options={})
|
99
|
-
@session ||= Net::SSH::Authentication::Session.new(transport(options), options)
|
100
|
-
end
|
101
|
-
|
102
|
-
def transport(options={})
|
103
|
-
@transport ||= MockTransport.new(options)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
data/test/common.rb
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
2
|
-
gem "test-unit" # http://rubyforge.org/pipermail/test-unit-tracker/2009-July/000075.html
|
3
|
-
gem 'mocha'
|
4
|
-
require 'test/unit'
|
5
|
-
require 'mocha/setup'
|
6
|
-
require 'net/ssh/buffer'
|
7
|
-
require 'net/ssh/config'
|
8
|
-
require 'net/ssh/loggable'
|
9
|
-
require 'net/ssh/packet'
|
10
|
-
require 'net/ssh/transport/session'
|
11
|
-
require 'ostruct'
|
12
|
-
|
13
|
-
# clear the default files out so that tests don't get confused by existing
|
14
|
-
# SSH config files.
|
15
|
-
$original_config_default_files = Net::SSH::Config.default_files.dup
|
16
|
-
Net::SSH::Config.default_files.clear
|
17
|
-
|
18
|
-
def P(*args)
|
19
|
-
Net::SSH::Packet.new(Net::SSH::Buffer.from(*args))
|
20
|
-
end
|
21
|
-
|
22
|
-
class MockTransport < Net::SSH::Transport::Session
|
23
|
-
class BlockVerifier
|
24
|
-
def initialize(block)
|
25
|
-
@block = block
|
26
|
-
end
|
27
|
-
|
28
|
-
def verify(data)
|
29
|
-
@block.call(data)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
attr_reader :host_key_verifier
|
34
|
-
attr_accessor :host_as_string
|
35
|
-
attr_accessor :server_version
|
36
|
-
|
37
|
-
attr_reader :client_options
|
38
|
-
attr_reader :server_options
|
39
|
-
attr_reader :hints, :queue
|
40
|
-
|
41
|
-
attr_accessor :mock_enqueue
|
42
|
-
|
43
|
-
def initialize(options={})
|
44
|
-
@options = options
|
45
|
-
self.logger = options[:logger]
|
46
|
-
self.host_as_string = "net.ssh.test,127.0.0.1"
|
47
|
-
self.server_version = OpenStruct.new(:version => "SSH-2.0-Ruby/Net::SSH::Test")
|
48
|
-
@expectation = nil
|
49
|
-
@queue = []
|
50
|
-
@hints = {}
|
51
|
-
@socket = options[:socket]
|
52
|
-
@algorithms = OpenStruct.new(:session_id => "abcxyz123")
|
53
|
-
verifier { |data| true }
|
54
|
-
end
|
55
|
-
|
56
|
-
def send_message(message)
|
57
|
-
buffer = Net::SSH::Buffer.new(message.to_s)
|
58
|
-
if @expectation.nil?
|
59
|
-
raise "got #{message.to_s.inspect} but was not expecting anything"
|
60
|
-
else
|
61
|
-
block, @expectation = @expectation, nil
|
62
|
-
block.call(self, Net::SSH::Packet.new(buffer))
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def enqueue_message(message)
|
67
|
-
if mock_enqueue
|
68
|
-
send_message(message)
|
69
|
-
else
|
70
|
-
super
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def poll_message
|
75
|
-
@queue.shift
|
76
|
-
end
|
77
|
-
|
78
|
-
def next_message
|
79
|
-
@queue.shift or raise "expected a message from the server but nothing was ready to send"
|
80
|
-
end
|
81
|
-
|
82
|
-
def return(type, *args)
|
83
|
-
@queue << P(:byte, type, *args)
|
84
|
-
end
|
85
|
-
|
86
|
-
def expect(&block)
|
87
|
-
@expectation = block
|
88
|
-
end
|
89
|
-
|
90
|
-
def expect!
|
91
|
-
expect {}
|
92
|
-
end
|
93
|
-
|
94
|
-
def verifier(&block)
|
95
|
-
@host_key_verifier = BlockVerifier.new(block)
|
96
|
-
end
|
97
|
-
|
98
|
-
def configure_client(options)
|
99
|
-
@client_options = options
|
100
|
-
end
|
101
|
-
|
102
|
-
def configure_server(options)
|
103
|
-
@server_options = options
|
104
|
-
end
|
105
|
-
|
106
|
-
def hint(name, value=true)
|
107
|
-
@hints[name] = value
|
108
|
-
end
|
109
|
-
end
|