net-ssh 2.0.10 → 2.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +5 -0
- data/lib/net/ssh.rb +3 -1
- data/lib/net/ssh/authentication/key_manager.rb +18 -0
- data/lib/net/ssh/authentication/session.rb +8 -1
- data/lib/net/ssh/key_factory.rb +21 -6
- data/lib/net/ssh/version.rb +1 -1
- data/net-ssh.gemspec +2 -2
- metadata +2 -2
data/CHANGELOG.rdoc
CHANGED
data/lib/net/ssh.rb
CHANGED
@@ -62,7 +62,7 @@ module Net
|
|
62
62
|
# Net::SSH.start for a description of each option.
|
63
63
|
VALID_OPTIONS = [
|
64
64
|
:auth_methods, :compression, :compression_level, :config, :encryption,
|
65
|
-
:forward_agent, :hmac, :host_key, :kex, :keys, :languages,
|
65
|
+
:forward_agent, :hmac, :host_key, :kex, :keys, :key_data, :languages,
|
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,
|
@@ -123,6 +123,8 @@ module Net
|
|
123
123
|
# * :kex => the key exchange algorithm (or algorithms) to use
|
124
124
|
# * :keys => an array of file names of private keys to use for publickey
|
125
125
|
# and hostbased authentication
|
126
|
+
# * :key_data => an array of strings, with each element of the array being
|
127
|
+
# a raw private key in PEM format.
|
126
128
|
# * :logger => the logger instance to use when logging
|
127
129
|
# * :paranoid => either true, false, or :very, specifying how strict
|
128
130
|
# host-key verification should be
|
@@ -27,6 +27,9 @@ module Net
|
|
27
27
|
# The list of user key files that will be examined
|
28
28
|
attr_reader :key_files
|
29
29
|
|
30
|
+
# The list of user key data that will be examined
|
31
|
+
attr_reader :key_data
|
32
|
+
|
30
33
|
# The map of loaded identities
|
31
34
|
attr_reader :known_identities
|
32
35
|
|
@@ -38,6 +41,7 @@ module Net
|
|
38
41
|
def initialize(logger, options={})
|
39
42
|
self.logger = logger
|
40
43
|
@key_files = []
|
44
|
+
@key_data = []
|
41
45
|
@use_agent = true
|
42
46
|
@known_identities = {}
|
43
47
|
@agent = nil
|
@@ -50,6 +54,7 @@ module Net
|
|
50
54
|
# files.
|
51
55
|
def clear!
|
52
56
|
key_files.clear
|
57
|
+
key_data.clear
|
53
58
|
known_identities.clear
|
54
59
|
self
|
55
60
|
end
|
@@ -60,6 +65,12 @@ module Net
|
|
60
65
|
self
|
61
66
|
end
|
62
67
|
|
68
|
+
# Add the given key_file to the list of keys that will be used.
|
69
|
+
def add_key_data(key_data_)
|
70
|
+
key_data.push(key_data_).uniq!
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
63
74
|
# This is used as a hint to the KeyManager indicating that the agent
|
64
75
|
# connection is no longer needed. Any other open resources may be closed
|
65
76
|
# at this time.
|
@@ -109,6 +120,13 @@ module Net
|
|
109
120
|
end
|
110
121
|
end
|
111
122
|
|
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 }
|
127
|
+
yield key
|
128
|
+
end
|
129
|
+
|
112
130
|
self
|
113
131
|
end
|
114
132
|
|
@@ -53,7 +53,8 @@ module Net; module SSH; module Authentication
|
|
53
53
|
message = expect_message(SERVICE_ACCEPT)
|
54
54
|
|
55
55
|
key_manager = KeyManager.new(logger, options)
|
56
|
-
keys.each { |key| key_manager.add(key) }
|
56
|
+
keys.each { |key| key_manager.add(key) } unless keys.empty?
|
57
|
+
key_data.each { |key2| key_manager.add_key_data(key2) } unless key_data.empty?
|
57
58
|
|
58
59
|
attempted = []
|
59
60
|
|
@@ -123,5 +124,11 @@ module Net; module SSH; module Authentication
|
|
123
124
|
%w(~/.ssh/id_dsa ~/.ssh/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_rsa)
|
124
125
|
)
|
125
126
|
end
|
127
|
+
|
128
|
+
# Returns an array of the key data that should be used when
|
129
|
+
# attempting any key-based authentication mechanism.
|
130
|
+
def key_data
|
131
|
+
Array(options[:key_data])
|
132
|
+
end
|
126
133
|
end
|
127
134
|
end; end; end
|
data/lib/net/ssh/key_factory.rb
CHANGED
@@ -35,23 +35,31 @@ module Net; module SSH
|
|
35
35
|
# encrypted (requiring a passphrase to use), the user will be
|
36
36
|
# prompted to enter their password unless passphrase works.
|
37
37
|
def load_private_key(filename, passphrase=nil)
|
38
|
-
|
38
|
+
data = File.read(File.expand_path(filename))
|
39
|
+
load_data_private_key(data, passphrase, filename)
|
40
|
+
end
|
39
41
|
|
40
|
-
|
42
|
+
# Loads a private key. It will correctly determine
|
43
|
+
# whether the file describes an RSA or DSA key, and will load it
|
44
|
+
# appropriately. The new key is returned. If the key itself is
|
45
|
+
# encrypted (requiring a passphrase to use), the user will be
|
46
|
+
# prompted to enter their password unless passphrase works.
|
47
|
+
def load_data_private_key(data, passphrase=nil, filename="")
|
48
|
+
if data.match(/-----BEGIN DSA PRIVATE KEY-----/)
|
41
49
|
key_type = OpenSSL::PKey::DSA
|
42
|
-
elsif
|
50
|
+
elsif data.match(/-----BEGIN RSA PRIVATE KEY-----/)
|
43
51
|
key_type = OpenSSL::PKey::RSA
|
44
|
-
elsif
|
52
|
+
elsif data.match(/-----BEGIN (.*) PRIVATE KEY-----/)
|
45
53
|
raise OpenSSL::PKey::PKeyError, "not a supported key type '#{$1}'"
|
46
54
|
else
|
47
55
|
raise OpenSSL::PKey::PKeyError, "not a private key (#{filename})"
|
48
56
|
end
|
49
57
|
|
50
|
-
encrypted_key =
|
58
|
+
encrypted_key = data.match(/ENCRYPTED/)
|
51
59
|
tries = 0
|
52
60
|
|
53
61
|
begin
|
54
|
-
return key_type.new(
|
62
|
+
return key_type.new(data, passphrase || 'invalid')
|
55
63
|
rescue OpenSSL::PKey::RSAError, OpenSSL::PKey::DSAError => e
|
56
64
|
if encrypted_key
|
57
65
|
tries += 1
|
@@ -72,6 +80,13 @@ module Net; module SSH
|
|
72
80
|
# appropriately. The new public key is returned.
|
73
81
|
def load_public_key(filename)
|
74
82
|
data = File.read(File.expand_path(filename))
|
83
|
+
load_data_public_key(data, filename)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Loads a public key. It will correctly determine whether
|
87
|
+
# the file describes an RSA or DSA key, and will load it
|
88
|
+
# appropriately. The new public key is returned.
|
89
|
+
def load_data_public_key(data, filename="")
|
75
90
|
type, blob = data.split(/ /)
|
76
91
|
|
77
92
|
raise Net::SSH::Exception, "public key at #{filename} is not valid" if blob.nil?
|
data/lib/net/ssh/version.rb
CHANGED
data/net-ssh.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{net-ssh}
|
3
|
-
s.version = "2.0.
|
3
|
+
s.version = "2.0.11"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
6
6
|
s.authors = ["Jamis Buck"]
|
7
|
-
s.date = %q{2009-02-
|
7
|
+
s.date = %q{2009-02-24}
|
8
8
|
s.description = %q{a pure-Ruby implementation of the SSH2 client protocol}
|
9
9
|
s.email = %q{jamis@jamisbuck.org}
|
10
10
|
s.extra_rdoc_files = ["CHANGELOG.rdoc", "lib/net/ssh/authentication/agent.rb", "lib/net/ssh/authentication/constants.rb", "lib/net/ssh/authentication/key_manager.rb", "lib/net/ssh/authentication/methods/abstract.rb", "lib/net/ssh/authentication/methods/hostbased.rb", "lib/net/ssh/authentication/methods/keyboard_interactive.rb", "lib/net/ssh/authentication/methods/password.rb", "lib/net/ssh/authentication/methods/publickey.rb", "lib/net/ssh/authentication/pageant.rb", "lib/net/ssh/authentication/session.rb", "lib/net/ssh/buffer.rb", "lib/net/ssh/buffered_io.rb", "lib/net/ssh/config.rb", "lib/net/ssh/connection/channel.rb", "lib/net/ssh/connection/constants.rb", "lib/net/ssh/connection/session.rb", "lib/net/ssh/connection/term.rb", "lib/net/ssh/errors.rb", "lib/net/ssh/key_factory.rb", "lib/net/ssh/known_hosts.rb", "lib/net/ssh/loggable.rb", "lib/net/ssh/packet.rb", "lib/net/ssh/prompt.rb", "lib/net/ssh/proxy/errors.rb", "lib/net/ssh/proxy/http.rb", "lib/net/ssh/proxy/socks4.rb", "lib/net/ssh/proxy/socks5.rb", "lib/net/ssh/ruby_compat.rb", "lib/net/ssh/service/forward.rb", "lib/net/ssh/test/channel.rb", "lib/net/ssh/test/extensions.rb", "lib/net/ssh/test/kex.rb", "lib/net/ssh/test/local_packet.rb", "lib/net/ssh/test/packet.rb", "lib/net/ssh/test/remote_packet.rb", "lib/net/ssh/test/script.rb", "lib/net/ssh/test/socket.rb", "lib/net/ssh/test.rb", "lib/net/ssh/transport/algorithms.rb", "lib/net/ssh/transport/cipher_factory.rb", "lib/net/ssh/transport/constants.rb", "lib/net/ssh/transport/hmac/abstract.rb", "lib/net/ssh/transport/hmac/md5.rb", "lib/net/ssh/transport/hmac/md5_96.rb", "lib/net/ssh/transport/hmac/none.rb", "lib/net/ssh/transport/hmac/sha1.rb", "lib/net/ssh/transport/hmac/sha1_96.rb", "lib/net/ssh/transport/hmac.rb", "lib/net/ssh/transport/identity_cipher.rb", "lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb", "lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb", "lib/net/ssh/transport/kex.rb", "lib/net/ssh/transport/openssl.rb", "lib/net/ssh/transport/packet_stream.rb", "lib/net/ssh/transport/server_version.rb", "lib/net/ssh/transport/session.rb", "lib/net/ssh/transport/state.rb", "lib/net/ssh/verifiers/lenient.rb", "lib/net/ssh/verifiers/null.rb", "lib/net/ssh/verifiers/strict.rb", "lib/net/ssh/version.rb", "lib/net/ssh.rb", "README.rdoc", "THANKS.rdoc"]
|
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.0.
|
4
|
+
version: 2.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamis Buck
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-02-
|
12
|
+
date: 2009-02-24 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|