net-ssh 1.1.4 → 2.0.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.
- data/CHANGELOG.rdoc +37 -0
- data/Manifest +101 -0
- data/README.rdoc +110 -0
- data/Rakefile +26 -0
- data/{THANKS → THANKS.rdoc} +2 -5
- data/lib/net/ssh.rb +189 -57
- data/lib/net/ssh/authentication/agent.rb +175 -0
- data/lib/net/ssh/authentication/constants.rb +18 -0
- data/lib/net/ssh/authentication/key_manager.rb +166 -0
- data/lib/net/ssh/authentication/methods/abstract.rb +60 -0
- data/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
- data/lib/net/ssh/authentication/methods/password.rb +39 -0
- data/lib/net/ssh/authentication/methods/publickey.rb +92 -0
- data/lib/net/ssh/authentication/pageant.rb +176 -0
- data/lib/net/ssh/authentication/session.rb +116 -0
- data/lib/net/ssh/buffer.rb +339 -0
- data/lib/net/ssh/buffered_io.rb +149 -0
- data/lib/net/ssh/config.rb +173 -0
- data/lib/net/ssh/connection/channel.rb +575 -454
- data/lib/net/ssh/connection/constants.rb +31 -45
- data/lib/net/ssh/connection/session.rb +569 -0
- data/lib/net/ssh/connection/term.rb +176 -88
- data/lib/net/ssh/errors.rb +83 -61
- data/lib/net/ssh/key_factory.rb +85 -0
- data/lib/net/ssh/known_hosts.rb +129 -0
- data/lib/net/ssh/loggable.rb +61 -0
- data/lib/net/ssh/packet.rb +102 -0
- data/lib/net/ssh/prompt.rb +93 -0
- data/lib/net/ssh/proxy/errors.rb +8 -28
- data/lib/net/ssh/proxy/http.rb +75 -107
- data/lib/net/ssh/proxy/socks4.rb +35 -48
- data/lib/net/ssh/proxy/socks5.rb +76 -108
- data/lib/net/ssh/service/forward.rb +267 -0
- data/lib/net/ssh/test.rb +89 -0
- data/lib/net/ssh/test/channel.rb +129 -0
- data/lib/net/ssh/test/extensions.rb +152 -0
- data/lib/net/ssh/test/kex.rb +44 -0
- data/lib/net/ssh/test/local_packet.rb +51 -0
- data/lib/net/ssh/test/packet.rb +81 -0
- data/lib/net/ssh/test/remote_packet.rb +38 -0
- data/lib/net/ssh/test/script.rb +157 -0
- data/lib/net/ssh/test/socket.rb +59 -0
- data/lib/net/ssh/transport/algorithms.rb +384 -0
- data/lib/net/ssh/transport/cipher_factory.rb +72 -0
- data/lib/net/ssh/transport/constants.rb +22 -58
- data/lib/net/ssh/transport/hmac.rb +31 -0
- data/lib/net/ssh/transport/hmac/abstract.rb +48 -0
- data/lib/net/ssh/transport/hmac/md5.rb +12 -0
- data/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
- data/lib/net/ssh/transport/hmac/none.rb +15 -0
- data/lib/net/ssh/transport/hmac/sha1.rb +13 -0
- data/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
- data/lib/net/ssh/transport/identity_cipher.rb +40 -0
- data/lib/net/ssh/transport/kex.rb +13 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
- data/lib/net/ssh/{util → transport}/openssl.rb +22 -40
- data/lib/net/ssh/transport/packet_stream.rb +230 -0
- data/lib/net/ssh/transport/server_version.rb +61 -0
- data/lib/net/ssh/transport/session.rb +225 -303
- data/lib/net/ssh/transport/state.rb +170 -0
- data/lib/net/ssh/verifiers/lenient.rb +30 -0
- data/lib/net/ssh/verifiers/null.rb +12 -0
- data/lib/net/ssh/verifiers/strict.rb +53 -0
- data/lib/net/ssh/version.rb +57 -26
- data/net-ssh.gemspec +54 -0
- data/setup.rb +1585 -0
- data/test/authentication/methods/common.rb +28 -0
- data/test/authentication/methods/test_abstract.rb +51 -0
- data/test/authentication/methods/test_hostbased.rb +108 -0
- data/test/authentication/methods/test_keyboard_interactive.rb +98 -0
- data/test/authentication/methods/test_password.rb +50 -0
- data/test/authentication/methods/test_publickey.rb +123 -0
- data/test/authentication/test_agent.rb +205 -0
- data/test/authentication/test_key_manager.rb +100 -0
- data/test/authentication/test_session.rb +93 -0
- data/test/common.rb +106 -0
- data/test/configs/exact_match +8 -0
- data/test/configs/wild_cards +14 -0
- data/test/connection/test_channel.rb +452 -0
- data/test/connection/test_session.rb +483 -0
- data/test/test_all.rb +6 -0
- data/test/test_buffer.rb +336 -0
- data/test/test_buffered_io.rb +63 -0
- data/test/test_config.rb +78 -0
- data/test/test_key_factory.rb +67 -0
- data/test/transport/hmac/test_md5.rb +34 -0
- data/test/transport/hmac/test_md5_96.rb +25 -0
- data/test/transport/hmac/test_none.rb +34 -0
- data/test/transport/hmac/test_sha1.rb +34 -0
- data/test/transport/hmac/test_sha1_96.rb +25 -0
- data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
- data/test/transport/test_algorithms.rb +302 -0
- data/test/transport/test_cipher_factory.rb +163 -0
- data/test/transport/test_hmac.rb +34 -0
- data/test/transport/test_identity_cipher.rb +40 -0
- data/test/transport/test_packet_stream.rb +433 -0
- data/test/transport/test_server_version.rb +55 -0
- data/test/transport/test_session.rb +312 -0
- data/test/transport/test_state.rb +173 -0
- metadata +102 -253
- data/ChangeLog +0 -560
- data/LICENSE +0 -7
- data/NEWS +0 -152
- data/README +0 -14
- data/bin/rb-keygen +0 -210
- data/doc/LICENSE-BSD +0 -27
- data/doc/LICENSE-GPL +0 -280
- data/doc/LICENSE-RUBY +0 -56
- data/doc/manual-html/chapter-1.html +0 -388
- data/doc/manual-html/chapter-2.html +0 -552
- data/doc/manual-html/chapter-3.html +0 -470
- data/doc/manual-html/chapter-4.html +0 -413
- data/doc/manual-html/chapter-5.html +0 -525
- data/doc/manual-html/chapter-6.html +0 -456
- data/doc/manual-html/chapter-7.html +0 -343
- data/doc/manual-html/index.html +0 -235
- data/doc/manual-html/stylesheets/manual.css +0 -270
- data/doc/manual-html/stylesheets/ruby.css +0 -17
- data/doc/manual/chapter.erb +0 -38
- data/doc/manual/example.erb +0 -18
- data/doc/manual/index.erb +0 -29
- data/doc/manual/manual.rb +0 -311
- data/doc/manual/manual.yml +0 -73
- data/doc/manual/page.erb +0 -87
- data/doc/manual/parts/0000.txt +0 -5
- data/doc/manual/parts/0001.txt +0 -3
- data/doc/manual/parts/0002.txt +0 -40
- data/doc/manual/parts/0003.txt +0 -6
- data/doc/manual/parts/0004.txt +0 -7
- data/doc/manual/parts/0005.txt +0 -1
- data/doc/manual/parts/0006.txt +0 -49
- data/doc/manual/parts/0007.txt +0 -67
- data/doc/manual/parts/0008.txt +0 -43
- data/doc/manual/parts/0009.txt +0 -14
- data/doc/manual/parts/0010.txt +0 -7
- data/doc/manual/parts/0011.txt +0 -14
- data/doc/manual/parts/0012.txt +0 -3
- data/doc/manual/parts/0013.txt +0 -20
- data/doc/manual/parts/0014.txt +0 -32
- data/doc/manual/parts/0015.txt +0 -14
- data/doc/manual/parts/0016.txt +0 -28
- data/doc/manual/parts/0017.txt +0 -50
- data/doc/manual/parts/0018.txt +0 -35
- data/doc/manual/parts/0019.txt +0 -7
- data/doc/manual/parts/0020.txt +0 -72
- data/doc/manual/parts/0021.txt +0 -50
- data/doc/manual/parts/0022.txt +0 -42
- data/doc/manual/parts/0023.txt +0 -51
- data/doc/manual/parts/0024.txt +0 -18
- data/doc/manual/parts/0025.txt +0 -18
- data/doc/manual/parts/0026.txt +0 -15
- data/doc/manual/parts/0027.txt +0 -37
- data/doc/manual/parts/0028.txt +0 -16
- data/doc/manual/parts/0029.txt +0 -1
- data/doc/manual/parts/0030.txt +0 -52
- data/doc/manual/parts/0031.txt +0 -25
- data/doc/manual/stylesheets/manual.css +0 -270
- data/doc/manual/stylesheets/ruby.css +0 -17
- data/doc/manual/tutorial.erb +0 -30
- data/examples/auth-forward.rb +0 -41
- data/examples/channel-demo.rb +0 -81
- data/examples/port-forward.rb +0 -51
- data/examples/process-demo.rb +0 -91
- data/examples/remote-net-port-forward.rb +0 -45
- data/examples/remote-port-forward.rb +0 -80
- data/examples/shell-demo.rb +0 -46
- data/examples/ssh-client.rb +0 -67
- data/examples/sync-shell-demo.rb +0 -69
- data/examples/tail-demo.rb +0 -49
- data/lib/net/ssh/connection/driver.rb +0 -446
- data/lib/net/ssh/connection/services.rb +0 -72
- data/lib/net/ssh/host-key-verifier.rb +0 -52
- data/lib/net/ssh/known-hosts.rb +0 -96
- data/lib/net/ssh/lenient-host-key-verifier.rb +0 -25
- data/lib/net/ssh/null-host-key-verifier.rb +0 -14
- data/lib/net/ssh/service/agentforward/driver.rb +0 -78
- data/lib/net/ssh/service/agentforward/services.rb +0 -41
- data/lib/net/ssh/service/forward/driver.rb +0 -319
- data/lib/net/ssh/service/forward/local-network-handler.rb +0 -71
- data/lib/net/ssh/service/forward/remote-network-handler.rb +0 -83
- data/lib/net/ssh/service/forward/services.rb +0 -76
- data/lib/net/ssh/service/process/driver.rb +0 -153
- data/lib/net/ssh/service/process/open.rb +0 -193
- data/lib/net/ssh/service/process/popen3.rb +0 -178
- data/lib/net/ssh/service/process/services.rb +0 -66
- data/lib/net/ssh/service/services.rb +0 -60
- data/lib/net/ssh/service/shell/driver.rb +0 -86
- data/lib/net/ssh/service/shell/services.rb +0 -54
- data/lib/net/ssh/service/shell/shell.rb +0 -222
- data/lib/net/ssh/service/shell/sync.rb +0 -114
- data/lib/net/ssh/session.rb +0 -305
- data/lib/net/ssh/transport/algorithm-negotiator.rb +0 -275
- data/lib/net/ssh/transport/compress/compressor.rb +0 -53
- data/lib/net/ssh/transport/compress/decompressor.rb +0 -53
- data/lib/net/ssh/transport/compress/none-compressor.rb +0 -39
- data/lib/net/ssh/transport/compress/none-decompressor.rb +0 -39
- data/lib/net/ssh/transport/compress/services.rb +0 -68
- data/lib/net/ssh/transport/compress/zlib-compressor.rb +0 -60
- data/lib/net/ssh/transport/compress/zlib-decompressor.rb +0 -52
- data/lib/net/ssh/transport/errors.rb +0 -47
- data/lib/net/ssh/transport/identity-cipher.rb +0 -61
- data/lib/net/ssh/transport/kex/dh-gex.rb +0 -106
- data/lib/net/ssh/transport/kex/dh.rb +0 -249
- data/lib/net/ssh/transport/kex/services.rb +0 -62
- data/lib/net/ssh/transport/ossl/buffer-factory.rb +0 -52
- data/lib/net/ssh/transport/ossl/buffer.rb +0 -87
- data/lib/net/ssh/transport/ossl/cipher-factory.rb +0 -98
- data/lib/net/ssh/transport/ossl/digest-factory.rb +0 -51
- data/lib/net/ssh/transport/ossl/hmac-factory.rb +0 -71
- data/lib/net/ssh/transport/ossl/hmac/hmac.rb +0 -62
- data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +0 -44
- data/lib/net/ssh/transport/ossl/hmac/md5.rb +0 -46
- data/lib/net/ssh/transport/ossl/hmac/none.rb +0 -46
- data/lib/net/ssh/transport/ossl/hmac/services.rb +0 -68
- data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +0 -44
- data/lib/net/ssh/transport/ossl/hmac/sha1.rb +0 -45
- data/lib/net/ssh/transport/ossl/key-factory.rb +0 -116
- data/lib/net/ssh/transport/ossl/services.rb +0 -149
- data/lib/net/ssh/transport/packet-stream.rb +0 -236
- data/lib/net/ssh/transport/services.rb +0 -146
- data/lib/net/ssh/transport/version-negotiator.rb +0 -73
- data/lib/net/ssh/userauth/agent.rb +0 -222
- data/lib/net/ssh/userauth/constants.rb +0 -35
- data/lib/net/ssh/userauth/driver.rb +0 -183
- data/lib/net/ssh/userauth/methods/hostbased.rb +0 -119
- data/lib/net/ssh/userauth/methods/keyboard-interactive.rb +0 -104
- data/lib/net/ssh/userauth/methods/password.rb +0 -70
- data/lib/net/ssh/userauth/methods/publickey.rb +0 -137
- data/lib/net/ssh/userauth/methods/services.rb +0 -90
- data/lib/net/ssh/userauth/pageant.rb +0 -197
- data/lib/net/ssh/userauth/services.rb +0 -141
- data/lib/net/ssh/userauth/userkeys.rb +0 -258
- data/lib/net/ssh/util/buffer.rb +0 -274
- data/lib/net/ssh/util/prompter.rb +0 -73
- data/test/ALL-TESTS.rb +0 -18
- data/test/connection/tc_channel.rb +0 -136
- data/test/connection/tc_driver.rb +0 -287
- data/test/connection/tc_integration.rb +0 -87
- data/test/proxy/tc_http.rb +0 -209
- data/test/proxy/tc_socks4.rb +0 -148
- data/test/proxy/tc_socks5.rb +0 -214
- data/test/service/agentforward/tc_driver.rb +0 -138
- data/test/service/forward/tc_driver.rb +0 -289
- data/test/service/forward/tc_local_network_handler.rb +0 -123
- data/test/service/forward/tc_remote_network_handler.rb +0 -111
- data/test/service/process/tc_driver.rb +0 -79
- data/test/service/process/tc_integration.rb +0 -119
- data/test/service/process/tc_open.rb +0 -179
- data/test/service/process/tc_popen3.rb +0 -164
- data/test/tc_integration.rb +0 -80
- data/test/transport/compress/tc_none_compress.rb +0 -41
- data/test/transport/compress/tc_none_decompress.rb +0 -45
- data/test/transport/compress/tc_zlib_compress.rb +0 -61
- data/test/transport/compress/tc_zlib_decompress.rb +0 -48
- data/test/transport/kex/tc_dh.rb +0 -312
- data/test/transport/kex/tc_dh_gex.rb +0 -71
- data/test/transport/ossl/fixtures/dsa-encrypted +0 -15
- data/test/transport/ossl/fixtures/dsa-encrypted-bad +0 -15
- data/test/transport/ossl/fixtures/dsa-unencrypted +0 -12
- data/test/transport/ossl/fixtures/dsa-unencrypted-bad +0 -12
- data/test/transport/ossl/fixtures/dsa-unencrypted.pub +0 -1
- data/test/transport/ossl/fixtures/not-a-private-key +0 -4
- data/test/transport/ossl/fixtures/not-supported +0 -2
- data/test/transport/ossl/fixtures/rsa-encrypted +0 -18
- data/test/transport/ossl/fixtures/rsa-encrypted-bad +0 -18
- data/test/transport/ossl/fixtures/rsa-unencrypted +0 -15
- data/test/transport/ossl/fixtures/rsa-unencrypted-bad +0 -15
- data/test/transport/ossl/fixtures/rsa-unencrypted.pub +0 -1
- data/test/transport/ossl/hmac/tc_hmac.rb +0 -58
- data/test/transport/ossl/hmac/tc_md5.rb +0 -50
- data/test/transport/ossl/hmac/tc_md5_96.rb +0 -50
- data/test/transport/ossl/hmac/tc_none.rb +0 -50
- data/test/transport/ossl/hmac/tc_sha1.rb +0 -50
- data/test/transport/ossl/hmac/tc_sha1_96.rb +0 -50
- data/test/transport/ossl/tc_buffer.rb +0 -97
- data/test/transport/ossl/tc_buffer_factory.rb +0 -67
- data/test/transport/ossl/tc_cipher_factory.rb +0 -84
- data/test/transport/ossl/tc_digest_factory.rb +0 -39
- data/test/transport/ossl/tc_hmac_factory.rb +0 -72
- data/test/transport/ossl/tc_key_factory.rb +0 -199
- data/test/transport/tc_algorithm_negotiator.rb +0 -170
- data/test/transport/tc_identity_cipher.rb +0 -52
- data/test/transport/tc_integration.rb +0 -115
- data/test/transport/tc_packet_stream.rb +0 -184
- data/test/transport/tc_session.rb +0 -296
- data/test/transport/tc_version_negotiator.rb +0 -86
- data/test/userauth/methods/tc_hostbased.rb +0 -136
- data/test/userauth/methods/tc_password.rb +0 -89
- data/test/userauth/methods/tc_publickey.rb +0 -167
- data/test/userauth/tc_agent.rb +0 -223
- data/test/userauth/tc_driver.rb +0 -190
- data/test/userauth/tc_integration.rb +0 -97
- data/test/userauth/tc_userkeys.rb +0 -265
- data/test/util/tc_buffer.rb +0 -217
@@ -1,141 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
|
4
|
-
# All rights reserved.
|
5
|
-
#
|
6
|
-
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
7
|
-
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
-
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
-
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
10
|
-
# distribution for the texts of these licenses.
|
11
|
-
# -----------------------------------------------------------------------------
|
12
|
-
# net-ssh website : http://net-ssh.rubyforge.org
|
13
|
-
# project website: http://rubyforge.org/projects/net-ssh
|
14
|
-
# =============================================================================
|
15
|
-
#++
|
16
|
-
|
17
|
-
module Net
|
18
|
-
module SSH
|
19
|
-
module UserAuth
|
20
|
-
|
21
|
-
def register_services( container )
|
22
|
-
container.namespace_define :userauth do |b|
|
23
|
-
|
24
|
-
b.require 'net/ssh/userauth/methods/services', "#{self}::Methods"
|
25
|
-
|
26
|
-
b.agent_socket_factory do
|
27
|
-
if File::ALT_SEPARATOR
|
28
|
-
require 'net/ssh/userauth/pageant'
|
29
|
-
Pageant::Socket
|
30
|
-
else
|
31
|
-
require 'socket'
|
32
|
-
defined?( UNIXSocket ) ? UNIXSocket : nil
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
b.default_agent_socket_name { ENV['SSH_AUTH_SOCK'] }
|
37
|
-
|
38
|
-
b.default_agent_version { 2 }
|
39
|
-
|
40
|
-
b.agent( :model => :prototype ) do |c,p|
|
41
|
-
socket_factory = c[:agent_socket_factory]
|
42
|
-
socket_name = c[:default_agent_socket_name]
|
43
|
-
|
44
|
-
if (File::ALT_SEPARATOR || socket_name) && socket_factory
|
45
|
-
require 'net/ssh/userauth/agent'
|
46
|
-
require 'net/ssh/transport/services'
|
47
|
-
|
48
|
-
agent = Agent.new
|
49
|
-
agent.socket_factory = socket_factory
|
50
|
-
agent.socket_name = socket_name
|
51
|
-
agent.version = c[:default_agent_version]
|
52
|
-
agent.buffers = c[:transport][:buffers]
|
53
|
-
agent.keys = c[:transport][:keys]
|
54
|
-
|
55
|
-
begin
|
56
|
-
agent.connect!
|
57
|
-
rescue Net::SSH::Exception
|
58
|
-
# if there was an error connecting to the agent, swallow the
|
59
|
-
# error and move on, without the agent
|
60
|
-
agent = nil
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
agent
|
65
|
-
end
|
66
|
-
|
67
|
-
b.agent_factory do |c,p|
|
68
|
-
factory = Object.new
|
69
|
-
klass = class << factory; self; end
|
70
|
-
klass.send( :define_method, :open ) { c[:agent] }
|
71
|
-
factory
|
72
|
-
end
|
73
|
-
|
74
|
-
b.default_user_key_locations do
|
75
|
-
[ "#{ENV['HOME']}/.ssh/id_dsa",
|
76
|
-
"#{ENV['HOME']}/.ssh2/id_dsa",
|
77
|
-
"#{ENV['HOME']}/.ssh/id_rsa",
|
78
|
-
"#{ENV['HOME']}/.ssh2/id_rsa" ]
|
79
|
-
end
|
80
|
-
|
81
|
-
b.default_host_key_locations do
|
82
|
-
[ "/etc/ssh/ssh_host_dsa_key",
|
83
|
-
"/etc/ssh/ssh_host_rsa_key" ]
|
84
|
-
end
|
85
|
-
|
86
|
-
b.key_existence_tester { File }
|
87
|
-
|
88
|
-
b.user_keys do |c,p|
|
89
|
-
require 'net/ssh/userauth/userkeys'
|
90
|
-
|
91
|
-
userkeys = UserKeyManager.new
|
92
|
-
userkeys.agent_factory = c[:agent_factory]
|
93
|
-
userkeys.keys = c[:transport][:keys]
|
94
|
-
userkeys.buffers = c[:transport][:buffers]
|
95
|
-
userkeys.log = c[:log_for, p]
|
96
|
-
userkeys.key_existence_tester = b.key_existence_tester
|
97
|
-
|
98
|
-
b.default_user_key_locations.each { |f| userkeys.add f }
|
99
|
-
b.default_host_key_locations.each { |f| userkeys.add_host_key f }
|
100
|
-
|
101
|
-
userkeys
|
102
|
-
end
|
103
|
-
|
104
|
-
b.authentication_method_order do
|
105
|
-
[ "publickey",
|
106
|
-
"hostbased",
|
107
|
-
"password",
|
108
|
-
"keyboard-interactive" ]
|
109
|
-
end
|
110
|
-
|
111
|
-
b.driver do |c,p|
|
112
|
-
require 'net/ssh/userauth/driver'
|
113
|
-
|
114
|
-
driver = Driver.new( c[:log_for, p],
|
115
|
-
c[:transport][:buffers],
|
116
|
-
c[:methods],
|
117
|
-
c[:authentication_method_order] )
|
118
|
-
|
119
|
-
driver.key_manager = c[:user_keys]
|
120
|
-
driver.session = c[:transport][:session]
|
121
|
-
|
122
|
-
if c.knows_key?(:userauth_keys) && c[:userauth_keys]
|
123
|
-
driver.set_key_files c[:userauth_keys]
|
124
|
-
end
|
125
|
-
if c.knows_key?(:userauth_host_keys) && c[:userauth_host_keys]
|
126
|
-
driver.set_host_key_files c[:userauth_host_keys]
|
127
|
-
end
|
128
|
-
if c.knows_key?(:userauth_method_order) && c[:userauth_method_order]
|
129
|
-
driver.set_auth_method_order(*c[:userauth_method_order])
|
130
|
-
end
|
131
|
-
|
132
|
-
driver
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
136
|
-
end
|
137
|
-
module_function :register_services
|
138
|
-
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
@@ -1,258 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
|
4
|
-
# All rights reserved.
|
5
|
-
#
|
6
|
-
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
7
|
-
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
-
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
-
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
10
|
-
# distribution for the texts of these licenses.
|
11
|
-
# -----------------------------------------------------------------------------
|
12
|
-
# net-ssh website : http://net-ssh.rubyforge.org
|
13
|
-
# project website: http://rubyforge.org/projects/net-ssh
|
14
|
-
# =============================================================================
|
15
|
-
#++
|
16
|
-
|
17
|
-
require 'net/ssh/errors'
|
18
|
-
|
19
|
-
module Net
|
20
|
-
module SSH
|
21
|
-
module UserAuth
|
22
|
-
|
23
|
-
# A trivial exception class used to report errors in the key manager.
|
24
|
-
class UserKeyManagerError < Net::SSH::Exception; end
|
25
|
-
|
26
|
-
# This class encapsulates all operations done by clients on a user's
|
27
|
-
# private keys. In practice, the client should never need a reference
|
28
|
-
# to a private key; instead, they grab a list of "identities" (public
|
29
|
-
# keys) that are available from the UserKeyManager, and then use
|
30
|
-
# the UserKeyManager to do various private key operations using those
|
31
|
-
# identities.
|
32
|
-
#
|
33
|
-
# The UserKeyManager also uses the Agent class to encapsulate the
|
34
|
-
# ssh-agent. Thus, from a client's perspective it is completely
|
35
|
-
# hidden whether an identity comes from the ssh-agent or from a file
|
36
|
-
# on disk.
|
37
|
-
class UserKeyManager
|
38
|
-
|
39
|
-
# The agent factory to use when a new agent instance is needed.
|
40
|
-
attr_writer :agent_factory
|
41
|
-
|
42
|
-
# The key manager instance to use for managing keys
|
43
|
-
attr_writer :keys
|
44
|
-
|
45
|
-
# The logger instance to use for logging messages
|
46
|
-
attr_writer :log
|
47
|
-
|
48
|
-
# The buffer manager to use for providing new buffer instances.
|
49
|
-
attr_writer :buffers
|
50
|
-
|
51
|
-
# The object that will be used to test whether a given key file is
|
52
|
-
# readable. This object must only respond to "readable?" with one
|
53
|
-
# parameter, the file to test the readability of.
|
54
|
-
attr_writer :key_existence_tester
|
55
|
-
|
56
|
-
# The list of user key files that will be examined
|
57
|
-
attr_reader :key_files
|
58
|
-
|
59
|
-
# The list of host key files that will be examined
|
60
|
-
attr_reader :host_key_files
|
61
|
-
|
62
|
-
# Create a new UserKeyManager. By default, the manager will
|
63
|
-
# use the ssh-agent (if it is running).
|
64
|
-
def initialize
|
65
|
-
@key_files = []
|
66
|
-
@host_key_files = []
|
67
|
-
@use_agent = true
|
68
|
-
@agent = nil
|
69
|
-
end
|
70
|
-
|
71
|
-
# Clear all knowledge of any loaded user keys. This also clears the list
|
72
|
-
# of default identity files that are to be loaded, thus making it
|
73
|
-
# appropriate to use if a client wishes to NOT use the default identity
|
74
|
-
# files.
|
75
|
-
def clear!
|
76
|
-
@key_files = []
|
77
|
-
@known_identities = nil
|
78
|
-
self
|
79
|
-
end
|
80
|
-
|
81
|
-
# Clear all knowledge of any loaded host keys. This also clears the list
|
82
|
-
# of default identity files that are to be loaded, thus making it
|
83
|
-
# appropriate to use if a client wishes to NOT use the default identity
|
84
|
-
# files.
|
85
|
-
def clear_host!
|
86
|
-
@host_key_files = []
|
87
|
-
@known_host_identities = nil
|
88
|
-
self
|
89
|
-
end
|
90
|
-
|
91
|
-
# Add the given key_file to the list of key files that will be used.
|
92
|
-
def add( key_file )
|
93
|
-
@key_files.push( key_file ).uniq!
|
94
|
-
self
|
95
|
-
end
|
96
|
-
|
97
|
-
alias :<< :add
|
98
|
-
|
99
|
-
# Add the given key_file to the list of host key files that will be
|
100
|
-
# used.
|
101
|
-
def add_host_key( key_file )
|
102
|
-
@host_key_files.push( key_file ).uniq!
|
103
|
-
self
|
104
|
-
end
|
105
|
-
|
106
|
-
# This is used as a hint to the UserKeyManager indicating that the agent
|
107
|
-
# connection is no longer needed. Any other open resources may be closed
|
108
|
-
# at this time.
|
109
|
-
#
|
110
|
-
# Calling this does NOT indicate that the UserKeyManager will no longer
|
111
|
-
# be used. Identities may still be requested and operations done on
|
112
|
-
# loaded identities, in which case, the agent will be automatically
|
113
|
-
# reconnected. This method simply allows the client connection to be
|
114
|
-
# closed when it will not be used in the immediate future.
|
115
|
-
def finish
|
116
|
-
close_agent
|
117
|
-
end
|
118
|
-
|
119
|
-
# Returns an array of identities (public keys) known to this manager.
|
120
|
-
# The origin of the identities may be from files on disk or from an
|
121
|
-
# ssh-agent. Note that identities from an ssh-agent are always listed
|
122
|
-
# first in the array, with other identities coming after.
|
123
|
-
def identities
|
124
|
-
identities = []
|
125
|
-
@known_identities = Hash.new
|
126
|
-
|
127
|
-
ensure_agent
|
128
|
-
if @agent
|
129
|
-
@agent.identities.each do |key|
|
130
|
-
identities.push key
|
131
|
-
@known_identities[ key ] = { :from => :agent }
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
@key_files.each do |file|
|
136
|
-
if @key_existence_tester.readable?( file )
|
137
|
-
begin
|
138
|
-
key = @keys.load_public_key( file + ".pub" )
|
139
|
-
identities.push key
|
140
|
-
@known_identities[ key ] = { :from => :file, :file => file }
|
141
|
-
rescue Exception => e
|
142
|
-
@log.warn "could not load public key file " +
|
143
|
-
"'#{file}.pub' (#{e.message} [#{e.class}])" if @log.warn?
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
identities
|
149
|
-
end
|
150
|
-
|
151
|
-
# Returns an array of host identities (public keys) known to this
|
152
|
-
# manager. Host identities are those that identify the current host,
|
153
|
-
# and are used (typically) for hostbased authentication.
|
154
|
-
def host_identities
|
155
|
-
identities = []
|
156
|
-
@known_host_identities = Hash.new
|
157
|
-
|
158
|
-
@host_key_files.each do |file|
|
159
|
-
if @key_existence_tester.readable?( file )
|
160
|
-
begin
|
161
|
-
key = @keys.load_public_key( file + ".pub" )
|
162
|
-
identities.push key
|
163
|
-
@known_host_identities[ key ] =
|
164
|
-
{ :from => :file, :file => file }
|
165
|
-
rescue Exception => e
|
166
|
-
@log.warn "could not load public host key file " +
|
167
|
-
"'#{file}.pub' (#{e.message} [#{e.class}])" if @log.warn?
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
identities
|
173
|
-
end
|
174
|
-
|
175
|
-
# Sign the given data, using the corresponding private key of the given
|
176
|
-
# identity. If the identity was originally obtained from an ssh-agent,
|
177
|
-
# then the ssh-agent will be used to sign the data, otherwise the
|
178
|
-
# private key for the identity will be loaded from disk (if it hasn't
|
179
|
-
# been loaded already) and will then be used to sign the data.
|
180
|
-
#
|
181
|
-
# Regardless of the identity's origin or who does the signing, this
|
182
|
-
# will always return the signature in an SSH2-specified "signature
|
183
|
-
# blob" format.
|
184
|
-
def sign( identity, data )
|
185
|
-
info = find_identity( identity )
|
186
|
-
|
187
|
-
if info[:key].nil? && info[:from] == :file
|
188
|
-
begin
|
189
|
-
info[:key] = @keys.load_private_key( info[:file] )
|
190
|
-
rescue Exception => e
|
191
|
-
raise UserKeyManagerError,
|
192
|
-
"the given identity is known, " +
|
193
|
-
"but the private key could not be loaded " +
|
194
|
-
"(#{e.message} [#{e.class}])"
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
if info[:key]
|
199
|
-
sig_blob = @buffers.writer
|
200
|
-
sig_blob.write_string identity.ssh_type
|
201
|
-
sig_blob.write_string info[:key].ssh_do_sign( data.to_s )
|
202
|
-
return sig_blob.to_s
|
203
|
-
end
|
204
|
-
|
205
|
-
if info[:from] == :agent
|
206
|
-
raise UserKeyManagerError,
|
207
|
-
"the agent is no longer available" unless @agent
|
208
|
-
return @agent.sign( identity, data.to_s )
|
209
|
-
end
|
210
|
-
|
211
|
-
raise UserKeyManagerError,
|
212
|
-
"[BUG] can't determine identity origin (#{info.inspect})"
|
213
|
-
end
|
214
|
-
|
215
|
-
# Identifies whether the ssh-agent will be used or not.
|
216
|
-
def use_agent?
|
217
|
-
@use_agent
|
218
|
-
end
|
219
|
-
|
220
|
-
# Toggles whether the ssh-agent will be used or not. If true, an
|
221
|
-
# attempt will be made to use the ssh-agent. If false, any existing
|
222
|
-
# connection to an agent is closed and the agent will not be used.
|
223
|
-
def use_agent=( use_agent )
|
224
|
-
close_agent if !use_agent
|
225
|
-
@use_agent = use_agent
|
226
|
-
end
|
227
|
-
|
228
|
-
# Ensures that a connection to the agent has been made, if an agent is
|
229
|
-
# to be used.
|
230
|
-
def ensure_agent
|
231
|
-
return if @agent || !@use_agent
|
232
|
-
@agent = @agent_factory.open
|
233
|
-
end
|
234
|
-
private :ensure_agent
|
235
|
-
|
236
|
-
# Closes any open connection to an ssh-agent.
|
237
|
-
def close_agent
|
238
|
-
@agent.close if @agent
|
239
|
-
@agent = nil
|
240
|
-
end
|
241
|
-
private :close_agent
|
242
|
-
|
243
|
-
def find_identity( identity )
|
244
|
-
info = @known_identities[ identity ] if @known_identities
|
245
|
-
if !info && @known_host_identities[ identity ]
|
246
|
-
info = @known_host_identities[ identity ]
|
247
|
-
end
|
248
|
-
raise UserKeyManagerError,
|
249
|
-
"the given identity is unknown to the key manager" unless info
|
250
|
-
return info
|
251
|
-
end
|
252
|
-
private :find_identity
|
253
|
-
|
254
|
-
end
|
255
|
-
|
256
|
-
end
|
257
|
-
end
|
258
|
-
end
|
data/lib/net/ssh/util/buffer.rb
DELETED
@@ -1,274 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
|
4
|
-
# All rights reserved.
|
5
|
-
#
|
6
|
-
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
7
|
-
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
-
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
-
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
10
|
-
# distribution for the texts of these licenses.
|
11
|
-
# -----------------------------------------------------------------------------
|
12
|
-
# net-ssh website : http://net-ssh.rubyforge.org
|
13
|
-
# project website: http://rubyforge.org/projects/net-ssh
|
14
|
-
# =============================================================================
|
15
|
-
#++
|
16
|
-
|
17
|
-
module Net
|
18
|
-
module SSH
|
19
|
-
|
20
|
-
module Util
|
21
|
-
|
22
|
-
# The abstract ancestor module of both ReaderBufferImpl and
|
23
|
-
# WriterBufferImpl. It defines the common interface for both submodules.
|
24
|
-
module BufferBase
|
25
|
-
|
26
|
-
# exposes the content of the buffer
|
27
|
-
attr_reader :content
|
28
|
-
|
29
|
-
# the length of the buffer's content.
|
30
|
-
def length
|
31
|
-
@content.length
|
32
|
-
end
|
33
|
-
|
34
|
-
# returns a copy of the buffer's content.
|
35
|
-
def to_s
|
36
|
-
( @content || "" ).dup
|
37
|
-
end
|
38
|
-
|
39
|
-
# Compares the contents of the two buffers.
|
40
|
-
def ==( buffer )
|
41
|
-
to_s == buffer.to_s
|
42
|
-
end
|
43
|
-
|
44
|
-
# Resets the buffer, making it empty.
|
45
|
-
def clear!
|
46
|
-
@content = ""
|
47
|
-
end
|
48
|
-
|
49
|
-
def init_BufferBase( content="" )
|
50
|
-
@content = content
|
51
|
-
end
|
52
|
-
private :init_BufferBase
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
# A convenience module for representing a string of encoded data. It
|
57
|
-
# provides an interface for easily reading and decoding the buffer.
|
58
|
-
module ReaderBufferImpl
|
59
|
-
|
60
|
-
# the current position of the pointer in the buffer
|
61
|
-
attr_reader :position
|
62
|
-
|
63
|
-
# used by derived modules and classes to perform any
|
64
|
-
# reader-buffer-specific initialization.
|
65
|
-
def init_ReaderBufferImpl
|
66
|
-
@position = 0
|
67
|
-
end
|
68
|
-
private :init_ReaderBufferImpl
|
69
|
-
|
70
|
-
# Appends the given text to the end of the buffer.
|
71
|
-
def append( text )
|
72
|
-
@content << text
|
73
|
-
end
|
74
|
-
|
75
|
-
# Returns all text from the current pointer to the end of the buffer as
|
76
|
-
# a new buffer as the same class as the receiver.
|
77
|
-
def remainder_as_buffer
|
78
|
-
self.class.new( @content[ @position..-1 ] )
|
79
|
-
end
|
80
|
-
|
81
|
-
# Reads +count+ bytes from the buffer. If +count+ is +nil+, this will
|
82
|
-
# return all remaining text in the buffer. This method will increment
|
83
|
-
# the pointer.
|
84
|
-
def read( count = nil )
|
85
|
-
count = length - @position unless count
|
86
|
-
return nil if @position + count > length
|
87
|
-
|
88
|
-
@position += count
|
89
|
-
@content[ @position-count, count ]
|
90
|
-
end
|
91
|
-
|
92
|
-
# Return the next 8 bytes as a 64-bit integer (in network byte order).
|
93
|
-
def read_int64
|
94
|
-
hi = read_long
|
95
|
-
lo = read_long
|
96
|
-
return ( hi << 32 ) + lo
|
97
|
-
end
|
98
|
-
|
99
|
-
# Return the next four bytes as a long integer (in network byte order).
|
100
|
-
def read_long
|
101
|
-
b = read( 4 ) or return nil
|
102
|
-
b.unpack( "N" ).first
|
103
|
-
end
|
104
|
-
|
105
|
-
# Read the next two bytes as a short integer (in network byte order).
|
106
|
-
def read_short
|
107
|
-
b = read( 2 ) or return nil
|
108
|
-
b.unpack( "n" ).first
|
109
|
-
end
|
110
|
-
|
111
|
-
# Read and return the next byte in the buffer.
|
112
|
-
def read_byte
|
113
|
-
b = read( 1 ) or return nil
|
114
|
-
b[0]
|
115
|
-
end
|
116
|
-
|
117
|
-
# Read and return an SSH2-encoded string. The string starts with a long
|
118
|
-
# integer that describes the number of bytes remaining in the string.
|
119
|
-
def read_string
|
120
|
-
length = read_long or return nil
|
121
|
-
read( length )
|
122
|
-
end
|
123
|
-
|
124
|
-
# Read a single byte and convert it into a boolean, using 'C' rules
|
125
|
-
# (i.e., zero is false, non-zero is true).
|
126
|
-
def read_bool
|
127
|
-
b = read( 1 ) or return nil
|
128
|
-
b[0] != 0
|
129
|
-
end
|
130
|
-
|
131
|
-
# Resets the pointer to the start of the buffer.
|
132
|
-
def reset!
|
133
|
-
@position = 0
|
134
|
-
end
|
135
|
-
|
136
|
-
# Returns true if the pointer is at the end of the buffer.
|
137
|
-
def eof?
|
138
|
-
@position >= length
|
139
|
-
end
|
140
|
-
|
141
|
-
# Resets the buffer, making it empty.
|
142
|
-
def clear!
|
143
|
-
@content = ""
|
144
|
-
@position = 0
|
145
|
-
end
|
146
|
-
|
147
|
-
end # ReaderBufferImpl
|
148
|
-
|
149
|
-
# A convenience module for writing a string of encoded data. It provides
|
150
|
-
# an interface for easily writing and encoding data.
|
151
|
-
module WriterBufferImpl
|
152
|
-
|
153
|
-
def init_WriterBufferImpl
|
154
|
-
# nothing
|
155
|
-
end
|
156
|
-
private :init_WriterBufferImpl
|
157
|
-
|
158
|
-
# Writes the given data literally into the string.
|
159
|
-
def write( *data )
|
160
|
-
@content << data.join
|
161
|
-
end
|
162
|
-
|
163
|
-
# Writes each argument to the buffer as a network-byte-order-encoded
|
164
|
-
# 64-bit integer (8 bytes).
|
165
|
-
def write_int64( *n )
|
166
|
-
n.each do |i|
|
167
|
-
hi = ( i >> 32 ) & 0xFFFFFFFF
|
168
|
-
lo = i & 0xFFFFFFFF
|
169
|
-
@content << [ hi, lo ].pack( "N2" )
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
# Writes each argument to the buffer as a network-byte-order-encoded
|
174
|
-
# long (4-byte) integer.
|
175
|
-
def write_long( *n )
|
176
|
-
@content << n.pack( "N*" )
|
177
|
-
end
|
178
|
-
|
179
|
-
# Writes each argument to the buffer as a network-byte-order-encoded
|
180
|
-
# short (2-byte) integer.
|
181
|
-
def write_short( *n )
|
182
|
-
@content << n.pack( "n*" )
|
183
|
-
end
|
184
|
-
|
185
|
-
# Writes each argument to the buffer as a byte.
|
186
|
-
def write_byte( *n )
|
187
|
-
@content << n.map { |c| c.chr }.join
|
188
|
-
end
|
189
|
-
|
190
|
-
# Writes each argument to the buffer as an SSH2-encoded string. Each
|
191
|
-
# string is prefixed by its length, encoded as a 4-byte long integer.
|
192
|
-
def write_string( *text )
|
193
|
-
text.each do |string|
|
194
|
-
write_long( string.length )
|
195
|
-
write( string )
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
# Writes each argument to the buffer as a (C-style) boolean, with 1
|
200
|
-
# meaning true, and 0 meaning false.
|
201
|
-
def write_bool( *b )
|
202
|
-
@content << b.map { |v| ( v ? 1 : 0 ).chr }.join
|
203
|
-
end
|
204
|
-
|
205
|
-
# Writes each argument to the buffer as a bignum (SSH2-style). No
|
206
|
-
# checking is done to ensure that the arguments are, in fact, bignums.
|
207
|
-
def write_bignum( *n )
|
208
|
-
@content << n.map { |b| b.to_ssh }.join
|
209
|
-
end
|
210
|
-
|
211
|
-
# Writes the given arguments to the buffer as SSH2-encoded keys.
|
212
|
-
def write_key( *key )
|
213
|
-
key.each do |k|
|
214
|
-
write_string( k.ssh_type )
|
215
|
-
|
216
|
-
case k.ssh_type
|
217
|
-
when "ssh-dss"
|
218
|
-
write_bignum( k.p )
|
219
|
-
write_bignum( k.q )
|
220
|
-
write_bignum( k.g )
|
221
|
-
write_bignum( k.pub_key )
|
222
|
-
|
223
|
-
when "ssh-rsa"
|
224
|
-
write_bignum( k.e )
|
225
|
-
write_bignum( k.n )
|
226
|
-
|
227
|
-
else
|
228
|
-
raise NotImplementedError,
|
229
|
-
"unsupported key type '#{k.ssh_type}'"
|
230
|
-
end
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
end # class WriterBufferImpl
|
235
|
-
|
236
|
-
# A convenience class for a read-only buffer.
|
237
|
-
class ReaderBuffer
|
238
|
-
include BufferBase
|
239
|
-
include ReaderBufferImpl
|
240
|
-
|
241
|
-
def initialize( content )
|
242
|
-
init_BufferBase( content )
|
243
|
-
init_ReaderBufferImpl
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
# A convenience class for a write-only buffer.
|
248
|
-
class WriterBuffer
|
249
|
-
include BufferBase
|
250
|
-
include WriterBufferImpl
|
251
|
-
|
252
|
-
def initialize( content="" )
|
253
|
-
init_BufferBase( content )
|
254
|
-
init_WriterBufferImpl
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
# A convenience class for a read/write buffer.
|
259
|
-
class Buffer
|
260
|
-
include BufferBase
|
261
|
-
include ReaderBufferImpl
|
262
|
-
include WriterBufferImpl
|
263
|
-
|
264
|
-
def initialize( content="" )
|
265
|
-
init_BufferBase( content )
|
266
|
-
init_ReaderBufferImpl
|
267
|
-
init_WriterBufferImpl
|
268
|
-
end
|
269
|
-
end
|
270
|
-
|
271
|
-
end # module Util
|
272
|
-
|
273
|
-
end # module SSH
|
274
|
-
end # module Net
|