net-ssh 4.2.0 → 7.0.1

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 (126) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.dockerignore +6 -0
  4. data/.github/config/rubocop_linter_action.yml +4 -0
  5. data/.github/workflows/ci-with-docker.yml +44 -0
  6. data/.github/workflows/ci.yml +87 -0
  7. data/.github/workflows/rubocop.yml +13 -0
  8. data/.gitignore +7 -0
  9. data/.rubocop.yml +19 -2
  10. data/.rubocop_todo.yml +619 -667
  11. data/CHANGES.txt +110 -1
  12. data/Dockerfile +27 -0
  13. data/Dockerfile.openssl3 +17 -0
  14. data/Gemfile +3 -7
  15. data/{Gemfile.norbnacl → Gemfile.noed25519} +3 -1
  16. data/Manifest +4 -5
  17. data/README.md +293 -0
  18. data/Rakefile +45 -29
  19. data/appveyor.yml +8 -6
  20. data/docker-compose.yml +23 -0
  21. data/lib/net/ssh/authentication/agent.rb +248 -223
  22. data/lib/net/ssh/authentication/certificate.rb +178 -164
  23. data/lib/net/ssh/authentication/constants.rb +17 -15
  24. data/lib/net/ssh/authentication/ed25519.rb +141 -116
  25. data/lib/net/ssh/authentication/ed25519_loader.rb +28 -28
  26. data/lib/net/ssh/authentication/key_manager.rb +79 -36
  27. data/lib/net/ssh/authentication/methods/abstract.rb +62 -47
  28. data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
  29. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +3 -3
  30. data/lib/net/ssh/authentication/methods/none.rb +16 -19
  31. data/lib/net/ssh/authentication/methods/password.rb +15 -16
  32. data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
  33. data/lib/net/ssh/authentication/pageant.rb +468 -465
  34. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  35. data/lib/net/ssh/authentication/session.rb +131 -122
  36. data/lib/net/ssh/buffer.rb +385 -332
  37. data/lib/net/ssh/buffered_io.rb +150 -151
  38. data/lib/net/ssh/config.rb +316 -239
  39. data/lib/net/ssh/connection/channel.rb +635 -613
  40. data/lib/net/ssh/connection/constants.rb +29 -29
  41. data/lib/net/ssh/connection/event_loop.rb +104 -95
  42. data/lib/net/ssh/connection/keepalive.rb +55 -51
  43. data/lib/net/ssh/connection/session.rb +614 -611
  44. data/lib/net/ssh/connection/term.rb +125 -123
  45. data/lib/net/ssh/errors.rb +101 -99
  46. data/lib/net/ssh/key_factory.rb +194 -108
  47. data/lib/net/ssh/known_hosts.rb +212 -134
  48. data/lib/net/ssh/loggable.rb +50 -49
  49. data/lib/net/ssh/packet.rb +83 -79
  50. data/lib/net/ssh/prompt.rb +51 -51
  51. data/lib/net/ssh/proxy/command.rb +105 -91
  52. data/lib/net/ssh/proxy/errors.rb +12 -10
  53. data/lib/net/ssh/proxy/http.rb +81 -81
  54. data/lib/net/ssh/proxy/https.rb +37 -36
  55. data/lib/net/ssh/proxy/jump.rb +49 -48
  56. data/lib/net/ssh/proxy/socks4.rb +2 -6
  57. data/lib/net/ssh/proxy/socks5.rb +14 -17
  58. data/lib/net/ssh/service/forward.rb +365 -362
  59. data/lib/net/ssh/test/channel.rb +145 -143
  60. data/lib/net/ssh/test/extensions.rb +131 -127
  61. data/lib/net/ssh/test/kex.rb +34 -32
  62. data/lib/net/ssh/test/local_packet.rb +46 -44
  63. data/lib/net/ssh/test/packet.rb +87 -84
  64. data/lib/net/ssh/test/remote_packet.rb +32 -30
  65. data/lib/net/ssh/test/script.rb +155 -155
  66. data/lib/net/ssh/test/socket.rb +49 -48
  67. data/lib/net/ssh/test.rb +82 -80
  68. data/lib/net/ssh/transport/algorithms.rb +433 -364
  69. data/lib/net/ssh/transport/cipher_factory.rb +95 -91
  70. data/lib/net/ssh/transport/constants.rb +32 -24
  71. data/lib/net/ssh/transport/ctr.rb +37 -15
  72. data/lib/net/ssh/transport/hmac/abstract.rb +81 -63
  73. data/lib/net/ssh/transport/hmac/md5.rb +0 -2
  74. data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
  75. data/lib/net/ssh/transport/hmac/none.rb +0 -2
  76. data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
  77. data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
  78. data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
  79. data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
  80. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
  81. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  82. data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
  83. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
  84. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  85. data/lib/net/ssh/transport/hmac.rb +14 -12
  86. data/lib/net/ssh/transport/identity_cipher.rb +54 -52
  87. data/lib/net/ssh/transport/kex/abstract.rb +130 -0
  88. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  89. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  90. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  91. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
  92. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  93. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +112 -217
  94. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -63
  95. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
  96. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
  97. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
  98. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
  99. data/lib/net/ssh/transport/kex.rb +15 -12
  100. data/lib/net/ssh/transport/key_expander.rb +24 -21
  101. data/lib/net/ssh/transport/openssl.rb +158 -133
  102. data/lib/net/ssh/transport/packet_stream.rb +223 -191
  103. data/lib/net/ssh/transport/server_version.rb +55 -56
  104. data/lib/net/ssh/transport/session.rb +306 -259
  105. data/lib/net/ssh/transport/state.rb +178 -176
  106. data/lib/net/ssh/verifiers/accept_new.rb +33 -0
  107. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  108. data/lib/net/ssh/verifiers/always.rb +58 -0
  109. data/lib/net/ssh/verifiers/never.rb +19 -0
  110. data/lib/net/ssh/version.rb +55 -53
  111. data/lib/net/ssh.rb +47 -34
  112. data/net-ssh-public_cert.pem +18 -19
  113. data/net-ssh.gemspec +12 -11
  114. data/support/ssh_tunnel_bug.rb +5 -5
  115. data.tar.gz.sig +0 -0
  116. metadata +78 -73
  117. metadata.gz.sig +0 -0
  118. data/.travis.yml +0 -51
  119. data/Gemfile.norbnacl.lock +0 -41
  120. data/README.rdoc +0 -169
  121. data/lib/net/ssh/ruby_compat.rb +0 -24
  122. data/lib/net/ssh/verifiers/lenient.rb +0 -30
  123. data/lib/net/ssh/verifiers/null.rb +0 -12
  124. data/lib/net/ssh/verifiers/secure.rb +0 -52
  125. data/lib/net/ssh/verifiers/strict.rb +0 -24
  126. data/support/arcfour_check.rb +0 -20
@@ -5,40 +5,42 @@ require 'net/ssh/transport/algorithms'
5
5
  require 'net/ssh/transport/constants'
6
6
  require 'net/ssh/transport/kex'
7
7
 
8
- module Net; module SSH; module Test
9
-
10
- # An implementation of a key-exchange strategy specifically for unit tests.
11
- # (This strategy would never really work against a real SSH server--it makes
12
- # too many assumptions about the server's response.)
13
- #
14
- # This registers itself with the transport key-exchange system as the
15
- # "test" algorithm.
16
- class Kex
17
- include Net::SSH::Transport::Constants
18
-
19
- # Creates a new instance of the testing key-exchange algorithm with the
20
- # given arguments.
21
- def initialize(algorithms, connection, data)
22
- @connection = connection
23
- end
24
-
25
- # Exchange keys with the server. This returns a hash of constant values,
26
- # and does not actually exchange keys.
27
- def exchange_keys
28
- result = Net::SSH::Buffer.from(:byte, NEWKEYS)
29
- @connection.send_message(result)
30
-
31
- buffer = @connection.next_message
32
- raise Net::SSH::Exception, "expected NEWKEYS" unless buffer.type == NEWKEYS
33
-
34
- { session_id: "abc-xyz",
35
- server_key: OpenSSL::PKey::RSA.new(512),
36
- shared_secret: OpenSSL::BN.new("1234567890", 10),
37
- hashing_algorithm: OpenSSL::Digest::SHA1 }
8
+ module Net
9
+ module SSH
10
+ module Test
11
+ # An implementation of a key-exchange strategy specifically for unit tests.
12
+ # (This strategy would never really work against a real SSH server--it makes
13
+ # too many assumptions about the server's response.)
14
+ #
15
+ # This registers itself with the transport key-exchange system as the
16
+ # "test" algorithm.
17
+ class Kex
18
+ include Net::SSH::Transport::Constants
19
+
20
+ # Creates a new instance of the testing key-exchange algorithm with the
21
+ # given arguments.
22
+ def initialize(algorithms, connection, data)
23
+ @connection = connection
24
+ end
25
+
26
+ # Exchange keys with the server. This returns a hash of constant values,
27
+ # and does not actually exchange keys.
28
+ def exchange_keys
29
+ result = Net::SSH::Buffer.from(:byte, NEWKEYS)
30
+ @connection.send_message(result)
31
+
32
+ buffer = @connection.next_message
33
+ raise Net::SSH::Exception, "expected NEWKEYS" unless buffer.type == NEWKEYS
34
+
35
+ { session_id: "abc-xyz",
36
+ server_key: OpenSSL::PKey::RSA.new(512),
37
+ shared_secret: OpenSSL::BN.new("1234567890", 10),
38
+ hashing_algorithm: OpenSSL::Digest::SHA1 }
39
+ end
40
+ end
38
41
  end
39
42
  end
40
-
41
- end; end; end
43
+ end
42
44
 
43
45
  Net::SSH::Transport::Algorithms::ALGORITHMS[:kex] << "test"
44
46
  Net::SSH::Transport::Kex::MAP["test"] = Net::SSH::Test::Kex
@@ -1,51 +1,53 @@
1
1
  require 'net/ssh/packet'
2
2
  require 'net/ssh/test/packet'
3
3
 
4
- module Net; module SSH; module Test
5
-
6
- # This is a specialization of Net::SSH::Test::Packet for representing mock
7
- # packets that are sent from the local (client) host. These are created
8
- # automatically by Net::SSH::Test::Script and Net::SSH::Test::Channel by any
9
- # of the sends_* methods.
10
- class LocalPacket < Packet
11
- attr_reader :init
12
-
13
- # Extend the default Net::SSH::Test::Packet constructor to also accept an
14
- # optional block, which is used to finalize the initialization of the
15
- # packet when #process is first called.
16
- def initialize(type, *args, &block)
17
- super(type, *args)
18
- @init = block
19
- end
20
-
21
- # Returns +true+; this is a local packet.
22
- def local?
23
- true
24
- end
25
-
26
- # Called by Net::SSH::Test::Extensions::PacketStream#test_enqueue_packet
27
- # to mimic remote processing of a locally-sent packet. It compares the
28
- # packet it was given with the contents of this LocalPacket's data, to see
29
- # if what was sent matches what was scripted. If it differs in any way,
30
- # an exception is raised.
31
- def process(packet)
32
- @init.call(Net::SSH::Packet.new(packet.to_s)) if @init
33
- type = packet.read_byte
34
- raise "expected #{@type}, but got #{type}" if @type != type
35
-
36
- @data.zip(types).each do |expected, _type|
37
- _type ||= case expected
38
- when nil then break
39
- when Numeric then :long
40
- when String then :string
41
- when TrueClass, FalseClass then :bool
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
@@ -1,98 +1,101 @@
1
1
  require 'net/ssh/connection/constants'
2
2
  require 'net/ssh/transport/constants'
3
3
 
4
- module Net; module SSH; module Test
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
- # This is an abstract class, not to be instantiated directly, subclassed by
7
- # Net::SSH::Test::LocalPacket and Net::SSH::Test::RemotePacket. It implements
8
- # functionality common to those subclasses.
9
- #
10
- # These packets are not true packets, in that they don't represent what was
11
- # actually sent between the hosst; rather, they represent what was expected
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
- # Register a custom channel request. extra_parts is an array of types
21
- # of extra parameters
22
- def self.register_channel_request(request, extra_parts)
23
- @registered_requests ||= {}
24
- @registered_requests[request] = {extra_parts: extra_parts}
25
- end
28
+ def self.registered_channel_requests(request)
29
+ @registered_requests && @registered_requests[request]
30
+ end
26
31
 
27
- def self.registered_channel_requests(request)
28
- @registered_requests && @registered_requests[request]
29
- end
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
30
39
 
31
- # Ceate a new packet of the given +type+, and with +args+ being a list of
32
- # data elements in the order expected for packets of the given +type+
33
- # (see #types).
34
- def initialize(type, *args)
35
- @type = self.class.const_get(type.to_s.upcase)
36
- @data = args
37
- end
40
+ # The default for +remote?+ is false. Subclasses should override as necessary.
41
+ def remote?
42
+ false
43
+ end
38
44
 
39
- # The default for +remote?+ is false. Subclasses should override as necessary.
40
- def remote?
41
- false
42
- end
45
+ # The default for +local?+ is false. Subclasses should override as necessary.
46
+ def local?
47
+ false
48
+ end
43
49
 
44
- # The default for +local?+ is false. Subclasses should override as necessary.
45
- def local?
46
- false
47
- end
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
48
60
 
49
- # Instantiates the packets data elements. When the packet was first defined,
50
- # some elements may not have been fully realized, and were described as
51
- # Proc objects rather than atomic types. This invokes those Proc objects
52
- # and replaces them with their returned values. This allows for values
53
- # like Net::SSH::Test::Channel#remote_id to be used in scripts before
54
- # the remote_id is known (since it is only known after a channel has been
55
- # confirmed open).
56
- def instantiate!
57
- @data.map! { |i| i.respond_to?(:call) ? i.call : i }
58
- end
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
59
92
 
60
- # Returns an array of symbols describing the data elements for packets of
61
- # the same type as this packet. These types are used to either validate
62
- # sent packets (Net::SSH::Test::LocalPacket) or build received packets
63
- # (Net::SSH::Test::RemotePacket).
64
- #
65
- # Not all packet types are defined here. As new packet types are required
66
- # (e.g., a unit test needs to test that the remote host sent a packet that
67
- # is not implemented here), the description of that packet should be
68
- # added. Unsupported packet types will otherwise raise an exception.
69
- def types
70
- @types ||= case @type
71
- when KEXINIT then
72
- [:long, :long, :long, :long,
73
- :string, :string, :string, :string, :string, :string, :string, :string, :string, :string,
74
- :bool]
75
- when NEWKEYS then []
76
- when CHANNEL_OPEN then [:string, :long, :long, :long]
77
- when CHANNEL_OPEN_CONFIRMATION then [:long, :long, :long, :long]
78
- when CHANNEL_DATA then [:long, :string]
79
- when CHANNEL_EXTENDED_DATA then [:long, :long, :string]
80
- when CHANNEL_EOF, CHANNEL_CLOSE, CHANNEL_SUCCESS, CHANNEL_FAILURE then [:long]
81
- when CHANNEL_REQUEST
82
- parts = [:long, :string, :bool]
83
- case @data[1]
84
- when "exec", "subsystem","shell" then parts << :string
85
- when "exit-status" then parts << :long
86
- when "pty-req" then parts.concat([:string, :long, :long, :long, :long, :string])
87
- when "env" then parts.contact([:string,:string])
88
- else
89
- request = Packet.registered_channel_requests(@data[1])
90
- raise "don't know what to do about #{@data[1]} channel request" unless request
91
- parts.concat(request[:extra_parts])
92
- end
93
- 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
94
97
  end
98
+ end
95
99
  end
96
100
  end
97
-
98
- 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; module SSH; module Test
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
- # This is a specialization of Net::SSH::Test::Packet for representing mock
7
- # packets that are received by the local (client) host. These are created
8
- # automatically by Net::SSH::Test::Script and Net::SSH::Test::Channel by any
9
- # of the gets_* methods.
10
- class RemotePacket < Packet
11
- # Returns +true+; this is a remote packet.
12
- def remote?
13
- true
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
- # Returns this remote packet as a string, suitable for parsing by
26
- # Net::SSH::Transport::PacketStream and friends. When a remote packet is
27
- # received, this method is called and the result concatenated onto the
28
- # input buffer for the packet stream.
29
- def to_s
30
- @to_s ||= begin
31
- instantiate!
32
- string = Net::SSH::Buffer.from(:byte, @type, *types.zip(@data).flatten).to_s
33
- [string.length, string].pack("NA*")
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