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.
- data/doc/LICENSE-BSD +27 -0
- data/doc/LICENSE-GPL +280 -0
- data/doc/LICENSE-RUBY +56 -0
- data/doc/README +13 -0
- data/doc/manual-html/chapter-1.html +333 -0
- data/doc/manual-html/chapter-2.html +455 -0
- data/doc/manual-html/chapter-3.html +413 -0
- data/doc/manual-html/chapter-4.html +353 -0
- data/doc/manual-html/chapter-5.html +393 -0
- data/doc/manual-html/chapter-6.html +296 -0
- data/doc/manual-html/index.html +217 -0
- data/doc/manual-html/manual.css +192 -0
- data/doc/manual/chapter.erb +18 -0
- data/doc/manual/example.erb +18 -0
- data/doc/manual/index.erb +29 -0
- data/doc/manual/manual.css +192 -0
- data/doc/manual/manual.rb +240 -0
- data/doc/manual/manual.yml +67 -0
- data/doc/manual/page.erb +87 -0
- data/doc/manual/parts/channels_callbacks.txt +32 -0
- data/doc/manual/parts/channels_loop.txt +14 -0
- data/doc/manual/parts/channels_open.txt +20 -0
- data/doc/manual/parts/channels_operations.txt +15 -0
- data/doc/manual/parts/channels_types.txt +3 -0
- data/doc/manual/parts/channels_what_are.txt +7 -0
- data/doc/manual/parts/exec_channels.txt +28 -0
- data/doc/manual/parts/exec_open.txt +51 -0
- data/doc/manual/parts/exec_popen3.txt +35 -0
- data/doc/manual/parts/forward_direct.txt +37 -0
- data/doc/manual/parts/forward_handlers.txt +16 -0
- data/doc/manual/parts/forward_intro.txt +18 -0
- data/doc/manual/parts/forward_local.txt +18 -0
- data/doc/manual/parts/forward_remote.txt +14 -0
- data/doc/manual/parts/intro_author.txt +1 -0
- data/doc/manual/parts/intro_getting.txt +39 -0
- data/doc/manual/parts/intro_license.txt +6 -0
- data/doc/manual/parts/intro_support.txt +7 -0
- data/doc/manual/parts/intro_what_is.txt +7 -0
- data/doc/manual/parts/intro_what_is_not.txt +3 -0
- data/doc/manual/parts/proxy_http.txt +52 -0
- data/doc/manual/parts/proxy_intro.txt +1 -0
- data/doc/manual/parts/proxy_socks.txt +23 -0
- data/doc/manual/parts/session_key.txt +66 -0
- data/doc/manual/parts/session_options.txt +42 -0
- data/doc/manual/parts/session_session.txt +14 -0
- data/doc/manual/parts/session_start.txt +49 -0
- data/doc/manual/tutorial.erb +30 -0
- data/examples/channel-demo.rb +81 -0
- data/examples/port-forward.rb +51 -0
- data/examples/process-demo.rb +91 -0
- data/examples/remote-net-port-forward.rb +45 -0
- data/examples/remote-port-forward.rb +80 -0
- data/examples/tail-demo.rb +49 -0
- data/lib/net/ssh.rb +52 -0
- data/lib/net/ssh/connection/channel.rb +411 -0
- data/lib/net/ssh/connection/constants.rb +47 -0
- data/lib/net/ssh/connection/driver.rb +343 -0
- data/lib/net/ssh/connection/services.rb +72 -0
- data/lib/net/ssh/connection/term.rb +90 -0
- data/lib/net/ssh/errors.rb +27 -0
- data/lib/net/ssh/proxy/errors.rb +34 -0
- data/lib/net/ssh/proxy/http.rb +126 -0
- data/lib/net/ssh/proxy/socks4.rb +83 -0
- data/lib/net/ssh/proxy/socks5.rb +160 -0
- data/lib/net/ssh/service/forward/driver.rb +319 -0
- data/lib/net/ssh/service/forward/local-network-handler.rb +74 -0
- data/lib/net/ssh/service/forward/remote-network-handler.rb +81 -0
- data/lib/net/ssh/service/forward/services.rb +76 -0
- data/lib/net/ssh/service/process/driver.rb +153 -0
- data/lib/net/ssh/service/process/open.rb +193 -0
- data/lib/net/ssh/service/process/popen3.rb +160 -0
- data/lib/net/ssh/service/process/services.rb +66 -0
- data/lib/net/ssh/service/services.rb +44 -0
- data/lib/net/ssh/session.rb +242 -0
- data/lib/net/ssh/transport/algorithm-negotiator.rb +267 -0
- data/lib/net/ssh/transport/compress/compressor.rb +53 -0
- data/lib/net/ssh/transport/compress/decompressor.rb +53 -0
- data/lib/net/ssh/transport/compress/none-compressor.rb +39 -0
- data/lib/net/ssh/transport/compress/none-decompressor.rb +39 -0
- data/lib/net/ssh/transport/compress/services.rb +68 -0
- data/lib/net/ssh/transport/compress/zlib-compressor.rb +60 -0
- data/lib/net/ssh/transport/compress/zlib-decompressor.rb +52 -0
- data/lib/net/ssh/transport/constants.rb +66 -0
- data/lib/net/ssh/transport/errors.rb +47 -0
- data/lib/net/ssh/transport/identity-cipher.rb +61 -0
- data/lib/net/ssh/transport/kex/dh-gex.rb +106 -0
- data/lib/net/ssh/transport/kex/dh.rb +231 -0
- data/lib/net/ssh/transport/kex/services.rb +60 -0
- data/lib/net/ssh/transport/ossl/buffer-factory.rb +52 -0
- data/lib/net/ssh/transport/ossl/buffer.rb +87 -0
- data/lib/net/ssh/transport/ossl/cipher-factory.rb +98 -0
- data/lib/net/ssh/transport/ossl/digest-factory.rb +51 -0
- data/lib/net/ssh/transport/ossl/hmac-factory.rb +71 -0
- data/lib/net/ssh/transport/ossl/hmac/hmac.rb +62 -0
- data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +44 -0
- data/lib/net/ssh/transport/ossl/hmac/md5.rb +46 -0
- data/lib/net/ssh/transport/ossl/hmac/none.rb +46 -0
- data/lib/net/ssh/transport/ossl/hmac/services.rb +68 -0
- data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +44 -0
- data/lib/net/ssh/transport/ossl/hmac/sha1.rb +45 -0
- data/lib/net/ssh/transport/ossl/key-factory.rb +113 -0
- data/lib/net/ssh/transport/ossl/services.rb +149 -0
- data/lib/net/ssh/transport/packet-stream.rb +210 -0
- data/lib/net/ssh/transport/services.rb +146 -0
- data/lib/net/ssh/transport/session.rb +296 -0
- data/lib/net/ssh/transport/version-negotiator.rb +73 -0
- data/lib/net/ssh/userauth/agent.rb +218 -0
- data/lib/net/ssh/userauth/constants.rb +35 -0
- data/lib/net/ssh/userauth/driver.rb +176 -0
- data/lib/net/ssh/userauth/methods/hostbased.rb +119 -0
- data/lib/net/ssh/userauth/methods/password.rb +70 -0
- data/lib/net/ssh/userauth/methods/publickey.rb +137 -0
- data/lib/net/ssh/userauth/methods/services.rb +63 -0
- data/lib/net/ssh/userauth/services.rb +126 -0
- data/lib/net/ssh/userauth/userkeys.rb +258 -0
- data/lib/net/ssh/util/buffer.rb +274 -0
- data/lib/net/ssh/util/openssl.rb +146 -0
- data/lib/net/ssh/util/prompter.rb +73 -0
- data/lib/net/ssh/version.rb +29 -0
- data/test/ALL-TESTS.rb +21 -0
- data/test/connection/tc_channel.rb +136 -0
- data/test/connection/tc_driver.rb +287 -0
- data/test/connection/tc_integration.rb +85 -0
- data/test/proxy/tc_http.rb +209 -0
- data/test/proxy/tc_socks4.rb +148 -0
- data/test/proxy/tc_socks5.rb +214 -0
- data/test/service/forward/tc_driver.rb +289 -0
- data/test/service/forward/tc_local_network_handler.rb +123 -0
- data/test/service/forward/tc_remote_network_handler.rb +108 -0
- data/test/service/process/tc_driver.rb +79 -0
- data/test/service/process/tc_integration.rb +117 -0
- data/test/service/process/tc_open.rb +179 -0
- data/test/service/process/tc_popen3.rb +164 -0
- data/test/tc_integration.rb +79 -0
- data/test/transport/compress/tc_none_compress.rb +41 -0
- data/test/transport/compress/tc_none_decompress.rb +45 -0
- data/test/transport/compress/tc_zlib_compress.rb +61 -0
- data/test/transport/compress/tc_zlib_decompress.rb +48 -0
- data/test/transport/kex/tc_dh.rb +304 -0
- data/test/transport/kex/tc_dh_gex.rb +70 -0
- data/test/transport/ossl/fixtures/dsa-encrypted +15 -0
- data/test/transport/ossl/fixtures/dsa-encrypted-bad +15 -0
- data/test/transport/ossl/fixtures/dsa-unencrypted +12 -0
- data/test/transport/ossl/fixtures/dsa-unencrypted-bad +12 -0
- data/test/transport/ossl/fixtures/dsa-unencrypted.pub +1 -0
- data/test/transport/ossl/fixtures/not-a-private-key +4 -0
- data/test/transport/ossl/fixtures/not-supported +2 -0
- data/test/transport/ossl/fixtures/rsa-encrypted +18 -0
- data/test/transport/ossl/fixtures/rsa-encrypted-bad +18 -0
- data/test/transport/ossl/fixtures/rsa-unencrypted +15 -0
- data/test/transport/ossl/fixtures/rsa-unencrypted-bad +15 -0
- data/test/transport/ossl/fixtures/rsa-unencrypted.pub +1 -0
- data/test/transport/ossl/hmac/tc_hmac.rb +58 -0
- data/test/transport/ossl/hmac/tc_md5.rb +50 -0
- data/test/transport/ossl/hmac/tc_md5_96.rb +50 -0
- data/test/transport/ossl/hmac/tc_none.rb +50 -0
- data/test/transport/ossl/hmac/tc_sha1.rb +50 -0
- data/test/transport/ossl/hmac/tc_sha1_96.rb +50 -0
- data/test/transport/ossl/tc_buffer.rb +97 -0
- data/test/transport/ossl/tc_buffer_factory.rb +67 -0
- data/test/transport/ossl/tc_cipher_factory.rb +84 -0
- data/test/transport/ossl/tc_digest_factory.rb +39 -0
- data/test/transport/ossl/tc_hmac_factory.rb +72 -0
- data/test/transport/ossl/tc_key_factory.rb +199 -0
- data/test/transport/tc_algorithm_negotiator.rb +169 -0
- data/test/transport/tc_identity_cipher.rb +52 -0
- data/test/transport/tc_integration.rb +110 -0
- data/test/transport/tc_packet_stream.rb +183 -0
- data/test/transport/tc_session.rb +283 -0
- data/test/transport/tc_version_negotiator.rb +86 -0
- data/test/userauth/methods/tc_hostbased.rb +136 -0
- data/test/userauth/methods/tc_password.rb +89 -0
- data/test/userauth/methods/tc_publickey.rb +167 -0
- data/test/userauth/tc_agent.rb +223 -0
- data/test/userauth/tc_driver.rb +190 -0
- data/test/userauth/tc_integration.rb +81 -0
- data/test/userauth/tc_userkeys.rb +265 -0
- data/test/util/tc_buffer.rb +217 -0
- metadata +256 -0
|
@@ -0,0 +1,190 @@
|
|
|
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/userauth/driver'
|
|
20
|
+
require 'net/ssh/util/buffer'
|
|
21
|
+
require 'test/unit'
|
|
22
|
+
|
|
23
|
+
class TC_UserAuth_Driver < Test::Unit::TestCase
|
|
24
|
+
|
|
25
|
+
class Log
|
|
26
|
+
def debug?
|
|
27
|
+
false
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class Buffers
|
|
32
|
+
def writer
|
|
33
|
+
Net::SSH::Util::WriterBuffer.new
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class KeyManager
|
|
38
|
+
attr_reader :events
|
|
39
|
+
|
|
40
|
+
def initialize
|
|
41
|
+
@events = []
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def clear!
|
|
45
|
+
@events << :clear!
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def clear_host!
|
|
49
|
+
@events << :clear_host!
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def finish
|
|
53
|
+
@events << :finish
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def add( file )
|
|
57
|
+
@events << { :name => :add, :file => file }
|
|
58
|
+
end
|
|
59
|
+
alias :<< :add
|
|
60
|
+
|
|
61
|
+
def add_host_key( file )
|
|
62
|
+
@events << { :name => :add_host_key, :file => file }
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
class Session
|
|
67
|
+
attr_reader :script
|
|
68
|
+
attr_reader :messages
|
|
69
|
+
|
|
70
|
+
def initialize
|
|
71
|
+
@script = []
|
|
72
|
+
@messages = []
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def send_message( message )
|
|
76
|
+
@messages << message
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def wait_for_message
|
|
80
|
+
type, data = @script.shift
|
|
81
|
+
[ type, Net::SSH::Util::ReaderBuffer.new( data ) ]
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
class AuthMethod
|
|
86
|
+
attr_reader :next_service
|
|
87
|
+
attr_reader :username
|
|
88
|
+
attr_reader :data
|
|
89
|
+
|
|
90
|
+
def initialize( good )
|
|
91
|
+
@good = good
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def authenticate( next_service, username, data={} )
|
|
95
|
+
@next_service = next_service
|
|
96
|
+
@username = username
|
|
97
|
+
@data = data
|
|
98
|
+
@good
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def setup
|
|
103
|
+
@methods = { :test_fail => AuthMethod.new( false ),
|
|
104
|
+
:test_succeed => AuthMethod.new( true ) }
|
|
105
|
+
order = [ "test-fail", "test-succeed" ]
|
|
106
|
+
@driver = Net::SSH::UserAuth::Driver.new( Log.new,
|
|
107
|
+
Buffers.new, @methods, order )
|
|
108
|
+
@driver.session = @session = Session.new
|
|
109
|
+
@driver.key_manager = @manager = KeyManager.new
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def test_set_key_files
|
|
113
|
+
@driver.set_key_files [ :one, :two ]
|
|
114
|
+
assert_equal [ :clear!,
|
|
115
|
+
{ :name => :add, :file => :one },
|
|
116
|
+
{ :name => :add, :file => :two } ], @manager.events
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def test_set_host_key_files
|
|
120
|
+
@driver.set_host_key_files [ :one, :two ]
|
|
121
|
+
assert_equal [ :clear_host!,
|
|
122
|
+
{ :name => :add_host_key, :file => :one },
|
|
123
|
+
{ :name => :add_host_key, :file => :two } ], @manager.events
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_order
|
|
127
|
+
assert_equal [ "test-fail", "test-succeed" ], @driver.order
|
|
128
|
+
original = [ "one", "two", "three" ]
|
|
129
|
+
@driver.set_auth_method_order( original )
|
|
130
|
+
@driver.order << "four"
|
|
131
|
+
assert_equal [ "one", "two", "three" ], original
|
|
132
|
+
assert_equal [ "one", "two", "three", "four" ], @driver.order
|
|
133
|
+
@driver.set_auth_method_order *original
|
|
134
|
+
assert_equal [ "one", "two", "three" ], @driver.order
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def test_on_banner
|
|
138
|
+
msg = lang = nil
|
|
139
|
+
@driver.on_banner { |m,l| msg, lang = m, l }
|
|
140
|
+
@session.script << [ 53, "\0\0\0\15hello, world!\0\0\0\2en" ]
|
|
141
|
+
@session.script << [ 51, "\0\0\0\15howdy, earth!\0" ]
|
|
142
|
+
result = @driver.wait_for_message
|
|
143
|
+
|
|
144
|
+
assert_equal "hello, world!", msg
|
|
145
|
+
assert_equal "en", lang
|
|
146
|
+
assert_equal 51, result.message_type
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def test_send_message
|
|
150
|
+
@driver.send_message "konnichi wa"
|
|
151
|
+
assert_equal [ "konnichi wa" ], @session.messages
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def test_authenticate_bad_reply
|
|
155
|
+
@session.script << [ 0, "\0\0\0\0" ]
|
|
156
|
+
assert_raise( Net::SSH::Exception ) do
|
|
157
|
+
@driver.authenticate( "service", "test_user", "passwd" )
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def test_authenticate_unexpected_reply
|
|
162
|
+
@session.script << [ 60, "\0\0\0\0" ]
|
|
163
|
+
assert_raise( Net::SSH::Exception ) do
|
|
164
|
+
@driver.authenticate( "service", "test_user", "passwd" )
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def test_authenticate
|
|
169
|
+
@session.script << [ 6, "\0\0\0\14ssh-userauth" ]
|
|
170
|
+
assert @driver.authenticate( "service", "test_user", "passwd" )
|
|
171
|
+
|
|
172
|
+
@methods.each_value do |method|
|
|
173
|
+
assert_equal "service", method.next_service
|
|
174
|
+
assert_equal "test_user", method.username
|
|
175
|
+
assert_equal( { :password => "passwd", :key_manager => @manager }, method.data )
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
assert_equal :finish, @manager.events.last
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def test_authenticate_not_implemented
|
|
182
|
+
@session.script << [ 6, "\0\0\0\14ssh-userauth" ]
|
|
183
|
+
@driver.set_auth_method_order "bogus"
|
|
184
|
+
assert_raise( NotImplementedError ) do
|
|
185
|
+
@driver.authenticate( "service", "test_user", "passwd" )
|
|
186
|
+
end
|
|
187
|
+
assert_equal :finish, @manager.events.last
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
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
|
+
if $run_integration_tests || __FILE__ == $0
|
|
20
|
+
|
|
21
|
+
require 'needle'
|
|
22
|
+
require 'net/ssh/transport/services'
|
|
23
|
+
require 'net/ssh/userauth/services'
|
|
24
|
+
require 'test/unit'
|
|
25
|
+
|
|
26
|
+
class TC_UserAuth_Integration < Test::Unit::TestCase
|
|
27
|
+
|
|
28
|
+
HOST = "test.host"
|
|
29
|
+
USER = "test"
|
|
30
|
+
PASSWORD = "test/unit"
|
|
31
|
+
SERVICE = "ssh-connection"
|
|
32
|
+
|
|
33
|
+
def setup
|
|
34
|
+
@registry = Needle::Registry.new(
|
|
35
|
+
:logs => { :device=>STDOUT, :default_level => :WARN }
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
Net::SSH::Transport.register_services( @registry )
|
|
39
|
+
Net::SSH::UserAuth.register_services( @registry )
|
|
40
|
+
|
|
41
|
+
@registry.define do |b|
|
|
42
|
+
b.crypto_backend { :ossl }
|
|
43
|
+
b.transport_host { HOST }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
@userauth = @registry[:userauth][:driver]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def teardown
|
|
50
|
+
@registry[:transport][:session].close
|
|
51
|
+
@registry.logs.close
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_keyboard_interactive
|
|
55
|
+
@userauth.set_auth_method_order "keyboard-interactive"
|
|
56
|
+
assert @userauth.authenticate( SERVICE, USER, PASSWORD )
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_password
|
|
60
|
+
@userauth.set_auth_method_order "password"
|
|
61
|
+
assert @userauth.authenticate( SERVICE, USER, PASSWORD )
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_password_bad
|
|
65
|
+
@userauth.set_auth_method_order "password"
|
|
66
|
+
assert !@userauth.authenticate( SERVICE, USER, PASSWORD + 'K' )
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_publickey_bad
|
|
70
|
+
@userauth.set_auth_method_order "publickey"
|
|
71
|
+
assert !@userauth.authenticate( SERVICE, USER )
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_hostbased_bad
|
|
75
|
+
@userauth.set_auth_method_order "hostbased"
|
|
76
|
+
assert !@userauth.authenticate( SERVICE, USER )
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
@@ -0,0 +1,265 @@
|
|
|
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/userauth/userkeys'
|
|
20
|
+
require 'net/ssh/util/buffer'
|
|
21
|
+
require 'test/unit'
|
|
22
|
+
require 'logger'
|
|
23
|
+
require 'stringio'
|
|
24
|
+
|
|
25
|
+
class TC_UserKeyManager < Test::Unit::TestCase
|
|
26
|
+
|
|
27
|
+
class Buffers
|
|
28
|
+
def writer
|
|
29
|
+
Net::SSH::Util::WriterBuffer.new
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class Keys
|
|
34
|
+
def load_public_key( file )
|
|
35
|
+
o = Object.new
|
|
36
|
+
singleton = class << o; self; end
|
|
37
|
+
singleton.send( :define_method, :ssh_type ) { "test" }
|
|
38
|
+
o
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def load_private_key( file )
|
|
42
|
+
count = 0
|
|
43
|
+
o = Object.new
|
|
44
|
+
singleton = class << o; self; end
|
|
45
|
+
singleton.send( :define_method, :ssh_do_sign ) { |data| count += 1; "<#{data}:#{count}>" }
|
|
46
|
+
o
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
class AgentFactory
|
|
51
|
+
attr_reader :state
|
|
52
|
+
|
|
53
|
+
def initialize
|
|
54
|
+
@state = :new
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def open
|
|
58
|
+
@state = :opened
|
|
59
|
+
self
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def sign( identity, data )
|
|
63
|
+
"from the agent (#{identity.inspect}, #{data.inspect})"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def identities
|
|
67
|
+
[ :one, :two, :three ]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def close
|
|
71
|
+
@state = :closed
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
class ExistenceTester
|
|
76
|
+
def readable?( file )
|
|
77
|
+
true
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def setup
|
|
82
|
+
@userkeys = Net::SSH::UserAuth::UserKeyManager.new
|
|
83
|
+
@userkeys.agent_factory = @agent_factory = AgentFactory.new
|
|
84
|
+
@userkeys.keys = Keys.new
|
|
85
|
+
@userkeys.log = @log = Logger.new( StringIO.new )
|
|
86
|
+
@userkeys.buffers = Buffers.new
|
|
87
|
+
@userkeys.key_existence_tester = ExistenceTester.new
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_initialize
|
|
91
|
+
assert_equal 0, @userkeys.key_files.length
|
|
92
|
+
assert_equal 0, @userkeys.host_key_files.length
|
|
93
|
+
assert @userkeys.use_agent?
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_add
|
|
97
|
+
assert_equal 0, @userkeys.key_files.length
|
|
98
|
+
@userkeys.add "hello"
|
|
99
|
+
assert_equal 1, @userkeys.key_files.length
|
|
100
|
+
assert_equal "hello", @userkeys.key_files.first
|
|
101
|
+
@userkeys.add "world"
|
|
102
|
+
assert_equal 2, @userkeys.key_files.length
|
|
103
|
+
@userkeys.add "hello"
|
|
104
|
+
assert_equal 2, @userkeys.key_files.length
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def test_add_host_key
|
|
108
|
+
assert_equal 0, @userkeys.host_key_files.length
|
|
109
|
+
@userkeys.add_host_key "hello"
|
|
110
|
+
assert_equal 1, @userkeys.host_key_files.length
|
|
111
|
+
assert_equal "hello", @userkeys.host_key_files.first
|
|
112
|
+
@userkeys.add_host_key "world"
|
|
113
|
+
assert_equal 2, @userkeys.host_key_files.length
|
|
114
|
+
@userkeys.add_host_key "hello"
|
|
115
|
+
assert_equal 2, @userkeys.host_key_files.length
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_clear!
|
|
119
|
+
@userkeys.add "hello"
|
|
120
|
+
@userkeys.add "howdy"
|
|
121
|
+
assert_equal 2, @userkeys.key_files.length
|
|
122
|
+
@userkeys.clear!
|
|
123
|
+
assert_equal 0, @userkeys.key_files.length
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_clear_host!
|
|
127
|
+
@userkeys.add_host_key "hello"
|
|
128
|
+
@userkeys.add_host_key "howdy"
|
|
129
|
+
assert_equal 2, @userkeys.host_key_files.length
|
|
130
|
+
@userkeys.clear_host!
|
|
131
|
+
assert_equal 0, @userkeys.host_key_files.length
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_clear_and_clear_host!
|
|
135
|
+
@userkeys.add "hello"
|
|
136
|
+
@userkeys.add "howdy"
|
|
137
|
+
@userkeys.add_host_key "hello"
|
|
138
|
+
@userkeys.add_host_key "howdy"
|
|
139
|
+
assert_equal 2, @userkeys.key_files.length
|
|
140
|
+
assert_equal 2, @userkeys.host_key_files.length
|
|
141
|
+
@userkeys.clear!
|
|
142
|
+
assert_equal 0, @userkeys.key_files.length
|
|
143
|
+
assert_equal 2, @userkeys.host_key_files.length
|
|
144
|
+
@userkeys.add "hello"
|
|
145
|
+
@userkeys.add "howdy"
|
|
146
|
+
assert_equal 2, @userkeys.key_files.length
|
|
147
|
+
assert_equal 2, @userkeys.host_key_files.length
|
|
148
|
+
@userkeys.clear_host!
|
|
149
|
+
assert_equal 2, @userkeys.key_files.length
|
|
150
|
+
assert_equal 0, @userkeys.host_key_files.length
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def test_finish_use_agent_unopened
|
|
154
|
+
@userkeys.use_agent = true
|
|
155
|
+
assert_equal :new, @agent_factory.state
|
|
156
|
+
@userkeys.finish
|
|
157
|
+
assert_equal :new, @agent_factory.state
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_finish_unopened_no_use_agent
|
|
161
|
+
@userkeys.use_agent = false
|
|
162
|
+
assert_equal :new, @agent_factory.state
|
|
163
|
+
@userkeys.finish
|
|
164
|
+
assert_equal :new, @agent_factory.state
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def test_finish_use_agent_opened
|
|
168
|
+
@userkeys.use_agent = true
|
|
169
|
+
@userkeys.identities
|
|
170
|
+
assert_equal :opened, @agent_factory.state
|
|
171
|
+
@userkeys.finish
|
|
172
|
+
assert_equal :closed, @agent_factory.state
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def test_finish_no_use_agent_opened
|
|
176
|
+
@userkeys.use_agent = false
|
|
177
|
+
@userkeys.identities
|
|
178
|
+
assert_equal :new, @agent_factory.state
|
|
179
|
+
@userkeys.finish
|
|
180
|
+
assert_equal :new, @agent_factory.state
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def test_identities_no_use_agent_no_files
|
|
184
|
+
@userkeys.use_agent = false
|
|
185
|
+
ids = @userkeys.identities
|
|
186
|
+
assert_equal 0, ids.length
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def test_identities_use_agent_no_files
|
|
190
|
+
@userkeys.use_agent = true
|
|
191
|
+
ids = @userkeys.identities
|
|
192
|
+
assert_equal 3, ids.length
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def test_identities_no_use_agent_files
|
|
196
|
+
@userkeys.use_agent = false
|
|
197
|
+
@userkeys.add "one"
|
|
198
|
+
@userkeys.add "two"
|
|
199
|
+
@userkeys.add "three"
|
|
200
|
+
ids = @userkeys.identities
|
|
201
|
+
assert_equal 3, ids.length
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def test_identities_use_agent_files
|
|
205
|
+
@userkeys.use_agent = true
|
|
206
|
+
@userkeys.add "one"
|
|
207
|
+
@userkeys.add "two"
|
|
208
|
+
@userkeys.add "three"
|
|
209
|
+
ids = @userkeys.identities
|
|
210
|
+
assert_equal 6, ids.length
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def test_host_identities_no_files
|
|
214
|
+
ids = @userkeys.host_identities
|
|
215
|
+
assert_equal 0, ids.length
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def test_host_identities_files
|
|
219
|
+
@userkeys.add_host_key "one"
|
|
220
|
+
@userkeys.add_host_key "two"
|
|
221
|
+
@userkeys.add_host_key "three"
|
|
222
|
+
ids = @userkeys.host_identities
|
|
223
|
+
assert_equal 3, ids.length
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def test_sign_from_file
|
|
227
|
+
@userkeys.use_agent = false
|
|
228
|
+
@userkeys.add "one"
|
|
229
|
+
ids = @userkeys.identities
|
|
230
|
+
assert_equal 1, ids.length
|
|
231
|
+
data = @userkeys.sign( ids.first, "hello" )
|
|
232
|
+
assert_equal "\0\0\0\4test\0\0\0\11<hello:1>", data
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def test_sign_from_agent
|
|
236
|
+
@userkeys.use_agent = true
|
|
237
|
+
ids = @userkeys.identities
|
|
238
|
+
assert_equal 3, ids.length
|
|
239
|
+
data = @userkeys.sign( ids.first, "hello" )
|
|
240
|
+
assert_equal %q{from the agent (:one, "hello")}, data
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def test_sign_from_key
|
|
244
|
+
@userkeys.use_agent = false
|
|
245
|
+
@userkeys.add "one"
|
|
246
|
+
ids = @userkeys.identities
|
|
247
|
+
assert_equal 1, ids.length
|
|
248
|
+
@userkeys.sign( ids.first, "hello" )
|
|
249
|
+
data = @userkeys.sign( ids.first, "hello" )
|
|
250
|
+
assert_equal "\0\0\0\4test\0\0\0\11<hello:2>", data
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def test_use_agent
|
|
254
|
+
assert @userkeys.use_agent?
|
|
255
|
+
@userkeys.identities
|
|
256
|
+
assert_equal :opened, @agent_factory.state
|
|
257
|
+
@userkeys.use_agent = false
|
|
258
|
+
assert_equal :closed, @agent_factory.state
|
|
259
|
+
@userkeys.use_agent = true
|
|
260
|
+
assert_equal :closed, @agent_factory.state
|
|
261
|
+
@userkeys.identities
|
|
262
|
+
assert_equal :opened, @agent_factory.state
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
end
|