net-ssh 5.0.2 → 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 (122) hide show
  1. checksums.yaml +4 -4
  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 +3 -0
  9. data/.rubocop.yml +19 -2
  10. data/.rubocop_todo.yml +623 -511
  11. data/CHANGES.txt +76 -0
  12. data/Dockerfile +27 -0
  13. data/Dockerfile.openssl3 +17 -0
  14. data/Gemfile +2 -0
  15. data/Gemfile.noed25519 +2 -0
  16. data/Manifest +0 -1
  17. data/README.md +293 -0
  18. data/Rakefile +6 -2
  19. data/appveyor.yml +4 -2
  20. data/docker-compose.yml +23 -0
  21. data/lib/net/ssh/authentication/agent.rb +36 -14
  22. data/lib/net/ssh/authentication/certificate.rb +19 -7
  23. data/lib/net/ssh/authentication/constants.rb +0 -1
  24. data/lib/net/ssh/authentication/ed25519.rb +83 -50
  25. data/lib/net/ssh/authentication/ed25519_loader.rb +5 -8
  26. data/lib/net/ssh/authentication/key_manager.rb +74 -33
  27. data/lib/net/ssh/authentication/methods/abstract.rb +12 -3
  28. data/lib/net/ssh/authentication/methods/hostbased.rb +3 -5
  29. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +5 -3
  30. data/lib/net/ssh/authentication/methods/none.rb +6 -9
  31. data/lib/net/ssh/authentication/methods/password.rb +2 -3
  32. data/lib/net/ssh/authentication/methods/publickey.rb +58 -16
  33. data/lib/net/ssh/authentication/pageant.rb +97 -97
  34. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +2 -3
  35. data/lib/net/ssh/authentication/session.rb +27 -23
  36. data/lib/net/ssh/buffer.rb +91 -40
  37. data/lib/net/ssh/buffered_io.rb +24 -26
  38. data/lib/net/ssh/config.rb +99 -53
  39. data/lib/net/ssh/connection/channel.rb +101 -87
  40. data/lib/net/ssh/connection/constants.rb +0 -4
  41. data/lib/net/ssh/connection/event_loop.rb +30 -25
  42. data/lib/net/ssh/connection/keepalive.rb +12 -12
  43. data/lib/net/ssh/connection/session.rb +115 -111
  44. data/lib/net/ssh/connection/term.rb +56 -58
  45. data/lib/net/ssh/errors.rb +12 -12
  46. data/lib/net/ssh/key_factory.rb +108 -22
  47. data/lib/net/ssh/known_hosts.rb +120 -36
  48. data/lib/net/ssh/loggable.rb +10 -11
  49. data/lib/net/ssh/packet.rb +1 -1
  50. data/lib/net/ssh/prompt.rb +9 -11
  51. data/lib/net/ssh/proxy/command.rb +1 -2
  52. data/lib/net/ssh/proxy/errors.rb +2 -4
  53. data/lib/net/ssh/proxy/http.rb +18 -20
  54. data/lib/net/ssh/proxy/https.rb +8 -10
  55. data/lib/net/ssh/proxy/jump.rb +8 -10
  56. data/lib/net/ssh/proxy/socks4.rb +2 -4
  57. data/lib/net/ssh/proxy/socks5.rb +3 -6
  58. data/lib/net/ssh/service/forward.rb +9 -8
  59. data/lib/net/ssh/test/channel.rb +24 -26
  60. data/lib/net/ssh/test/extensions.rb +37 -35
  61. data/lib/net/ssh/test/kex.rb +6 -8
  62. data/lib/net/ssh/test/local_packet.rb +0 -2
  63. data/lib/net/ssh/test/packet.rb +3 -3
  64. data/lib/net/ssh/test/remote_packet.rb +6 -8
  65. data/lib/net/ssh/test/script.rb +25 -27
  66. data/lib/net/ssh/test/socket.rb +12 -15
  67. data/lib/net/ssh/test.rb +12 -12
  68. data/lib/net/ssh/transport/algorithms.rb +177 -118
  69. data/lib/net/ssh/transport/cipher_factory.rb +34 -50
  70. data/lib/net/ssh/transport/constants.rb +13 -9
  71. data/lib/net/ssh/transport/ctr.rb +8 -14
  72. data/lib/net/ssh/transport/hmac/abstract.rb +20 -5
  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 +13 -11
  86. data/lib/net/ssh/transport/identity_cipher.rb +11 -13
  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 +5 -19
  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 +30 -139
  94. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +1 -8
  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 +20 -81
  97. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +5 -4
  98. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +5 -4
  99. data/lib/net/ssh/transport/kex.rb +15 -10
  100. data/lib/net/ssh/transport/key_expander.rb +7 -8
  101. data/lib/net/ssh/transport/openssl.rb +149 -111
  102. data/lib/net/ssh/transport/packet_stream.rb +53 -22
  103. data/lib/net/ssh/transport/server_version.rb +17 -16
  104. data/lib/net/ssh/transport/session.rb +35 -11
  105. data/lib/net/ssh/transport/state.rb +44 -44
  106. data/lib/net/ssh/verifiers/accept_new.rb +7 -2
  107. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +1 -2
  108. data/lib/net/ssh/verifiers/always.rb +10 -4
  109. data/lib/net/ssh/verifiers/never.rb +4 -2
  110. data/lib/net/ssh/version.rb +2 -2
  111. data/lib/net/ssh.rb +17 -9
  112. data/net-ssh-public_cert.pem +18 -19
  113. data/net-ssh.gemspec +9 -7
  114. data/support/ssh_tunnel_bug.rb +3 -3
  115. data.tar.gz.sig +0 -0
  116. metadata +65 -41
  117. metadata.gz.sig +0 -0
  118. data/.travis.yml +0 -52
  119. data/Gemfile.noed25519.lock +0 -41
  120. data/README.rdoc +0 -169
  121. data/lib/net/ssh/ruby_compat.rb +0 -13
  122. data/support/arcfour_check.rb +0 -20
@@ -11,7 +11,6 @@ require 'net/ssh/authentication/methods/keyboard_interactive'
11
11
  module Net
12
12
  module SSH
13
13
  module Authentication
14
-
15
14
  # Raised if the current authentication method is not allowed
16
15
  class DisallowedMethod < Net::SSH::Exception
17
16
  end
@@ -42,7 +41,7 @@ module Net
42
41
 
43
42
  # Instantiates a new Authentication::Session object over the given
44
43
  # transport layer abstraction.
45
- def initialize(transport, options={})
44
+ def initialize(transport, options = {})
46
45
  self.logger = transport.logger
47
46
  @transport = transport
48
47
 
@@ -55,7 +54,7 @@ module Net
55
54
  # Attempts to authenticate the given user, in preparation for the next
56
55
  # service request. Returns true if an authentication method succeeds in
57
56
  # authenticating the user, and false otherwise.
58
- def authenticate(next_service, username, password=nil)
57
+ def authenticate(next_service, username, password = nil)
59
58
  debug { "beginning authentication of `#{username}'" }
60
59
 
61
60
  transport.send_message(transport.service_request("ssh-userauth"))
@@ -63,28 +62,30 @@ module Net
63
62
 
64
63
  key_manager = KeyManager.new(logger, options)
65
64
  keys.each { |key| key_manager.add(key) } unless keys.empty?
65
+ keycerts.each { |keycert| key_manager.add_keycert(keycert) } unless keycerts.empty?
66
66
  key_data.each { |key2| key_manager.add_key_data(key2) } unless key_data.empty?
67
67
  default_keys.each { |key| key_manager.add(key) } unless options.key?(:keys) || options.key?(:key_data)
68
68
 
69
69
  attempted = []
70
70
 
71
71
  @auth_methods.each do |name|
72
+ next unless @allowed_auth_methods.include?(name)
73
+
74
+ attempted << name
75
+
76
+ debug { "trying #{name}" }
72
77
  begin
73
- next unless @allowed_auth_methods.include?(name)
74
- attempted << name
75
-
76
- debug { "trying #{name}" }
77
- begin
78
- auth_class = Methods.const_get(name.split(/\W+/).map { |p| p.capitalize }.join)
79
- method = auth_class.new(self, key_manager: key_manager, password_prompt: options[:password_prompt])
80
- rescue NameError
81
- debug {"Mechanism #{name} was requested, but isn't a known type. Ignoring it."}
82
- next
83
- end
84
-
85
- return true if method.authenticate(next_service, username, password)
86
- rescue Net::SSH::Authentication::DisallowedMethod
78
+ auth_class = Methods.const_get(name.split(/\W+/).map { |p| p.capitalize }.join)
79
+ method = auth_class.new(self,
80
+ key_manager: key_manager, password_prompt: options[:password_prompt],
81
+ pubkey_algorithms: options[:pubkey_algorithms] || nil)
82
+ rescue NameError
83
+ debug {"Mechanism #{name} was requested, but isn't a known type. Ignoring it."}
84
+ next
87
85
  end
86
+
87
+ return true if method.authenticate(next_service, username, password)
88
+ rescue Net::SSH::Authentication::DisallowedMethod
88
89
  end
89
90
 
90
91
  error { "all authorization methods failed (tried #{attempted.join(', ')})" }
@@ -128,6 +129,7 @@ module Net
128
129
  def expect_message(type)
129
130
  message = next_message
130
131
  raise Net::SSH::Exception, "expected #{type}, got #{message.type} (#{message})" unless message.type == type
132
+
131
133
  message
132
134
  end
133
135
 
@@ -136,12 +138,8 @@ module Net
136
138
  # Returns an array of paths to the key files usually defined
137
139
  # by system default.
138
140
  def default_keys
139
- if defined?(OpenSSL::PKey::EC)
140
- %w[~/.ssh/id_ed25519 ~/.ssh/id_rsa ~/.ssh/id_dsa ~/.ssh/id_ecdsa
141
- ~/.ssh2/id_ed25519 ~/.ssh2/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_ecdsa]
142
- else
143
- %w[~/.ssh/id_dsa ~/.ssh/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_rsa]
144
- end
141
+ %w[~/.ssh/id_ed25519 ~/.ssh/id_rsa ~/.ssh/id_dsa ~/.ssh/id_ecdsa
142
+ ~/.ssh2/id_ed25519 ~/.ssh2/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_ecdsa]
145
143
  end
146
144
 
147
145
  # Returns an array of paths to the key files that should be used when
@@ -150,6 +148,12 @@ module Net
150
148
  Array(options[:keys])
151
149
  end
152
150
 
151
+ # Returns an array of paths to the keycert files that should be used when
152
+ # attempting any key-based authentication mechanism.
153
+ def keycerts
154
+ Array(options[:keycerts])
155
+ end
156
+
153
157
  # Returns an array of the key data that should be used when
154
158
  # attempting any key-based authentication mechanism.
155
159
  def key_data
@@ -1,4 +1,3 @@
1
- require 'net/ssh/ruby_compat'
2
1
  require 'net/ssh/transport/openssl'
3
2
 
4
3
  require 'net/ssh/authentication/certificate'
@@ -6,7 +5,6 @@ require 'net/ssh/authentication/ed25519_loader'
6
5
 
7
6
  module Net
8
7
  module SSH
9
-
10
8
  # Net::SSH::Buffer is a flexible class for building and parsing binary
11
9
  # data packets. It provides a stream-like interface for sequentially
12
10
  # reading data items from the buffer, as well as a useful helper method
@@ -72,7 +70,7 @@ module Net
72
70
 
73
71
  # Creates a new buffer, initialized to the given content. The position
74
72
  # is initialized to the beginning of the buffer.
75
- def initialize(content="")
73
+ def initialize(content = String.new)
76
74
  @content = content.to_s
77
75
  @position = 0
78
76
  end
@@ -119,7 +117,7 @@ module Net
119
117
  # Resets the buffer, making it empty. Also, resets the read position to
120
118
  # 0.
121
119
  def clear!
122
- @content = ""
120
+ @content = String.new
123
121
  @position = 0
124
122
  end
125
123
 
@@ -130,12 +128,12 @@ module Net
130
128
  # would otherwise tend to grow without bound.
131
129
  #
132
130
  # Returns the buffer object itself.
133
- def consume!(n=position)
131
+ def consume!(n = position)
134
132
  if n >= length
135
133
  # optimize for a fairly common case
136
134
  clear!
137
135
  elsif n > 0
138
- @content = @content[n..-1] || ""
136
+ @content = @content[n..-1] || String.new
139
137
  @position -= n
140
138
  @position = 0 if @position < 0
141
139
  end
@@ -173,7 +171,7 @@ module Net
173
171
  # Reads and returns the next +count+ bytes from the buffer, starting from
174
172
  # the read position. If +count+ is +nil+, this will return all remaining
175
173
  # text in the buffer. This method will increment the pointer.
176
- def read(count=nil)
174
+ def read(count = nil)
177
175
  count ||= length
178
176
  count = length - @position if @position + count > length
179
177
  @position += count
@@ -182,7 +180,7 @@ module Net
182
180
 
183
181
  # Reads (as #read) and returns the given number of bytes from the buffer,
184
182
  # and then consumes (as #consume!) all data up to the new read position.
185
- def read!(count=nil)
183
+ def read!(count = nil)
186
184
  data = read(count)
187
185
  consume!
188
186
  data
@@ -238,6 +236,7 @@ module Net
238
236
  def read_bignum
239
237
  data = read_string
240
238
  return unless data
239
+
241
240
  OpenSSL::BN.new(data, 2)
242
241
  end
243
242
 
@@ -249,6 +248,48 @@ module Net
249
248
  return (type ? read_keyblob(type) : nil)
250
249
  end
251
250
 
251
+ def read_private_keyblob(type)
252
+ case type
253
+ when /^ssh-rsa$/
254
+ key = OpenSSL::PKey::RSA.new
255
+ n = read_bignum
256
+ e = read_bignum
257
+ d = read_bignum
258
+ iqmp = read_bignum
259
+ p = read_bignum
260
+ q = read_bignum
261
+ _unkown1 = read_bignum
262
+ _unkown2 = read_bignum
263
+ dmp1 = d % (p - 1)
264
+ dmq1 = d % (q - 1)
265
+ if key.respond_to?(:set_key)
266
+ key.set_key(n, e, d)
267
+ else
268
+ key.e = e
269
+ key.n = n
270
+ key.d = d
271
+ end
272
+ if key.respond_to?(:set_factors)
273
+ key.set_factors(p, q)
274
+ else
275
+ key.p = p
276
+ key.q = q
277
+ end
278
+ if key.respond_to?(:set_crt_params)
279
+ key.set_crt_params(dmp1, dmq1, iqmp)
280
+ else
281
+ key.dmp1 = dmp1
282
+ key.dmq1 = dmq1
283
+ key.iqmp = iqmp
284
+ end
285
+ key
286
+ when /^ecdsa\-sha2\-(\w*)$/
287
+ OpenSSL::PKey::EC.read_keyblob($1, self)
288
+ else
289
+ raise Exception, "Cannot decode private key of type #{type}"
290
+ end
291
+ end
292
+
252
293
  # Read a keyblob of the given type from the buffer, and return it as
253
294
  # a key. Only RSA, DSA, and ECDSA keys are supported.
254
295
  def read_keyblob(type)
@@ -256,42 +297,47 @@ module Net
256
297
  when /^(.*)-cert-v01@openssh\.com$/
257
298
  key = Net::SSH::Authentication::Certificate.read_certblob(self, $1)
258
299
  when /^ssh-dss$/
259
- key = OpenSSL::PKey::DSA.new
260
- if key.respond_to?(:set_pqg)
261
- key.set_pqg(read_bignum, read_bignum, read_bignum)
262
- else
263
- key.p = read_bignum
264
- key.q = read_bignum
265
- key.g = read_bignum
266
- end
267
- if key.respond_to?(:set_key)
268
- key.set_key(read_bignum, nil)
269
- else
270
- key.pub_key = read_bignum
271
- end
300
+ p = read_bignum
301
+ q = read_bignum
302
+ g = read_bignum
303
+ pub_key = read_bignum
304
+
305
+ asn1 = OpenSSL::ASN1::Sequence.new(
306
+ [
307
+ OpenSSL::ASN1::Sequence.new(
308
+ [
309
+ OpenSSL::ASN1::ObjectId.new('DSA'),
310
+ OpenSSL::ASN1::Sequence.new(
311
+ [
312
+ OpenSSL::ASN1::Integer.new(p),
313
+ OpenSSL::ASN1::Integer.new(q),
314
+ OpenSSL::ASN1::Integer.new(g)
315
+ ]
316
+ )
317
+ ]
318
+ ),
319
+ OpenSSL::ASN1::BitString.new(OpenSSL::ASN1::Integer.new(pub_key).to_der)
320
+ ]
321
+ )
322
+
323
+ key = OpenSSL::PKey::DSA.new(asn1.to_der)
272
324
  when /^ssh-rsa$/
273
- key = OpenSSL::PKey::RSA.new
274
- if key.respond_to?(:set_key)
275
- e = read_bignum
276
- n = read_bignum
277
- key.set_key(n, e, nil)
278
- else
279
- key.e = read_bignum
280
- key.n = read_bignum
281
- end
325
+ e = read_bignum
326
+ n = read_bignum
327
+
328
+ asn1 = OpenSSL::ASN1::Sequence(
329
+ [
330
+ OpenSSL::ASN1::Integer(n),
331
+ OpenSSL::ASN1::Integer(e)
332
+ ]
333
+ )
334
+
335
+ key = OpenSSL::PKey::RSA.new(asn1.to_der)
282
336
  when /^ssh-ed25519$/
283
337
  Net::SSH::Authentication::ED25519Loader.raiseUnlessLoaded("unsupported key type `#{type}'")
284
338
  key = Net::SSH::Authentication::ED25519::PubKey.read_keyblob(self)
285
339
  when /^ecdsa\-sha2\-(\w*)$/
286
- unless defined?(OpenSSL::PKey::EC)
287
- raise NotImplementedError, "unsupported key type `#{type}'"
288
- else
289
- begin
290
- key = OpenSSL::PKey::EC.read_keyblob($1, self)
291
- rescue OpenSSL::PKey::ECError
292
- raise NotImplementedError, "unsupported key type `#{type}'"
293
- end
294
- end
340
+ key = OpenSSL::PKey::EC.read_keyblob($1, self)
295
341
  else
296
342
  raise NotImplementedError, "unsupported key type `#{type}'"
297
343
  end
@@ -315,7 +361,12 @@ module Net
315
361
  # Optimized version of write where the caller gives up ownership of string
316
362
  # to the method. This way we can mutate the string.
317
363
  def write_moved(string)
318
- @content << string.force_encoding('BINARY')
364
+ @content <<
365
+ if string.frozen?
366
+ string.dup.force_encoding('BINARY')
367
+ else
368
+ string.force_encoding('BINARY')
369
+ end
319
370
  self
320
371
  end
321
372
 
@@ -1,10 +1,8 @@
1
1
  require 'net/ssh/buffer'
2
2
  require 'net/ssh/loggable'
3
- require 'net/ssh/ruby_compat'
4
3
 
5
- module Net
4
+ module Net
6
5
  module SSH
7
-
8
6
  # This module is used to extend sockets and other IO objects, to allow
9
7
  # them to be buffered for both read and write. This abstraction makes it
10
8
  # quite easy to write a select-based event loop
@@ -49,19 +47,19 @@ module Net
49
47
  # end
50
48
  module BufferedIo
51
49
  include Loggable
52
-
50
+
53
51
  # Called when the #extend is called on an object, with this module as the
54
52
  # argument. It ensures that the modules instance variables are all properly
55
53
  # initialized.
56
- def self.extended(object) #:nodoc:
54
+ def self.extended(object) # :nodoc:
57
55
  # need to use __send__ because #send is overridden in Socket
58
56
  object.__send__(:initialize_buffered_io)
59
57
  end
60
-
58
+
61
59
  # Tries to read up to +n+ bytes of data from the remote end, and appends
62
60
  # the data to the input buffer. It returns the number of bytes read, or 0
63
61
  # if no data was available to be read.
64
- def fill(n=8192)
62
+ def fill(n = 8192)
65
63
  input.consume!
66
64
  data = recv(n)
67
65
  debug { "read #{data.length} bytes" }
@@ -71,31 +69,31 @@ module Net
71
69
  @input_errors << e
72
70
  return 0
73
71
  end
74
-
72
+
75
73
  # Read up to +length+ bytes from the input buffer. If +length+ is nil,
76
74
  # all available data is read from the buffer. (See #available.)
77
- def read_available(length=nil)
75
+ def read_available(length = nil)
78
76
  input.read(length || available)
79
77
  end
80
-
78
+
81
79
  # Returns the number of bytes available to be read from the input buffer.
82
80
  # (See #read_available.)
83
81
  def available
84
82
  input.available
85
83
  end
86
-
84
+
87
85
  # Enqueues data in the output buffer, to be written when #send_pending
88
86
  # is called. Note that the data is _not_ sent immediately by this method!
89
87
  def enqueue(data)
90
88
  output.append(data)
91
89
  end
92
-
90
+
93
91
  # Returns +true+ if there is data waiting in the output buffer, and
94
92
  # +false+ otherwise.
95
93
  def pending_write?
96
94
  output.length > 0
97
95
  end
98
-
96
+
99
97
  # Sends as much of the pending output as possible. Returns +true+ if any
100
98
  # data was sent, and +false+ otherwise.
101
99
  def send_pending
@@ -108,7 +106,7 @@ module Net
108
106
  return false
109
107
  end
110
108
  end
111
-
109
+
112
110
  # Calls #send_pending repeatedly, if necessary, blocking until the output
113
111
  # buffer is empty.
114
112
  def wait_for_pending_sends
@@ -116,31 +114,32 @@ module Net
116
114
  while output.length > 0
117
115
  result = IO.select(nil, [self]) or next
118
116
  next unless result[1].any?
117
+
119
118
  send_pending
120
119
  end
121
120
  end
122
-
121
+
123
122
  public # these methods are primarily for use in tests
124
-
125
- def write_buffer #:nodoc:
123
+
124
+ def write_buffer # :nodoc:
126
125
  output.to_s
127
126
  end
128
-
129
- def read_buffer #:nodoc:
127
+
128
+ def read_buffer # :nodoc:
130
129
  input.to_s
131
130
  end
132
-
131
+
133
132
  private
134
-
133
+
135
134
  #--
136
135
  # Can't use attr_reader here (after +private+) without incurring the
137
136
  # wrath of "ruby -w". We hates it.
138
137
  #++
139
-
138
+
140
139
  def input; @input; end
141
140
 
142
141
  def output; @output; end
143
-
142
+
144
143
  # Initializes the intput and output buffers for this object. This method
145
144
  # is called automatically when the module is mixed into an object via
146
145
  # Object#extend (see Net::SSH::BufferedIo.extended), but must be called
@@ -167,7 +166,7 @@ module Net
167
166
  # http://github.com/net-ssh/net-ssh/tree/portfwfix
168
167
  #
169
168
  module ForwardedBufferedIo
170
- def fill(n=8192)
169
+ def fill(n = 8192)
171
170
  begin
172
171
  super(n)
173
172
  rescue Errno::ECONNRESET => e
@@ -182,7 +181,7 @@ module Net
182
181
  end
183
182
  end
184
183
  end
185
-
184
+
186
185
  def send_pending
187
186
  begin
188
187
  super
@@ -199,6 +198,5 @@ module Net
199
198
  end
200
199
  end
201
200
  end
202
-
203
201
  end
204
202
  end