net-ssh 2.7.0 → 7.3.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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/.dockerignore +6 -0
- data/.github/FUNDING.yml +1 -0
- data/.github/config/rubocop_linter_action.yml +4 -0
- data/.github/workflows/ci-with-docker.yml +44 -0
- data/.github/workflows/ci.yml +94 -0
- data/.github/workflows/rubocop.yml +16 -0
- data/.gitignore +15 -0
- data/.rubocop.yml +22 -0
- data/.rubocop_todo.yml +1081 -0
- data/CHANGES.txt +387 -0
- data/DEVELOPMENT.md +23 -0
- data/Dockerfile +29 -0
- data/Dockerfile.openssl3 +17 -0
- data/Gemfile +13 -0
- data/Gemfile.noed25519 +12 -0
- data/Gemfile.norbnacl +12 -0
- data/ISSUE_TEMPLATE.md +30 -0
- data/Manifest +4 -5
- data/README.md +303 -0
- data/Rakefile +174 -40
- data/SECURITY.md +4 -0
- data/THANKS.txt +25 -0
- data/appveyor.yml +58 -0
- data/docker-compose.yml +25 -0
- data/lib/net/ssh/authentication/agent.rb +279 -18
- data/lib/net/ssh/authentication/certificate.rb +183 -0
- data/lib/net/ssh/authentication/constants.rb +17 -15
- data/lib/net/ssh/authentication/ed25519.rb +184 -0
- data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
- data/lib/net/ssh/authentication/key_manager.rb +125 -54
- data/lib/net/ssh/authentication/methods/abstract.rb +67 -48
- data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +19 -12
- data/lib/net/ssh/authentication/methods/none.rb +16 -19
- data/lib/net/ssh/authentication/methods/password.rb +56 -19
- data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
- data/lib/net/ssh/authentication/pageant.rb +483 -246
- data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
- data/lib/net/ssh/authentication/session.rb +138 -120
- data/lib/net/ssh/buffer.rb +399 -300
- data/lib/net/ssh/buffered_io.rb +154 -150
- data/lib/net/ssh/config.rb +361 -166
- data/lib/net/ssh/connection/channel.rb +640 -596
- data/lib/net/ssh/connection/constants.rb +29 -29
- data/lib/net/ssh/connection/event_loop.rb +123 -0
- data/lib/net/ssh/connection/keepalive.rb +59 -0
- data/lib/net/ssh/connection/session.rb +628 -548
- data/lib/net/ssh/connection/term.rb +125 -123
- data/lib/net/ssh/errors.rb +101 -95
- data/lib/net/ssh/key_factory.rb +198 -100
- data/lib/net/ssh/known_hosts.rb +221 -98
- data/lib/net/ssh/loggable.rb +50 -49
- data/lib/net/ssh/packet.rb +83 -79
- data/lib/net/ssh/prompt.rb +50 -81
- data/lib/net/ssh/proxy/command.rb +108 -60
- data/lib/net/ssh/proxy/errors.rb +12 -10
- data/lib/net/ssh/proxy/http.rb +82 -78
- data/lib/net/ssh/proxy/https.rb +50 -0
- data/lib/net/ssh/proxy/jump.rb +54 -0
- data/lib/net/ssh/proxy/socks4.rb +5 -8
- data/lib/net/ssh/proxy/socks5.rb +18 -20
- data/lib/net/ssh/service/forward.rb +383 -255
- data/lib/net/ssh/test/channel.rb +145 -136
- data/lib/net/ssh/test/extensions.rb +131 -110
- data/lib/net/ssh/test/kex.rb +34 -32
- data/lib/net/ssh/test/local_packet.rb +46 -44
- data/lib/net/ssh/test/packet.rb +89 -70
- data/lib/net/ssh/test/remote_packet.rb +32 -30
- data/lib/net/ssh/test/script.rb +156 -142
- data/lib/net/ssh/test/socket.rb +49 -48
- data/lib/net/ssh/test.rb +82 -77
- data/lib/net/ssh/transport/aes128_gcm.rb +40 -0
- data/lib/net/ssh/transport/aes256_gcm.rb +40 -0
- data/lib/net/ssh/transport/algorithms.rb +472 -348
- data/lib/net/ssh/transport/chacha20_poly1305_cipher.rb +117 -0
- data/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb +17 -0
- data/lib/net/ssh/transport/cipher_factory.rb +124 -100
- data/lib/net/ssh/transport/constants.rb +32 -24
- data/lib/net/ssh/transport/ctr.rb +42 -22
- data/lib/net/ssh/transport/gcm_cipher.rb +207 -0
- data/lib/net/ssh/transport/hmac/abstract.rb +97 -63
- data/lib/net/ssh/transport/hmac/md5.rb +0 -2
- data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
- data/lib/net/ssh/transport/hmac/none.rb +0 -2
- data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
- data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
- data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
- data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
- data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac.rb +14 -12
- data/lib/net/ssh/transport/identity_cipher.rb +54 -44
- data/lib/net/ssh/transport/kex/abstract.rb +130 -0
- data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +119 -213
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -61
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
- data/lib/net/ssh/transport/kex.rb +15 -12
- data/lib/net/ssh/transport/key_expander.rb +24 -20
- data/lib/net/ssh/transport/openssl.rb +161 -124
- data/lib/net/ssh/transport/openssl_cipher_extensions.rb +8 -0
- data/lib/net/ssh/transport/packet_stream.rb +246 -183
- data/lib/net/ssh/transport/server_version.rb +57 -51
- data/lib/net/ssh/transport/session.rb +307 -235
- data/lib/net/ssh/transport/state.rb +178 -176
- data/lib/net/ssh/verifiers/accept_new.rb +33 -0
- data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
- data/lib/net/ssh/verifiers/always.rb +58 -0
- data/lib/net/ssh/verifiers/never.rb +19 -0
- data/lib/net/ssh/version.rb +57 -51
- data/lib/net/ssh.rb +140 -40
- data/net-ssh-public_cert.pem +21 -0
- data/net-ssh.gemspec +39 -184
- data/support/ssh_tunnel_bug.rb +5 -5
- data.tar.gz.sig +0 -0
- metadata +205 -99
- metadata.gz.sig +0 -0
- data/README.rdoc +0 -219
- data/Rudyfile +0 -96
- data/gem-public_cert.pem +0 -20
- data/lib/net/ssh/authentication/agent/java_pageant.rb +0 -85
- data/lib/net/ssh/authentication/agent/socket.rb +0 -170
- data/lib/net/ssh/ruby_compat.rb +0 -51
- data/lib/net/ssh/verifiers/lenient.rb +0 -30
- data/lib/net/ssh/verifiers/null.rb +0 -12
- data/lib/net/ssh/verifiers/secure.rb +0 -54
- data/lib/net/ssh/verifiers/strict.rb +0 -24
- data/setup.rb +0 -1585
- data/support/arcfour_check.rb +0 -20
- data/test/README.txt +0 -47
- 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 -100
- data/test/authentication/methods/test_none.rb +0 -41
- data/test/authentication/methods/test_password.rb +0 -52
- data/test/authentication/methods/test_publickey.rb +0 -148
- data/test/authentication/test_agent.rb +0 -205
- data/test/authentication/test_key_manager.rb +0 -218
- data/test/authentication/test_session.rb +0 -108
- data/test/common.rb +0 -108
- 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/nohost +0 -19
- data/test/configs/numeric_host +0 -4
- 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 -467
- data/test/connection/test_session.rb +0 -526
- data/test/known_hosts/github +0 -1
- data/test/manual/test_forward.rb +0 -223
- data/test/start/test_options.rb +0 -36
- data/test/start/test_transport.rb +0 -28
- data/test/test_all.rb +0 -11
- data/test/test_buffer.rb +0 -433
- data/test/test_buffered_io.rb +0 -63
- data/test/test_config.rb +0 -151
- data/test/test_key_factory.rb +0 -173
- data/test/test_known_hosts.rb +0 -13
- 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 -146
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -92
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -34
- 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 -330
- data/test/transport/test_cipher_factory.rb +0 -443
- 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 -1755
- data/test/transport/test_server_version.rb +0 -78
- data/test/transport/test_session.rb +0 -319
- data/test/transport/test_state.rb +0 -181
@@ -1,51 +1,53 @@
|
|
1
1
|
require 'net/ssh/packet'
|
2
2
|
require 'net/ssh/test/packet'
|
3
3
|
|
4
|
-
module Net
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
4
|
+
module Net
|
5
|
+
module SSH
|
6
|
+
module Test
|
7
|
+
# This is a specialization of Net::SSH::Test::Packet for representing mock
|
8
|
+
# packets that are sent from the local (client) host. These are created
|
9
|
+
# automatically by Net::SSH::Test::Script and Net::SSH::Test::Channel by any
|
10
|
+
# of the sends_* methods.
|
11
|
+
class LocalPacket < Packet
|
12
|
+
attr_reader :init
|
13
|
+
|
14
|
+
# Extend the default Net::SSH::Test::Packet constructor to also accept an
|
15
|
+
# optional block, which is used to finalize the initialization of the
|
16
|
+
# packet when #process is first called.
|
17
|
+
def initialize(type, *args, &block)
|
18
|
+
super(type, *args)
|
19
|
+
@init = block
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns +true+; this is a local packet.
|
23
|
+
def local?
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
# Called by Net::SSH::Test::Extensions::PacketStream#test_enqueue_packet
|
28
|
+
# to mimic remote processing of a locally-sent packet. It compares the
|
29
|
+
# packet it was given with the contents of this LocalPacket's data, to see
|
30
|
+
# if what was sent matches what was scripted. If it differs in any way,
|
31
|
+
# an exception is raised.
|
32
|
+
def process(packet)
|
33
|
+
@init.call(Net::SSH::Packet.new(packet.to_s)) if @init
|
34
|
+
type = packet.read_byte
|
35
|
+
raise "expected #{@type}, but got #{type}" if @type != type
|
36
|
+
|
37
|
+
@data.zip(types).each do |expected, _type|
|
38
|
+
_type ||= case expected
|
39
|
+
when nil then break
|
40
|
+
when Numeric then :long
|
41
|
+
when String then :string
|
42
|
+
when TrueClass, FalseClass then :bool
|
43
|
+
end
|
44
|
+
|
45
|
+
actual = packet.send("read_#{_type}")
|
46
|
+
next if expected.nil?
|
47
|
+
raise "expected #{_type} #{expected.inspect} but got #{actual.inspect}" unless expected == actual
|
42
48
|
end
|
43
|
-
|
44
|
-
actual = packet.send("read_#{_type}")
|
45
|
-
next if expected.nil?
|
46
|
-
raise "expected #{_type} #{expected.inspect} but got #{actual.inspect}" unless expected == actual
|
49
|
+
end
|
47
50
|
end
|
48
51
|
end
|
49
52
|
end
|
50
|
-
|
51
|
-
end; end; end
|
53
|
+
end
|
data/lib/net/ssh/test/packet.rb
CHANGED
@@ -1,82 +1,101 @@
|
|
1
1
|
require 'net/ssh/connection/constants'
|
2
2
|
require 'net/ssh/transport/constants'
|
3
3
|
|
4
|
-
module Net
|
4
|
+
module Net
|
5
|
+
module SSH
|
6
|
+
module Test
|
7
|
+
# This is an abstract class, not to be instantiated directly, subclassed by
|
8
|
+
# Net::SSH::Test::LocalPacket and Net::SSH::Test::RemotePacket. It implements
|
9
|
+
# functionality common to those subclasses.
|
10
|
+
#
|
11
|
+
# These packets are not true packets, in that they don't represent what was
|
12
|
+
# actually sent between the hosst; rather, they represent what was expected
|
13
|
+
# to be sent, as dictated by the script (Net::SSH::Test::Script). Thus,
|
14
|
+
# though they are defined with data elements, these data elements are used
|
15
|
+
# to either validate data that was sent by the local host (Net::SSH::Test::LocalPacket)
|
16
|
+
# or to mimic the sending of data by the remote host (Net::SSH::Test::RemotePacket).
|
17
|
+
class Packet
|
18
|
+
include Net::SSH::Transport::Constants
|
19
|
+
include Net::SSH::Connection::Constants
|
5
20
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# to be sent, as dictated by the script (Net::SSH::Test::Script). Thus,
|
13
|
-
# though they are defined with data elements, these data elements are used
|
14
|
-
# to either validate data that was sent by the local host (Net::SSH::Test::LocalPacket)
|
15
|
-
# or to mimic the sending of data by the remote host (Net::SSH::Test::RemotePacket).
|
16
|
-
class Packet
|
17
|
-
include Net::SSH::Transport::Constants
|
18
|
-
include Net::SSH::Connection::Constants
|
21
|
+
# Register a custom channel request. extra_parts is an array of types
|
22
|
+
# of extra parameters
|
23
|
+
def self.register_channel_request(request, extra_parts)
|
24
|
+
@registered_requests ||= {}
|
25
|
+
@registered_requests[request] = { extra_parts: extra_parts }
|
26
|
+
end
|
19
27
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def initialize(type, *args)
|
24
|
-
@type = self.class.const_get(type.to_s.upcase)
|
25
|
-
@data = args
|
26
|
-
end
|
28
|
+
def self.registered_channel_requests(request)
|
29
|
+
@registered_requests && @registered_requests[request]
|
30
|
+
end
|
27
31
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
+
# Ceate a new packet of the given +type+, and with +args+ being a list of
|
33
|
+
# data elements in the order expected for packets of the given +type+
|
34
|
+
# (see #types).
|
35
|
+
def initialize(type, *args)
|
36
|
+
@type = self.class.const_get(type.to_s.upcase)
|
37
|
+
@data = args
|
38
|
+
end
|
32
39
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
40
|
+
# The default for +remote?+ is false. Subclasses should override as necessary.
|
41
|
+
def remote?
|
42
|
+
false
|
43
|
+
end
|
37
44
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
# The default for +local?+ is false. Subclasses should override as necessary.
|
46
|
+
def local?
|
47
|
+
false
|
48
|
+
end
|
49
|
+
|
50
|
+
# Instantiates the packets data elements. When the packet was first defined,
|
51
|
+
# some elements may not have been fully realized, and were described as
|
52
|
+
# Proc objects rather than atomic types. This invokes those Proc objects
|
53
|
+
# and replaces them with their returned values. This allows for values
|
54
|
+
# like Net::SSH::Test::Channel#remote_id to be used in scripts before
|
55
|
+
# the remote_id is known (since it is only known after a channel has been
|
56
|
+
# confirmed open).
|
57
|
+
def instantiate!
|
58
|
+
@data.map! { |i| i.respond_to?(:call) ? i.call : i }
|
59
|
+
end
|
60
|
+
|
61
|
+
# Returns an array of symbols describing the data elements for packets of
|
62
|
+
# the same type as this packet. These types are used to either validate
|
63
|
+
# sent packets (Net::SSH::Test::LocalPacket) or build received packets
|
64
|
+
# (Net::SSH::Test::RemotePacket).
|
65
|
+
#
|
66
|
+
# Not all packet types are defined here. As new packet types are required
|
67
|
+
# (e.g., a unit test needs to test that the remote host sent a packet that
|
68
|
+
# is not implemented here), the description of that packet should be
|
69
|
+
# added. Unsupported packet types will otherwise raise an exception.
|
70
|
+
def types
|
71
|
+
@types ||= case @type
|
72
|
+
when KEXINIT
|
73
|
+
%i[long long long long
|
74
|
+
string string string string string string string string string string
|
75
|
+
bool]
|
76
|
+
when NEWKEYS then []
|
77
|
+
when CHANNEL_OPEN then %i[string long long long]
|
78
|
+
when CHANNEL_OPEN_CONFIRMATION then %i[long long long long]
|
79
|
+
when CHANNEL_DATA then %i[long string]
|
80
|
+
when CHANNEL_EXTENDED_DATA then %i[long long string]
|
81
|
+
when CHANNEL_EOF, CHANNEL_CLOSE, CHANNEL_SUCCESS, CHANNEL_FAILURE then [:long]
|
82
|
+
when CHANNEL_REQUEST
|
83
|
+
parts = %i[long string bool]
|
84
|
+
case @data[1]
|
85
|
+
when "exec", "subsystem", "shell" then parts << :string
|
86
|
+
when "exit-status" then parts << :long
|
87
|
+
when "pty-req" then parts.concat(%i[string long long long long string])
|
88
|
+
when "env" then parts.contact(%i[string string])
|
89
|
+
else
|
90
|
+
request = Packet.registered_channel_requests(@data[1])
|
91
|
+
raise "don't know what to do about #{@data[1]} channel request" unless request
|
48
92
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
#
|
54
|
-
# Not all packet types are defined here. As new packet types are required
|
55
|
-
# (e.g., a unit test needs to test that the remote host sent a packet that
|
56
|
-
# is not implemented here), the description of that packet should be
|
57
|
-
# added. Unsupported packet types will otherwise raise an exception.
|
58
|
-
def types
|
59
|
-
@types ||= case @type
|
60
|
-
when KEXINIT then
|
61
|
-
[:long, :long, :long, :long,
|
62
|
-
:string, :string, :string, :string, :string, :string, :string, :string, :string, :string,
|
63
|
-
:bool]
|
64
|
-
when NEWKEYS then []
|
65
|
-
when CHANNEL_OPEN then [:string, :long, :long, :long]
|
66
|
-
when CHANNEL_OPEN_CONFIRMATION then [:long, :long, :long, :long]
|
67
|
-
when CHANNEL_DATA then [:long, :string]
|
68
|
-
when CHANNEL_EXTENDED_DATA then [:long, :long, :string]
|
69
|
-
when CHANNEL_EOF, CHANNEL_CLOSE, CHANNEL_SUCCESS, CHANNEL_FAILURE then [:long]
|
70
|
-
when CHANNEL_REQUEST
|
71
|
-
parts = [:long, :string, :bool]
|
72
|
-
case @data[1]
|
73
|
-
when "exec", "subsystem" then parts << :string
|
74
|
-
when "exit-status" then parts << :long
|
75
|
-
else raise "don't know what to do about #{@data[1]} channel request"
|
76
|
-
end
|
77
|
-
else raise "don't know how to parse packet type #{@type}"
|
93
|
+
parts.concat(request[:extra_parts])
|
94
|
+
end
|
95
|
+
else raise "don't know how to parse packet type #{@type}"
|
96
|
+
end
|
78
97
|
end
|
98
|
+
end
|
79
99
|
end
|
80
100
|
end
|
81
|
-
|
82
|
-
end; end; end
|
101
|
+
end
|
@@ -1,38 +1,40 @@
|
|
1
1
|
require 'net/ssh/buffer'
|
2
2
|
require 'net/ssh/test/packet'
|
3
3
|
|
4
|
-
module Net
|
4
|
+
module Net
|
5
|
+
module SSH
|
6
|
+
module Test
|
7
|
+
# This is a specialization of Net::SSH::Test::Packet for representing mock
|
8
|
+
# packets that are received by the local (client) host. These are created
|
9
|
+
# automatically by Net::SSH::Test::Script and Net::SSH::Test::Channel by any
|
10
|
+
# of the gets_* methods.
|
11
|
+
class RemotePacket < Packet
|
12
|
+
# Returns +true+; this is a remote packet.
|
13
|
+
def remote?
|
14
|
+
true
|
15
|
+
end
|
5
16
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
# The #process method should only be called on Net::SSH::Test::LocalPacket
|
17
|
-
# packets; if it is attempted on a remote packet, then it is an expectation
|
18
|
-
# mismatch (a remote packet was received when a local packet was expected
|
19
|
-
# to be sent). This will happen when either your test script
|
20
|
-
# (Net::SSH::Test::Script) or your program are wrong.
|
21
|
-
def process(packet)
|
22
|
-
raise "received packet type #{packet.read_byte} and was not expecting any packet"
|
23
|
-
end
|
17
|
+
# The #process method should only be called on Net::SSH::Test::LocalPacket
|
18
|
+
# packets; if it is attempted on a remote packet, then it is an expectation
|
19
|
+
# mismatch (a remote packet was received when a local packet was expected
|
20
|
+
# to be sent). This will happen when either your test script
|
21
|
+
# (Net::SSH::Test::Script) or your program are wrong.
|
22
|
+
def process(packet)
|
23
|
+
raise "received packet type #{packet.read_byte} and was not expecting any packet"
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
26
|
+
# Returns this remote packet as a string, suitable for parsing by
|
27
|
+
# Net::SSH::Transport::PacketStream and friends. When a remote packet is
|
28
|
+
# received, this method is called and the result concatenated onto the
|
29
|
+
# input buffer for the packet stream.
|
30
|
+
def to_s
|
31
|
+
@to_s ||= begin
|
32
|
+
instantiate!
|
33
|
+
string = Net::SSH::Buffer.from(:byte, @type, *types.zip(@data).flatten).to_s
|
34
|
+
[string.length, string].pack("NA*")
|
35
|
+
end
|
36
|
+
end
|
34
37
|
end
|
35
38
|
end
|
36
39
|
end
|
37
|
-
|
38
|
-
end; end; end
|
40
|
+
end
|