summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamis Buck <jamis@37signals.com>2009-01-08 20:49:20 -0700
committerJamis Buck <jamis@37signals.com>2009-01-08 20:53:16 -0700
commitf9b2f3cb8de97730b4b4a5624fdb6e0fd0302f26 (patch)
tree8ef38fee6cc0429e98a6aa4b0fb69c49d1d2be5c
parente72a2787fedd1da5fdd2ab071f848d0190a8a85f (diff)
downloadnet-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.rdoc2
-rw-r--r--lib/net/ssh/authentication/key_manager.rb17
-rw-r--r--test/authentication/test_key_manager.rb7
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