net-ssh 2.0.24 → 2.1.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.
@@ -1,4 +1,11 @@
1
1
 
2
+
3
+ === 2.1 / 19 Jan 2011
4
+
5
+ * Support "IdentitiesOnly" directive [Edmund Haselwanter]
6
+ * Speeding up the Loggable module [robbebob]
7
+
8
+
2
9
  === 2.0.24 / 14 Jan 2011
3
10
 
4
11
  * Fix for process code to correctly wait until remote_id is set before sending any output, including eof. [Daniel Pittman, Markus Roberts]
@@ -66,7 +66,7 @@ module Net
66
66
  :logger, :paranoid, :password, :port, :proxy, :rekey_blocks_limit,
67
67
  :rekey_limit, :rekey_packet_limit, :timeout, :verbose,
68
68
  :global_known_hosts_file, :user_known_hosts_file, :host_key_alias,
69
- :host_name, :user, :properties, :passphrase
69
+ :host_name, :user, :properties, :passphrase, :keys_only
70
70
  ]
71
71
 
72
72
  # The standard means of starting a new SSH connection. When used with a
@@ -125,6 +125,10 @@ module Net
125
125
  # and hostbased authentication
126
126
  # * :key_data => an array of strings, with each element of the array being
127
127
  # a raw private key in PEM format.
128
+ # * :keys_only => set to +true+ to use only private keys from +keys+ and
129
+ # +key_data+ parameters, even if ssh-agent offers more identities. This
130
+ # option is intended for situations where ssh-agent offers many different
131
+ # identites.
128
132
  # * :logger => the logger instance to use when logging
129
133
  # * :paranoid => either true, false, or :very, specifying how strict
130
134
  # host-key verification should be
@@ -90,40 +90,30 @@ module Net
90
90
  # The origin of the identities may be from files on disk or from an
91
91
  # ssh-agent. Note that identities from an ssh-agent are always listed
92
92
  # first in the array, with other identities coming after.
93
+ #
94
+ # If key manager was created with :keys_only option, any identity
95
+ # from ssh-agent will be ignored unless it present in key_files or
96
+ # key_data.
93
97
  def each_identity
98
+ user_identities = load_identities_from_files + load_identities_from_data
99
+
94
100
  if agent
95
101
  agent.identities.each do |key|
96
- known_identities[key] = { :from => :agent }
97
- yield key
98
- end
99
- end
100
-
101
- key_files.each do |file|
102
- public_key_file = file + ".pub"
103
- if File.readable?(public_key_file)
104
- begin
105
- key = KeyFactory.load_public_key(public_key_file)
106
- known_identities[key] = { :from => :file, :file => file }
107
- yield key
108
- rescue Exception => e
109
- error { "could not load public key file `#{public_key_file}': #{e.class} (#{e.message})" }
110
- end
111
- elsif File.readable?(file)
112
- begin
113
- private_key = KeyFactory.load_private_key(file, options[:passphrase])
114
- key = private_key.send(:public_key)
115
- known_identities[key] = { :from => :file, :file => file, :key => private_key }
102
+ corresponding_user_identity = user_identities.detect { |identity|
103
+ identity[:public_key].to_pem == key.to_pem
104
+ }
105
+ user_identities.delete(corresponding_user_identity) if corresponding_user_identity
106
+
107
+ if !options[:keys_only] || corresponding_user_identity
108
+ known_identities[key] = { :from => :agent }
116
109
  yield key
117
- rescue Exception => e
118
- error { "could not load private key file `#{file}': #{e.class} (#{e.message})" }
119
110
  end
120
111
  end
121
112
  end
122
113
 
123
- key_data.each do |data|
124
- private_key = KeyFactory.load_data_private_key(data)
125
- key = private_key.send(:public_key)
126
- known_identities[key] = { :from => :key_data, :data => data, :key => private_key }
114
+ user_identities.each do |identity|
115
+ key = identity.delete(:public_key)
116
+ known_identities[key] = identity
127
117
  yield key
128
118
  end
129
119
 
@@ -186,8 +176,44 @@ module Net
186
176
  @use_agent = false
187
177
  nil
188
178
  end
189
- end
190
179
 
180
+ private
181
+
182
+ # Extracts identities from user key_files, preserving their order and sources.
183
+ def load_identities_from_files
184
+ key_files.map do |file|
185
+ public_key_file = file + ".pub"
186
+ if File.readable?(public_key_file)
187
+ begin
188
+ key = KeyFactory.load_public_key(public_key_file)
189
+ { :public_key => key, :from => :file, :file => file }
190
+ rescue Exception => e
191
+ error { "could not load public key file `#{public_key_file}': #{e.class} (#{e.message})" }
192
+ nil
193
+ end
194
+ elsif File.readable?(file)
195
+ begin
196
+ private_key = KeyFactory.load_private_key(file, options[:passphrase])
197
+ key = private_key.send(:public_key)
198
+ { :public_key => key, :from => :file, :file => file, :key => private_key }
199
+ rescue Exception => e
200
+ error { "could not load private key file `#{file}': #{e.class} (#{e.message})" }
201
+ nil
202
+ end
203
+ end
204
+ end.compact
205
+ end
206
+
207
+ # Extraccts identities from user key_data, preserving their order and sources.
208
+ def load_identities_from_data
209
+ key_data.map do |data|
210
+ private_key = KeyFactory.load_data_private_key(data)
211
+ key = private_key.send(:public_key)
212
+ { :public_key => key, :from => :key_data, :data => data, :key => private_key }
213
+ end
214
+ end
215
+
216
+ end
191
217
  end
192
218
  end
193
219
  end
@@ -19,6 +19,7 @@ module Net; module SSH
19
19
  # * HostKeyAlias => :host_key_alias
20
20
  # * HostName => :host_name
21
21
  # * IdentityFile => maps to the :keys option
22
+ # * IdentitiesOnly => :keys_only
22
23
  # * Macs => maps to the :hmac option
23
24
  # * PasswordAuthentication => maps to the :auth_methods option
24
25
  # * Port => :port
@@ -128,6 +129,8 @@ module Net; module SSH
128
129
  hash[:timeout] = value
129
130
  when 'forwardagent' then
130
131
  hash[:forward_agent] = value
132
+ when 'identitiesonly' then
133
+ hash[:keys_only] = value
131
134
  when 'globalknownhostsfile'
132
135
  hash[:global_known_hosts_file] = value
133
136
  when 'hostbasedauthentication' then
@@ -22,31 +22,31 @@ module Net; module SSH
22
22
  # Displays the result of yielding if the log level is Logger::DEBUG or
23
23
  # greater.
24
24
  def debug
25
- logger.add(Logger::DEBUG, nil, facility) { yield } if logger
25
+ logger.add(Logger::DEBUG, nil, facility) { yield } if logger && logger.debug?
26
26
  end
27
27
 
28
28
  # Displays the result of yielding if the log level is Logger::INFO or
29
29
  # greater.
30
30
  def info
31
- logger.add(Logger::INFO, nil, facility) { yield } if logger
31
+ logger.add(Logger::INFO, nil, facility) { yield } if logger && logger.info?
32
32
  end
33
33
 
34
34
  # Displays the result of yielding if the log level is Logger::WARN or
35
35
  # greater. (Called lwarn to avoid shadowing with Kernel#warn.)
36
36
  def lwarn
37
- logger.add(Logger::WARN, nil, facility) { yield } if logger
37
+ logger.add(Logger::WARN, nil, facility) { yield } if logger && logger.warn?
38
38
  end
39
39
 
40
40
  # Displays the result of yielding if the log level is Logger:ERROR or
41
41
  # greater.
42
42
  def error
43
- logger.add(Logger::ERROR, nil, facility) { yield } if logger
43
+ logger.add(Logger::ERROR, nil, facility) { yield } if logger && logger.error?
44
44
  end
45
45
 
46
46
  # Displays the result of yielding if the log level is Logger::FATAL or
47
47
  # greater.
48
48
  def fatal
49
- logger.add(Logger::FATAL, nil, facility) { yield } if logger
49
+ logger.add(Logger::FATAL, nil, facility) { yield } if logger && logger.fatal?
50
50
  end
51
51
 
52
52
  private
@@ -48,10 +48,10 @@ 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 = 0
51
+ MINOR = 1
52
52
 
53
53
  # The tiny component of this version of the Net::SSH library
54
- TINY = 24
54
+ TINY = 0
55
55
 
56
56
  # The current version of the Net::SSH library as a Version instance
57
57
  CURRENT = new(MAJOR, MINOR, TINY)
@@ -1,7 +1,7 @@
1
1
  @spec = Gem::Specification.new do |s|
2
2
  s.name = "net-ssh"
3
3
  s.rubyforge_project = 'net-ssh'
4
- s.version = "2.0.24"
4
+ s.version = "2.1.0"
5
5
  s.summary = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
6
6
  s.description = s.summary
7
7
  s.authors = ["Jamis Buck", "Delano Mandelbaum"]
@@ -59,6 +59,20 @@ module Authentication
59
59
  assert_equal({:from => :agent}, manager.known_identities[dsa])
60
60
  end
61
61
 
62
+ def test_only_identities_with_key_files_should_load_from_agent_of_keys_only_set
63
+ manager(:keys_only => true).stubs(:agent).returns(agent)
64
+
65
+ stub_file_key "/first", rsa
66
+
67
+ identities = []
68
+ manager.each_identity { |identity| identities << identity }
69
+
70
+ assert_equal 1, identities.length
71
+ assert_equal rsa.to_blob, identities.first.to_blob
72
+
73
+ assert_equal({:from => :agent}, manager.known_identities[rsa])
74
+ end
75
+
62
76
  def test_sign_with_agent_originated_key_should_request_signature_from_agent
63
77
  manager.stubs(:agent).returns(agent)
64
78
  manager.each_identity { |identity| } # preload the known_identities
@@ -96,8 +110,8 @@ module Authentication
96
110
  @agent ||= stub("agent", :identities => [rsa, dsa])
97
111
  end
98
112
 
99
- def manager
100
- @manager ||= Net::SSH::Authentication::KeyManager.new(nil)
113
+ def manager(options = {})
114
+ @manager ||= Net::SSH::Authentication::KeyManager.new(nil, options)
101
115
  end
102
116
 
103
117
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-ssh
3
3
  version: !ruby/object:Gem::Version
4
- hash: 63
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
+ - 1
8
9
  - 0
9
- - 24
10
- version: 2.0.24
10
+ version: 2.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jamis Buck
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-01-14 00:00:00 -05:00
19
+ date: 2011-01-20 00:00:00 -05:00
20
20
  default_executable:
21
21
  dependencies: []
22
22