net-ssh 1.1.4 → 2.0.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/CHANGELOG.rdoc +37 -0
- data/Manifest +101 -0
- data/README.rdoc +110 -0
- data/Rakefile +26 -0
- data/{THANKS → THANKS.rdoc} +2 -5
- data/lib/net/ssh.rb +189 -57
- 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 +166 -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 +116 -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 +575 -454
- data/lib/net/ssh/connection/constants.rb +31 -45
- data/lib/net/ssh/connection/session.rb +569 -0
- data/lib/net/ssh/connection/term.rb +176 -88
- data/lib/net/ssh/errors.rb +83 -61
- 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 +8 -28
- data/lib/net/ssh/proxy/http.rb +75 -107
- data/lib/net/ssh/proxy/socks4.rb +35 -48
- data/lib/net/ssh/proxy/socks5.rb +76 -108
- 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 +22 -58
- 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/{util → transport}/openssl.rb +22 -40
- 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 +225 -303
- 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 +57 -26
- data/net-ssh.gemspec +54 -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 +102 -253
- data/ChangeLog +0 -560
- data/LICENSE +0 -7
- data/NEWS +0 -152
- data/README +0 -14
- data/bin/rb-keygen +0 -210
- data/doc/LICENSE-BSD +0 -27
- data/doc/LICENSE-GPL +0 -280
- data/doc/LICENSE-RUBY +0 -56
- data/doc/manual-html/chapter-1.html +0 -388
- data/doc/manual-html/chapter-2.html +0 -552
- data/doc/manual-html/chapter-3.html +0 -470
- data/doc/manual-html/chapter-4.html +0 -413
- data/doc/manual-html/chapter-5.html +0 -525
- data/doc/manual-html/chapter-6.html +0 -456
- data/doc/manual-html/chapter-7.html +0 -343
- data/doc/manual-html/index.html +0 -235
- data/doc/manual-html/stylesheets/manual.css +0 -270
- data/doc/manual-html/stylesheets/ruby.css +0 -17
- data/doc/manual/chapter.erb +0 -38
- data/doc/manual/example.erb +0 -18
- data/doc/manual/index.erb +0 -29
- data/doc/manual/manual.rb +0 -311
- data/doc/manual/manual.yml +0 -73
- data/doc/manual/page.erb +0 -87
- data/doc/manual/parts/0000.txt +0 -5
- data/doc/manual/parts/0001.txt +0 -3
- data/doc/manual/parts/0002.txt +0 -40
- data/doc/manual/parts/0003.txt +0 -6
- data/doc/manual/parts/0004.txt +0 -7
- data/doc/manual/parts/0005.txt +0 -1
- data/doc/manual/parts/0006.txt +0 -49
- data/doc/manual/parts/0007.txt +0 -67
- data/doc/manual/parts/0008.txt +0 -43
- data/doc/manual/parts/0009.txt +0 -14
- data/doc/manual/parts/0010.txt +0 -7
- data/doc/manual/parts/0011.txt +0 -14
- data/doc/manual/parts/0012.txt +0 -3
- data/doc/manual/parts/0013.txt +0 -20
- data/doc/manual/parts/0014.txt +0 -32
- data/doc/manual/parts/0015.txt +0 -14
- data/doc/manual/parts/0016.txt +0 -28
- data/doc/manual/parts/0017.txt +0 -50
- data/doc/manual/parts/0018.txt +0 -35
- data/doc/manual/parts/0019.txt +0 -7
- data/doc/manual/parts/0020.txt +0 -72
- data/doc/manual/parts/0021.txt +0 -50
- data/doc/manual/parts/0022.txt +0 -42
- data/doc/manual/parts/0023.txt +0 -51
- data/doc/manual/parts/0024.txt +0 -18
- data/doc/manual/parts/0025.txt +0 -18
- data/doc/manual/parts/0026.txt +0 -15
- data/doc/manual/parts/0027.txt +0 -37
- data/doc/manual/parts/0028.txt +0 -16
- data/doc/manual/parts/0029.txt +0 -1
- data/doc/manual/parts/0030.txt +0 -52
- data/doc/manual/parts/0031.txt +0 -25
- data/doc/manual/stylesheets/manual.css +0 -270
- data/doc/manual/stylesheets/ruby.css +0 -17
- data/doc/manual/tutorial.erb +0 -30
- data/examples/auth-forward.rb +0 -41
- data/examples/channel-demo.rb +0 -81
- data/examples/port-forward.rb +0 -51
- data/examples/process-demo.rb +0 -91
- data/examples/remote-net-port-forward.rb +0 -45
- data/examples/remote-port-forward.rb +0 -80
- data/examples/shell-demo.rb +0 -46
- data/examples/ssh-client.rb +0 -67
- data/examples/sync-shell-demo.rb +0 -69
- data/examples/tail-demo.rb +0 -49
- data/lib/net/ssh/connection/driver.rb +0 -446
- data/lib/net/ssh/connection/services.rb +0 -72
- data/lib/net/ssh/host-key-verifier.rb +0 -52
- data/lib/net/ssh/known-hosts.rb +0 -96
- data/lib/net/ssh/lenient-host-key-verifier.rb +0 -25
- data/lib/net/ssh/null-host-key-verifier.rb +0 -14
- data/lib/net/ssh/service/agentforward/driver.rb +0 -78
- data/lib/net/ssh/service/agentforward/services.rb +0 -41
- data/lib/net/ssh/service/forward/driver.rb +0 -319
- data/lib/net/ssh/service/forward/local-network-handler.rb +0 -71
- data/lib/net/ssh/service/forward/remote-network-handler.rb +0 -83
- data/lib/net/ssh/service/forward/services.rb +0 -76
- data/lib/net/ssh/service/process/driver.rb +0 -153
- data/lib/net/ssh/service/process/open.rb +0 -193
- data/lib/net/ssh/service/process/popen3.rb +0 -178
- data/lib/net/ssh/service/process/services.rb +0 -66
- data/lib/net/ssh/service/services.rb +0 -60
- data/lib/net/ssh/service/shell/driver.rb +0 -86
- data/lib/net/ssh/service/shell/services.rb +0 -54
- data/lib/net/ssh/service/shell/shell.rb +0 -222
- data/lib/net/ssh/service/shell/sync.rb +0 -114
- data/lib/net/ssh/session.rb +0 -305
- data/lib/net/ssh/transport/algorithm-negotiator.rb +0 -275
- data/lib/net/ssh/transport/compress/compressor.rb +0 -53
- data/lib/net/ssh/transport/compress/decompressor.rb +0 -53
- data/lib/net/ssh/transport/compress/none-compressor.rb +0 -39
- data/lib/net/ssh/transport/compress/none-decompressor.rb +0 -39
- data/lib/net/ssh/transport/compress/services.rb +0 -68
- data/lib/net/ssh/transport/compress/zlib-compressor.rb +0 -60
- data/lib/net/ssh/transport/compress/zlib-decompressor.rb +0 -52
- data/lib/net/ssh/transport/errors.rb +0 -47
- data/lib/net/ssh/transport/identity-cipher.rb +0 -61
- data/lib/net/ssh/transport/kex/dh-gex.rb +0 -106
- data/lib/net/ssh/transport/kex/dh.rb +0 -249
- data/lib/net/ssh/transport/kex/services.rb +0 -62
- data/lib/net/ssh/transport/ossl/buffer-factory.rb +0 -52
- data/lib/net/ssh/transport/ossl/buffer.rb +0 -87
- data/lib/net/ssh/transport/ossl/cipher-factory.rb +0 -98
- data/lib/net/ssh/transport/ossl/digest-factory.rb +0 -51
- data/lib/net/ssh/transport/ossl/hmac-factory.rb +0 -71
- data/lib/net/ssh/transport/ossl/hmac/hmac.rb +0 -62
- data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +0 -44
- data/lib/net/ssh/transport/ossl/hmac/md5.rb +0 -46
- data/lib/net/ssh/transport/ossl/hmac/none.rb +0 -46
- data/lib/net/ssh/transport/ossl/hmac/services.rb +0 -68
- data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +0 -44
- data/lib/net/ssh/transport/ossl/hmac/sha1.rb +0 -45
- data/lib/net/ssh/transport/ossl/key-factory.rb +0 -116
- data/lib/net/ssh/transport/ossl/services.rb +0 -149
- data/lib/net/ssh/transport/packet-stream.rb +0 -236
- data/lib/net/ssh/transport/services.rb +0 -146
- data/lib/net/ssh/transport/version-negotiator.rb +0 -73
- data/lib/net/ssh/userauth/agent.rb +0 -222
- data/lib/net/ssh/userauth/constants.rb +0 -35
- data/lib/net/ssh/userauth/driver.rb +0 -183
- data/lib/net/ssh/userauth/methods/hostbased.rb +0 -119
- data/lib/net/ssh/userauth/methods/keyboard-interactive.rb +0 -104
- data/lib/net/ssh/userauth/methods/password.rb +0 -70
- data/lib/net/ssh/userauth/methods/publickey.rb +0 -137
- data/lib/net/ssh/userauth/methods/services.rb +0 -90
- data/lib/net/ssh/userauth/pageant.rb +0 -197
- data/lib/net/ssh/userauth/services.rb +0 -141
- data/lib/net/ssh/userauth/userkeys.rb +0 -258
- data/lib/net/ssh/util/buffer.rb +0 -274
- data/lib/net/ssh/util/prompter.rb +0 -73
- data/test/ALL-TESTS.rb +0 -18
- data/test/connection/tc_channel.rb +0 -136
- data/test/connection/tc_driver.rb +0 -287
- data/test/connection/tc_integration.rb +0 -87
- data/test/proxy/tc_http.rb +0 -209
- data/test/proxy/tc_socks4.rb +0 -148
- data/test/proxy/tc_socks5.rb +0 -214
- data/test/service/agentforward/tc_driver.rb +0 -138
- data/test/service/forward/tc_driver.rb +0 -289
- data/test/service/forward/tc_local_network_handler.rb +0 -123
- data/test/service/forward/tc_remote_network_handler.rb +0 -111
- data/test/service/process/tc_driver.rb +0 -79
- data/test/service/process/tc_integration.rb +0 -119
- data/test/service/process/tc_open.rb +0 -179
- data/test/service/process/tc_popen3.rb +0 -164
- data/test/tc_integration.rb +0 -80
- data/test/transport/compress/tc_none_compress.rb +0 -41
- data/test/transport/compress/tc_none_decompress.rb +0 -45
- data/test/transport/compress/tc_zlib_compress.rb +0 -61
- data/test/transport/compress/tc_zlib_decompress.rb +0 -48
- data/test/transport/kex/tc_dh.rb +0 -312
- data/test/transport/kex/tc_dh_gex.rb +0 -71
- data/test/transport/ossl/fixtures/dsa-encrypted +0 -15
- data/test/transport/ossl/fixtures/dsa-encrypted-bad +0 -15
- data/test/transport/ossl/fixtures/dsa-unencrypted +0 -12
- data/test/transport/ossl/fixtures/dsa-unencrypted-bad +0 -12
- data/test/transport/ossl/fixtures/dsa-unencrypted.pub +0 -1
- data/test/transport/ossl/fixtures/not-a-private-key +0 -4
- data/test/transport/ossl/fixtures/not-supported +0 -2
- data/test/transport/ossl/fixtures/rsa-encrypted +0 -18
- data/test/transport/ossl/fixtures/rsa-encrypted-bad +0 -18
- data/test/transport/ossl/fixtures/rsa-unencrypted +0 -15
- data/test/transport/ossl/fixtures/rsa-unencrypted-bad +0 -15
- data/test/transport/ossl/fixtures/rsa-unencrypted.pub +0 -1
- data/test/transport/ossl/hmac/tc_hmac.rb +0 -58
- data/test/transport/ossl/hmac/tc_md5.rb +0 -50
- data/test/transport/ossl/hmac/tc_md5_96.rb +0 -50
- data/test/transport/ossl/hmac/tc_none.rb +0 -50
- data/test/transport/ossl/hmac/tc_sha1.rb +0 -50
- data/test/transport/ossl/hmac/tc_sha1_96.rb +0 -50
- data/test/transport/ossl/tc_buffer.rb +0 -97
- data/test/transport/ossl/tc_buffer_factory.rb +0 -67
- data/test/transport/ossl/tc_cipher_factory.rb +0 -84
- data/test/transport/ossl/tc_digest_factory.rb +0 -39
- data/test/transport/ossl/tc_hmac_factory.rb +0 -72
- data/test/transport/ossl/tc_key_factory.rb +0 -199
- data/test/transport/tc_algorithm_negotiator.rb +0 -170
- data/test/transport/tc_identity_cipher.rb +0 -52
- data/test/transport/tc_integration.rb +0 -115
- data/test/transport/tc_packet_stream.rb +0 -184
- data/test/transport/tc_session.rb +0 -296
- data/test/transport/tc_version_negotiator.rb +0 -86
- data/test/userauth/methods/tc_hostbased.rb +0 -136
- data/test/userauth/methods/tc_password.rb +0 -89
- data/test/userauth/methods/tc_publickey.rb +0 -167
- data/test/userauth/tc_agent.rb +0 -223
- data/test/userauth/tc_driver.rb +0 -190
- data/test/userauth/tc_integration.rb +0 -97
- data/test/userauth/tc_userkeys.rb +0 -265
- data/test/util/tc_buffer.rb +0 -217
@@ -1,296 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
|
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 "#{File.dirname(__FILE__)}/../../lib"
|
18
|
-
|
19
|
-
require 'net/ssh/transport/constants'
|
20
|
-
require 'net/ssh/transport/session'
|
21
|
-
require 'net/ssh/util/buffer'
|
22
|
-
require 'test/unit'
|
23
|
-
require 'ostruct'
|
24
|
-
|
25
|
-
class TC_Session < Test::Unit::TestCase
|
26
|
-
include Net::SSH::Transport::Constants
|
27
|
-
|
28
|
-
class Logger
|
29
|
-
attr_reader :msgs
|
30
|
-
def initialize
|
31
|
-
@msgs = []
|
32
|
-
end
|
33
|
-
def debug?; true; end
|
34
|
-
def debug(msg)
|
35
|
-
@msgs << "[D] #{msg}"
|
36
|
-
end
|
37
|
-
def info?; true; end
|
38
|
-
def info(msg)
|
39
|
-
@msgs << "[I] #{msg}"
|
40
|
-
end
|
41
|
-
def warn?; true; end
|
42
|
-
def warn(msg)
|
43
|
-
@msgs << "[W] #{msg}"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
class VersionNegotiator
|
48
|
-
def negotiate( socket, version ); "A"; end
|
49
|
-
end
|
50
|
-
|
51
|
-
class AlgorithmNegotiator
|
52
|
-
def negotiate( session, options )
|
53
|
-
OpenStruct.new(
|
54
|
-
:server_packet => "A",
|
55
|
-
:client_packet => "B",
|
56
|
-
:kex => "C",
|
57
|
-
:host_key => "D",
|
58
|
-
:encryption_c2s => "E",
|
59
|
-
:encryption_s2c => "E",
|
60
|
-
:mac_c2s => "F",
|
61
|
-
:mac_s2c => "F",
|
62
|
-
:compression_c2s => "G",
|
63
|
-
:compression_s2c => "G",
|
64
|
-
:language_c2s => "",
|
65
|
-
:language_s2c => ""
|
66
|
-
)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
class ScriptedSocket
|
71
|
-
attr_reader :replies
|
72
|
-
attr_accessor :open_delay
|
73
|
-
|
74
|
-
def initialize( script )
|
75
|
-
@replies = []
|
76
|
-
@script = script
|
77
|
-
@open_delay = 0
|
78
|
-
end
|
79
|
-
|
80
|
-
def open( host, port )
|
81
|
-
@replies << "#{host}:#{port}"
|
82
|
-
sleep @open_delay
|
83
|
-
self
|
84
|
-
end
|
85
|
-
|
86
|
-
def write( msg )
|
87
|
-
@replies << msg
|
88
|
-
end
|
89
|
-
|
90
|
-
def read
|
91
|
-
@script.shift
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
class PacketHandler
|
96
|
-
attr_writer :socket
|
97
|
-
def on_new_algos( &block )
|
98
|
-
@on_new_algos = block
|
99
|
-
end
|
100
|
-
def set_algorithms( *args )
|
101
|
-
@on_new_algos.call(*args) if @on_new_algos
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
class PacketSender < PacketHandler
|
106
|
-
def send( msg )
|
107
|
-
@socket.write msg
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
class PacketReceiver < PacketHandler
|
112
|
-
def get
|
113
|
-
@socket.read
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
class Ciphers
|
118
|
-
def get( *args )
|
119
|
-
args.first
|
120
|
-
end
|
121
|
-
def get_lengths( name )
|
122
|
-
[ 24, 8 ]
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
class HMACs
|
127
|
-
def get( *args )
|
128
|
-
args.first
|
129
|
-
end
|
130
|
-
def get_key_length( name )
|
131
|
-
24
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
class Compressor
|
136
|
-
def initialize( *args )
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
class SSHAble; def to_ssh; ""; end; end
|
141
|
-
|
142
|
-
class Digester
|
143
|
-
def digest( text )
|
144
|
-
text
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
class Kex
|
149
|
-
def exchange_keys( session, info )
|
150
|
-
{
|
151
|
-
:shared_secret => SSHAble.new,
|
152
|
-
:session_id => "",
|
153
|
-
:server_key => "",
|
154
|
-
:hashing_algorithm => Digester.new
|
155
|
-
}
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def self.method_added( name )
|
160
|
-
super
|
161
|
-
|
162
|
-
end
|
163
|
-
|
164
|
-
def reader(text)
|
165
|
-
Net::SSH::Util::ReaderBuffer.new( text )
|
166
|
-
end
|
167
|
-
|
168
|
-
def setup
|
169
|
-
@script = []
|
170
|
-
@logger = Logger.new
|
171
|
-
@socket = ScriptedSocket.new( @script )
|
172
|
-
@sender = PacketSender.new
|
173
|
-
@getter = PacketReceiver.new
|
174
|
-
end
|
175
|
-
|
176
|
-
def do_setup( host, opts={} )
|
177
|
-
@session = Net::SSH::Transport::Session.new( host, opts ) do |s|
|
178
|
-
s.logger = @logger
|
179
|
-
s.default_port = 22
|
180
|
-
s.version_negotiator = VersionNegotiator.new
|
181
|
-
s.algorithm_negotiator = AlgorithmNegotiator.new
|
182
|
-
s.socket_factory = @socket
|
183
|
-
s.packet_sender = @sender
|
184
|
-
s.packet_receiver = @getter
|
185
|
-
s.ciphers = Ciphers.new
|
186
|
-
s.hmacs = HMACs.new
|
187
|
-
s.kexs = { "C" => Kex.new }
|
188
|
-
s.compressors = { "G" => Compressor }
|
189
|
-
s.decompressors = { "G" => Compressor }
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
def test_bad_option
|
194
|
-
assert_raise( ArgumentError ) do
|
195
|
-
do_setup( "the-host", :bogus => "thing" )
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
def test_open
|
200
|
-
@sender.on_new_algos do |a,b,c|
|
201
|
-
assert_equal "E", a
|
202
|
-
assert_equal "F", b
|
203
|
-
assert_instance_of Compressor, c
|
204
|
-
end
|
205
|
-
|
206
|
-
@getter.on_new_algos do |a,b,c|
|
207
|
-
assert_equal "E", a
|
208
|
-
assert_equal "F", b
|
209
|
-
assert_instance_of Compressor, c
|
210
|
-
end
|
211
|
-
|
212
|
-
do_setup "the.host.com"
|
213
|
-
|
214
|
-
assert_equal [ "the.host.com:22" ], @socket.replies
|
215
|
-
end
|
216
|
-
|
217
|
-
def test_send_message
|
218
|
-
do_setup "the.host.com"
|
219
|
-
@session.send_message "sending"
|
220
|
-
assert_equal [ "the.host.com:22", "sending" ], @socket.replies
|
221
|
-
end
|
222
|
-
|
223
|
-
def test_wait_for_message
|
224
|
-
@script << reader( "\xFFhello" )
|
225
|
-
do_setup "the.host.com"
|
226
|
-
type, buffer = @session.wait_for_message
|
227
|
-
assert_equal 255, type
|
228
|
-
assert_equal "hello", buffer.remainder_as_buffer.content
|
229
|
-
end
|
230
|
-
|
231
|
-
def test_wait_for_disconnect
|
232
|
-
@script << reader( "#{DISCONNECT.chr}\0\0\0\1\0\0\0\1A\0\0\0\1B" )
|
233
|
-
do_setup "the.host.com"
|
234
|
-
assert_raise( Net::SSH::Transport::Disconnect ) do
|
235
|
-
@session.wait_for_message
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
def test_wait_for_ignore
|
240
|
-
@script << reader( "#{IGNORE.chr}\0\0\0\1A" )
|
241
|
-
@script << reader( "\xFFhello" )
|
242
|
-
do_setup "the.host.com"
|
243
|
-
type, buffer = @session.wait_for_message
|
244
|
-
|
245
|
-
assert_equal 255, type
|
246
|
-
assert_equal "hello", buffer.remainder_as_buffer.content
|
247
|
-
|
248
|
-
assert @logger.msgs.include?("[I] received IGNORE message (\"A\")")
|
249
|
-
end
|
250
|
-
|
251
|
-
def test_wait_for_debug_quiet
|
252
|
-
@script << reader( "#{DEBUG.chr}\0\0\0\0\1A\0\0\0\1B" )
|
253
|
-
@script << reader( "\xFFhello" )
|
254
|
-
do_setup "the.host.com"
|
255
|
-
type, buffer = @session.wait_for_message
|
256
|
-
|
257
|
-
assert_equal 255, type
|
258
|
-
assert_equal "hello", buffer.remainder_as_buffer.content
|
259
|
-
|
260
|
-
assert @logger.msgs.include?("[D] A (B)")
|
261
|
-
end
|
262
|
-
|
263
|
-
def test_wait_for_debug_verbose
|
264
|
-
@script << reader( "#{DEBUG.chr}\1\0\0\0\1A\0\0\0\1B" )
|
265
|
-
@script << reader( "\xFFhello" )
|
266
|
-
do_setup "the.host.com"
|
267
|
-
type, buffer = @session.wait_for_message
|
268
|
-
|
269
|
-
assert_equal 255, type
|
270
|
-
assert_equal "hello", buffer.remainder_as_buffer.content
|
271
|
-
|
272
|
-
assert @logger.msgs.include?("[W] A (B)")
|
273
|
-
end
|
274
|
-
|
275
|
-
def test_wait_for_kexinit
|
276
|
-
@script << reader( "#{KEXINIT.chr}\1\0\0\0\1A\0\0\0\1B" )
|
277
|
-
@script << reader( "\xFFhello" )
|
278
|
-
do_setup "the.host.com"
|
279
|
-
type, buffer = @session.wait_for_message
|
280
|
-
|
281
|
-
assert_equal 255, type
|
282
|
-
assert_equal "hello", buffer.remainder_as_buffer.content
|
283
|
-
|
284
|
-
assert @logger.msgs.include?("[I] re-key requested")
|
285
|
-
end
|
286
|
-
|
287
|
-
def test_timeout_expired
|
288
|
-
@socket.open_delay = 2
|
289
|
-
assert_raise(Timeout::Error) { do_setup( "the.host.com", :timeout => 1 ) }
|
290
|
-
end
|
291
|
-
|
292
|
-
def test_timeout_not_expired
|
293
|
-
@socket.open_delay = 1
|
294
|
-
assert_nothing_raised { do_setup( "the.host.com", :timeout => 2 ) }
|
295
|
-
end
|
296
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
|
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 "#{File.dirname(__FILE__)}/../../lib"
|
18
|
-
|
19
|
-
require 'net/ssh/transport/version-negotiator'
|
20
|
-
require 'test/unit'
|
21
|
-
|
22
|
-
class TC_VersionNegotiator < Test::Unit::TestCase
|
23
|
-
|
24
|
-
class MockLogger; def debug?; false; end; end
|
25
|
-
|
26
|
-
class ScriptedSocket
|
27
|
-
attr_reader :lines
|
28
|
-
|
29
|
-
def initialize( *script )
|
30
|
-
@lines = []
|
31
|
-
@script = script
|
32
|
-
end
|
33
|
-
|
34
|
-
def readline
|
35
|
-
@script.shift
|
36
|
-
end
|
37
|
-
|
38
|
-
def print( msg )
|
39
|
-
@lines << msg
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def setup
|
44
|
-
logger = MockLogger.new
|
45
|
-
@negotiator = Net::SSH::Transport::VersionNegotiator.new( logger )
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_negotiate_bad_version
|
49
|
-
socket = ScriptedSocket.new( "SSH-1.5-Bogus/Thing\n" )
|
50
|
-
assert_raise( Net::SSH::Exception ) do
|
51
|
-
@negotiator.negotiate( socket, "SSH-2.0-My/Version" )
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_negotiate_compat_version
|
56
|
-
socket = ScriptedSocket.new( "SSH-1.99-Bogus/Thing\n" )
|
57
|
-
version = nil
|
58
|
-
assert_nothing_raised do
|
59
|
-
version = @negotiator.negotiate( socket, "SSH-2.0-My/Version" )
|
60
|
-
end
|
61
|
-
assert_equal "SSH-1.99-Bogus/Thing", version
|
62
|
-
assert_equal [ "SSH-2.0-My/Version\r\n" ], socket.lines
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_negotiate_good_version
|
66
|
-
socket = ScriptedSocket.new( "SSH-2.0-Bogus/Thing\n" )
|
67
|
-
version = nil
|
68
|
-
assert_nothing_raised do
|
69
|
-
version = @negotiator.negotiate( socket, "SSH-2.0-My/Version" )
|
70
|
-
end
|
71
|
-
assert_equal "SSH-2.0-Bogus/Thing", version
|
72
|
-
assert_equal [ "SSH-2.0-My/Version\r\n" ], socket.lines
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_header_lines
|
76
|
-
socket = ScriptedSocket.new( "First Line", "Second Line", "SSH-2.0-Bogus/Thing\n" )
|
77
|
-
version = nil
|
78
|
-
assert_nothing_raised do
|
79
|
-
version = @negotiator.negotiate( socket, "SSH-2.0-My/Version" )
|
80
|
-
end
|
81
|
-
assert_equal "SSH-2.0-Bogus/Thing", version
|
82
|
-
assert_equal [ "SSH-2.0-My/Version\r\n" ], socket.lines
|
83
|
-
assert_equal [ "First Line", "Second Line" ], @negotiator.header_lines
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
@@ -1,136 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
|
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 "#{File.dirname(__FILE__)}/../../../lib"
|
18
|
-
|
19
|
-
require 'net/ssh/userauth/methods/hostbased'
|
20
|
-
require 'net/ssh/util/buffer'
|
21
|
-
require 'test/unit'
|
22
|
-
require 'ostruct'
|
23
|
-
|
24
|
-
class TC_Methods_HostBased < Test::Unit::TestCase
|
25
|
-
|
26
|
-
class Buffers
|
27
|
-
def writer
|
28
|
-
Net::SSH::Util::WriterBuffer.new
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class Key < OpenStruct
|
33
|
-
def initialize( e, n )
|
34
|
-
super( :ssh_type => "ssh-rsa",
|
35
|
-
:e => OpenStruct.new( :to_ssh => [ e ].pack("N") ),
|
36
|
-
:n => OpenStruct.new( :to_ssh => [ n ].pack("N") ) )
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class Messenger
|
41
|
-
attr_reader :data
|
42
|
-
attr_reader :messages
|
43
|
-
|
44
|
-
def initialize
|
45
|
-
@data = []
|
46
|
-
@messages = []
|
47
|
-
end
|
48
|
-
|
49
|
-
def send_message( msg )
|
50
|
-
@messages << msg.to_s
|
51
|
-
end
|
52
|
-
|
53
|
-
def wait_for_message
|
54
|
-
@data.shift
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
class KeyManager
|
59
|
-
attr_reader :host_identities
|
60
|
-
attr_reader :state
|
61
|
-
attr_reader :sigdata
|
62
|
-
|
63
|
-
def initialize( *identities )
|
64
|
-
@host_identities = identities.flatten
|
65
|
-
@state = :open
|
66
|
-
end
|
67
|
-
|
68
|
-
def sign( identity, data )
|
69
|
-
@sigdata = [ identity, data.to_s ]
|
70
|
-
"<signature>"
|
71
|
-
end
|
72
|
-
|
73
|
-
def finish
|
74
|
-
@state = :finished
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def setup
|
79
|
-
ENV["USER"] = "test_client_user"
|
80
|
-
buffers = Buffers.new
|
81
|
-
@messenger = Messenger.new
|
82
|
-
@method = Net::SSH::UserAuth::Methods::HostBased.new( buffers )
|
83
|
-
@method.messenger = @messenger
|
84
|
-
@method.session_id = "test"
|
85
|
-
@method.hostname = "test.host"
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_authenticate_no_key_manager
|
89
|
-
assert !@method.authenticate( "test", "test_user" )
|
90
|
-
assert @messenger.messages.empty?
|
91
|
-
end
|
92
|
-
|
93
|
-
def test_authenticate_no_identities
|
94
|
-
manager = KeyManager.new
|
95
|
-
assert !@method.authenticate( "test", "test_user", :key_manager => manager )
|
96
|
-
assert_equal :finished, manager.state
|
97
|
-
end
|
98
|
-
|
99
|
-
def test_authenticate_success
|
100
|
-
manager = KeyManager.new( Key.new( 0x01010101, 0x02020202 ) )
|
101
|
-
@messenger.data.concat [ OpenStruct.new( :message_type => 52 ) ]
|
102
|
-
assert @method.authenticate( "test", "test_user", :key_manager => manager )
|
103
|
-
assert_equal :finished, manager.state
|
104
|
-
assert_equal 1, @messenger.messages.length
|
105
|
-
|
106
|
-
sig = "#{50.chr}\0\0\0\11test_user\0\0\0\4test\0\0\0\11hostbased\0\0\0\7ssh-rsa" +
|
107
|
-
"\0\0\0\23\0\0\0\7ssh-rsa\1\1\1\1\2\2\2\2" +
|
108
|
-
"\0\0\0\12test.host.\0\0\0\20test_client_user"
|
109
|
-
packet1 = sig + "\0\0\0\13<signature>"
|
110
|
-
assert_equal packet1, @messenger.messages[0]
|
111
|
-
|
112
|
-
sigdata = manager.sigdata
|
113
|
-
assert_equal "\0\0\0\4test" + sig, sigdata[1]
|
114
|
-
end
|
115
|
-
|
116
|
-
def test_authenticate_fail
|
117
|
-
manager = KeyManager.new( Key.new( 0x01010101, 0x02020202 ),
|
118
|
-
Key.new( 0x03030303, 0x04040404 ) )
|
119
|
-
@messenger.data.concat [ OpenStruct.new( :message_type => 51 ),
|
120
|
-
OpenStruct.new( :message_type => 51 ) ]
|
121
|
-
assert !@method.authenticate( "test", "test_user", :key_manager => manager )
|
122
|
-
assert_equal :finished, manager.state
|
123
|
-
assert_equal 2, @messenger.messages.length
|
124
|
-
end
|
125
|
-
|
126
|
-
def test_authenticate_acceptible_identities_error
|
127
|
-
manager = KeyManager.new( Key.new( 0x01010101, 0x02020202 ) )
|
128
|
-
@messenger.data.concat [ OpenStruct.new( :message_type => 60 ),
|
129
|
-
OpenStruct.new( :message_type => 0 ) ]
|
130
|
-
assert_raise( Net::SSH::Exception ) do
|
131
|
-
@method.authenticate( "test", "test_user", :key_manager => manager )
|
132
|
-
end
|
133
|
-
assert_equal 1, @messenger.messages.length
|
134
|
-
end
|
135
|
-
|
136
|
-
end
|