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.
Files changed (199) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.dockerignore +6 -0
  4. data/.github/FUNDING.yml +1 -0
  5. data/.github/config/rubocop_linter_action.yml +4 -0
  6. data/.github/workflows/ci-with-docker.yml +44 -0
  7. data/.github/workflows/ci.yml +94 -0
  8. data/.github/workflows/rubocop.yml +16 -0
  9. data/.gitignore +15 -0
  10. data/.rubocop.yml +22 -0
  11. data/.rubocop_todo.yml +1081 -0
  12. data/CHANGES.txt +387 -0
  13. data/DEVELOPMENT.md +23 -0
  14. data/Dockerfile +29 -0
  15. data/Dockerfile.openssl3 +17 -0
  16. data/Gemfile +13 -0
  17. data/Gemfile.noed25519 +12 -0
  18. data/Gemfile.norbnacl +12 -0
  19. data/ISSUE_TEMPLATE.md +30 -0
  20. data/Manifest +4 -5
  21. data/README.md +303 -0
  22. data/Rakefile +174 -40
  23. data/SECURITY.md +4 -0
  24. data/THANKS.txt +25 -0
  25. data/appveyor.yml +58 -0
  26. data/docker-compose.yml +25 -0
  27. data/lib/net/ssh/authentication/agent.rb +279 -18
  28. data/lib/net/ssh/authentication/certificate.rb +183 -0
  29. data/lib/net/ssh/authentication/constants.rb +17 -15
  30. data/lib/net/ssh/authentication/ed25519.rb +184 -0
  31. data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
  32. data/lib/net/ssh/authentication/key_manager.rb +125 -54
  33. data/lib/net/ssh/authentication/methods/abstract.rb +67 -48
  34. data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
  35. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +19 -12
  36. data/lib/net/ssh/authentication/methods/none.rb +16 -19
  37. data/lib/net/ssh/authentication/methods/password.rb +56 -19
  38. data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
  39. data/lib/net/ssh/authentication/pageant.rb +483 -246
  40. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  41. data/lib/net/ssh/authentication/session.rb +138 -120
  42. data/lib/net/ssh/buffer.rb +399 -300
  43. data/lib/net/ssh/buffered_io.rb +154 -150
  44. data/lib/net/ssh/config.rb +361 -166
  45. data/lib/net/ssh/connection/channel.rb +640 -596
  46. data/lib/net/ssh/connection/constants.rb +29 -29
  47. data/lib/net/ssh/connection/event_loop.rb +123 -0
  48. data/lib/net/ssh/connection/keepalive.rb +59 -0
  49. data/lib/net/ssh/connection/session.rb +628 -548
  50. data/lib/net/ssh/connection/term.rb +125 -123
  51. data/lib/net/ssh/errors.rb +101 -95
  52. data/lib/net/ssh/key_factory.rb +198 -100
  53. data/lib/net/ssh/known_hosts.rb +221 -98
  54. data/lib/net/ssh/loggable.rb +50 -49
  55. data/lib/net/ssh/packet.rb +83 -79
  56. data/lib/net/ssh/prompt.rb +50 -81
  57. data/lib/net/ssh/proxy/command.rb +108 -60
  58. data/lib/net/ssh/proxy/errors.rb +12 -10
  59. data/lib/net/ssh/proxy/http.rb +82 -78
  60. data/lib/net/ssh/proxy/https.rb +50 -0
  61. data/lib/net/ssh/proxy/jump.rb +54 -0
  62. data/lib/net/ssh/proxy/socks4.rb +5 -8
  63. data/lib/net/ssh/proxy/socks5.rb +18 -20
  64. data/lib/net/ssh/service/forward.rb +383 -255
  65. data/lib/net/ssh/test/channel.rb +145 -136
  66. data/lib/net/ssh/test/extensions.rb +131 -110
  67. data/lib/net/ssh/test/kex.rb +34 -32
  68. data/lib/net/ssh/test/local_packet.rb +46 -44
  69. data/lib/net/ssh/test/packet.rb +89 -70
  70. data/lib/net/ssh/test/remote_packet.rb +32 -30
  71. data/lib/net/ssh/test/script.rb +156 -142
  72. data/lib/net/ssh/test/socket.rb +49 -48
  73. data/lib/net/ssh/test.rb +82 -77
  74. data/lib/net/ssh/transport/aes128_gcm.rb +40 -0
  75. data/lib/net/ssh/transport/aes256_gcm.rb +40 -0
  76. data/lib/net/ssh/transport/algorithms.rb +472 -348
  77. data/lib/net/ssh/transport/chacha20_poly1305_cipher.rb +117 -0
  78. data/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb +17 -0
  79. data/lib/net/ssh/transport/cipher_factory.rb +124 -100
  80. data/lib/net/ssh/transport/constants.rb +32 -24
  81. data/lib/net/ssh/transport/ctr.rb +42 -22
  82. data/lib/net/ssh/transport/gcm_cipher.rb +207 -0
  83. data/lib/net/ssh/transport/hmac/abstract.rb +97 -63
  84. data/lib/net/ssh/transport/hmac/md5.rb +0 -2
  85. data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
  86. data/lib/net/ssh/transport/hmac/none.rb +0 -2
  87. data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
  88. data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
  89. data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
  90. data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
  91. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
  92. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  93. data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
  94. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
  95. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  96. data/lib/net/ssh/transport/hmac.rb +14 -12
  97. data/lib/net/ssh/transport/identity_cipher.rb +54 -44
  98. data/lib/net/ssh/transport/kex/abstract.rb +130 -0
  99. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  100. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  101. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  102. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
  103. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  104. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +119 -213
  105. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -61
  106. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
  107. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
  108. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
  109. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
  110. data/lib/net/ssh/transport/kex.rb +15 -12
  111. data/lib/net/ssh/transport/key_expander.rb +24 -20
  112. data/lib/net/ssh/transport/openssl.rb +161 -124
  113. data/lib/net/ssh/transport/openssl_cipher_extensions.rb +8 -0
  114. data/lib/net/ssh/transport/packet_stream.rb +246 -183
  115. data/lib/net/ssh/transport/server_version.rb +57 -51
  116. data/lib/net/ssh/transport/session.rb +307 -235
  117. data/lib/net/ssh/transport/state.rb +178 -176
  118. data/lib/net/ssh/verifiers/accept_new.rb +33 -0
  119. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  120. data/lib/net/ssh/verifiers/always.rb +58 -0
  121. data/lib/net/ssh/verifiers/never.rb +19 -0
  122. data/lib/net/ssh/version.rb +57 -51
  123. data/lib/net/ssh.rb +140 -40
  124. data/net-ssh-public_cert.pem +21 -0
  125. data/net-ssh.gemspec +39 -184
  126. data/support/ssh_tunnel_bug.rb +5 -5
  127. data.tar.gz.sig +0 -0
  128. metadata +205 -99
  129. metadata.gz.sig +0 -0
  130. data/README.rdoc +0 -219
  131. data/Rudyfile +0 -96
  132. data/gem-public_cert.pem +0 -20
  133. data/lib/net/ssh/authentication/agent/java_pageant.rb +0 -85
  134. data/lib/net/ssh/authentication/agent/socket.rb +0 -170
  135. data/lib/net/ssh/ruby_compat.rb +0 -51
  136. data/lib/net/ssh/verifiers/lenient.rb +0 -30
  137. data/lib/net/ssh/verifiers/null.rb +0 -12
  138. data/lib/net/ssh/verifiers/secure.rb +0 -54
  139. data/lib/net/ssh/verifiers/strict.rb +0 -24
  140. data/setup.rb +0 -1585
  141. data/support/arcfour_check.rb +0 -20
  142. data/test/README.txt +0 -47
  143. data/test/authentication/methods/common.rb +0 -28
  144. data/test/authentication/methods/test_abstract.rb +0 -51
  145. data/test/authentication/methods/test_hostbased.rb +0 -114
  146. data/test/authentication/methods/test_keyboard_interactive.rb +0 -100
  147. data/test/authentication/methods/test_none.rb +0 -41
  148. data/test/authentication/methods/test_password.rb +0 -52
  149. data/test/authentication/methods/test_publickey.rb +0 -148
  150. data/test/authentication/test_agent.rb +0 -205
  151. data/test/authentication/test_key_manager.rb +0 -218
  152. data/test/authentication/test_session.rb +0 -108
  153. data/test/common.rb +0 -108
  154. data/test/configs/eqsign +0 -3
  155. data/test/configs/exact_match +0 -8
  156. data/test/configs/host_plus +0 -10
  157. data/test/configs/multihost +0 -4
  158. data/test/configs/nohost +0 -19
  159. data/test/configs/numeric_host +0 -4
  160. data/test/configs/send_env +0 -2
  161. data/test/configs/substitutes +0 -8
  162. data/test/configs/wild_cards +0 -14
  163. data/test/connection/test_channel.rb +0 -467
  164. data/test/connection/test_session.rb +0 -526
  165. data/test/known_hosts/github +0 -1
  166. data/test/manual/test_forward.rb +0 -223
  167. data/test/start/test_options.rb +0 -36
  168. data/test/start/test_transport.rb +0 -28
  169. data/test/test_all.rb +0 -11
  170. data/test/test_buffer.rb +0 -433
  171. data/test/test_buffered_io.rb +0 -63
  172. data/test/test_config.rb +0 -151
  173. data/test/test_key_factory.rb +0 -173
  174. data/test/test_known_hosts.rb +0 -13
  175. data/test/transport/hmac/test_md5.rb +0 -41
  176. data/test/transport/hmac/test_md5_96.rb +0 -27
  177. data/test/transport/hmac/test_none.rb +0 -34
  178. data/test/transport/hmac/test_ripemd160.rb +0 -36
  179. data/test/transport/hmac/test_sha1.rb +0 -36
  180. data/test/transport/hmac/test_sha1_96.rb +0 -27
  181. data/test/transport/hmac/test_sha2_256.rb +0 -37
  182. data/test/transport/hmac/test_sha2_256_96.rb +0 -27
  183. data/test/transport/hmac/test_sha2_512.rb +0 -37
  184. data/test/transport/hmac/test_sha2_512_96.rb +0 -27
  185. data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
  186. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -146
  187. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -92
  188. data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -34
  189. data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
  190. data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
  191. data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
  192. data/test/transport/test_algorithms.rb +0 -330
  193. data/test/transport/test_cipher_factory.rb +0 -443
  194. data/test/transport/test_hmac.rb +0 -34
  195. data/test/transport/test_identity_cipher.rb +0 -40
  196. data/test/transport/test_packet_stream.rb +0 -1755
  197. data/test/transport/test_server_version.rb +0 -78
  198. data/test/transport/test_session.rb +0 -319
  199. 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; 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,82 +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
- # Ceate a new packet of the given +type+, and with +args+ being a list of
21
- # data elements in the order expected for packets of the given +type+
22
- # (see #types).
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
- # The default for +remote?+ is false. Subclasses should override as necessary.
29
- def remote?
30
- false
31
- 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
32
39
 
33
- # The default for +local?+ is false. Subclasses should override as necessary.
34
- def local?
35
- false
36
- end
40
+ # The default for +remote?+ is false. Subclasses should override as necessary.
41
+ def remote?
42
+ false
43
+ end
37
44
 
38
- # Instantiates the packets data elements. When the packet was first defined,
39
- # some elements may not have been fully realized, and were described as
40
- # Proc objects rather than atomic types. This invokes those Proc objects
41
- # and replaces them with their returned values. This allows for values
42
- # like Net::SSH::Test::Channel#remote_id to be used in scripts before
43
- # the remote_id is known (since it is only known after a channel has been
44
- # confirmed open).
45
- def instantiate!
46
- @data.map! { |i| i.respond_to?(:call) ? i.call : i }
47
- end
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
- # Returns an array of symbols describing the data elements for packets of
50
- # the same type as this packet. These types are used to either validate
51
- # sent packets (Net::SSH::Test::LocalPacket) or build received packets
52
- # (Net::SSH::Test::RemotePacket).
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; 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