net-ssh 6.3.0.beta1 → 7.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) 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 +4 -10
  7. data/.github/workflows/rubocop.yml +13 -0
  8. data/.rubocop.yml +2 -1
  9. data/.rubocop_todo.yml +244 -237
  10. data/Dockerfile +27 -0
  11. data/Dockerfile.openssl3 +17 -0
  12. data/README.md +7 -1
  13. data/Rakefile +4 -0
  14. data/docker-compose.yml +23 -0
  15. data/lib/net/ssh/authentication/agent.rb +13 -13
  16. data/lib/net/ssh/authentication/certificate.rb +4 -4
  17. data/lib/net/ssh/authentication/ed25519.rb +5 -5
  18. data/lib/net/ssh/authentication/key_manager.rb +18 -5
  19. data/lib/net/ssh/authentication/methods/abstract.rb +12 -2
  20. data/lib/net/ssh/authentication/methods/hostbased.rb +3 -3
  21. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +1 -1
  22. data/lib/net/ssh/authentication/methods/none.rb +1 -1
  23. data/lib/net/ssh/authentication/methods/password.rb +1 -1
  24. data/lib/net/ssh/authentication/methods/publickey.rb +56 -14
  25. data/lib/net/ssh/authentication/pageant.rb +8 -8
  26. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +2 -2
  27. data/lib/net/ssh/authentication/session.rb +5 -3
  28. data/lib/net/ssh/buffer.rb +41 -26
  29. data/lib/net/ssh/buffered_io.rb +6 -6
  30. data/lib/net/ssh/config.rb +4 -4
  31. data/lib/net/ssh/connection/channel.rb +13 -13
  32. data/lib/net/ssh/connection/event_loop.rb +8 -8
  33. data/lib/net/ssh/connection/session.rb +13 -13
  34. data/lib/net/ssh/errors.rb +2 -2
  35. data/lib/net/ssh/key_factory.rb +7 -7
  36. data/lib/net/ssh/known_hosts.rb +5 -4
  37. data/lib/net/ssh/prompt.rb +1 -1
  38. data/lib/net/ssh/proxy/http.rb +1 -1
  39. data/lib/net/ssh/proxy/https.rb +2 -2
  40. data/lib/net/ssh/proxy/socks4.rb +1 -1
  41. data/lib/net/ssh/proxy/socks5.rb +1 -1
  42. data/lib/net/ssh/service/forward.rb +4 -4
  43. data/lib/net/ssh/test/channel.rb +3 -3
  44. data/lib/net/ssh/test/extensions.rb +6 -6
  45. data/lib/net/ssh/test/packet.rb +1 -1
  46. data/lib/net/ssh/test/script.rb +3 -3
  47. data/lib/net/ssh/test/socket.rb +1 -1
  48. data/lib/net/ssh/test.rb +3 -3
  49. data/lib/net/ssh/transport/algorithms.rb +12 -12
  50. data/lib/net/ssh/transport/cipher_factory.rb +15 -15
  51. data/lib/net/ssh/transport/ctr.rb +3 -3
  52. data/lib/net/ssh/transport/hmac/abstract.rb +4 -4
  53. data/lib/net/ssh/transport/hmac.rb +12 -12
  54. data/lib/net/ssh/transport/identity_cipher.rb +1 -1
  55. data/lib/net/ssh/transport/kex/abstract.rb +3 -3
  56. data/lib/net/ssh/transport/kex/abstract5656.rb +1 -1
  57. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +1 -1
  58. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +21 -21
  59. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +1 -1
  60. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +2 -2
  61. data/lib/net/ssh/transport/kex.rb +7 -7
  62. data/lib/net/ssh/transport/key_expander.rb +1 -1
  63. data/lib/net/ssh/transport/openssl.rb +32 -11
  64. data/lib/net/ssh/transport/packet_stream.rb +1 -1
  65. data/lib/net/ssh/transport/session.rb +6 -6
  66. data/lib/net/ssh/transport/state.rb +1 -1
  67. data/lib/net/ssh/version.rb +2 -2
  68. data/lib/net/ssh.rb +3 -3
  69. data/net-ssh.gemspec +2 -2
  70. data.tar.gz.sig +0 -0
  71. metadata +13 -7
  72. metadata.gz.sig +1 -2
  73. data/.travis.yml +0 -51
@@ -70,7 +70,7 @@ module Net
70
70
 
71
71
  # Creates a new buffer, initialized to the given content. The position
72
72
  # is initialized to the beginning of the buffer.
73
- def initialize(content=String.new)
73
+ def initialize(content = String.new)
74
74
  @content = content.to_s
75
75
  @position = 0
76
76
  end
@@ -128,7 +128,7 @@ module Net
128
128
  # would otherwise tend to grow without bound.
129
129
  #
130
130
  # Returns the buffer object itself.
131
- def consume!(n=position)
131
+ def consume!(n = position)
132
132
  if n >= length
133
133
  # optimize for a fairly common case
134
134
  clear!
@@ -171,7 +171,7 @@ module Net
171
171
  # Reads and returns the next +count+ bytes from the buffer, starting from
172
172
  # the read position. If +count+ is +nil+, this will return all remaining
173
173
  # text in the buffer. This method will increment the pointer.
174
- def read(count=nil)
174
+ def read(count = nil)
175
175
  count ||= length
176
176
  count = length - @position if @position + count > length
177
177
  @position += count
@@ -180,7 +180,7 @@ module Net
180
180
 
181
181
  # Reads (as #read) and returns the given number of bytes from the buffer,
182
182
  # and then consumes (as #consume!) all data up to the new read position.
183
- def read!(count=nil)
183
+ def read!(count = nil)
184
184
  data = read(count)
185
185
  consume!
186
186
  data
@@ -283,6 +283,8 @@ module Net
283
283
  key.iqmp = iqmp
284
284
  end
285
285
  key
286
+ when /^ecdsa\-sha2\-(\w*)$/
287
+ OpenSSL::PKey::EC.read_keyblob($1, self)
286
288
  else
287
289
  raise Exception, "Cannot decode private key of type #{type}"
288
290
  end
@@ -295,29 +297,42 @@ module Net
295
297
  when /^(.*)-cert-v01@openssh\.com$/
296
298
  key = Net::SSH::Authentication::Certificate.read_certblob(self, $1)
297
299
  when /^ssh-dss$/
298
- key = OpenSSL::PKey::DSA.new
299
- if key.respond_to?(:set_pqg)
300
- key.set_pqg(read_bignum, read_bignum, read_bignum)
301
- else
302
- key.p = read_bignum
303
- key.q = read_bignum
304
- key.g = read_bignum
305
- end
306
- if key.respond_to?(:set_key)
307
- key.set_key(read_bignum, nil)
308
- else
309
- key.pub_key = read_bignum
310
- 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)
311
324
  when /^ssh-rsa$/
312
- key = OpenSSL::PKey::RSA.new
313
- if key.respond_to?(:set_key)
314
- e = read_bignum
315
- n = read_bignum
316
- key.set_key(n, e, nil)
317
- else
318
- key.e = read_bignum
319
- key.n = read_bignum
320
- 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)
321
336
  when /^ssh-ed25519$/
322
337
  Net::SSH::Authentication::ED25519Loader.raiseUnlessLoaded("unsupported key type `#{type}'")
323
338
  key = Net::SSH::Authentication::ED25519::PubKey.read_keyblob(self)
@@ -51,7 +51,7 @@ module Net
51
51
  # Called when the #extend is called on an object, with this module as the
52
52
  # argument. It ensures that the modules instance variables are all properly
53
53
  # initialized.
54
- def self.extended(object) #:nodoc:
54
+ def self.extended(object) # :nodoc:
55
55
  # need to use __send__ because #send is overridden in Socket
56
56
  object.__send__(:initialize_buffered_io)
57
57
  end
@@ -59,7 +59,7 @@ module Net
59
59
  # Tries to read up to +n+ bytes of data from the remote end, and appends
60
60
  # the data to the input buffer. It returns the number of bytes read, or 0
61
61
  # if no data was available to be read.
62
- def fill(n=8192)
62
+ def fill(n = 8192)
63
63
  input.consume!
64
64
  data = recv(n)
65
65
  debug { "read #{data.length} bytes" }
@@ -72,7 +72,7 @@ module Net
72
72
 
73
73
  # Read up to +length+ bytes from the input buffer. If +length+ is nil,
74
74
  # all available data is read from the buffer. (See #available.)
75
- def read_available(length=nil)
75
+ def read_available(length = nil)
76
76
  input.read(length || available)
77
77
  end
78
78
 
@@ -121,11 +121,11 @@ module Net
121
121
 
122
122
  public # these methods are primarily for use in tests
123
123
 
124
- def write_buffer #:nodoc:
124
+ def write_buffer # :nodoc:
125
125
  output.to_s
126
126
  end
127
127
 
128
- def read_buffer #:nodoc:
128
+ def read_buffer # :nodoc:
129
129
  input.to_s
130
130
  end
131
131
 
@@ -166,7 +166,7 @@ module Net
166
166
  # http://github.com/net-ssh/net-ssh/tree/portfwfix
167
167
  #
168
168
  module ForwardedBufferedIo
169
- def fill(n=8192)
169
+ def fill(n = 8192)
170
170
  begin
171
171
  super(n)
172
172
  rescue Errno::ECONNRESET => e
@@ -65,7 +65,7 @@ module Net
65
65
  # given +files+ (defaulting to the list of files returned by
66
66
  # #default_files), translates the resulting hash into the options
67
67
  # recognized by Net::SSH, and returns them.
68
- def for(host, files=expandable_default_files)
68
+ def for(host, files = expandable_default_files)
69
69
  translate(files.inject({}) { |settings, file|
70
70
  load(file, host, settings)
71
71
  })
@@ -77,7 +77,7 @@ module Net
77
77
  # ones. Returns a hash containing the OpenSSH options. (See
78
78
  # #translate for how to convert the OpenSSH options into Net::SSH
79
79
  # options.)
80
- def load(path, host, settings={}, base_dir = nil)
80
+ def load(path, host, settings = {}, base_dir = nil)
81
81
  file = File.expand_path(path)
82
82
  base_dir ||= File.dirname(file)
83
83
  return settings unless File.readable?(file)
@@ -317,7 +317,7 @@ module Net
317
317
  tail = pattern
318
318
  prefix = String.new
319
319
  while !tail.empty? do
320
- head,sep,tail = tail.partition(/[\*\?]/)
320
+ head, sep, tail = tail.partition(/[\*\?]/)
321
321
  prefix = prefix + Regexp.quote(head)
322
322
  case sep
323
323
  when '*'
@@ -371,7 +371,7 @@ module Net
371
371
 
372
372
  conditions = conditions.each_slice(2)
373
373
  condition_matches = []
374
- conditions.each do |(kind,exprs)|
374
+ conditions.each do |(kind, exprs)|
375
375
  exprs = unquote(exprs)
376
376
 
377
377
  case kind.downcase
@@ -96,12 +96,12 @@ module Net
96
96
  # The output buffer for this channel. Data written to the channel is
97
97
  # enqueued here, to be written as CHANNEL_DATA packets during each pass of
98
98
  # the event loop. See Connection::Session#process and #enqueue_pending_output.
99
- attr_reader :output #:nodoc:
99
+ attr_reader :output # :nodoc:
100
100
 
101
101
  # The list of pending requests. Each time a request is sent which requires
102
102
  # a reply, the corresponding callback is pushed onto this queue. As responses
103
103
  # arrive, they are shifted off the front and handled.
104
- attr_reader :pending_requests #:nodoc:
104
+ attr_reader :pending_requests # :nodoc:
105
105
 
106
106
  # Instantiates a new channel on the given connection, of the given type,
107
107
  # and with the given id. If a block is given, it will be remembered until
@@ -217,7 +217,7 @@ module Net
217
217
  # puts "could not obtain pty"
218
218
  # end
219
219
  # end
220
- def request_pty(opts={}, &block)
220
+ def request_pty(opts = {}, &block)
221
221
  extra = opts.keys - VALID_PTY_OPTIONS.keys
222
222
  raise ArgumentError, "invalid option(s) to request_pty: #{extra.inspect}" if extra.any?
223
223
 
@@ -230,9 +230,9 @@ module Net
230
230
  modes.write_byte(0)
231
231
 
232
232
  send_channel_request("pty-req", :string, opts[:term],
233
- :long, opts[:chars_wide], :long, opts[:chars_high],
234
- :long, opts[:pixels_wide], :long, opts[:pixels_high],
235
- :string, modes.to_s, &block)
233
+ :long, opts[:chars_wide], :long, opts[:chars_high],
234
+ :long, opts[:pixels_wide], :long, opts[:pixels_high],
235
+ :string, modes.to_s, &block)
236
236
  end
237
237
 
238
238
  # Sends data to the channel's remote endpoint. This usually has the
@@ -490,8 +490,8 @@ module Net
490
490
  fail "Channel open not yet confirmed, please call send_channel_request(or exec) from block of open_channel" unless remote_id
491
491
 
492
492
  msg = Buffer.from(:byte, CHANNEL_REQUEST,
493
- :long, remote_id, :string, request_name,
494
- :bool, !callback.nil?, *data)
493
+ :long, remote_id, :string, request_name,
494
+ :bool, !callback.nil?, *data)
495
495
  connection.send_message(msg)
496
496
  pending_requests << callback if callback
497
497
  end
@@ -503,7 +503,7 @@ module Net
503
503
  # #do_open_confirmation). This is called automatically by #process, which
504
504
  # is called from the event loop (Connection::Session#process). You will
505
505
  # generally not need to invoke it directly.
506
- def enqueue_pending_output #:nodoc:
506
+ def enqueue_pending_output # :nodoc:
507
507
  return unless remote_id
508
508
 
509
509
  while output.length > 0
@@ -527,7 +527,7 @@ module Net
527
527
  # packet sizes, respectively. If an open-confirmation callback was
528
528
  # given when the channel was created, it is invoked at this time with
529
529
  # the channel itself as the sole argument.
530
- def do_open_confirmation(remote_id, max_window, max_packet) #:nodoc:
530
+ def do_open_confirmation(remote_id, max_window, max_packet) # :nodoc:
531
531
  @remote_id = remote_id
532
532
  @remote_window_size = @remote_maximum_window_size = max_window
533
533
  @remote_maximum_packet_size = max_packet
@@ -553,7 +553,7 @@ module Net
553
553
  # causes the remote window size to be adjusted upwards by the given
554
554
  # number of bytes. This has the effect of allowing more data to be sent
555
555
  # from the local end to the remote end of the channel.
556
- def do_window_adjust(bytes) #:nodoc:
556
+ def do_window_adjust(bytes) # :nodoc:
557
557
  @remote_maximum_window_size += bytes
558
558
  @remote_window_size += bytes
559
559
  end
@@ -566,7 +566,7 @@ module Net
566
566
  # CHANNEL_SUCCESS, unless the callback raised ChannelRequestFailed. The
567
567
  # callback should accept the channel as the first argument, and the
568
568
  # request-specific data as the second.
569
- def do_request(request, want_reply, data) #:nodoc:
569
+ def do_request(request, want_reply, data) # :nodoc:
570
570
  result = true
571
571
 
572
572
  begin
@@ -587,7 +587,7 @@ module Net
587
587
  # but does not actually throttle requests that come in illegally when
588
588
  # the window size is too small. The callback is invoked with the channel
589
589
  # as the first argument, and the data as the second.
590
- def do_data(data) #:nodoc:
590
+ def do_data(data) # :nodoc:
591
591
  update_local_window_size(data.length)
592
592
  @on_data.call(self, data) if @on_data
593
593
  end
@@ -12,7 +12,7 @@ module Net
12
12
  class EventLoop
13
13
  include Loggable
14
14
 
15
- def initialize(logger=nil)
15
+ def initialize(logger = nil)
16
16
  self.logger = logger
17
17
  @sessions = []
18
18
  end
@@ -60,7 +60,7 @@ module Net
60
60
  w = []
61
61
  minwait = nil
62
62
  @sessions.each do |session|
63
- sr,sw,actwait = session.ev_do_calculate_rw_wait(wait)
63
+ sr, sw, actwait = session.ev_do_calculate_rw_wait(wait)
64
64
  minwait = actwait if actwait && (minwait.nil? || actwait < minwait)
65
65
  r.push(*sr)
66
66
  w.push(*sw)
@@ -75,18 +75,18 @@ module Net
75
75
  if readers
76
76
  readers.each do |reader|
77
77
  session = owners[reader]
78
- (fired_sessions[session] ||= { r: [],w: [] })[:r] << reader
78
+ (fired_sessions[session] ||= { r: [], w: [] })[:r] << reader
79
79
  end
80
80
  end
81
81
  if writers
82
82
  writers.each do |writer|
83
83
  session = owners[writer]
84
- (fired_sessions[session] ||= { r: [],w: [] })[:w] << writer
84
+ (fired_sessions[session] ||= { r: [], w: [] })[:w] << writer
85
85
  end
86
86
  end
87
87
 
88
- fired_sessions.each do |s,rw|
89
- s.ev_do_handle_events(rw[:r],rw[:w])
88
+ fired_sessions.each do |s, rw|
89
+ s.ev_do_handle_events(rw[:r], rw[:w])
90
90
  end
91
91
 
92
92
  @sessions.each { |s| s.ev_do_postprocess(fired_sessions.key?(s)) }
@@ -111,10 +111,10 @@ module Net
111
111
  raise "Only one session expected" unless @sessions.count == 1
112
112
 
113
113
  session = @sessions.first
114
- sr,sw,actwait = session.ev_do_calculate_rw_wait(wait)
114
+ sr, sw, actwait = session.ev_do_calculate_rw_wait(wait)
115
115
  readers, writers, = IO.select(sr, sw, nil, actwait)
116
116
 
117
- session.ev_do_handle_events(readers,writers)
117
+ session.ev_do_handle_events(readers, writers)
118
118
  session.ev_do_postprocess(!((readers.nil? || readers.empty?) && (writers.nil? || writers.empty?)))
119
119
  end
120
120
  end
@@ -41,17 +41,17 @@ module Net
41
41
  attr_reader :properties
42
42
 
43
43
  # The map of channels, each key being the local-id for the channel.
44
- attr_reader :channels #:nodoc:
44
+ attr_reader :channels # :nodoc:
45
45
 
46
46
  # The map of listeners that the event loop knows about. See #listen_to.
47
- attr_reader :listeners #:nodoc:
47
+ attr_reader :listeners # :nodoc:
48
48
 
49
49
  # The map of specialized handlers for opening specific channel types. See
50
50
  # #on_open_channel.
51
- attr_reader :channel_open_handlers #:nodoc:
51
+ attr_reader :channel_open_handlers # :nodoc:
52
52
 
53
53
  # The list of callbacks for pending requests. See #send_global_request.
54
- attr_reader :pending_requests #:nodoc:
54
+ attr_reader :pending_requests # :nodoc:
55
55
 
56
56
  class NilChannel
57
57
  def initialize(session)
@@ -65,7 +65,7 @@ module Net
65
65
 
66
66
  # Create a new connection service instance atop the given transport
67
67
  # layer. Initializes the listeners to be only the underlying socket object.
68
- def initialize(transport, options={})
68
+ def initialize(transport, options = {})
69
69
  self.logger = transport.logger
70
70
 
71
71
  @transport = transport
@@ -149,7 +149,7 @@ module Net
149
149
  # to be run.
150
150
  #
151
151
  # ssh.loop { ssh.busy? }
152
- def busy?(include_invisible=false)
152
+ def busy?(include_invisible = false)
153
153
  if include_invisible
154
154
  channels.any?
155
155
  else
@@ -174,7 +174,7 @@ module Net
174
174
  # int_pressed = false
175
175
  # trap("INT") { int_pressed = true }
176
176
  # ssh.loop(0.1) { not int_pressed }
177
- def loop(wait=nil, &block)
177
+ def loop(wait = nil, &block)
178
178
  running = block || Proc.new { busy? }
179
179
  loop_forever { break unless process(wait, &running) }
180
180
  begin
@@ -222,7 +222,7 @@ module Net
222
222
  # connections.delete_if { |ssh| !ssh.process(0.1, &condition) }
223
223
  # break if connections.empty?
224
224
  # end
225
- def process(wait=nil, &block)
225
+ def process(wait = nil, &block)
226
226
  @event_loop.process(wait, &block)
227
227
  rescue StandardError
228
228
  force_channel_cleanup_on_close if closed?
@@ -255,7 +255,7 @@ module Net
255
255
  def ev_do_calculate_rw_wait(wait)
256
256
  r = listeners.keys
257
257
  w = r.select { |w2| w2.respond_to?(:pending_write?) && w2.pending_write? }
258
- [r,w,io_select_wait(wait)]
258
+ [r, w, io_select_wait(wait)]
259
259
  end
260
260
 
261
261
  # This is called internally as part of #process.
@@ -335,13 +335,13 @@ module Net
335
335
  # end
336
336
  #
337
337
  # channel.wait
338
- def open_channel(type="session", *extra, &on_confirm)
338
+ def open_channel(type = "session", *extra, &on_confirm)
339
339
  local_id = get_next_channel_id
340
340
 
341
341
  channel = Channel.new(self, type, local_id, @max_pkt_size, @max_win_size, &on_confirm)
342
342
  msg = Buffer.from(:byte, CHANNEL_OPEN, :string, type, :long, local_id,
343
- :long, channel.local_maximum_window_size,
344
- :long, channel.local_maximum_packet_size, *extra)
343
+ :long, channel.local_maximum_window_size,
344
+ :long, channel.local_maximum_packet_size, *extra)
345
345
  send_message(msg)
346
346
 
347
347
  channels[local_id] = channel
@@ -382,7 +382,7 @@ module Net
382
382
  raise "could not execute command: #{command.inspect}" unless success
383
383
 
384
384
  if status
385
- channel.on_request("exit-status") do |ch2,data|
385
+ channel.on_request("exit-status") do |ch2, data|
386
386
  status[:exit_code] = data.read_long
387
387
  end
388
388
 
@@ -45,10 +45,10 @@ module Net
45
45
  # the remember_host! method on the exception, and then retry.
46
46
  class HostKeyError < Net::SSH::Exception
47
47
  # the callback to use when #remember_host! is called
48
- attr_writer :callback #:nodoc:
48
+ attr_writer :callback # :nodoc:
49
49
 
50
50
  # situation-specific data describing the host (see #host, #port, etc.)
51
- attr_writer :data #:nodoc:
51
+ attr_writer :data # :nodoc:
52
52
 
53
53
  # An accessor for getting at the data that was used to look up the host
54
54
  # (see also #fingerprint, #host, #port, #ip, and #key).
@@ -17,14 +17,14 @@ module Net
17
17
  class KeyFactory
18
18
  # Specifies the mapping of SSH names to OpenSSL key classes.
19
19
  MAP = {
20
- 'dh' => OpenSSL::PKey::DH,
21
- 'rsa' => OpenSSL::PKey::RSA,
22
- 'dsa' => OpenSSL::PKey::DSA,
20
+ 'dh' => OpenSSL::PKey::DH,
21
+ 'rsa' => OpenSSL::PKey::RSA,
22
+ 'dsa' => OpenSSL::PKey::DSA,
23
23
  'ecdsa' => OpenSSL::PKey::EC
24
24
  }
25
25
  MAP["ed25519"] = Net::SSH::Authentication::ED25519::PrivKey if defined? Net::SSH::Authentication::ED25519
26
26
 
27
- class <<self
27
+ class << self
28
28
  # Fetch an OpenSSL key instance by its SSH name. It will be a new,
29
29
  # empty key of the given type.
30
30
  def get(name)
@@ -36,7 +36,7 @@ module Net
36
36
  # appropriately. The new key is returned. If the key itself is
37
37
  # encrypted (requiring a passphrase to use), the user will be
38
38
  # prompted to enter their password unless passphrase works.
39
- def load_private_key(filename, passphrase=nil, ask_passphrase=true, prompt=Prompt.default)
39
+ def load_private_key(filename, passphrase = nil, ask_passphrase = true, prompt = Prompt.default)
40
40
  data = File.read(File.expand_path(filename))
41
41
  load_data_private_key(data, passphrase, ask_passphrase, filename, prompt)
42
42
  end
@@ -46,7 +46,7 @@ module Net
46
46
  # appropriately. The new key is returned. If the key itself is
47
47
  # encrypted (requiring a passphrase to use), the user will be
48
48
  # prompted to enter their password unless passphrase works.
49
- def load_data_private_key(data, passphrase=nil, ask_passphrase=true, filename="", prompt=Prompt.default)
49
+ def load_data_private_key(data, passphrase = nil, ask_passphrase = true, filename = "", prompt = Prompt.default)
50
50
  key_type = classify_key(data, filename)
51
51
 
52
52
  encrypted_key = nil
@@ -86,7 +86,7 @@ module Net
86
86
  # Loads a public key. It will correctly determine whether
87
87
  # the file describes an RSA or DSA key, and will load it
88
88
  # appropriately. The new public key is returned.
89
- def load_data_public_key(data, filename="")
89
+ def load_data_public_key(data, filename = "")
90
90
  fields = data.split(/ /)
91
91
 
92
92
  blob = nil
@@ -1,6 +1,7 @@
1
1
  require 'strscan'
2
2
  require 'openssl'
3
3
  require 'base64'
4
+ require 'delegate'
4
5
  require 'net/ssh/buffer'
5
6
  require 'net/ssh/authentication/ed25519_loader'
6
7
 
@@ -105,10 +106,10 @@ module Net
105
106
 
106
107
  SUPPORTED_TYPE.push('ssh-ed25519') if Net::SSH::Authentication::ED25519Loader::LOADED
107
108
 
108
- class <<self
109
+ class << self
109
110
  # Searches all known host files (see KnownHosts.hostfiles) for all keys
110
111
  # of the given host. Returns an enumerable of keys found.
111
- def search_for(host, options={})
112
+ def search_for(host, options = {})
112
113
  HostKeys.new(search_in(hostfiles(options), host, options), host, self, options)
113
114
  end
114
115
 
@@ -127,7 +128,7 @@ module Net
127
128
  #
128
129
  # If you only want the user known host files, you can pass :user as
129
130
  # the second option.
130
- def hostfiles(options, which=:all)
131
+ def hostfiles(options, which = :all)
131
132
  files = []
132
133
 
133
134
  files += Array(options[:user_known_hosts_file] || %w[~/.ssh/known_hosts ~/.ssh/known_hosts2]) if which == :all || which == :user
@@ -142,7 +143,7 @@ module Net
142
143
  # Looks in all user known host files (see KnownHosts.hostfiles) and tries to
143
144
  # add an entry for the given host and key to the first file it is able
144
145
  # to.
145
- def add(host, key, options={})
146
+ def add(host, key, options = {})
146
147
  hostfiles(options, :user).each do |file|
147
148
  KnownHosts.new(file).add(host, key)
148
149
  return
@@ -38,7 +38,7 @@ module Net
38
38
 
39
39
  # ask input from user, a prompter might ask for multiple inputs
40
40
  # (like user and password) in a single session.
41
- def ask(prompt, echo=true)
41
+ def ask(prompt, echo = true)
42
42
  $stdout.print(prompt)
43
43
  $stdout.flush
44
44
  ret = $stdin.noecho(&:gets).chomp
@@ -40,7 +40,7 @@ module Net
40
40
  #
41
41
  # * :user => the user name to use when authenticating to the proxy
42
42
  # * :password => the password to use when authenticating
43
- def initialize(proxy_host, proxy_port=80, options={})
43
+ def initialize(proxy_host, proxy_port = 80, options = {})
44
44
  @proxy_host = proxy_host
45
45
  @proxy_port = proxy_port
46
46
  @options = options
@@ -16,7 +16,7 @@ module Net
16
16
  # taken by Net::SSH::Proxy::HTTP it supports:
17
17
  #
18
18
  # * :ssl_context => the SSL configuration to use for the connection
19
- def initialize(proxy_host, proxy_port=80, options={})
19
+ def initialize(proxy_host, proxy_port = 80, options = {})
20
20
  @ssl_context = options.delete(:ssl_context) ||
21
21
  OpenSSL::SSL::SSLContext.new
22
22
  super(proxy_host, proxy_port, options)
@@ -27,7 +27,7 @@ module Net
27
27
  # Shim to make OpenSSL::SSL::SSLSocket behave like a regular TCPSocket
28
28
  # for all intents and purposes of Net::SSH::BufferedIo
29
29
  module SSLSocketCompatibility
30
- def self.extended(object) #:nodoc:
30
+ def self.extended(object) # :nodoc:
31
31
  object.define_singleton_method(:recv, object.method(:sysread))
32
32
  object.sync_close = true
33
33
  end
@@ -37,7 +37,7 @@ module Net
37
37
  # Create a new proxy connection to the given proxy host and port.
38
38
  # Optionally, a :user key may be given to identify the username
39
39
  # with which to authenticate.
40
- def initialize(proxy_host, proxy_port=1080, options={})
40
+ def initialize(proxy_host, proxy_port = 1080, options = {})
41
41
  @proxy_host = proxy_host
42
42
  @proxy_port = proxy_port
43
43
  @options = options
@@ -52,7 +52,7 @@ module Net
52
52
  # Create a new proxy connection to the given proxy host and port.
53
53
  # Optionally, :user and :password options may be given to
54
54
  # identify the username and password with which to authenticate.
55
- def initialize(proxy_host, proxy_port=1080, options={})
55
+ def initialize(proxy_host, proxy_port = 1080, options = {})
56
56
  @proxy_host = proxy_host
57
57
  @proxy_port = proxy_port
58
58
  @options = options
@@ -17,7 +17,7 @@ module Net
17
17
  attr_reader :session
18
18
 
19
19
  # A simple class for representing a requested remote forwarded port.
20
- Remote = Struct.new(:host, :port) #:nodoc:
20
+ Remote = Struct.new(:host, :port) # :nodoc:
21
21
 
22
22
  # Instantiates a new Forward service instance atop the given connection
23
23
  # service session. This will register new channel open handlers to handle
@@ -105,7 +105,7 @@ module Net
105
105
  #
106
106
  # ssh.forward.cancel_local(1234)
107
107
  # ssh.forward.cancel_local(1234, "0.0.0.0")
108
- def cancel_local(port, bind_address="127.0.0.1")
108
+ def cancel_local(port, bind_address = "127.0.0.1")
109
109
  socket = @local_forwarded_ports.delete([port, bind_address])
110
110
  socket.shutdown rescue nil
111
111
  socket.close rescue nil
@@ -214,7 +214,7 @@ module Net
214
214
  # raise Net::SSH::Exception, "remote forwarding request failed"
215
215
  # end
216
216
  #
217
- def remote(port, host, remote_port, remote_host="127.0.0.1")
217
+ def remote(port, host, remote_port, remote_host = "127.0.0.1")
218
218
  session.send_global_request("tcpip-forward", :string, remote_host, :long, remote_port) do |success, response|
219
219
  if success
220
220
  remote_port = response.read_long if remote_port == 0
@@ -248,7 +248,7 @@ module Net
248
248
  #
249
249
  # ssh.forward.cancel_remote(1234, "0.0.0.0")
250
250
  # ssh.loop { ssh.forward.active_remotes.include?([1234, "0.0.0.0"]) }
251
- def cancel_remote(port, host="127.0.0.1")
251
+ def cancel_remote(port, host = "127.0.0.1")
252
252
  session.send_global_request("cancel-tcpip-forward", :string, host, :long, port) do |success, response|
253
253
  if success
254
254
  @remote_forwarded_ports.delete([port, host])
@@ -65,7 +65,7 @@ module Net
65
65
  # be scripted.
66
66
  #
67
67
  # channel.sends_exec "ls -l"
68
- def sends_exec(command, reply=true, success=true)
68
+ def sends_exec(command, reply = true, success = true)
69
69
  script.sends_channel_request(self, "exec", reply, command, success)
70
70
  end
71
71
 
@@ -74,7 +74,7 @@ module Net
74
74
  # and +success+ arguments.
75
75
  #
76
76
  # channel.sends_subsystem "sftp"
77
- def sends_subsystem(subsystem, reply=true, success=true)
77
+ def sends_subsystem(subsystem, reply = true, success = true)
78
78
  script.sends_channel_request(self, "subsystem", reply, subsystem, success)
79
79
  end
80
80
 
@@ -124,7 +124,7 @@ module Net
124
124
  # Scripts the reception of an "exit-status" channel request packet.
125
125
  #
126
126
  # channel.gets_exit_status(127)
127
- def gets_exit_status(status=0)
127
+ def gets_exit_status(status = 0)
128
128
  script.gets_channel_request(self, "exit-status", false, status)
129
129
  end
130
130