net-ssh 2.8.0 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.9.3"
4
+ - "2.0.0"
5
+ - "2.1.0"
6
+
7
+
8
+ install: gem install jeweler test-unit mocha
9
+
10
+ script: rake test
11
+
@@ -1,5 +1,24 @@
1
1
 
2
2
 
3
+ === 2.9.0 / 30 Apr 2014
4
+
5
+ * New ciphers [chr4]
6
+ * Added host keys: ssh-rsa-cert-v01@openssh.com ssh-rsa-cert-v00@openssh.com ssh-ed25519-cert-v01@openssh.com ssh-ed25519
7
+ * Added HMACs: hmac-sha2-512-etm@openssh.com hmac-sha2-256-etm@openssh.com umac-128-etm@openssh.com
8
+ * Added Kex: aes256-gcm@openssh.com aes128-gcm@openssh.com curve25519-sha256@libssh.org
9
+ * Added private key support for id_ed25519
10
+ * IdentiesOnly will not disable ssh_agent - fixes #148 and new fix for #137 [mfazekas]
11
+ * Ignore errors during ssh agent negotiation [simonswine, jasiek]
12
+ * Added an optional "options" argument to test socket open method [jefmathiot]
13
+ * Added gem signing (again) with new cert [delano]
14
+
15
+
16
+ === 2.8.1 / 19 Feb 2014
17
+
18
+ * Correct location of global known_hosts files [mfischer-zd]
19
+ * Fix for password authentication [blackpond, zachlipton, delano]
20
+
21
+
3
22
  === 2.8.0 / 01 Feb 2014
4
23
 
5
24
  * Handle ssh-rsa and ssh-dss certificate files [bobveznat]
@@ -17,6 +36,7 @@
17
36
  * Allow KeyManager to recover from incompatible agents [ecki, delano]
18
37
  * Fix for "Authentication Method determination can pick up a class from the root namespace" [dave.sieh]
19
38
 
39
+
20
40
  === 2.7.0 / 11 Sep 2013
21
41
 
22
42
  * Fix for 'Could not parse PKey: no start line' error on private keys with passphrases (issue #101) [metametaclass]
data/Rakefile CHANGED
@@ -34,8 +34,8 @@ begin
34
34
 
35
35
  s.license = "MIT"
36
36
 
37
- #s.signing_key = File.join('/mnt/gem/', 'gem-private_key.pem')
38
- #s.cert_chain = ['gem-public_cert.pem']
37
+ s.signing_key = File.join('/mnt/gem/', 'gem-private_key.pem')
38
+ s.cert_chain = ['gem-public_cert.pem']
39
39
  end
40
40
  Jeweler::GemcutterTasks.new
41
41
  rescue LoadError
@@ -1,20 +1,20 @@
1
1
  -----BEGIN CERTIFICATE-----
2
2
  MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMQ8wDQYDVQQDDAZkZWxh
3
3
  bm8xGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZFgNj
4
- b20wHhcNMTMwMjA2MTE1NzQ1WhcNMTQwMjA2MTE1NzQ1WjBBMQ8wDQYDVQQDDAZk
4
+ b20wHhcNMTQwNDMwMTczNjI2WhcNMTUwNDMwMTczNjI2WjBBMQ8wDQYDVQQDDAZk
5
5
  ZWxhbm8xGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZ
6
- FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDg1hMtl0XsMuUK
7
- AKTgYWv3gjj7vuEsE2EjT+vyBg8/LpqVVwZziiaebJT9IZiQ+sCFqbiakj0b53pI
8
- hg1yOaBEmH6/W0L7rwzqaRV9sW1eJs9JxFYQCnd67zUnzj8nnRlOjG+hhIG+Vsij
9
- npsGbt28pefuNZJjO5q2clAlfSniIIHfIsU7/StEYu6FUGOjnwryZ0r5yJlr9RrE
10
- Gs+q0DW8QnZ9UpAfuDFQZuIqeKQFFLE7nMmCGaA+0BN1nLl3fVHNbLHq7Avk8+Z+
11
- ZuuvkdscbHlO/l+3xCNQ5nUnHwq0ADAbMLOlmiYYzqXoWLjmeI6me/clktJCfN2R
12
- oZG3UQvvAgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFMSJOEtHzE4l0azv
13
- M0JK0kKNToK1MAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAtOdE73qx
14
- OH2ydi9oT2hS5f9G0y1Z70Tlwh+VGExyfxzVE9XwC+iPpJxNraiHYgF/9/oky7ZZ
15
- R9q0/tJneuhAenZdiQkX7oi4O3v9wRS6YHoWBxMPFKVRLNTzvVJsbmfpCAlp5/5g
16
- ps4wQFy5mibElGVlOobf/ghqZ25HS9J6kd0/C/ry0AUtTogsL7TxGwT4kbCx63ub
17
- 3vywEEhsJUzfd97GCABmtQfRTldX/j7F1z/5wd8p+hfdox1iibds9ZtfaZA3KzKn
18
- kchWN9B6zg9r1XMQ8BM2Jz0XoPanPe354+lWwjpkRKbFow/ZbQHcCLCq24+N6b6g
19
- dgKfNDzwiDpqCA==
6
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdbeFjM67+Txrq
7
+ +8HaD4wKEiacRoB8ps17Vzt9TBUyoMMj5KTtFiptr/+ZTug/YdYBquMprPsKlYM2
8
+ NoG6BzvDcvQK1zrdHnyVosIDKAHk2wnyN/psZikS1bo9nUHCS5hJdPEnQZx/MxTZ
9
+ +GjuRsiBxPYBXnqObLhR83LBeWsauWTuo5gJt1DYxDTVrLoB+Z+ceMV+3vh0HBCb
10
+ iwegkx9GWG45h5wTksUIpzOMB3VsHGtGmBjCvdCgLJ2H6b8U9rmL7chunjdqfNf3
11
+ zPtnH32c/zrFzeWJTyH2s8Ia+3D6vum2xjjn8FnLg3V4zOf5x598GFBJYDQv7zX/
12
+ rV9eCzHDAgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFA+Buc8ySEw2qKnq
13
+ VH4wh8KAm6hUMAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAYsM0M42h
14
+ ZEUXvr/i18gkwHKLFDKDAcimgCoS5+syG6rkuSOnKGQolyKTNczNM4gWJJPH5aVq
15
+ mW2BtqpIom4YRYb9m3fDNNs6kcB5DedY9UPhVvJ8XTTB2YLxLql7UJid9ZOiqWzC
16
+ OTm06w7zkAT/ldt46p6BqyUy6PW4QMg0Bq7SMfRURVrp2lvhQvBdC7oDR9CGEBZC
17
+ /Ci++ZEh/QR9qy11AHciEIXnNkytidyZtLr4MWhtbV468y6shpPYdKU/uCINSgvt
18
+ FpMAM5Nit8L8nHwf3IIUPg7lsMCRzOkQ/FD87BI3V3SnFNoTCdGgnGj3jfW4zRlL
19
+ iFyareFPA84btQ==
20
20
  -----END CERTIFICATE-----
@@ -68,7 +68,7 @@ module Net
68
68
  :rekey_blocks_limit,:rekey_limit, :rekey_packet_limit, :timeout, :verbose,
69
69
  :global_known_hosts_file, :user_known_hosts_file, :host_key_alias,
70
70
  :host_name, :user, :properties, :passphrase, :keys_only, :max_pkt_size,
71
- :max_win_size, :send_env
71
+ :max_win_size, :send_env, :use_agent
72
72
  ]
73
73
 
74
74
  # The standard means of starting a new SSH connection. When used with a
@@ -115,7 +115,7 @@ module Net
115
115
  # be forwarded
116
116
  # * :global_known_hosts_file => the location of the global known hosts
117
117
  # file. Set to an array if you want to specify multiple global known
118
- # hosts files. Defaults to %w(/etc/ssh/known_hosts /etc/ssh/known_hosts2).
118
+ # hosts files. Defaults to %w(/etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2).
119
119
  # * :hmac => the hmac algorithm (or algorithms) to use
120
120
  # * :host_key => the host key algorithm (or algorithms) to use
121
121
  # * :host_key_alias => the host name to use when looking up or adding a
@@ -166,6 +166,8 @@ module Net
166
166
  # * :user_known_hosts_file => the location of the user known hosts file.
167
167
  # Set to an array to specify multiple user known hosts files.
168
168
  # Defaults to %w(~/.ssh/known_hosts ~/.ssh/known_hosts2).
169
+ # * :use_agent => Set false to disable the use of ssh-agent. Defaults to
170
+ # true
169
171
  # * :verbose => how verbose to be (Logger verbosity constants, Logger::DEBUG
170
172
  # is very verbose, Logger::FATAL is all but silent). Logger::FATAL is the
171
173
  # default. The symbols :debug, :info, :warn, :error, and :fatal are also
@@ -77,6 +77,8 @@ module Net; module SSH; module Authentication
77
77
 
78
78
  if type == SSH2_AGENT_VERSION_RESPONSE
79
79
  raise AgentNotAvailable, "SSH2 agents are not yet supported"
80
+ elsif type == SSH2_AGENT_FAILURE
81
+ debug { "Unexpected response type==#{type}, this will be ignored" }
80
82
  elsif type != SSH_AGENT_RSA_IDENTITIES_ANSWER1 && type != SSH_AGENT_RSA_IDENTITIES_ANSWER2
81
83
  raise AgentNotAvailable, "unknown response from agent: #{type}, #{body.to_s.inspect}"
82
84
  end
@@ -37,13 +37,13 @@ module Net
37
37
  attr_reader :options
38
38
 
39
39
  # Create a new KeyManager. By default, the manager will
40
- # use the ssh-agent if it is running and the `:keys_only` option
41
- # is not true.
40
+ # use the ssh-agent if it is running and the `:use_agent` option
41
+ # is not false.
42
42
  def initialize(logger, options={})
43
43
  self.logger = logger
44
44
  @key_files = []
45
45
  @key_data = []
46
- @use_agent = !options[:keys_only]
46
+ @use_agent = !(options[:use_agent] == false)
47
47
  @known_identities = {}
48
48
  @agent = nil
49
49
  @options = options
@@ -92,8 +92,9 @@ module Net
92
92
  # ssh-agent. Note that identities from an ssh-agent are always listed
93
93
  # first in the array, with other identities coming after.
94
94
  #
95
- # If key manager was created with :keys_only option, no identities
96
- # from ssh-agent will be loaded.
95
+ # If key manager was created with :keys_only option, any identity
96
+ # from ssh-agent will be ignored unless it present in key_files or
97
+ # key_data.
97
98
  def each_identity
98
99
  prepared_identities = prepare_identities_from_files + prepare_identities_from_data
99
100
 
@@ -133,8 +133,8 @@ module Net; module SSH; module Authentication
133
133
  # by system default.
134
134
  def default_keys
135
135
  if defined?(OpenSSL::PKey::EC)
136
- %w(~/.ssh/id_dsa ~/.ssh/id_rsa ~/.ssh/id_ecdsa
137
- ~/.ssh2/id_dsa ~/.ssh2/id_rsa ~/.ssh2/id_ecdsa)
136
+ %w(~/.ssh/id_ed25519 ~/.ssh/id_rsa ~/.ssh/id_dsa ~/.ssh/id_ecdsa
137
+ ~/.ssh2/id_ed25519 ~/.ssh2/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_ecdsa)
138
138
  else
139
139
  %w(~/.ssh/id_dsa ~/.ssh/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_rsa)
140
140
  end
@@ -8,7 +8,8 @@ module Net; module SSH
8
8
  #
9
9
  # Only a subset of OpenSSH configuration options are understood:
10
10
  #
11
- # * ChallengeResponseAuthentication => maps to the :auth_methods option
11
+ # * ChallengeResponseAuthentication => maps to the :auth_methods option challenge-response (then coleasced into keyboard-interactive)
12
+ # * KbdInteractiveAuthentication => maps to the :auth_methods keyboard-interactive
12
13
  # * Ciphers => maps to the :encryption option
13
14
  # * Compression => :compression
14
15
  # * CompressionLevel => :compression_level
@@ -22,7 +23,7 @@ module Net; module SSH
22
23
  # * IdentityFile => maps to the :keys option
23
24
  # * IdentitiesOnly => :keys_only
24
25
  # * Macs => maps to the :hmac option
25
- # * PasswordAuthentication => maps to the :auth_methods option
26
+ # * PasswordAuthentication => maps to the :auth_methods option password
26
27
  # * Port => :port
27
28
  # * PreferredAuthentications => maps to the :auth_methods option
28
29
  # * ProxyCommand => maps to the :proxy option
@@ -48,7 +49,7 @@ module Net; module SSH
48
49
  def default_files
49
50
  @@default_files
50
51
  end
51
-
52
+
52
53
  def default_auth_methods
53
54
  @@default_auth_methods
54
55
  end
@@ -58,7 +59,7 @@ module Net; module SSH
58
59
  # #default_files), translates the resulting hash into the options
59
60
  # recognized by Net::SSH, and returns them.
60
61
  def for(host, files=default_files)
61
- hash = translate(files.inject({}) { |settings, file|
62
+ hash = translate(files.inject({}) { |settings, file|
62
63
  load(file, host, settings)
63
64
  })
64
65
  end
@@ -73,15 +74,13 @@ module Net; module SSH
73
74
  file = File.expand_path(path)
74
75
  return settings unless File.readable?(file)
75
76
 
76
- settings[:auth_methods] ||= default_auth_methods.clone
77
-
78
77
  globals = {}
79
78
  matched_host = nil
80
79
  multi_host = []
81
80
  seen_host = false
82
81
  IO.foreach(file) do |line|
83
82
  next if line =~ /^\s*(?:#.*)?$/
84
-
83
+
85
84
  if line =~ /^\s*(\S+)\s*=(.*)$/
86
85
  key, value = $1, $2
87
86
  else
@@ -93,14 +92,14 @@ module Net; module SSH
93
92
 
94
93
  key.downcase!
95
94
  value = $1 if value =~ /^"(.*)"$/
96
-
95
+
97
96
  value = case value.strip
98
97
  when /^\d+$/ then value.to_i
99
98
  when /^no$/i then false
100
99
  when /^yes$/i then true
101
100
  else value
102
101
  end
103
-
102
+
104
103
  if key == 'host'
105
104
  # Support "Host host1 host2 hostN".
106
105
  # See http://github.com/net-ssh/net-ssh/issues#issue/6
@@ -122,9 +121,9 @@ module Net; module SSH
122
121
  end
123
122
  end
124
123
  end
125
-
124
+
126
125
  settings = globals.merge(settings) if globals
127
-
126
+
128
127
  return settings
129
128
  end
130
129
 
@@ -133,8 +132,9 @@ module Net; module SSH
133
132
  # +settings+ hash must have Strings for keys, all downcased, and
134
133
  # the returned hash will have Symbols for keys.
135
134
  def translate(settings)
136
- settings.inject({}) do |hash, (key, value)|
137
- hash[:auth_methods] ||= settings[:auth_methods] || default_auth_methods.clone
135
+ auth_methods = default_auth_methods.clone
136
+ (auth_methods << 'challenge-response').uniq!
137
+ ret = settings.inject({:auth_methods=>auth_methods}) do |hash, (key, value)|
138
138
  case key
139
139
  when 'bindaddress' then
140
140
  hash[:bind_address] = value
@@ -175,6 +175,12 @@ module Net; module SSH
175
175
  hash[:auth_methods].delete('password')
176
176
  end
177
177
  when 'challengeresponseauthentication'
178
+ if value
179
+ (hash[:auth_methods] << 'challenge-response').uniq!
180
+ else
181
+ hash[:auth_methods].delete('challenge-response')
182
+ end
183
+ when 'kbdinteractiveauthentication'
178
184
  if value
179
185
  (hash[:auth_methods] << 'keyboard-interactive').uniq!
180
186
  else
@@ -183,7 +189,7 @@ module Net; module SSH
183
189
  when 'port'
184
190
  hash[:port] = value
185
191
  when 'preferredauthentications'
186
- hash[:auth_methods] = value.split(/,/)
192
+ hash[:auth_methods] = value.split(/,/) # TODO we should place to preferred_auth_methods rather than auth_methods
187
193
  when 'proxycommand'
188
194
  if value and !(value =~ /^none$/)
189
195
  require 'net/ssh/proxy/command'
@@ -207,6 +213,7 @@ module Net; module SSH
207
213
  end
208
214
  hash
209
215
  end
216
+ merge_challenge_response_with_keyboard_interactive(ret)
210
217
  end
211
218
 
212
219
  private
@@ -230,6 +237,14 @@ module Net; module SSH
230
237
  else size.to_i
231
238
  end
232
239
  end
240
+
241
+ def merge_challenge_response_with_keyboard_interactive(hash)
242
+ if hash[:auth_methods].include?('challenge-response')
243
+ hash[:auth_methods].delete('challenge-response')
244
+ (hash[:auth_methods] << 'keyboard-interactive').uniq!
245
+ end
246
+ hash
247
+ end
233
248
  end
234
249
  end
235
250
 
@@ -15,9 +15,17 @@ module Net; module SSH
15
15
  SUPPORTED_TYPE = %w(ssh-rsa ssh-dss
16
16
  ecdsa-sha2-nistp256
17
17
  ecdsa-sha2-nistp384
18
- ecdsa-sha2-nistp521)
18
+ ecdsa-sha2-nistp521
19
+ ssh-ed25519-cert-v01@openssh.com
20
+ ssh-rsa-cert-v01@openssh.com
21
+ ssh-rsa-cert-v00@openssh.com
22
+ ssh-ed25519
23
+ )
19
24
  else
20
- SUPPORTED_TYPE = %w(ssh-rsa ssh-dss)
25
+ SUPPORTED_TYPE = %w(ssh-rsa ssh-dss
26
+ ssh-rsa-cert-v01@openssh.com
27
+ ssh-rsa-cert-v00@openssh.com
28
+ )
21
29
  end
22
30
 
23
31
 
@@ -40,7 +48,7 @@ module Net; module SSH
40
48
  # hosts files. If the :user_known_hosts_file key is not set, the
41
49
  # default is returned (~/.ssh/known_hosts and ~/.ssh/known_hosts2). If
42
50
  # :global_known_hosts_file is not set, the default is used
43
- # (/etc/ssh/known_hosts and /etc/ssh/known_hosts2).
51
+ # (/etc/ssh/ssh_known_hosts and /etc/ssh/ssh_known_hosts2).
44
52
  #
45
53
  # If you only want the user known host files, you can pass :user as
46
54
  # the second option.
@@ -52,7 +60,7 @@ module Net; module SSH
52
60
  end
53
61
 
54
62
  if which == :all || which == :global
55
- files += Array(options[:global_known_hosts_file] || %w(/etc/ssh/known_hosts /etc/ssh/known_hosts2))
63
+ files += Array(options[:global_known_hosts_file] || %w(/etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2))
56
64
  end
57
65
 
58
66
  return files
@@ -39,7 +39,7 @@ module Net; module SSH; module Test
39
39
 
40
40
  # Allows the socket to also mimic a socket factory, simply returning
41
41
  # +self+.
42
- def open(host, port)
42
+ def open(host, port, options={})
43
43
  @host, @port = host, port
44
44
  self
45
45
  end
@@ -22,7 +22,9 @@ module Net; module SSH; module Transport
22
22
  # Define the default algorithms, in order of preference, supported by
23
23
  # Net::SSH.
24
24
  ALGORITHMS = {
25
- :host_key => %w(ssh-rsa ssh-dss),
25
+ :host_key => %w(ssh-rsa ssh-dss
26
+ ssh-rsa-cert-v01@openssh.com
27
+ ssh-rsa-cert-v00@openssh.com),
26
28
  :kex => %w(diffie-hellman-group-exchange-sha1
27
29
  diffie-hellman-group1-sha1
28
30
  diffie-hellman-group14-sha1
@@ -40,21 +42,28 @@ module Net; module SSH; module Transport
40
42
  camellia192-ctr@openssh.org
41
43
  camellia256-ctr@openssh.org
42
44
  cast128-ctr blowfish-ctr 3des-ctr
45
+ aes256-gcm@openssh.com aes128-gcm@openssh.com
43
46
  ),
44
47
  :hmac => %w(hmac-sha1 hmac-md5 hmac-sha1-96 hmac-md5-96
45
48
  hmac-ripemd160 hmac-ripemd160@openssh.com
46
49
  hmac-sha2-256 hmac-sha2-512 hmac-sha2-256-96
47
- hmac-sha2-512-96 none),
50
+ hmac-sha2-512-96 none
51
+ hmac-sha2-512-etm@openssh.com hmac-sha2-256-etm@openssh.com
52
+ umac-128-etm@openssh.com),
53
+
48
54
  :compression => %w(none zlib@openssh.com zlib),
49
55
  :language => %w()
50
56
  }
51
57
  if defined?(OpenSSL::PKey::EC)
52
58
  ALGORITHMS[:host_key] += %w(ecdsa-sha2-nistp256
53
59
  ecdsa-sha2-nistp384
54
- ecdsa-sha2-nistp521)
60
+ ecdsa-sha2-nistp521
61
+ ssh-ed25519-cert-v01@openssh.com
62
+ ssh-ed25519)
55
63
  ALGORITHMS[:kex] += %w(ecdh-sha2-nistp256
56
64
  ecdh-sha2-nistp384
57
- ecdh-sha2-nistp521)
65
+ ecdh-sha2-nistp521
66
+ curve25519-sha256@libssh.org)
58
67
  end
59
68
 
60
69
  # The underlying transport layer session that supports this object
@@ -48,7 +48,7 @@ module Net; module SSH
48
48
  MAJOR = 2
49
49
 
50
50
  # The minor component of this version of the Net::SSH library
51
- MINOR = 8
51
+ MINOR = 9
52
52
 
53
53
  # The tiny component of this version of the Net::SSH library
54
54
  TINY = 0
@@ -5,11 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "net-ssh"
8
- s.version = "2.8.0"
8
+ s.version = "2.9.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jamis Buck", "Delano Mandelbaum"]
12
- s.date = "2014-02-01"
12
+ s.cert_chain = ["gem-public_cert.pem"]
13
+ s.date = "2014-04-30"
13
14
  s.description = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol. It allows you to write programs that invoke and interact with processes on remote servers, via SSH2."
14
15
  s.email = "net-ssh@solutious.com"
15
16
  s.extra_rdoc_files = [
@@ -17,6 +18,7 @@ Gem::Specification.new do |s|
17
18
  "README.rdoc"
18
19
  ]
19
20
  s.files = [
21
+ ".travis.yml",
20
22
  "CHANGES.txt",
21
23
  "LICENSE.txt",
22
24
  "Manifest",
@@ -176,6 +178,7 @@ Gem::Specification.new do |s|
176
178
  s.require_paths = ["lib"]
177
179
  s.rubyforge_project = "net-ssh"
178
180
  s.rubygems_version = "1.8.23"
181
+ s.signing_key = "/mnt/gem/gem-private_key.pem"
179
182
  s.summary = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
180
183
 
181
184
  if s.respond_to? :specification_version then
@@ -30,8 +30,12 @@ module Authentication
30
30
  assert !manager.use_agent?
31
31
  end
32
32
 
33
- def test_use_agent_is_false_if_keys_only
34
- assert !manager(:keys_only => true).use_agent?
33
+ def test_agent_should_be_used_by_default
34
+ assert manager().use_agent?
35
+ end
36
+
37
+ def test_agent_should_not_be_used_with_no_agent
38
+ assert !manager(:use_agent => false).use_agent?
35
39
  end
36
40
 
37
41
  def test_each_identity_should_load_from_key_files
@@ -101,6 +105,7 @@ module Authentication
101
105
  assert_equal rsa.to_blob, identities.first.to_blob
102
106
 
103
107
  assert_equal({:from => :agent}, manager.known_identities[rsa])
108
+ assert manager.use_agent?
104
109
  end
105
110
 
106
111
  def test_identities_without_public_key_files_should_not_be_touched_if_identity_loaded_from_agent
@@ -1,4 +1,5 @@
1
1
  HostBasedAuthentication no
2
2
  PasswordAuthentication no
3
3
  PubKeyAuthentication no
4
- ChallengeResponseAuthentication no
4
+ ChallengeResponseAuthentication no
5
+ KbdInteractiveAuthentication no
@@ -112,7 +112,8 @@ class TestConfig < Test::Unit::TestCase
112
112
  'hostbasedauthentication' => false,
113
113
  'passwordauthentication' => false,
114
114
  'pubkeyauthentication' => false,
115
- 'challengeresponseauthentication' => false
115
+ 'challengeresponseauthentication' => false,
116
+ 'kbdinteractiveauthentication' => false
116
117
  }
117
118
 
118
119
  net_ssh = Net::SSH::Config.translate(open_ssh)
@@ -125,7 +126,8 @@ class TestConfig < Test::Unit::TestCase
125
126
  'hostbasedauthentication' => true,
126
127
  'passwordauthentication' => true,
127
128
  'pubkeyauthentication' => true,
128
- 'challengeresponseauthentication' => true
129
+ 'challengeresponseauthentication' => true,
130
+ 'kbdinteractiveauthentication' => true
129
131
  }
130
132
 
131
133
  net_ssh = Net::SSH::Config.translate(open_ssh)
@@ -133,6 +135,30 @@ class TestConfig < Test::Unit::TestCase
133
135
  assert_equal %w(hostbased keyboard-interactive none password publickey), net_ssh[:auth_methods].sort
134
136
  end
135
137
 
138
+ def test_translate_should_not_disable_keyboard_interactive_when_challange_or_keyboardinterective_is_on
139
+ open_ssh = {
140
+ 'kbdinteractiveauthentication' => false
141
+ }
142
+ net_ssh = Net::SSH::Config.translate(open_ssh)
143
+ assert_equal %w(keyboard-interactive none password publickey), net_ssh[:auth_methods].sort
144
+
145
+ open_ssh = {
146
+ 'challengeresponseauthentication' => false
147
+ }
148
+ net_ssh = Net::SSH::Config.translate(open_ssh)
149
+ assert_equal %w(keyboard-interactive none password publickey), net_ssh[:auth_methods].sort
150
+ end
151
+
152
+ def test_should_ddisable_keyboard_interactive_when_challeng_and_keyboardinteractive_is_off
153
+ open_ssh = {
154
+ 'challengeresponseauthentication' => false,
155
+ 'kbdinteractiveauthentication' => false
156
+ }
157
+
158
+ net_ssh = Net::SSH::Config.translate(open_ssh)
159
+ assert_equal %w(none password publickey), net_ssh[:auth_methods].sort
160
+ end
161
+
136
162
  def test_for_should_turn_off_authentication_methods
137
163
  config = Net::SSH::Config.for("test.host", [config(:empty), config(:auth_off), config(:auth_on)])
138
164
  assert_equal %w(none), config[:auth_methods].sort
@@ -18,18 +18,17 @@ module Transport
18
18
 
19
19
  def test_constructor_should_build_default_list_of_preferred_algorithms
20
20
  if defined?(OpenSSL::PKey::EC)
21
- assert_equal %w(ssh-rsa ssh-dss ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521), algorithms[:host_key]
22
- assert_equal %w(diffie-hellman-group-exchange-sha1 diffie-hellman-group1-sha1 diffie-hellman-group14-sha1 diffie-hellman-group-exchange-sha256 ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521), algorithms[:kex]
21
+ assert_equal %w(ssh-rsa ssh-dss ssh-rsa-cert-v01@openssh.com ssh-rsa-cert-v00@openssh.com ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521 ssh-ed25519-cert-v01@openssh.com ssh-ed25519), algorithms[:host_key]
22
+ assert_equal %w(diffie-hellman-group-exchange-sha1 diffie-hellman-group1-sha1 diffie-hellman-group14-sha1 diffie-hellman-group-exchange-sha256 ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521 curve25519-sha256@libssh.org), algorithms[:kex]
23
23
  else
24
- assert_equal %w(ssh-rsa ssh-dss), algorithms[:host_key]
25
- assert_equal %w(diffie-hellman-group-exchange-sha1 diffie-hellman-group1-sha1 diffie-hellman-group14-sha1 diffie-hellman-group-exchange-sha256), algorithms[:kex]
24
+ assert_equal %w(ssh-rsa ssh-dss ssh-rsa-cert-v01@openssh.com ssh-rsa-cert-v00@openssh.com), algorithms[:host_key]
25
+ assert_equal %w(diffie-hellman-group-exchange-sha1 diffie-hellman-group1-sha1 diffie-hellman-group14-sha1 diffie-hellman-group-exchange-sha256 aes256-gcm@openssh.com aes128-gcm@openssh.com), algorithms[:kex]
26
26
  end
27
- assert_equal %w(aes128-cbc 3des-cbc blowfish-cbc cast128-cbc aes192-cbc aes256-cbc rijndael-cbc@lysator.liu.se idea-cbc none arcfour128 arcfour256 arcfour aes128-ctr aes192-ctr aes256-ctr camellia128-cbc camellia192-cbc camellia256-cbc camellia128-cbc@openssh.org camellia192-cbc@openssh.org camellia256-cbc@openssh.org camellia128-ctr camellia192-ctr camellia256-ctr camellia128-ctr@openssh.org camellia192-ctr@openssh.org camellia256-ctr@openssh.org cast128-ctr blowfish-ctr 3des-ctr), algorithms[:encryption]
27
+ assert_equal %w(aes128-cbc 3des-cbc blowfish-cbc cast128-cbc aes192-cbc aes256-cbc rijndael-cbc@lysator.liu.se idea-cbc none arcfour128 arcfour256 arcfour aes128-ctr aes192-ctr aes256-ctr camellia128-cbc camellia192-cbc camellia256-cbc camellia128-cbc@openssh.org camellia192-cbc@openssh.org camellia256-cbc@openssh.org camellia128-ctr camellia192-ctr camellia256-ctr camellia128-ctr@openssh.org camellia192-ctr@openssh.org camellia256-ctr@openssh.org cast128-ctr blowfish-ctr 3des-ctr aes256-gcm@openssh.com aes128-gcm@openssh.com), algorithms[:encryption]
28
28
  if defined?(OpenSSL::Digest::SHA256)
29
- assert_equal %w(hmac-sha1 hmac-md5 hmac-sha1-96 hmac-md5-96 hmac-ripemd160 hmac-ripemd160@openssh.com hmac-sha2-256 hmac-sha2-512 hmac-sha2-256-96 hmac-sha2-512-96 none), algorithms[:hmac]
29
+ assert_equal %w(hmac-sha1 hmac-md5 hmac-sha1-96 hmac-md5-96 hmac-ripemd160 hmac-ripemd160@openssh.com hmac-sha2-256 hmac-sha2-512 hmac-sha2-256-96 hmac-sha2-512-96 none hmac-sha2-512-etm@openssh.com hmac-sha2-256-etm@openssh.com umac-128-etm@openssh.com), algorithms[:hmac]
30
30
  else
31
- assert_equal %w(hmac-sha1 hmac-md5 hmac-sha1-96 hmac-md5-96 hmac-ripemd160 hmac-ripemd160@openssh.com none), algorithms[:hmac]
32
- end
31
+ assert_equal %w(hmac-sha1 hmac-md5 hmac-sha1-96 hmac-md5-96 hmac-ripemd160 hmac-ripemd160@openssh.com none umac-128-etm@openssh.com), algorithms[:hmac] end
33
32
  assert_equal %w(none zlib@openssh.com zlib), algorithms[:compression]
34
33
  assert_equal %w(), algorithms[:language]
35
34
  end
@@ -43,16 +42,16 @@ module Transport
43
42
 
44
43
  def test_constructor_with_preferred_host_key_type_should_put_preferred_host_key_type_first
45
44
  if defined?(OpenSSL::PKey::EC)
46
- assert_equal %w(ssh-dss ssh-rsa ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521), algorithms(:host_key => "ssh-dss")[:host_key]
45
+ assert_equal %w(ssh-dss ssh-rsa ssh-rsa-cert-v01@openssh.com ssh-rsa-cert-v00@openssh.com ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521 ssh-ed25519-cert-v01@openssh.com ssh-ed25519), algorithms(:host_key => "ssh-dss")[:host_key]
47
46
  else
48
- assert_equal %w(ssh-dss ssh-rsa), algorithms(:host_key => "ssh-dss")[:host_key]
47
+ assert_equal %w(ssh-dss ssh-rsa ssh-rsa-cert-v01@openssh.com ssh-rsa-cert-v00@openssh.com), algorithms(:host_key => "ssh-dss")[:host_key]
49
48
  end
50
49
  end
51
50
 
52
51
  def test_constructor_with_known_hosts_reporting_known_host_key_should_use_that_host_key_type
53
52
  Net::SSH::KnownHosts.expects(:search_for).with("net.ssh.test,127.0.0.1", {}).returns([stub("key", :ssh_type => "ssh-dss")])
54
53
  if defined?(OpenSSL::PKey::EC)
55
- assert_equal %w(ssh-dss ssh-rsa ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521), algorithms[:host_key]
54
+ assert_equal %w(ssh-dss ssh-rsa ssh-rsa-cert-v01@openssh.com ssh-rsa-cert-v00@openssh.com ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521 ssh-ed25519-cert-v01@openssh.com ssh-ed25519), algorithms[:host_key]
56
55
  else
57
56
  assert_equal %w(ssh-dss ssh-rsa), algorithms[:host_key]
58
57
  end
@@ -64,7 +63,7 @@ module Transport
64
63
 
65
64
  def test_constructor_with_preferred_kex_should_put_preferred_kex_first
66
65
  if defined?(OpenSSL::PKey::EC)
67
- assert_equal %w(diffie-hellman-group1-sha1 diffie-hellman-group-exchange-sha1 diffie-hellman-group14-sha1 diffie-hellman-group-exchange-sha256 ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521), algorithms(:kex => "diffie-hellman-group1-sha1")[:kex]
66
+ assert_equal %w(diffie-hellman-group1-sha1 diffie-hellman-group-exchange-sha1 diffie-hellman-group14-sha1 diffie-hellman-group-exchange-sha256 ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521 curve25519-sha256@libssh.org), algorithms(:kex => "diffie-hellman-group1-sha1")[:kex]
68
67
  else
69
68
  assert_equal %w(diffie-hellman-group1-sha1 diffie-hellman-group-exchange-sha1 diffie-hellman-group14-sha1 diffie-hellman-group-exchange-sha256), algorithms(:kex => "diffie-hellman-group1-sha1")[:kex]
70
69
  end
@@ -75,11 +74,11 @@ module Transport
75
74
  end
76
75
 
77
76
  def test_constructor_with_preferred_encryption_should_put_preferred_encryption_first
78
- assert_equal %w(aes256-cbc aes128-cbc 3des-cbc blowfish-cbc cast128-cbc aes192-cbc rijndael-cbc@lysator.liu.se idea-cbc none arcfour128 arcfour256 arcfour aes128-ctr aes192-ctr aes256-ctr camellia128-cbc camellia192-cbc camellia256-cbc camellia128-cbc@openssh.org camellia192-cbc@openssh.org camellia256-cbc@openssh.org camellia128-ctr camellia192-ctr camellia256-ctr camellia128-ctr@openssh.org camellia192-ctr@openssh.org camellia256-ctr@openssh.org cast128-ctr blowfish-ctr 3des-ctr), algorithms(:encryption => "aes256-cbc")[:encryption]
77
+ assert_equal %w(aes256-cbc aes128-cbc 3des-cbc blowfish-cbc cast128-cbc aes192-cbc rijndael-cbc@lysator.liu.se idea-cbc none arcfour128 arcfour256 arcfour aes128-ctr aes192-ctr aes256-ctr camellia128-cbc camellia192-cbc camellia256-cbc camellia128-cbc@openssh.org camellia192-cbc@openssh.org camellia256-cbc@openssh.org camellia128-ctr camellia192-ctr camellia256-ctr camellia128-ctr@openssh.org camellia192-ctr@openssh.org camellia256-ctr@openssh.org cast128-ctr blowfish-ctr 3des-ctr aes256-gcm@openssh.com aes128-gcm@openssh.com), algorithms(:encryption => "aes256-cbc")[:encryption]
79
78
  end
80
79
 
81
80
  def test_constructor_with_multiple_preferred_encryption_should_put_all_preferred_encryption_first
82
- assert_equal %w(aes256-cbc 3des-cbc idea-cbc aes128-cbc blowfish-cbc cast128-cbc aes192-cbc rijndael-cbc@lysator.liu.se none arcfour128 arcfour256 arcfour aes128-ctr aes192-ctr aes256-ctr camellia128-cbc camellia192-cbc camellia256-cbc camellia128-cbc@openssh.org camellia192-cbc@openssh.org camellia256-cbc@openssh.org camellia128-ctr camellia192-ctr camellia256-ctr camellia128-ctr@openssh.org camellia192-ctr@openssh.org camellia256-ctr@openssh.org cast128-ctr blowfish-ctr 3des-ctr), algorithms(:encryption => %w(aes256-cbc 3des-cbc idea-cbc))[:encryption]
81
+ assert_equal %w(aes256-cbc 3des-cbc idea-cbc aes128-cbc blowfish-cbc cast128-cbc aes192-cbc rijndael-cbc@lysator.liu.se none arcfour128 arcfour256 arcfour aes128-ctr aes192-ctr aes256-ctr camellia128-cbc camellia192-cbc camellia256-cbc camellia128-cbc@openssh.org camellia192-cbc@openssh.org camellia256-cbc@openssh.org camellia128-ctr camellia192-ctr camellia256-ctr camellia128-ctr@openssh.org camellia192-ctr@openssh.org camellia256-ctr@openssh.org cast128-ctr blowfish-ctr 3des-ctr aes256-gcm@openssh.com aes128-gcm@openssh.com), algorithms(:encryption => %w(aes256-cbc 3des-cbc idea-cbc))[:encryption]
83
82
  end
84
83
 
85
84
  def test_constructor_with_unrecognized_encryption_should_raise_exception
@@ -87,11 +86,11 @@ module Transport
87
86
  end
88
87
 
89
88
  def test_constructor_with_preferred_hmac_should_put_preferred_hmac_first
90
- assert_equal %w(hmac-md5-96 hmac-sha1 hmac-md5 hmac-sha1-96 hmac-ripemd160 hmac-ripemd160@openssh.com hmac-sha2-256 hmac-sha2-512 hmac-sha2-256-96 hmac-sha2-512-96 none), algorithms(:hmac => "hmac-md5-96")[:hmac]
89
+ assert_equal %w(hmac-md5-96 hmac-sha1 hmac-md5 hmac-sha1-96 hmac-ripemd160 hmac-ripemd160@openssh.com hmac-sha2-256 hmac-sha2-512 hmac-sha2-256-96 hmac-sha2-512-96 none hmac-sha2-512-etm@openssh.com hmac-sha2-256-etm@openssh.com umac-128-etm@openssh.com), algorithms(:hmac => "hmac-md5-96")[:hmac]
91
90
  end
92
91
 
93
92
  def test_constructor_with_multiple_preferred_hmac_should_put_all_preferred_hmac_first
94
- assert_equal %w(hmac-md5-96 hmac-sha1-96 hmac-sha1 hmac-md5 hmac-ripemd160 hmac-ripemd160@openssh.com hmac-sha2-256 hmac-sha2-512 hmac-sha2-256-96 hmac-sha2-512-96 none), algorithms(:hmac => %w(hmac-md5-96 hmac-sha1-96))[:hmac]
93
+ assert_equal %w(hmac-md5-96 hmac-sha1-96 hmac-sha1 hmac-md5 hmac-ripemd160 hmac-ripemd160@openssh.com hmac-sha2-256 hmac-sha2-512 hmac-sha2-256-96 hmac-sha2-512-96 none hmac-sha2-512-etm@openssh.com hmac-sha2-256-etm@openssh.com umac-128-etm@openssh.com), algorithms(:hmac => %w(hmac-md5-96 hmac-sha1-96))[:hmac]
95
94
  end
96
95
 
97
96
  def test_constructor_with_unrecognized_hmac_should_raise_exception
@@ -290,16 +289,16 @@ module Transport
290
289
  assert_equal KEXINIT, buffer.type
291
290
  assert_equal 16, buffer.read(16).length
292
291
  if defined?(OpenSSL::PKey::EC)
293
- assert_equal options[:kex] || "diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521", buffer.read_string
294
- assert_equal options[:host_key] || "ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521", buffer.read_string
292
+ assert_equal options[:kex] || "diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,curve25519-sha256@libssh.org", buffer.read_string
293
+ assert_equal options[:host_key] || "ssh-rsa,ssh-dss,ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519-cert-v01@openssh.com,ssh-ed25519", buffer.read_string
295
294
  else
296
295
  assert_equal options[:kex] || "diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256", buffer.read_string
297
296
  assert_equal options[:host_key] || "ssh-rsa,ssh-dss", buffer.read_string
298
297
  end
299
- assert_equal options[:encryption_client] || "aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,idea-cbc,none,arcfour128,arcfour256,arcfour,aes128-ctr,aes192-ctr,aes256-ctr,camellia128-cbc,camellia192-cbc,camellia256-cbc,camellia128-cbc@openssh.org,camellia192-cbc@openssh.org,camellia256-cbc@openssh.org,camellia128-ctr,camellia192-ctr,camellia256-ctr,camellia128-ctr@openssh.org,camellia192-ctr@openssh.org,camellia256-ctr@openssh.org,cast128-ctr,blowfish-ctr,3des-ctr", buffer.read_string
300
- assert_equal options[:encryption_server] || "aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,idea-cbc,none,arcfour128,arcfour256,arcfour,aes128-ctr,aes192-ctr,aes256-ctr,camellia128-cbc,camellia192-cbc,camellia256-cbc,camellia128-cbc@openssh.org,camellia192-cbc@openssh.org,camellia256-cbc@openssh.org,camellia128-ctr,camellia192-ctr,camellia256-ctr,camellia128-ctr@openssh.org,camellia192-ctr@openssh.org,camellia256-ctr@openssh.org,cast128-ctr,blowfish-ctr,3des-ctr", buffer.read_string
301
- assert_equal options[:hmac_client] || "hmac-sha1,hmac-md5,hmac-sha1-96,hmac-md5-96,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha2-256-96,hmac-sha2-512-96,none", buffer.read_string
302
- assert_equal options[:hmac_server] || "hmac-sha1,hmac-md5,hmac-sha1-96,hmac-md5-96,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha2-256-96,hmac-sha2-512-96,none", buffer.read_string
298
+ assert_equal options[:encryption_client] || "aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,idea-cbc,none,arcfour128,arcfour256,arcfour,aes128-ctr,aes192-ctr,aes256-ctr,camellia128-cbc,camellia192-cbc,camellia256-cbc,camellia128-cbc@openssh.org,camellia192-cbc@openssh.org,camellia256-cbc@openssh.org,camellia128-ctr,camellia192-ctr,camellia256-ctr,camellia128-ctr@openssh.org,camellia192-ctr@openssh.org,camellia256-ctr@openssh.org,cast128-ctr,blowfish-ctr,3des-ctr,aes256-gcm@openssh.com,aes128-gcm@openssh.com", buffer.read_string
299
+ assert_equal options[:encryption_server] || "aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,idea-cbc,none,arcfour128,arcfour256,arcfour,aes128-ctr,aes192-ctr,aes256-ctr,camellia128-cbc,camellia192-cbc,camellia256-cbc,camellia128-cbc@openssh.org,camellia192-cbc@openssh.org,camellia256-cbc@openssh.org,camellia128-ctr,camellia192-ctr,camellia256-ctr,camellia128-ctr@openssh.org,camellia192-ctr@openssh.org,camellia256-ctr@openssh.org,cast128-ctr,blowfish-ctr,3des-ctr,aes256-gcm@openssh.com,aes128-gcm@openssh.com", buffer.read_string
300
+ assert_equal options[:hmac_client] || "hmac-sha1,hmac-md5,hmac-sha1-96,hmac-md5-96,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha2-256-96,hmac-sha2-512-96,none,hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com", buffer.read_string
301
+ assert_equal options[:hmac_server] || "hmac-sha1,hmac-md5,hmac-sha1-96,hmac-md5-96,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha2-256-96,hmac-sha2-512-96,none,hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com", buffer.read_string
303
302
  assert_equal options[:compression_client] || "none,zlib@openssh.com,zlib", buffer.read_string
304
303
  assert_equal options[:compression_server] || "none,zlib@openssh.com,zlib", buffer.read_string
305
304
  assert_equal options[:language_client] || "", buffer.read_string
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: 2.8.0
4
+ version: 2.9.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,36 @@ authors:
9
9
  - Delano Mandelbaum
10
10
  autorequire:
11
11
  bindir: bin
12
- cert_chain: []
13
- date: 2014-02-01 00:00:00.000000000 Z
12
+ cert_chain:
13
+ - !binary |-
14
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUROakNDQWg2Z0F3SUJB
15
+ Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJCTVE4d0RRWURWUVFEREFaa1pX
16
+ eGgKYm04eEdUQVhCZ29Ka2lhSmsvSXNaQUVaRmdsemIyeDFkR2x2ZFhNeEV6
17
+ QVJCZ29Ka2lhSmsvSXNaQUVaRmdOagpiMjB3SGhjTk1UUXdORE13TVRjek5q
18
+ STJXaGNOTVRVd05ETXdNVGN6TmpJMldqQkJNUTh3RFFZRFZRUUREQVprClpX
19
+ eGhibTh4R1RBWEJnb0praWFKay9Jc1pBRVpGZ2x6YjJ4MWRHbHZkWE14RXpB
20
+ UkJnb0praWFKay9Jc1pBRVoKRmdOamIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFF
21
+ QkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEZGJlRmpNNjcrVHhycQorOEhhRDR3
22
+ S0VpYWNSb0I4cHMxN1Z6dDlUQlV5b01NajVLVHRGaXB0ci8rWlR1Zy9ZZFlC
23
+ cXVNcHJQc0tsWU0yCk5vRzZCenZEY3ZRSzF6cmRIbnlWb3NJREtBSGsyd255
24
+ Ti9wc1ppa1MxYm85blVIQ1M1aEpkUEVuUVp4L014VFoKK0dqdVJzaUJ4UFlC
25
+ WG5xT2JMaFI4M0xCZVdzYXVXVHVvNWdKdDFEWXhEVFZyTG9CK1orY2VNVisz
26
+ dmgwSEJDYgppd2Vna3g5R1dHNDVoNXdUa3NVSXB6T01CM1ZzSEd0R21CakN2
27
+ ZENnTEoySDZiOFU5cm1MN2NodW5qZHFmTmYzCnpQdG5IMzJjL3pyRnplV0pU
28
+ eUgyczhJYSszRDZ2dW0yeGpqbjhGbkxnM1Y0ek9mNXg1OThHRkJKWURRdjd6
29
+ WC8KclY5ZUN6SERBZ01CQUFHak9UQTNNQWtHQTFVZEV3UUNNQUF3SFFZRFZS
30
+ ME9CQllFRkErQnVjOHlTRXcycUtucQpWSDR3aDhLQW02aFVNQXNHQTFVZER3
31
+ UUVBd0lFc0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQVlzTTBNNDJoClpF
32
+ VVh2ci9pMThna3dIS0xGREtEQWNpbWdDb1M1K3N5RzZya3VTT25LR1FvbHlL
33
+ VE5jek5NNGdXSkpQSDVhVnEKbVcyQnRxcElvbTRZUlliOW0zZkROTnM2a2NC
34
+ NURlZFk5VVBoVnZKOFhUVEIyWUx4THFsN1VKaWQ5Wk9pcVd6QwpPVG0wNnc3
35
+ emtBVC9sZHQ0NnA2QnF5VXk2UFc0UU1nMEJxN1NNZlJVUlZycDJsdmhRdkJk
36
+ QzdvRFI5Q0dFQlpDCi9DaSsrWkVoL1FSOXF5MTFBSGNpRUlYbk5reXRpZHla
37
+ dExyNE1XaHRiVjQ2OHk2c2hwUFlkS1UvdUNJTlNndnQKRnBNQU01Tml0OEw4
38
+ bkh3ZjNJSVVQZzdsc01DUnpPa1EvRkQ4N0JJM1YzU25GTm9UQ2RHZ25HajNq
39
+ Zlc0elJsTAppRnlhcmVGUEE4NGJ0UT09Ci0tLS0tRU5EIENFUlRJRklDQVRF
40
+ LS0tLS0K
41
+ date: 2014-04-30 00:00:00.000000000 Z
14
42
  dependencies:
15
43
  - !ruby/object:Gem::Dependency
16
44
  name: test-unit
@@ -54,6 +82,7 @@ extra_rdoc_files:
54
82
  - LICENSE.txt
55
83
  - README.rdoc
56
84
  files:
85
+ - .travis.yml
57
86
  - CHANGES.txt
58
87
  - LICENSE.txt
59
88
  - Manifest
Binary file