net-ssh 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. data/doc/LICENSE-BSD +27 -0
  2. data/doc/LICENSE-GPL +280 -0
  3. data/doc/LICENSE-RUBY +56 -0
  4. data/doc/README +13 -0
  5. data/doc/manual-html/chapter-1.html +333 -0
  6. data/doc/manual-html/chapter-2.html +455 -0
  7. data/doc/manual-html/chapter-3.html +413 -0
  8. data/doc/manual-html/chapter-4.html +353 -0
  9. data/doc/manual-html/chapter-5.html +393 -0
  10. data/doc/manual-html/chapter-6.html +296 -0
  11. data/doc/manual-html/index.html +217 -0
  12. data/doc/manual-html/manual.css +192 -0
  13. data/doc/manual/chapter.erb +18 -0
  14. data/doc/manual/example.erb +18 -0
  15. data/doc/manual/index.erb +29 -0
  16. data/doc/manual/manual.css +192 -0
  17. data/doc/manual/manual.rb +240 -0
  18. data/doc/manual/manual.yml +67 -0
  19. data/doc/manual/page.erb +87 -0
  20. data/doc/manual/parts/channels_callbacks.txt +32 -0
  21. data/doc/manual/parts/channels_loop.txt +14 -0
  22. data/doc/manual/parts/channels_open.txt +20 -0
  23. data/doc/manual/parts/channels_operations.txt +15 -0
  24. data/doc/manual/parts/channels_types.txt +3 -0
  25. data/doc/manual/parts/channels_what_are.txt +7 -0
  26. data/doc/manual/parts/exec_channels.txt +28 -0
  27. data/doc/manual/parts/exec_open.txt +51 -0
  28. data/doc/manual/parts/exec_popen3.txt +35 -0
  29. data/doc/manual/parts/forward_direct.txt +37 -0
  30. data/doc/manual/parts/forward_handlers.txt +16 -0
  31. data/doc/manual/parts/forward_intro.txt +18 -0
  32. data/doc/manual/parts/forward_local.txt +18 -0
  33. data/doc/manual/parts/forward_remote.txt +14 -0
  34. data/doc/manual/parts/intro_author.txt +1 -0
  35. data/doc/manual/parts/intro_getting.txt +39 -0
  36. data/doc/manual/parts/intro_license.txt +6 -0
  37. data/doc/manual/parts/intro_support.txt +7 -0
  38. data/doc/manual/parts/intro_what_is.txt +7 -0
  39. data/doc/manual/parts/intro_what_is_not.txt +3 -0
  40. data/doc/manual/parts/proxy_http.txt +52 -0
  41. data/doc/manual/parts/proxy_intro.txt +1 -0
  42. data/doc/manual/parts/proxy_socks.txt +23 -0
  43. data/doc/manual/parts/session_key.txt +66 -0
  44. data/doc/manual/parts/session_options.txt +42 -0
  45. data/doc/manual/parts/session_session.txt +14 -0
  46. data/doc/manual/parts/session_start.txt +49 -0
  47. data/doc/manual/tutorial.erb +30 -0
  48. data/examples/channel-demo.rb +81 -0
  49. data/examples/port-forward.rb +51 -0
  50. data/examples/process-demo.rb +91 -0
  51. data/examples/remote-net-port-forward.rb +45 -0
  52. data/examples/remote-port-forward.rb +80 -0
  53. data/examples/tail-demo.rb +49 -0
  54. data/lib/net/ssh.rb +52 -0
  55. data/lib/net/ssh/connection/channel.rb +411 -0
  56. data/lib/net/ssh/connection/constants.rb +47 -0
  57. data/lib/net/ssh/connection/driver.rb +343 -0
  58. data/lib/net/ssh/connection/services.rb +72 -0
  59. data/lib/net/ssh/connection/term.rb +90 -0
  60. data/lib/net/ssh/errors.rb +27 -0
  61. data/lib/net/ssh/proxy/errors.rb +34 -0
  62. data/lib/net/ssh/proxy/http.rb +126 -0
  63. data/lib/net/ssh/proxy/socks4.rb +83 -0
  64. data/lib/net/ssh/proxy/socks5.rb +160 -0
  65. data/lib/net/ssh/service/forward/driver.rb +319 -0
  66. data/lib/net/ssh/service/forward/local-network-handler.rb +74 -0
  67. data/lib/net/ssh/service/forward/remote-network-handler.rb +81 -0
  68. data/lib/net/ssh/service/forward/services.rb +76 -0
  69. data/lib/net/ssh/service/process/driver.rb +153 -0
  70. data/lib/net/ssh/service/process/open.rb +193 -0
  71. data/lib/net/ssh/service/process/popen3.rb +160 -0
  72. data/lib/net/ssh/service/process/services.rb +66 -0
  73. data/lib/net/ssh/service/services.rb +44 -0
  74. data/lib/net/ssh/session.rb +242 -0
  75. data/lib/net/ssh/transport/algorithm-negotiator.rb +267 -0
  76. data/lib/net/ssh/transport/compress/compressor.rb +53 -0
  77. data/lib/net/ssh/transport/compress/decompressor.rb +53 -0
  78. data/lib/net/ssh/transport/compress/none-compressor.rb +39 -0
  79. data/lib/net/ssh/transport/compress/none-decompressor.rb +39 -0
  80. data/lib/net/ssh/transport/compress/services.rb +68 -0
  81. data/lib/net/ssh/transport/compress/zlib-compressor.rb +60 -0
  82. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +52 -0
  83. data/lib/net/ssh/transport/constants.rb +66 -0
  84. data/lib/net/ssh/transport/errors.rb +47 -0
  85. data/lib/net/ssh/transport/identity-cipher.rb +61 -0
  86. data/lib/net/ssh/transport/kex/dh-gex.rb +106 -0
  87. data/lib/net/ssh/transport/kex/dh.rb +231 -0
  88. data/lib/net/ssh/transport/kex/services.rb +60 -0
  89. data/lib/net/ssh/transport/ossl/buffer-factory.rb +52 -0
  90. data/lib/net/ssh/transport/ossl/buffer.rb +87 -0
  91. data/lib/net/ssh/transport/ossl/cipher-factory.rb +98 -0
  92. data/lib/net/ssh/transport/ossl/digest-factory.rb +51 -0
  93. data/lib/net/ssh/transport/ossl/hmac-factory.rb +71 -0
  94. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +62 -0
  95. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +44 -0
  96. data/lib/net/ssh/transport/ossl/hmac/md5.rb +46 -0
  97. data/lib/net/ssh/transport/ossl/hmac/none.rb +46 -0
  98. data/lib/net/ssh/transport/ossl/hmac/services.rb +68 -0
  99. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +44 -0
  100. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +45 -0
  101. data/lib/net/ssh/transport/ossl/key-factory.rb +113 -0
  102. data/lib/net/ssh/transport/ossl/services.rb +149 -0
  103. data/lib/net/ssh/transport/packet-stream.rb +210 -0
  104. data/lib/net/ssh/transport/services.rb +146 -0
  105. data/lib/net/ssh/transport/session.rb +296 -0
  106. data/lib/net/ssh/transport/version-negotiator.rb +73 -0
  107. data/lib/net/ssh/userauth/agent.rb +218 -0
  108. data/lib/net/ssh/userauth/constants.rb +35 -0
  109. data/lib/net/ssh/userauth/driver.rb +176 -0
  110. data/lib/net/ssh/userauth/methods/hostbased.rb +119 -0
  111. data/lib/net/ssh/userauth/methods/password.rb +70 -0
  112. data/lib/net/ssh/userauth/methods/publickey.rb +137 -0
  113. data/lib/net/ssh/userauth/methods/services.rb +63 -0
  114. data/lib/net/ssh/userauth/services.rb +126 -0
  115. data/lib/net/ssh/userauth/userkeys.rb +258 -0
  116. data/lib/net/ssh/util/buffer.rb +274 -0
  117. data/lib/net/ssh/util/openssl.rb +146 -0
  118. data/lib/net/ssh/util/prompter.rb +73 -0
  119. data/lib/net/ssh/version.rb +29 -0
  120. data/test/ALL-TESTS.rb +21 -0
  121. data/test/connection/tc_channel.rb +136 -0
  122. data/test/connection/tc_driver.rb +287 -0
  123. data/test/connection/tc_integration.rb +85 -0
  124. data/test/proxy/tc_http.rb +209 -0
  125. data/test/proxy/tc_socks4.rb +148 -0
  126. data/test/proxy/tc_socks5.rb +214 -0
  127. data/test/service/forward/tc_driver.rb +289 -0
  128. data/test/service/forward/tc_local_network_handler.rb +123 -0
  129. data/test/service/forward/tc_remote_network_handler.rb +108 -0
  130. data/test/service/process/tc_driver.rb +79 -0
  131. data/test/service/process/tc_integration.rb +117 -0
  132. data/test/service/process/tc_open.rb +179 -0
  133. data/test/service/process/tc_popen3.rb +164 -0
  134. data/test/tc_integration.rb +79 -0
  135. data/test/transport/compress/tc_none_compress.rb +41 -0
  136. data/test/transport/compress/tc_none_decompress.rb +45 -0
  137. data/test/transport/compress/tc_zlib_compress.rb +61 -0
  138. data/test/transport/compress/tc_zlib_decompress.rb +48 -0
  139. data/test/transport/kex/tc_dh.rb +304 -0
  140. data/test/transport/kex/tc_dh_gex.rb +70 -0
  141. data/test/transport/ossl/fixtures/dsa-encrypted +15 -0
  142. data/test/transport/ossl/fixtures/dsa-encrypted-bad +15 -0
  143. data/test/transport/ossl/fixtures/dsa-unencrypted +12 -0
  144. data/test/transport/ossl/fixtures/dsa-unencrypted-bad +12 -0
  145. data/test/transport/ossl/fixtures/dsa-unencrypted.pub +1 -0
  146. data/test/transport/ossl/fixtures/not-a-private-key +4 -0
  147. data/test/transport/ossl/fixtures/not-supported +2 -0
  148. data/test/transport/ossl/fixtures/rsa-encrypted +18 -0
  149. data/test/transport/ossl/fixtures/rsa-encrypted-bad +18 -0
  150. data/test/transport/ossl/fixtures/rsa-unencrypted +15 -0
  151. data/test/transport/ossl/fixtures/rsa-unencrypted-bad +15 -0
  152. data/test/transport/ossl/fixtures/rsa-unencrypted.pub +1 -0
  153. data/test/transport/ossl/hmac/tc_hmac.rb +58 -0
  154. data/test/transport/ossl/hmac/tc_md5.rb +50 -0
  155. data/test/transport/ossl/hmac/tc_md5_96.rb +50 -0
  156. data/test/transport/ossl/hmac/tc_none.rb +50 -0
  157. data/test/transport/ossl/hmac/tc_sha1.rb +50 -0
  158. data/test/transport/ossl/hmac/tc_sha1_96.rb +50 -0
  159. data/test/transport/ossl/tc_buffer.rb +97 -0
  160. data/test/transport/ossl/tc_buffer_factory.rb +67 -0
  161. data/test/transport/ossl/tc_cipher_factory.rb +84 -0
  162. data/test/transport/ossl/tc_digest_factory.rb +39 -0
  163. data/test/transport/ossl/tc_hmac_factory.rb +72 -0
  164. data/test/transport/ossl/tc_key_factory.rb +199 -0
  165. data/test/transport/tc_algorithm_negotiator.rb +169 -0
  166. data/test/transport/tc_identity_cipher.rb +52 -0
  167. data/test/transport/tc_integration.rb +110 -0
  168. data/test/transport/tc_packet_stream.rb +183 -0
  169. data/test/transport/tc_session.rb +283 -0
  170. data/test/transport/tc_version_negotiator.rb +86 -0
  171. data/test/userauth/methods/tc_hostbased.rb +136 -0
  172. data/test/userauth/methods/tc_password.rb +89 -0
  173. data/test/userauth/methods/tc_publickey.rb +167 -0
  174. data/test/userauth/tc_agent.rb +223 -0
  175. data/test/userauth/tc_driver.rb +190 -0
  176. data/test/userauth/tc_integration.rb +81 -0
  177. data/test/userauth/tc_userkeys.rb +265 -0
  178. data/test/util/tc_buffer.rb +217 -0
  179. metadata +256 -0
@@ -0,0 +1,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