diff options
| author | Jamis Buck <jamis@37signals.com> | 2009-01-08 20:49:20 -0700 |
|---|---|---|
| committer | Jamis Buck <jamis@37signals.com> | 2009-01-08 20:53:16 -0700 |
| commit | f9b2f3cb8de97730b4b4a5624fdb6e0fd0302f26 (patch) | |
| tree | 8ef38fee6cc0429e98a6aa4b0fb69c49d1d2be5c | |
| parent | e72a2787fedd1da5fdd2ab071f848d0190a8a85f (diff) | |
| download | net-ssh-f9b2f3cb8de97730b4b4a5624fdb6e0fd0302f26.tar.gz | |
Use foo.pub key by default, but fall back to private key.
Also, make sure we register the private key itself when we
load it, so that it doesn't get loaded twice (which causes
double passphrase prompts).
| -rw-r--r-- | CHANGELOG.rdoc | 2 | ||||
| -rw-r--r-- | lib/net/ssh/authentication/key_manager.rb | 17 | ||||
| -rw-r--r-- | test/authentication/test_key_manager.rb | 7 |
3 files changed, 19 insertions, 7 deletions
diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc index 39231cf..54de5b9 100644 --- a/CHANGELOG.rdoc +++ b/CHANGELOG.rdoc @@ -1,5 +1,7 @@ === unreleased +* Revert to pre-2.0.7 key-loading behavior by default, but load private-key if public-key doesn't exist [Jamis Buck] + * Make sure :passphrase option gets passed to key manager [Bob Cotton] diff --git a/lib/net/ssh/authentication/key_manager.rb b/lib/net/ssh/authentication/key_manager.rb index 7e0e9f2..f934bfc 100644 --- a/lib/net/ssh/authentication/key_manager.rb +++ b/lib/net/ssh/authentication/key_manager.rb @@ -88,14 +88,23 @@ module Net end key_files.each do |file| - if File.readable?(file) + public_key_file = file + ".pub" + if File.readable?(public_key_file) begin - private_key = KeyFactory.load_private_key(file,options[:passphrase]) - key = private_key.send :public_key + key = KeyFactory.load_public_key(public_key_file) known_identities[key] = { :from => :file, :file => file } yield key rescue Exception => e - error { "could not load public key file `#{file}.pub': #{e.class} (#{e.message})" } + error { "could not load public key file `#{public_key_file}': #{e.class} (#{e.message})" } + end + elsif File.readable?(file) + begin + private_key = KeyFactory.load_private_key(file, options[:passphrase]) + key = private_key.send(:public_key) + known_identities[key] = { :from => :file, :file => file, :key => private_key } + yield key + rescue Exception => e + error { "could not load private key file `#{file}': #{e.class} (#{e.message})" } end end end diff --git a/test/authentication/test_key_manager.rb b/test/authentication/test_key_manager.rb index ca6b683..af8422b 100644 --- a/test/authentication/test_key_manager.rb +++ b/test/authentication/test_key_manager.rb @@ -41,8 +41,8 @@ module Authentication assert_equal rsa.to_blob, identities.first.to_blob assert_equal dsa.to_blob, identities.last.to_blob - assert_equal({:from => :file, :file => "/first"}, manager.known_identities[rsa]) - assert_equal({:from => :file, :file => "/second"}, manager.known_identities[dsa]) + assert_equal({:from => :file, :file => "/first", :key => rsa}, manager.known_identities[rsa]) + assert_equal({:from => :file, :file => "/second", :key => dsa}, manager.known_identities[dsa]) end def test_identities_should_load_from_agent @@ -78,7 +78,8 @@ module Authentication def stub_file_key(name, key, also_private=false) manager.add(name) - File.expects(:readable?).returns(true) + File.expects(:readable?).with(name).returns(true) + File.expects(:readable?).with(name + ".pub").returns(false) Net::SSH::KeyFactory.expects(:load_private_key).with(name, nil).returns(key).at_least_once key.expects(:public_key).returns(key) end |
