net-ssh 2.8.0 → 2.9.0

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.
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