net-ssh 4.1.0 → 4.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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