net-ssh 4.0.0.rc1 → 4.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
@@ -37,7 +37,7 @@ module Net; module SSH
37
37
  # whether the file describes an RSA or DSA key, and will load it
38
38
  # appropriately. The new key is returned. If the key itself is
39
39
  # encrypted (requiring a passphrase to use), the user will be
40
- # prompted to enter their password unless passphrase works.
40
+ # prompted to enter their password unless passphrase works.
41
41
  def load_private_key(filename, passphrase=nil, ask_passphrase=true, prompt=Prompt.default)
42
42
  data = File.read(File.expand_path(filename))
43
43
  load_data_private_key(data, passphrase, ask_passphrase, filename, prompt)
@@ -47,7 +47,7 @@ module Net; module SSH
47
47
  # whether the file describes an RSA or DSA key, and will load it
48
48
  # appropriately. The new key is returned. If the key itself is
49
49
  # encrypted (requiring a passphrase to use), the user will be
50
- # prompted to enter their password unless passphrase works.
50
+ # prompted to enter their password unless passphrase works.
51
51
  def load_data_private_key(data, passphrase=nil, ask_passphrase=true, filename="", prompt=Prompt.default)
52
52
  key_read, error_classes = classify_key(data, filename)
53
53
 
@@ -55,7 +55,7 @@ module Net; module SSH
55
55
  tries = 0
56
56
 
57
57
  prompter = nil
58
- result =
58
+ result =
59
59
  begin
60
60
  key_read[data, passphrase || 'invalid']
61
61
  rescue *error_classes
@@ -109,11 +109,8 @@ module Net; module SSH
109
109
  # appropriately.
110
110
  def classify_key(data, filename)
111
111
  if data.match(/-----BEGIN OPENSSH PRIVATE KEY-----/)
112
- if defined?(Net::SSH::Authentication::ED25519)
113
- return ->(key_data, passphrase) { Net::SSH::Authentication::ED25519::PrivKey.read(key_data, passphrase) }, [ArgumentError]
114
- else
115
- raise OpenSSL::PKey::PKeyError, "OpenSSH keys only supported if ED25519 is available - #{ED25519_LOAD_ERROR}"
116
- end
112
+ Net::SSH::Authentication::ED25519Loader.raiseUnlessLoaded("OpenSSH keys only supported if ED25519 is available")
113
+ return ->(key_data, passphrase) { Net::SSH::Authentication::ED25519::PrivKey.read(key_data, passphrase) }, [ArgumentError]
117
114
  elsif OpenSSL::PKey.respond_to?(:read)
118
115
  return ->(key_data, passphrase) { OpenSSL::PKey.read(key_data, passphrase) }, [ArgumentError, OpenSSL::PKey::PKeyError]
119
116
  elsif data.match(/-----BEGIN DSA PRIVATE KEY-----/)
@@ -24,14 +24,13 @@ module Net; module SSH
24
24
  @default ||= new(options)
25
25
  end
26
26
 
27
- def initialize(options = {})
28
- end
27
+ def initialize(options = {}); end
29
28
 
30
29
  # default prompt object implementation. More sophisticated implemenetations
31
30
  # might implement caching.
32
31
  class Prompter
33
32
  def initialize(info)
34
- if info[:type] == 'keyboard-interactive' # rubocop:disable Style/GuardClause
33
+ if info[:type] == 'keyboard-interactive'
35
34
  $stdout.puts(info[:name]) unless info[:name].empty?
36
35
  $stdout.puts(info[:instruction]) unless info[:instruction].empty?
37
36
  end
@@ -49,8 +48,7 @@ module Net; module SSH
49
48
 
50
49
  # success method will be called when the password was accepted
51
50
  # It's a good time to save password asked to a cache.
52
- def success
53
- end
51
+ def success; end
54
52
  end
55
53
 
56
54
  # start password session. Multiple questions might be asked multiple times
@@ -61,4 +59,4 @@ module Net; module SSH
61
59
  end
62
60
  end
63
61
 
64
- end; end
62
+ end; end
@@ -87,11 +87,11 @@ module Net; module SSH; module Proxy
87
87
  body = socket.read(headers["Content-Length"].to_i)
88
88
  end
89
89
 
90
- return { :version => version,
91
- :code => code.to_i,
92
- :reason => reason,
93
- :headers => headers,
94
- :body => body }
90
+ return { version: version,
91
+ code: code.to_i,
92
+ reason: reason,
93
+ headers: headers,
94
+ body: body }
95
95
  end
96
96
  end
97
97
 
@@ -71,7 +71,7 @@ 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(options[:host] || "localhost", options.merge(kex: "test", host_key: "ssh-rsa", paranoid: false, proxy: socket(options)))
75
75
  end
76
76
 
77
77
  # First asserts that a story has been described (see #story). Then yields,
@@ -31,10 +31,10 @@ module Net; module SSH; module Test
31
31
  buffer = @connection.next_message
32
32
  raise Net::SSH::Exception, "expected NEWKEYS" unless buffer.type == NEWKEYS
33
33
 
34
- { :session_id => "abc-xyz",
35
- :server_key => OpenSSL::PKey::RSA.new(512),
36
- :shared_secret => OpenSSL::BN.new("1234567890", 10),
37
- :hashing_algorithm => OpenSSL::Digest::SHA1 }
34
+ { session_id: "abc-xyz",
35
+ server_key: OpenSSL::PKey::RSA.new(512),
36
+ shared_secret: OpenSSL::BN.new("1234567890", 10),
37
+ hashing_algorithm: OpenSSL::Digest::SHA1 }
38
38
  end
39
39
  end
40
40
 
@@ -6,6 +6,7 @@ require 'net/ssh/transport/constants'
6
6
  require 'net/ssh/transport/hmac'
7
7
  require 'net/ssh/transport/kex'
8
8
  require 'net/ssh/transport/server_version'
9
+ require 'net/ssh/authentication/ed25519_loader'
9
10
 
10
11
  module Net; module SSH; module Transport
11
12
 
@@ -22,32 +23,34 @@ module Net; module SSH; module Transport
22
23
  # Define the default algorithms, in order of preference, supported by
23
24
  # Net::SSH.
24
25
  ALGORITHMS = {
25
- :host_key => %w(ssh-rsa ssh-dss
26
- ssh-rsa-cert-v01@openssh.com
27
- ssh-rsa-cert-v00@openssh.com),
28
- :kex => %w(diffie-hellman-group-exchange-sha1
29
- diffie-hellman-group1-sha1
30
- diffie-hellman-group14-sha1
31
- diffie-hellman-group-exchange-sha256),
32
- :encryption => %w(aes128-cbc 3des-cbc blowfish-cbc cast128-cbc
33
- aes192-cbc aes256-cbc rijndael-cbc@lysator.liu.se
34
- idea-cbc none arcfour128 arcfour256 arcfour
35
- aes128-ctr aes192-ctr aes256-ctr
36
- cast128-ctr blowfish-ctr 3des-ctr
37
- ),
38
-
39
- :hmac => %w(hmac-sha1 hmac-md5 hmac-sha1-96 hmac-md5-96
40
- hmac-ripemd160 hmac-ripemd160@openssh.com
41
- hmac-sha2-256 hmac-sha2-512 hmac-sha2-256-96
42
- hmac-sha2-512-96 none),
43
-
44
- :compression => %w(none zlib@openssh.com zlib),
45
- :language => %w()
26
+ host_key: %w(ssh-rsa ssh-dss
27
+ ssh-rsa-cert-v01@openssh.com
28
+ ssh-rsa-cert-v00@openssh.com),
29
+ kex: %w(diffie-hellman-group-exchange-sha1
30
+ diffie-hellman-group1-sha1
31
+ diffie-hellman-group14-sha1
32
+ diffie-hellman-group-exchange-sha256),
33
+ encryption: %w(aes128-cbc 3des-cbc blowfish-cbc cast128-cbc
34
+ aes192-cbc aes256-cbc rijndael-cbc@lysator.liu.se
35
+ idea-cbc none arcfour128 arcfour256 arcfour
36
+ aes128-ctr aes192-ctr aes256-ctr
37
+ cast128-ctr blowfish-ctr 3des-ctr),
38
+
39
+ hmac: %w(hmac-sha1 hmac-md5 hmac-sha1-96 hmac-md5-96
40
+ hmac-ripemd160 hmac-ripemd160@openssh.com
41
+ hmac-sha2-256 hmac-sha2-512 hmac-sha2-256-96
42
+ hmac-sha2-512-96 none),
43
+
44
+ compression: %w(none zlib@openssh.com zlib),
45
+ language: %w()
46
46
  }
47
47
  if defined?(OpenSSL::PKey::EC)
48
48
  ALGORITHMS[:host_key] += %w(ecdsa-sha2-nistp256
49
49
  ecdsa-sha2-nistp384
50
50
  ecdsa-sha2-nistp521)
51
+ if Net::SSH::Authentication::ED25519Loader::LOADED
52
+ ALGORITHMS[:host_key] += %w(ssh-ed25519)
53
+ end
51
54
  ALGORITHMS[:kex] += %w(ecdh-sha2-nistp256
52
55
  ecdh-sha2-nistp384
53
56
  ecdh-sha2-nistp521)
@@ -251,7 +254,7 @@ module Net; module SSH; module Transport
251
254
 
252
255
  # Parses a KEXINIT packet from the server.
253
256
  def parse_server_algorithm_packet(packet)
254
- data = { :raw => packet.content }
257
+ data = { raw: packet.content }
255
258
 
256
259
  packet.read(16) # skip the cookie value
257
260
 
@@ -352,13 +355,13 @@ module Net; module SSH; module Transport
352
355
  debug { "exchanging keys" }
353
356
 
354
357
  algorithm = Kex::MAP[kex].new(self, session,
355
- :client_version_string => Net::SSH::Transport::ServerVersion::PROTO_VERSION,
356
- :server_version_string => session.server_version.version,
357
- :server_algorithm_packet => @server_packet,
358
- :client_algorithm_packet => @client_packet,
359
- :need_bytes => kex_byte_requirement,
360
- :minimum_dh_bits => options[:minimum_dh_bits],
361
- :logger => logger)
358
+ client_version_string: Net::SSH::Transport::ServerVersion::PROTO_VERSION,
359
+ server_version_string: session.server_version.version,
360
+ server_algorithm_packet: @server_packet,
361
+ client_algorithm_packet: @client_packet,
362
+ need_bytes: kex_byte_requirement,
363
+ minimum_dh_bits: options[:minimum_dh_bits],
364
+ logger: logger)
362
365
  result = algorithm.exchange_keys
363
366
 
364
367
  secret = result[:shared_secret].to_ssh
@@ -368,7 +371,7 @@ module Net; module SSH; module Transport
368
371
  @session_id ||= hash
369
372
 
370
373
  key = Proc.new { |salt| digester.digest(secret + hash + salt + @session_id) }
371
-
374
+
372
375
  iv_client = key["A"]
373
376
  iv_server = key["B"]
374
377
  key_client = key["C"]
@@ -376,26 +379,26 @@ module Net; module SSH; module Transport
376
379
  mac_key_client = key["E"]
377
380
  mac_key_server = key["F"]
378
381
 
379
- parameters = { :shared => secret, :hash => hash, :digester => digester }
380
-
381
- cipher_client = CipherFactory.get(encryption_client, parameters.merge(:iv => iv_client, :key => key_client, :encrypt => true))
382
- cipher_server = CipherFactory.get(encryption_server, parameters.merge(:iv => iv_server, :key => key_server, :decrypt => true))
382
+ parameters = { shared: secret, hash: hash, digester: digester }
383
+
384
+ cipher_client = CipherFactory.get(encryption_client, parameters.merge(iv: iv_client, key: key_client, encrypt: true))
385
+ cipher_server = CipherFactory.get(encryption_server, parameters.merge(iv: iv_server, key: key_server, decrypt: true))
383
386
 
384
387
  mac_client = HMAC.get(hmac_client, mac_key_client, parameters)
385
388
  mac_server = HMAC.get(hmac_server, mac_key_server, parameters)
386
389
 
387
- session.configure_client :cipher => cipher_client, :hmac => mac_client,
388
- :compression => normalize_compression_name(compression_client),
389
- :compression_level => options[:compression_level],
390
- :rekey_limit => options[:rekey_limit],
391
- :max_packets => options[:rekey_packet_limit],
392
- :max_blocks => options[:rekey_blocks_limit]
393
-
394
- session.configure_server :cipher => cipher_server, :hmac => mac_server,
395
- :compression => normalize_compression_name(compression_server),
396
- :rekey_limit => options[:rekey_limit],
397
- :max_packets => options[:rekey_packet_limit],
398
- :max_blocks => options[:rekey_blocks_limit]
390
+ session.configure_client cipher: cipher_client, hmac: mac_client,
391
+ compression: normalize_compression_name(compression_client),
392
+ compression_level: options[:compression_level],
393
+ rekey_limit: options[:rekey_limit],
394
+ max_packets: options[:rekey_packet_limit],
395
+ max_blocks: options[:rekey_blocks_limit]
396
+
397
+ session.configure_server cipher: cipher_server, hmac: mac_server,
398
+ compression: normalize_compression_name(compression_server),
399
+ rekey_limit: options[:rekey_limit],
400
+ max_packets: options[:rekey_packet_limit],
401
+ max_blocks: options[:rekey_blocks_limit]
399
402
 
400
403
  @initialized = true
401
404
  end
@@ -33,8 +33,8 @@ module Net; module SSH; module Transport
33
33
  }
34
34
 
35
35
  # Ruby's OpenSSL bindings always return a key length of 16 for RC4 ciphers
36
- # resulting in the error: OpenSSL::CipherError: key length too short.
37
- # The following ciphers will override this key length.
36
+ # resulting in the error: OpenSSL::CipherError: key length too short.
37
+ # The following ciphers will override this key length.
38
38
  KEY_LEN_OVERRIDE = {
39
39
  "arcfour256" => 32,
40
40
  "arcfour512" => 64
@@ -57,7 +57,7 @@ module Net; module SSH; module Transport
57
57
  def self.get(name, options={})
58
58
  ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'"
59
59
  return IdentityCipher if ossl_name == "none"
60
- cipher = OpenSSL::Cipher::Cipher.new(ossl_name)
60
+ cipher = OpenSSL::Cipher.new(ossl_name)
61
61
 
62
62
  cipher.send(options[:encrypt] ? :encrypt : :decrypt)
63
63
 
@@ -85,7 +85,7 @@ module Net; module SSH; module Transport
85
85
  result = [0, 0]
86
86
  result << 0 if options[:iv_len]
87
87
  else
88
- cipher = OpenSSL::Cipher::Cipher.new(ossl_name)
88
+ cipher = OpenSSL::Cipher.new(ossl_name)
89
89
  key_len = KEY_LEN_OVERRIDE[name] || cipher.key_len
90
90
  cipher.key_len = key_len
91
91
 
@@ -69,10 +69,10 @@ module Net; module SSH; module Transport; module Kex
69
69
  session_id = verify_signature(result)
70
70
  confirm_newkeys
71
71
 
72
- return { :session_id => session_id,
73
- :server_key => result[:server_key],
74
- :shared_secret => result[:shared_secret],
75
- :hashing_algorithm => digester }
72
+ return { session_id: session_id,
73
+ server_key: result[:server_key],
74
+ shared_secret: result[:shared_secret],
75
+ hashing_algorithm: digester }
76
76
  end
77
77
 
78
78
  private
@@ -115,11 +115,22 @@ module Net; module SSH; module Transport; module Kex
115
115
  def generate_key #:nodoc:
116
116
  dh = OpenSSL::PKey::DH.new
117
117
 
118
- dh.p, dh.g = get_parameters
119
- dh.priv_key = OpenSSL::BN.rand(data[:need_bytes] * 8)
120
-
121
- dh.generate_key! until dh.valid?
118
+ if dh.respond_to?(:set_pqg)
119
+ p, g = get_parameters
120
+ dh.set_pqg(p, nil, g)
121
+ else
122
+ dh.p, dh.g = get_parameters
123
+ end
122
124
 
125
+ dh.generate_key!
126
+ until dh.valid? && dh.priv_key.num_bytes == data[:need_bytes]
127
+ if dh.respond_to?(:set_key)
128
+ dh.set_key(nil, OpenSSL::BN.rand(data[:need_bytes] * 8))
129
+ else
130
+ dh.priv_key = OpenSSL::BN.rand(data[:need_bytes] * 8)
131
+ end
132
+ dh.generate_key!
133
+ end
123
134
  dh
124
135
  end
125
136
 
@@ -170,7 +181,7 @@ module Net; module SSH; module Transport; module Kex
170
181
 
171
182
  blob, fingerprint = generate_key_fingerprint(key)
172
183
 
173
- unless connection.host_key_verifier.verify(:key => key, :key_blob => blob, :fingerprint => fingerprint, :session => connection)
184
+ unless connection.host_key_verifier.verify(key: key, key_blob: blob, fingerprint: fingerprint, session: connection)
174
185
  raise Net::SSH::Exception, "host key verification failed"
175
186
  end
176
187
  end
@@ -164,7 +164,7 @@ module Net; module SSH; module Transport
164
164
  # Returns a hash of information about the peer (remote) side of the socket,
165
165
  # including :ip, :port, :host, and :canonized (see #host_as_string).
166
166
  def peer
167
- @peer ||= { :ip => socket.peer_ip, :port => @port.to_i, :host => @host, :canonized => host_as_string }
167
+ @peer ||= { ip: socket.peer_ip, port: @port.to_i, host: @host, canonized: host_as_string }
168
168
  end
169
169
 
170
170
  # Blocks until a new packet is available to be read, and returns that
@@ -55,7 +55,7 @@ module Net; module SSH
55
55
 
56
56
  # The prerelease component of this version of the Net::SSH library
57
57
  # nil allowed
58
- PRE = "rc1"
58
+ PRE = "rc2"
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)
@@ -1,20 +1,21 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIDODCCAiCgAwIBAgIBADANBgkqhkiG9w0BAQUFADBCMRAwDgYDVQQDDAduZXQt
3
- c3NoMRkwFwYKCZImiZPyLGQBGRYJc29sdXRpb3VzMRMwEQYKCZImiZPyLGQBGRYD
4
- Y29tMB4XDTE1MTIwNjIxMDYyNFoXDTE2MTIwNTIxMDYyNFowQjEQMA4GA1UEAwwH
5
- bmV0LXNzaDEZMBcGCgmSJomT8ixkARkWCXNvbHV0aW91czETMBEGCgmSJomT8ixk
6
- ARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMYnhNtn0f6p
7
- nTylB8mE8lMdoMLJC8KwpMWsvk73Pe2WVDsH/OSwwwz6oUGk1i70cJyDjIEBNpwT
8
- 88GpVXJSumvqVsf9fCg3mWNeb5t0J+aeNm9MIvYVMTqj5tydoXQiwnILRDYHV9tZ
9
- 1c3o59/VlahSTpZ7YEgzVufpAkvEGkbJiG849exiipK7MN/ZIkMOxYVnyRXk43Xc
10
- 6GYlsHOfSgPwcXwW5g57DCwLQLWrjDsTka28dxDmO7B5Lv5EqzINxVxWsu43OgZG
11
- 21Io/jIyf5PNpeKPKNGDuAQJ8mvdMYBJoDhtCwgsUYbl0BZzA7g4ytl51HtIeP+j
12
- Qp/eAvs/RrECAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUBfKiwO2eM4NE
13
- iRrVG793qEPLYyMwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQCfZFdb
14
- p4jzkfIzGDbiOxd0R8sdqJoC4nMLEgnQ7dLulawwA3IXe3sHAKgA5kmH3prsKc5H
15
- zVmM5NlH2P1nRbegIkQTYiIod1hZQCNxdmVG/fprMqPq0ybpUOjjrP5pj0OtszE1
16
- F2dQia1hOEstMR+n0nAtWII9HJAEyeZjVV0s2Cl7Pt85XJ3hxFcCKwzqsK5xRI7a
17
- B3vwh3/JJYrFonIohQ//Lg9qTZASEkoKLlq1/hFeICoCGGIGLq45ZB7CzXLooCKi
18
- s/ZUKye79ELwFYKJOhjW5g725OL3hy+llhEleytwKRwgXFQBPTC4f5UkdxZVVWGH
19
- e2C9M1m/2odPZo8h
2
+ MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMQ8wDQYDVQQDDAZuZXRz
3
+ c2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZFgNj
4
+ b20wHhcNMTYxMjE1MTgwNTIyWhcNMTcxMjE1MTgwNTIyWjBBMQ8wDQYDVQQDDAZu
5
+ ZXRzc2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZ
6
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGJ4TbZ9H+qZ08
7
+ pQfJhPJTHaDCyQvCsKTFrL5O9z3tllQ7B/zksMMM+qFBpNYu9HCcg4yBATacE/PB
8
+ qVVyUrpr6lbH/XwoN5ljXm+bdCfmnjZvTCL2FTE6o+bcnaF0IsJyC0Q2B1fbWdXN
9
+ 6Off1ZWoUk6We2BIM1bn6QJLxBpGyYhvOPXsYoqSuzDf2SJDDsWFZ8kV5ON13Ohm
10
+ JbBzn0oD8HF8FuYOewwsC0C1q4w7E5GtvHcQ5juweS7+RKsyDcVcVrLuNzoGRttS
11
+ KP4yMn+TzaXijyjRg7gECfJr3TGASaA4bQsILFGG5dAWcwO4OMrZedR7SHj/o0Kf
12
+ 3gL7P0axAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
13
+ BBQF8qLA7Z4zg0SJGtUbv3eoQ8tjIzAfBgNVHREEGDAWgRRuZXRzc2hAc29sdXRp
14
+ b3VzLmNvbTAfBgNVHRIEGDAWgRRuZXRzc2hAc29sdXRpb3VzLmNvbTANBgkqhkiG
15
+ 9w0BAQUFAAOCAQEATd8If+Ytmhf5lELy24j76ahGv64m518WTCdV2nIViGXB2BnV
16
+ uLQylGRb1rcgUS3Eh9TE28hqrfhotKS6a96qF9kN0mY2H6UwPWswJ+tj3gA1vLW8
17
+ wlZNlYGJ91Ig9zULPSbATyOOprUZyggy5p1260BaaI3LQYDeGJOSqpHCVu+TuMcy
18
+ k00ofiLT1crDSUl2WE/OIFK8AXpmd798AMsef8okHeoo+Dj7zCXn0VSimN+MO1mE
19
+ L4d54WIy4HkZCqQXoTSiK5HZMIdXkPk3F1bZdJ8Dy1sMRru0rUkkM5mW7TQ75mfW
20
+ Zp0QrZyNZhtitrXFbZneGRrIA/8G2Krft5Ly/A==
20
21
  -----END CERTIFICATE-----
@@ -35,10 +35,9 @@ Gem::Specification.new do |spec|
35
35
  end
36
36
 
37
37
  spec.add_development_dependency "bundler", "~> 1.11"
38
- spec.add_development_dependency "rake", "~> 11.1"
39
- spec.add_development_dependency "minitest", "~> 5.0"
40
- spec.add_development_dependency "rubocop", "~> 0.39.0"
41
- spec.add_development_dependency "mocha", ">= 1.1.0"
42
38
 
43
- spec.add_dependency('jruby-pageant', '>= 1.1.1') if RUBY_ENGINE == 'jruby'
39
+ spec.add_development_dependency "rake", "~> 12.0"
40
+ spec.add_development_dependency "minitest", "~> 5.10"
41
+ spec.add_development_dependency "rubocop", "~> 0.46.0"
42
+ spec.add_development_dependency "mocha", ">= 1.2.1"
44
43
  end
@@ -14,7 +14,7 @@ require 'net/ssh'
14
14
  [['arcfour128', 16], ['arcfour256', 32], ['arcfour512', 64]].each do |cipher|
15
15
  print "#{cipher[0]}: "
16
16
  a = Net::SSH::Transport::CipherFactory.get_lengths(cipher[0])
17
- b = Net::SSH::Transport::CipherFactory.get(cipher[0], :key => ([].fill('x', 0, cipher[1]).join))
17
+ b = Net::SSH::Transport::CipherFactory.get(cipher[0], key: ([].fill('x', 0, cipher[1]).join))
18
18
  puts "#{a} #{b.class}"
19
19
  end
20
20
 
@@ -37,7 +37,7 @@ pass = ask("Password: ") { |q| q.echo = "*" }
37
37
  puts "Configure your browser proxy to localhost:#{LOCAL_PORT}"
38
38
 
39
39
  begin
40
- session = Net::SSH.start(host, user, :password => pass)
40
+ session = Net::SSH.start(host, user, password: pass)
41
41
  session.forward.local(LOCAL_PORT, host, PROXY_PORT)
42
42
  session.loop{true}
43
43
  rescue => e
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.rc1
4
+ version: 4.0.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamis Buck
@@ -12,139 +12,140 @@ bindir: exe
12
12
  cert_chain:
13
13
  - |
14
14
  -----BEGIN CERTIFICATE-----
15
- MIIDODCCAiCgAwIBAgIBADANBgkqhkiG9w0BAQUFADBCMRAwDgYDVQQDDAduZXQt
16
- c3NoMRkwFwYKCZImiZPyLGQBGRYJc29sdXRpb3VzMRMwEQYKCZImiZPyLGQBGRYD
17
- Y29tMB4XDTE1MTIwNjIxMDYyNFoXDTE2MTIwNTIxMDYyNFowQjEQMA4GA1UEAwwH
18
- bmV0LXNzaDEZMBcGCgmSJomT8ixkARkWCXNvbHV0aW91czETMBEGCgmSJomT8ixk
19
- ARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMYnhNtn0f6p
20
- nTylB8mE8lMdoMLJC8KwpMWsvk73Pe2WVDsH/OSwwwz6oUGk1i70cJyDjIEBNpwT
21
- 88GpVXJSumvqVsf9fCg3mWNeb5t0J+aeNm9MIvYVMTqj5tydoXQiwnILRDYHV9tZ
22
- 1c3o59/VlahSTpZ7YEgzVufpAkvEGkbJiG849exiipK7MN/ZIkMOxYVnyRXk43Xc
23
- 6GYlsHOfSgPwcXwW5g57DCwLQLWrjDsTka28dxDmO7B5Lv5EqzINxVxWsu43OgZG
24
- 21Io/jIyf5PNpeKPKNGDuAQJ8mvdMYBJoDhtCwgsUYbl0BZzA7g4ytl51HtIeP+j
25
- Qp/eAvs/RrECAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUBfKiwO2eM4NE
26
- iRrVG793qEPLYyMwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQCfZFdb
27
- p4jzkfIzGDbiOxd0R8sdqJoC4nMLEgnQ7dLulawwA3IXe3sHAKgA5kmH3prsKc5H
28
- zVmM5NlH2P1nRbegIkQTYiIod1hZQCNxdmVG/fprMqPq0ybpUOjjrP5pj0OtszE1
29
- F2dQia1hOEstMR+n0nAtWII9HJAEyeZjVV0s2Cl7Pt85XJ3hxFcCKwzqsK5xRI7a
30
- B3vwh3/JJYrFonIohQ//Lg9qTZASEkoKLlq1/hFeICoCGGIGLq45ZB7CzXLooCKi
31
- s/ZUKye79ELwFYKJOhjW5g725OL3hy+llhEleytwKRwgXFQBPTC4f5UkdxZVVWGH
32
- e2C9M1m/2odPZo8h
15
+ MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMQ8wDQYDVQQDDAZuZXRz
16
+ c2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZFgNj
17
+ b20wHhcNMTYxMjE1MTgwNTIyWhcNMTcxMjE1MTgwNTIyWjBBMQ8wDQYDVQQDDAZu
18
+ ZXRzc2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZ
19
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGJ4TbZ9H+qZ08
20
+ pQfJhPJTHaDCyQvCsKTFrL5O9z3tllQ7B/zksMMM+qFBpNYu9HCcg4yBATacE/PB
21
+ qVVyUrpr6lbH/XwoN5ljXm+bdCfmnjZvTCL2FTE6o+bcnaF0IsJyC0Q2B1fbWdXN
22
+ 6Off1ZWoUk6We2BIM1bn6QJLxBpGyYhvOPXsYoqSuzDf2SJDDsWFZ8kV5ON13Ohm
23
+ JbBzn0oD8HF8FuYOewwsC0C1q4w7E5GtvHcQ5juweS7+RKsyDcVcVrLuNzoGRttS
24
+ KP4yMn+TzaXijyjRg7gECfJr3TGASaA4bQsILFGG5dAWcwO4OMrZedR7SHj/o0Kf
25
+ 3gL7P0axAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
26
+ BBQF8qLA7Z4zg0SJGtUbv3eoQ8tjIzAfBgNVHREEGDAWgRRuZXRzc2hAc29sdXRp
27
+ b3VzLmNvbTAfBgNVHRIEGDAWgRRuZXRzc2hAc29sdXRpb3VzLmNvbTANBgkqhkiG
28
+ 9w0BAQUFAAOCAQEATd8If+Ytmhf5lELy24j76ahGv64m518WTCdV2nIViGXB2BnV
29
+ uLQylGRb1rcgUS3Eh9TE28hqrfhotKS6a96qF9kN0mY2H6UwPWswJ+tj3gA1vLW8
30
+ wlZNlYGJ91Ig9zULPSbATyOOprUZyggy5p1260BaaI3LQYDeGJOSqpHCVu+TuMcy
31
+ k00ofiLT1crDSUl2WE/OIFK8AXpmd798AMsef8okHeoo+Dj7zCXn0VSimN+MO1mE
32
+ L4d54WIy4HkZCqQXoTSiK5HZMIdXkPk3F1bZdJ8Dy1sMRru0rUkkM5mW7TQ75mfW
33
+ Zp0QrZyNZhtitrXFbZneGRrIA/8G2Krft5Ly/A==
33
34
  -----END CERTIFICATE-----
34
- date: 2016-11-29 00:00:00.000000000 Z
35
+ date: 2016-12-15 00:00:00.000000000 Z
35
36
  dependencies:
36
37
  - !ruby/object:Gem::Dependency
37
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.10
43
44
  type: :development
44
45
  prerelease: false
45
46
  version_requirements: !ruby/object:Gem::Requirement
46
47
  requirements:
47
- - - ~>
48
+ - - "~>"
48
49
  - !ruby/object:Gem::Version
49
50
  version: 1.0.10
50
51
  - !ruby/object:Gem::Dependency
51
52
  name: rbnacl
52
53
  requirement: !ruby/object:Gem::Requirement
53
54
  requirements:
54
- - - ~>
55
+ - - "~>"
55
56
  - !ruby/object:Gem::Version
56
57
  version: 3.4.0
57
58
  type: :development
58
59
  prerelease: false
59
60
  version_requirements: !ruby/object:Gem::Requirement
60
61
  requirements:
61
- - - ~>
62
+ - - "~>"
62
63
  - !ruby/object:Gem::Version
63
64
  version: 3.4.0
64
65
  - !ruby/object:Gem::Dependency
65
66
  name: bcrypt_pbkdf
66
67
  requirement: !ruby/object:Gem::Requirement
67
68
  requirements:
68
- - - ~>
69
+ - - "~>"
69
70
  - !ruby/object:Gem::Version
70
71
  version: 1.0.0
71
72
  type: :development
72
73
  prerelease: false
73
74
  version_requirements: !ruby/object:Gem::Requirement
74
75
  requirements:
75
- - - ~>
76
+ - - "~>"
76
77
  - !ruby/object:Gem::Version
77
78
  version: 1.0.0
78
79
  - !ruby/object:Gem::Dependency
79
80
  name: bundler
80
81
  requirement: !ruby/object:Gem::Requirement
81
82
  requirements:
82
- - - ~>
83
+ - - "~>"
83
84
  - !ruby/object:Gem::Version
84
85
  version: '1.11'
85
86
  type: :development
86
87
  prerelease: false
87
88
  version_requirements: !ruby/object:Gem::Requirement
88
89
  requirements:
89
- - - ~>
90
+ - - "~>"
90
91
  - !ruby/object:Gem::Version
91
92
  version: '1.11'
92
93
  - !ruby/object:Gem::Dependency
93
94
  name: rake
94
95
  requirement: !ruby/object:Gem::Requirement
95
96
  requirements:
96
- - - ~>
97
+ - - "~>"
97
98
  - !ruby/object:Gem::Version
98
- version: '11.1'
99
+ version: '12.0'
99
100
  type: :development
100
101
  prerelease: false
101
102
  version_requirements: !ruby/object:Gem::Requirement
102
103
  requirements:
103
- - - ~>
104
+ - - "~>"
104
105
  - !ruby/object:Gem::Version
105
- version: '11.1'
106
+ version: '12.0'
106
107
  - !ruby/object:Gem::Dependency
107
108
  name: minitest
108
109
  requirement: !ruby/object:Gem::Requirement
109
110
  requirements:
110
- - - ~>
111
+ - - "~>"
111
112
  - !ruby/object:Gem::Version
112
- version: '5.0'
113
+ version: '5.10'
113
114
  type: :development
114
115
  prerelease: false
115
116
  version_requirements: !ruby/object:Gem::Requirement
116
117
  requirements:
117
- - - ~>
118
+ - - "~>"
118
119
  - !ruby/object:Gem::Version
119
- version: '5.0'
120
+ version: '5.10'
120
121
  - !ruby/object:Gem::Dependency
121
122
  name: rubocop
122
123
  requirement: !ruby/object:Gem::Requirement
123
124
  requirements:
124
- - - ~>
125
+ - - "~>"
125
126
  - !ruby/object:Gem::Version
126
- version: 0.39.0
127
+ version: 0.46.0
127
128
  type: :development
128
129
  prerelease: false
129
130
  version_requirements: !ruby/object:Gem::Requirement
130
131
  requirements:
131
- - - ~>
132
+ - - "~>"
132
133
  - !ruby/object:Gem::Version
133
- version: 0.39.0
134
+ version: 0.46.0
134
135
  - !ruby/object:Gem::Dependency
135
136
  name: mocha
136
137
  requirement: !ruby/object:Gem::Requirement
137
138
  requirements:
138
- - - '>='
139
+ - - ">="
139
140
  - !ruby/object:Gem::Version
140
- version: 1.1.0
141
+ version: 1.2.1
141
142
  type: :development
142
143
  prerelease: false
143
144
  version_requirements: !ruby/object:Gem::Requirement
144
145
  requirements:
145
- - - '>='
146
+ - - ">="
146
147
  - !ruby/object:Gem::Version
147
- version: 1.1.0
148
+ version: 1.2.1
148
149
  description: 'Net::SSH: a pure-Ruby implementation of the SSH2 client protocol. It
149
150
  allows you to write programs that invoke and interact with processes on remote servers,
150
151
  via SSH2.'
@@ -156,10 +157,10 @@ extra_rdoc_files:
156
157
  - LICENSE.txt
157
158
  - README.rdoc
158
159
  files:
159
- - .gitignore
160
- - .rubocop.yml
161
- - .rubocop_todo.yml
162
- - .travis.yml
160
+ - ".gitignore"
161
+ - ".rubocop.yml"
162
+ - ".rubocop_todo.yml"
163
+ - ".travis.yml"
163
164
  - CHANGES.txt
164
165
  - Gemfile
165
166
  - Gemfile.norbnacl
@@ -267,19 +268,18 @@ require_paths:
267
268
  - lib
268
269
  required_ruby_version: !ruby/object:Gem::Requirement
269
270
  requirements:
270
- - - '>='
271
+ - - ">="
271
272
  - !ruby/object:Gem::Version
272
273
  version: '2.0'
273
274
  required_rubygems_version: !ruby/object:Gem::Requirement
274
275
  requirements:
275
- - - '>'
276
+ - - ">"
276
277
  - !ruby/object:Gem::Version
277
278
  version: 1.3.1
278
279
  requirements: []
279
280
  rubyforge_project:
280
- rubygems_version: 2.6.8
281
+ rubygems_version: 2.5.1
281
282
  signing_key:
282
283
  specification_version: 4
283
284
  summary: 'Net::SSH: a pure-Ruby implementation of the SSH2 client protocol.'
284
285
  test_files: []
285
- has_rdoc: