net-ssh 4.1.0 → 4.2.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 315114c6a9537f7c43b92bb2aeb974a3a7e4a82e
4
- data.tar.gz: 0fe85c2a8f79d6dd869cfd71dd3b33f3b181a4a6
3
+ metadata.gz: 92ff27262ab7555ea9e90bda3a63d89401b9ad2a
4
+ data.tar.gz: 24e94ee3884a2d16986772988ace9296301fba12
5
5
  SHA512:
6
- metadata.gz: 8d5c7cb19f06e99fdb1d58a7aa9d4412a0e400cda6d474c7ddd6ad5d005669fbbac593eac41f68a39b55c5a02ae1f9cd04233c5fa9f966d589ad256954066291
7
- data.tar.gz: 2d902438534348c94d7c35913d654db76a04c71c3f4644265ee90a9c3f56e28af9a89e3d34843c261f9fc0d398a728274d2665097cab7c7157cbe9fec6a5ec69
6
+ metadata.gz: 1735c8964072ea8abffcd8e064e4c60872078376622f6f5947b88a387c158fbf13f2d85f5a80e2591f28390d9c6a3f86cd144f6b75a649e7f2a604c984d8f020
7
+ data.tar.gz: 872937fed88b544b59c9fc95b3b355409a26cc617770038626147543d0cd913c1f17f9b1cfcd3310418f35bde31b4eb6f18433805585a0a905494d22e2850461
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -639,7 +639,7 @@ Style/LineEndConcatenation:
639
639
 
640
640
  # Offense count: 12
641
641
  # Cop supports --auto-correct.
642
- Style/MethodCallParentheses:
642
+ Style/MethodCallWithoutArgsParentheses:
643
643
  Exclude:
644
644
  - 'test/authentication/test_key_manager.rb'
645
645
  - 'test/connection/test_session.rb'
@@ -1,3 +1,13 @@
1
+ === 4.2.0.rc1
2
+
3
+ * Close transport on proxy error [adamruzicka, #526]
4
+ * Support multiple identity files [Kimura Masayuki, #528]
5
+ * Move `none` cipher to end of cipher list [Brian Cain, #525]
6
+ * Deprecate `:paranoid` in favor of `:verify_host_key` [Jared Beck, #524]
7
+ * Support Multile Include ssh config files [Kasumi Hanazuki, #516]
8
+ * Support Relative path in ssh confif files [Akinori MUSHA, #510]
9
+ * add direct-streamlocal@openssh.com support in Forward class [Harald Sitter, #502]
10
+
1
11
  === 4.1.0
2
12
  === 4.1.0.rc1
3
13
 
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in mygem.gemspec
4
4
  gemspec
5
5
 
6
- if !Gem.win_platform? && RUBY_ENGINE == "mri"
6
+ if !Gem.win_platform? && RUBY_ENGINE == "ruby"
7
7
  gem 'byebug', group: [:development, :test]
8
8
  end
9
9
 
@@ -9,6 +9,10 @@ environment:
9
9
  - ruby_version: "23-x64"
10
10
  - ruby_version: "22-x64"
11
11
 
12
+ matrix:
13
+ allow_failures:
14
+ - ruby_version: "jruby-9.1.2.0"
15
+
12
16
  #init:
13
17
  # - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
14
18
 
@@ -71,8 +71,8 @@ module Net
71
71
  :known_hosts, :global_known_hosts_file, :user_known_hosts_file, :host_key_alias,
72
72
  :host_name, :user, :properties, :passphrase, :keys_only, :max_pkt_size,
73
73
  :max_win_size, :send_env, :use_agent, :number_of_password_prompts,
74
- :append_supported_algorithms, :non_interactive, :password_prompt, :agent_socket_factory,
75
- :minimum_dh_bits
74
+ :append_all_supported_algorithms, :non_interactive, :password_prompt,
75
+ :agent_socket_factory, :minimum_dh_bits, :verify_host_key
76
76
  ]
77
77
 
78
78
  # The standard means of starting a new SSH connection. When used with a
@@ -157,12 +157,7 @@ module Net
157
157
  # authentication failure vs password prompt. Non-interactive applications
158
158
  # should set it to true to prefer failing a password/etc auth methods vs.
159
159
  # asking for password.
160
- # * :paranoid => either false, true, :very, or :secure specifying how
161
- # strict host-key verification should be (in increasing order here).
162
- # You can also provide an own Object which responds to +verify+. The argument
163
- # given to +verify+ is a hash consisting of the +:key+, the +:key_blob+,
164
- # the +:fingerprint+ and the +:session+. Returning true accepts the host key,
165
- # returning false declines it and closes the connection.
160
+ # * :paranoid => deprecated alias for :verify_host_key
166
161
  # * :passphrase => the passphrase to use when loading a private key (default
167
162
  # is +nil+, for no passphrase)
168
163
  # * :password => the password to use to login
@@ -199,6 +194,13 @@ module Net
199
194
  # * :agent_socket_factory => enables the user to pass a lambda/block that will serve as the socket factory
200
195
  # Net::SSH::start(user,host,agent_socket_factory: ->{ UNIXSocket.open('/foo/bar') })
201
196
  # example: ->{ UNIXSocket.open('/foo/bar')}
197
+ # * :verify_host_key => either false, true, :very, or :secure specifying how
198
+ # strict host-key verification should be (in increasing order here).
199
+ # You can also provide an own Object which responds to +verify+. The argument
200
+ # given to +verify+ is a hash consisting of the +:key+, the +:key_blob+,
201
+ # the +:fingerprint+ and the +:session+. Returning true accepts the host key,
202
+ # returning false declines it and closes the connection.
203
+ #
202
204
  # If +user+ parameter is nil it defaults to USER from ssh_config, or
203
205
  # local username
204
206
  def self.start(host, user=nil, options={}, &block)
@@ -218,6 +220,8 @@ module Net
218
220
  options[:number_of_password_prompts] = 0
219
221
  end
220
222
 
223
+ _support_deprecated_option_paranoid(options)
224
+
221
225
  if options[:verbose]
222
226
  options[:logger].level = case options[:verbose]
223
227
  when Integer then options[:verbose]
@@ -249,6 +253,9 @@ module Net
249
253
  transport.close
250
254
  raise AuthenticationFailed, "Authentication failed for user #{user}@#{host}"
251
255
  end
256
+ rescue => e
257
+ transport.close unless transport.nil?
258
+ raise e
252
259
  end
253
260
 
254
261
  # Returns a hash of the configuration options for the given host, as read
@@ -291,5 +298,23 @@ module Net
291
298
  end
292
299
  end
293
300
  private_class_method :_sanitize_options
301
+
302
+ def self._support_deprecated_option_paranoid(options)
303
+ if options.key?(:paranoid)
304
+ Kernel.warn(
305
+ ":paranoid is deprecated, please use :verify_host_key. Supported " \
306
+ "values are exactly the same, only the name of the option has changed."
307
+ )
308
+ if options.key?(:verify_host_key)
309
+ Kernel.warn(
310
+ "Both :paranoid and :verify_host_key were specified. " \
311
+ ":verify_host_key takes precedence, :paranoid will be ignored."
312
+ )
313
+ else
314
+ options[:verify_host_key] = options.delete(:paranoid)
315
+ end
316
+ end
317
+ end
318
+ private_class_method :_support_deprecated_option_paranoid
294
319
  end
295
320
  end
@@ -52,6 +52,9 @@ module Net; module SSH; module Authentication
52
52
  SSH_AGENT_CONSTRAIN_LIFETIME = 1
53
53
  SSH_AGENT_CONSTRAIN_CONFIRM = 2
54
54
 
55
+ SSH_AGENT_RSA_SHA2_256 = 0x02
56
+ SSH_AGENT_RSA_SHA2_512 = 0x04
57
+
55
58
  # The underlying socket being used to communicate with the SSH agent.
56
59
  attr_reader :socket
57
60
 
@@ -138,8 +141,8 @@ module Net; module SSH; module Authentication
138
141
 
139
142
  # Using the agent and the given public key, sign the given data. The
140
143
  # signature is returned in SSH2 format.
141
- def sign(key, data)
142
- type, reply = send_and_wait(SSH2_AGENT_SIGN_REQUEST, :string, Buffer.from(:key, key), :string, data, :long, 0)
144
+ def sign(key, data, flags = 0)
145
+ type, reply = send_and_wait(SSH2_AGENT_SIGN_REQUEST, :string, Buffer.from(:key, key), :string, data, :long, flags)
143
146
 
144
147
  raise AgentError, "agent could not sign data with requested identity" if agent_failed(type)
145
148
  raise AgentError, "bad authentication response #{type}" if type != SSH2_AGENT_SIGN_RESPONSE
@@ -72,9 +72,9 @@ module Net; module SSH
72
72
  # ones. Returns a hash containing the OpenSSH options. (See
73
73
  # #translate for how to convert the OpenSSH options into Net::SSH
74
74
  # options.)
75
- def load(path, host, settings={})
75
+ def load(path, host, settings={}, base_dir = nil)
76
76
  file = File.expand_path(path)
77
- base_dir = File.dirname(file)
77
+ base_dir ||= File.dirname(file)
78
78
  return settings unless File.readable?(file)
79
79
 
80
80
  globals = {}
@@ -125,7 +125,7 @@ module Net; module SSH
125
125
  (globals[key] ||= []) << value
126
126
  when 'include'
127
127
  included_file_paths(base_dir, value).each do |file_path|
128
- globals = load(file_path, host, globals)
128
+ globals = load(file_path, host, globals, base_dir)
129
129
  end
130
130
  else
131
131
  globals[key] = value unless settings.key?(key)
@@ -136,7 +136,7 @@ module Net; module SSH
136
136
  (settings[key] ||= []) << value
137
137
  when 'include'
138
138
  included_file_paths(base_dir, value).each do |file_path|
139
- settings = load(file_path, host, settings)
139
+ settings = load(file_path, host, settings, base_dir)
140
140
  end
141
141
  else
142
142
  settings[key] = value unless settings.key?(key)
@@ -144,7 +144,16 @@ module Net; module SSH
144
144
  end
145
145
  end
146
146
 
147
- settings = globals.merge(settings) if globals
147
+ if globals
148
+ settings = globals.merge(settings) do |key, oldval, newval|
149
+ case key
150
+ when 'identityfile'
151
+ oldval + newval
152
+ else
153
+ newval
154
+ end
155
+ end
156
+ end
148
157
 
149
158
  return settings
150
159
  end
@@ -303,12 +312,17 @@ module Net; module SSH
303
312
  hash
304
313
  end
305
314
 
306
- def included_file_paths(base_dir, config_path)
307
- paths = Dir.glob(File.expand_path(config_path)).select { |f| File.file?(f) }
308
- paths += Dir.glob(File.join(base_dir, config_path)).select { |f| File.file?(f) }
309
- paths.uniq
315
+ def included_file_paths(base_dir, config_paths)
316
+ tokenize_config_value(config_paths).flat_map do |path|
317
+ Dir.glob(File.expand_path(path, base_dir)).select { |f| File.file?(f) }
318
+ end
310
319
  end
311
320
 
321
+ # Tokenize string into tokens.
322
+ # A token is a word or a quoted sequence of words, separated by whitespaces.
323
+ def tokenize_config_value(str)
324
+ str.scan(/([^"\s]+)?(?:"([^"]+)")?\s*/).map(&:join)
325
+ end
312
326
  end
313
327
  end
314
328
 
@@ -176,6 +176,15 @@ module Net; module SSH; module Connection
176
176
  def loop(wait=nil, &block)
177
177
  running = block || Proc.new { busy? }
178
178
  loop_forever { break unless process(wait, &running) }
179
+ begin
180
+ process(0)
181
+ rescue IOError => e
182
+ if e.message =~ /closed/
183
+ debug { "stream was closed after loop => shallowing exception so it will be re-raised in next loop" }
184
+ else
185
+ raise
186
+ end
187
+ end
179
188
  end
180
189
 
181
190
  # The core of the event loop. It processes a single iteration of the event
@@ -57,7 +57,8 @@ module Net; module SSH; module Proxy
57
57
  begin
58
58
  io = IO.popen(command_line, "r+")
59
59
  if result = Net::SSH::Compat.io_select([io], nil, [io], 60)
60
- if result.last.any?
60
+ if result.last.any? || io.eof?
61
+ io.close
61
62
  raise "command failed"
62
63
  end
63
64
  else
@@ -28,6 +28,7 @@ module Net; module SSH; module Service
28
28
  @remote_forwarded_ports = {}
29
29
  @local_forwarded_ports = {}
30
30
  @agent_forwarded = false
31
+ @local_forwarded_sockets = {}
31
32
 
32
33
  session.on_open_channel('forwarded-tcpip', &method(:forwarded_tcpip))
33
34
  session.on_open_channel('auth-agent', &method(:auth_agent_channel))
@@ -99,9 +100,7 @@ module Net; module SSH; module Service
99
100
  local_port
100
101
  end
101
102
 
102
- # Terminates an active local forwarded port. If no such forwarded port
103
- # exists, this will raise an exception. Otherwise, the forwarded connection
104
- # is terminated.
103
+ # Terminates an active local forwarded port.
105
104
  #
106
105
  # ssh.forward.cancel_local(1234)
107
106
  # ssh.forward.cancel_local(1234, "0.0.0.0")
@@ -120,6 +119,57 @@ module Net; module SSH; module Service
120
119
  @local_forwarded_ports.keys
121
120
  end
122
121
 
122
+ # Starts listening for connections on the local host, and forwards them
123
+ # to the specified remote socket via the SSH connection. This will
124
+ # (re)create the local socket file. The remote server needs to have the
125
+ # socket file already available.
126
+ #
127
+ # ssh.forward.local_socket('/tmp/local.sock', '/tmp/remote.sock')
128
+ def local_socket(local_socket_path, remote_socket_path)
129
+ File.delete(local_socket_path) if File.exist?(local_socket_path)
130
+ socket = Socket.unix_server_socket(local_socket_path)
131
+
132
+ @local_forwarded_sockets[local_socket_path] = socket
133
+
134
+ session.listen_to(socket) do |server|
135
+ client = server.accept[0]
136
+ debug { "received connection on #{socket}" }
137
+
138
+ channel = session.open_channel("direct-streamlocal@openssh.com",
139
+ :string, remote_socket_path,
140
+ :string, nil,
141
+ :long, 0) do |achannel|
142
+ achannel.info { "direct channel established" }
143
+ end
144
+
145
+ prepare_client(client, channel, :local)
146
+
147
+ channel.on_open_failed do |ch, code, description|
148
+ channel.error { "could not establish direct channel: #{description} (#{code})" }
149
+ session.stop_listening_to(channel[:socket])
150
+ channel[:socket].close
151
+ end
152
+ end
153
+
154
+ local_socket_path
155
+ end
156
+
157
+ # Terminates an active local forwarded socket.
158
+ #
159
+ # ssh.forward.cancel_local_socket('/tmp/foo.sock')
160
+ def cancel_local_socket(local_socket_path)
161
+ socket = @local_forwarded_sockets.delete(local_socket_path)
162
+ socket.shutdown rescue nil
163
+ socket.close rescue nil
164
+ session.stop_listening_to(socket)
165
+ end
166
+
167
+ # Returns a list of all active locally forwarded sockets. The returned value
168
+ # is an array of Unix domain socket file paths.
169
+ def active_local_sockets
170
+ @local_forwarded_sockets.keys
171
+ end
172
+
123
173
  # Requests that all connections on the given remote-port be forwarded via
124
174
  # the local host to the given port/host. The last argument describes the
125
175
  # bind address on the remote host, and defaults to 127.0.0.1.
@@ -71,7 +71,10 @@ module Net; module SSH
71
71
  # in these tests. It is a fully functional SSH transport session, operating
72
72
  # over a mock socket (#socket).
73
73
  def transport(options={})
74
- @transport ||= Net::SSH::Transport::Session.new(options[:host] || "localhost", options.merge(kex: "test", host_key: "ssh-rsa", paranoid: false, proxy: socket(options)))
74
+ @transport ||= Net::SSH::Transport::Session.new(
75
+ options[:host] || "localhost",
76
+ options.merge(kex: "test", host_key: "ssh-rsa", verify_host_key: false, proxy: socket(options))
77
+ )
75
78
  end
76
79
 
77
80
  # First asserts that a story has been described (see #story). Then yields,
@@ -86,4 +89,4 @@ module Net; module SSH
86
89
  end
87
90
  end
88
91
 
89
- end; end
92
+ end; end
@@ -155,7 +155,7 @@ module Net; module SSH; module Test
155
155
  processed += 1 if reader.idle!
156
156
  end
157
157
 
158
- raise "no readers were ready for reading, and none had any incoming packets" if processed == 0
158
+ raise "no readers were ready for reading, and none had any incoming packets" if processed == 0 && wait != 0
159
159
  end
160
160
  end
161
161
  end
@@ -32,9 +32,9 @@ module Net; module SSH; module Transport
32
32
  diffie-hellman-group-exchange-sha256),
33
33
  encryption: %w(aes128-cbc 3des-cbc blowfish-cbc cast128-cbc
34
34
  aes192-cbc aes256-cbc rijndael-cbc@lysator.liu.se
35
- idea-cbc none arcfour128 arcfour256 arcfour
35
+ idea-cbc arcfour128 arcfour256 arcfour
36
36
  aes128-ctr aes192-ctr aes256-ctr
37
- cast128-ctr blowfish-ctr 3des-ctr),
37
+ cast128-ctr blowfish-ctr 3des-ctr none),
38
38
 
39
39
  hmac: %w(hmac-sha1 hmac-md5 hmac-sha1-96 hmac-md5-96
40
40
  hmac-ripemd160 hmac-ripemd160@openssh.com
@@ -61,12 +61,12 @@ module Net; module SSH; module Transport
61
61
  @bind_address = options[:bind_address] || nil
62
62
  @options = options
63
63
 
64
- debug { "establishing connection to #{@host}:#{@port}" }
65
-
66
64
  @socket =
67
65
  if (factory = options[:proxy])
66
+ debug { "establishing connection to #{@host}:#{@port} through proxy" }
68
67
  factory.open(@host, @port, options)
69
68
  else
69
+ debug { "establishing connection to #{@host}:#{@port}" }
70
70
  Socket.tcp(@host, @port, @bind_address, nil,
71
71
  connect_timeout: options[:timeout])
72
72
  end
@@ -78,7 +78,7 @@ module Net; module SSH; module Transport
78
78
 
79
79
  @queue = []
80
80
 
81
- @host_key_verifier = select_host_key_verifier(options[:paranoid])
81
+ @host_key_verifier = select_host_key_verifier(options[:verify_host_key])
82
82
 
83
83
 
84
84
  @server_version = ServerVersion.new(socket, logger, options[:timeout])
@@ -281,8 +281,8 @@ module Net; module SSH; module Transport
281
281
  # strict Secure verifier is returned. If the argument happens to respond
282
282
  # to :verify, it is returned directly. Otherwise, an exception
283
283
  # is raised.
284
- def select_host_key_verifier(paranoid)
285
- case paranoid
284
+ def select_host_key_verifier(verify_host_key)
285
+ case verify_host_key
286
286
  when true, nil then
287
287
  Net::SSH::Verifiers::Lenient.new
288
288
  when false then
@@ -292,10 +292,14 @@ module Net; module SSH; module Transport
292
292
  when :secure then
293
293
  Net::SSH::Verifiers::Secure.new
294
294
  else
295
- if paranoid.respond_to?(:verify)
296
- paranoid
295
+ if verify_host_key.respond_to?(:verify)
296
+ verify_host_key
297
297
  else
298
- raise ArgumentError, "argument to :paranoid is not valid: #{paranoid.inspect}"
298
+ raise(
299
+ ArgumentError,
300
+ "Invalid argument to :verify_host_key (or deprecated " \
301
+ ":paranoid): #{verify_host_key.inspect}"
302
+ )
299
303
  end
300
304
  end
301
305
  end
@@ -48,14 +48,14 @@ module Net; module SSH
48
48
  MAJOR = 4
49
49
 
50
50
  # The minor component of this version of the Net::SSH library
51
- MINOR = 1
51
+ MINOR = 2
52
52
 
53
53
  # The tiny component of this version of the Net::SSH library
54
54
  TINY = 0
55
55
 
56
56
  # The prerelease component of this version of the Net::SSH library
57
57
  # nil allowed
58
- PRE = nil
58
+ PRE = "rc1"
59
59
 
60
60
  # The current version of the Net::SSH library as a Version instance
61
61
  CURRENT = new(*[MAJOR, MINOR, TINY, PRE].compact)
@@ -38,6 +38,6 @@ Gem::Specification.new do |spec|
38
38
 
39
39
  spec.add_development_dependency "rake", "~> 12.0"
40
40
  spec.add_development_dependency "minitest", "~> 5.10"
41
- spec.add_development_dependency "rubocop", "~> 0.46.0"
41
+ spec.add_development_dependency "rubocop", "~> 0.47.0"
42
42
  spec.add_development_dependency "mocha", ">= 1.2.1"
43
43
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
4
+ version: 4.2.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamis Buck
8
8
  - Delano Mandelbaum
9
9
  - Miklós Fazekas
10
- autorequire:
10
+ autorequire:
11
11
  bindir: exe
12
12
  cert_chain:
13
13
  - |
@@ -32,23 +32,24 @@ cert_chain:
32
32
  L4d54WIy4HkZCqQXoTSiK5HZMIdXkPk3F1bZdJ8Dy1sMRru0rUkkM5mW7TQ75mfW
33
33
  Zp0QrZyNZhtitrXFbZneGRrIA/8G2Krft5Ly/A==
34
34
  -----END CERTIFICATE-----
35
- date: 2017-02-18 00:00:00.000000000 Z
35
+ date: 2017-07-11 00:00:00.000000000 Z
36
36
  dependencies:
37
37
  - !ruby/object:Gem::Dependency
38
+ name: rbnacl-libsodium
38
39
  requirement: !ruby/object:Gem::Requirement
39
40
  requirements:
40
41
  - - "~>"
41
42
  - !ruby/object:Gem::Version
42
43
  version: 1.0.11
43
- name: rbnacl-libsodium
44
- prerelease: false
45
44
  type: :development
45
+ prerelease: false
46
46
  version_requirements: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - "~>"
49
49
  - !ruby/object:Gem::Version
50
50
  version: 1.0.11
51
51
  - !ruby/object:Gem::Dependency
52
+ name: rbnacl
52
53
  requirement: !ruby/object:Gem::Requirement
53
54
  requirements:
54
55
  - - ">="
@@ -57,9 +58,8 @@ dependencies:
57
58
  - - "<"
58
59
  - !ruby/object:Gem::Version
59
60
  version: '5.0'
60
- name: rbnacl
61
- prerelease: false
62
61
  type: :development
62
+ prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - ">="
@@ -69,70 +69,84 @@ dependencies:
69
69
  - !ruby/object:Gem::Version
70
70
  version: '5.0'
71
71
  - !ruby/object:Gem::Dependency
72
+ name: bcrypt_pbkdf
72
73
  requirement: !ruby/object:Gem::Requirement
73
74
  requirements:
74
75
  - - "~>"
75
76
  - !ruby/object:Gem::Version
76
- version: '1.11'
77
- name: bundler
77
+ version: '1.0'
78
+ type: :development
78
79
  prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '1.0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: bundler
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '1.11'
79
92
  type: :development
93
+ prerelease: false
80
94
  version_requirements: !ruby/object:Gem::Requirement
81
95
  requirements:
82
96
  - - "~>"
83
97
  - !ruby/object:Gem::Version
84
98
  version: '1.11'
85
99
  - !ruby/object:Gem::Dependency
100
+ name: rake
86
101
  requirement: !ruby/object:Gem::Requirement
87
102
  requirements:
88
103
  - - "~>"
89
104
  - !ruby/object:Gem::Version
90
105
  version: '12.0'
91
- name: rake
92
- prerelease: false
93
106
  type: :development
107
+ prerelease: false
94
108
  version_requirements: !ruby/object:Gem::Requirement
95
109
  requirements:
96
110
  - - "~>"
97
111
  - !ruby/object:Gem::Version
98
112
  version: '12.0'
99
113
  - !ruby/object:Gem::Dependency
114
+ name: minitest
100
115
  requirement: !ruby/object:Gem::Requirement
101
116
  requirements:
102
117
  - - "~>"
103
118
  - !ruby/object:Gem::Version
104
119
  version: '5.10'
105
- name: minitest
106
- prerelease: false
107
120
  type: :development
121
+ prerelease: false
108
122
  version_requirements: !ruby/object:Gem::Requirement
109
123
  requirements:
110
124
  - - "~>"
111
125
  - !ruby/object:Gem::Version
112
126
  version: '5.10'
113
127
  - !ruby/object:Gem::Dependency
128
+ name: rubocop
114
129
  requirement: !ruby/object:Gem::Requirement
115
130
  requirements:
116
131
  - - "~>"
117
132
  - !ruby/object:Gem::Version
118
- version: 0.46.0
119
- name: rubocop
120
- prerelease: false
133
+ version: 0.47.0
121
134
  type: :development
135
+ prerelease: false
122
136
  version_requirements: !ruby/object:Gem::Requirement
123
137
  requirements:
124
138
  - - "~>"
125
139
  - !ruby/object:Gem::Version
126
- version: 0.46.0
140
+ version: 0.47.0
127
141
  - !ruby/object:Gem::Dependency
142
+ name: mocha
128
143
  requirement: !ruby/object:Gem::Requirement
129
144
  requirements:
130
145
  - - ">="
131
146
  - !ruby/object:Gem::Version
132
147
  version: 1.2.1
133
- name: mocha
134
- prerelease: false
135
148
  type: :development
149
+ prerelease: false
136
150
  version_requirements: !ruby/object:Gem::Requirement
137
151
  requirements:
138
152
  - - ">="
@@ -256,7 +270,7 @@ homepage: https://github.com/net-ssh/net-ssh
256
270
  licenses:
257
271
  - MIT
258
272
  metadata: {}
259
- post_install_message:
273
+ post_install_message:
260
274
  rdoc_options: []
261
275
  require_paths:
262
276
  - lib
@@ -267,13 +281,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
267
281
  version: '2.0'
268
282
  required_rubygems_version: !ruby/object:Gem::Requirement
269
283
  requirements:
270
- - - ">="
284
+ - - ">"
271
285
  - !ruby/object:Gem::Version
272
- version: '0'
286
+ version: 1.3.1
273
287
  requirements: []
274
- rubyforge_project:
275
- rubygems_version: 2.6.8
276
- signing_key:
288
+ rubyforge_project:
289
+ rubygems_version: 2.6.10
290
+ signing_key:
277
291
  specification_version: 4
278
292
  summary: 'Net::SSH: a pure-Ruby implementation of the SSH2 client protocol.'
279
293
  test_files: []
metadata.gz.sig CHANGED
Binary file