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,222 +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
|
-
require 'net/ssh/transport/session'
|
19
|
-
|
20
|
-
module Net
|
21
|
-
module SSH
|
22
|
-
module UserAuth
|
23
|
-
|
24
|
-
# A trivial exception class for representing agent-specific errors.
|
25
|
-
class AgentError < Net::SSH::Exception; end
|
26
|
-
|
27
|
-
# This class implements a simple client for the ssh-agent protocol. It
|
28
|
-
# does not implement any specific protocol, but instead copies the
|
29
|
-
# behavior of the ssh-agent functions in the OpenSSH library (3.8).
|
30
|
-
#
|
31
|
-
# This means that although it behaves like a SSH1 client, it also has
|
32
|
-
# some SSH2 functionality (like signing data).
|
33
|
-
class Agent
|
34
|
-
SSH2_AGENT_REQUEST_VERSION = 1
|
35
|
-
SSH2_AGENT_REQUEST_IDENTITIES = 11
|
36
|
-
SSH2_AGENT_IDENTITIES_ANSWER = 12
|
37
|
-
SSH2_AGENT_SIGN_REQUEST = 13
|
38
|
-
SSH2_AGENT_SIGN_RESPONSE = 14
|
39
|
-
SSH2_AGENT_FAILURE = 30
|
40
|
-
SSH2_AGENT_VERSION_RESPONSE = 103
|
41
|
-
|
42
|
-
SSH_COM_AGENT2_FAILURE = 102
|
43
|
-
|
44
|
-
SSH_AGENT_REQUEST_RSA_IDENTITIES = 1
|
45
|
-
SSH_AGENT_RSA_IDENTITIES_ANSWER = 2
|
46
|
-
SSH_AGENT_FAILURE = 5
|
47
|
-
|
48
|
-
# The socket factory used to connect to the agent process. It must
|
49
|
-
# respond to #open, and accept a single parameter (the name of the
|
50
|
-
# socket to open).
|
51
|
-
attr_writer :socket_factory
|
52
|
-
|
53
|
-
# The name of the socket to open.
|
54
|
-
attr_writer :socket_name
|
55
|
-
|
56
|
-
# The version of the SSH protocol version to report.
|
57
|
-
attr_writer :version
|
58
|
-
|
59
|
-
# The buffer factory to use to obtain buffer instances.
|
60
|
-
attr_writer :buffers
|
61
|
-
|
62
|
-
# The key factory to use to obtain key instances.
|
63
|
-
attr_writer :keys
|
64
|
-
|
65
|
-
# Connect to the agent process using the socket factory and socket name
|
66
|
-
# given by the attribute writers. If the agent on the other end of the
|
67
|
-
# socket reports that it is an SSH2-compatible agent, this will fail
|
68
|
-
# (it only supports the ssh-agent distributed by OpenSSH).
|
69
|
-
def connect!
|
70
|
-
@socket = @socket_factory.open( @socket_name )
|
71
|
-
|
72
|
-
# determine what type of agent we're communicating with
|
73
|
-
buffer = @buffers.writer
|
74
|
-
buffer.write_string Net::SSH::Transport::Session.version
|
75
|
-
type, body = send_with_reply SSH2_AGENT_REQUEST_VERSION, buffer
|
76
|
-
|
77
|
-
if type == SSH2_AGENT_VERSION_RESPONSE
|
78
|
-
raise NotImplementedError, "SSH2 agents are not yet supported"
|
79
|
-
elsif type != SSH_AGENT_RSA_IDENTITIES_ANSWER
|
80
|
-
raise AgentError,
|
81
|
-
"unknown response from agent: #{type}, #{body.to_s.inspect}"
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
# Return an array of all identities (public keys) known to the agent.
|
86
|
-
# Each key returned is augmented with a +comment+ property which is set
|
87
|
-
# to the comment returned by the agent for that key.
|
88
|
-
def identities
|
89
|
-
case @version
|
90
|
-
when 1
|
91
|
-
code1 = SSH_AGENT_REQUEST_RSA_IDENTITIES
|
92
|
-
code2 = SSH_AGENT_RSA_IDENTITIES_ANSWER
|
93
|
-
when 2
|
94
|
-
code1 = SSH2_AGENT_REQUEST_IDENTITIES
|
95
|
-
code2 = SSH2_AGENT_IDENTITIES_ANSWER
|
96
|
-
else
|
97
|
-
raise NotImplementedError, "SSH version #{@version}"
|
98
|
-
end
|
99
|
-
|
100
|
-
type, body = send_with_reply code1
|
101
|
-
raise AgentError,
|
102
|
-
"could not get identity count" if agent_failed( type )
|
103
|
-
raise AgentError, "bad authentication reply: #{type}" if type != code2
|
104
|
-
|
105
|
-
identities = []
|
106
|
-
body.read_long.times do
|
107
|
-
case @version
|
108
|
-
when 1
|
109
|
-
key = @keys.get( "rsa" )
|
110
|
-
bits = body.read_long
|
111
|
-
key.e = body.read_bignum
|
112
|
-
key.n = body.read_bignum
|
113
|
-
when 2
|
114
|
-
blob = @buffers.reader( body.read_string )
|
115
|
-
key = blob.read_key
|
116
|
-
end
|
117
|
-
|
118
|
-
unless key.respond_to?( :comment= )
|
119
|
-
key.instance_eval <<-EVAL
|
120
|
-
def comment=(cmt)
|
121
|
-
@comment = cmt
|
122
|
-
end
|
123
|
-
EVAL
|
124
|
-
end
|
125
|
-
|
126
|
-
unless key.respond_to?( :comment )
|
127
|
-
key.instance_eval <<-EVAL
|
128
|
-
def comment
|
129
|
-
@comment
|
130
|
-
end
|
131
|
-
EVAL
|
132
|
-
end
|
133
|
-
|
134
|
-
key.comment = body.read_string
|
135
|
-
identities.push key
|
136
|
-
end
|
137
|
-
|
138
|
-
return identities
|
139
|
-
end
|
140
|
-
|
141
|
-
# Closes this socket. This agent reference is no longer able to
|
142
|
-
# query the agent.
|
143
|
-
def close
|
144
|
-
@socket.close
|
145
|
-
end
|
146
|
-
|
147
|
-
# Using the agent and the given public key, sign the given data. The
|
148
|
-
# signature is returned in SSH2 format.
|
149
|
-
def sign( key, data )
|
150
|
-
blob = @buffers.writer
|
151
|
-
blob.write_key key
|
152
|
-
|
153
|
-
packet_data = @buffers.writer
|
154
|
-
packet_data.write_string blob.to_s
|
155
|
-
packet_data.write_string data.to_s
|
156
|
-
packet_data.write_long 0
|
157
|
-
|
158
|
-
type, reply = send_with_reply SSH2_AGENT_SIGN_REQUEST, packet_data
|
159
|
-
if agent_failed( type )
|
160
|
-
raise AgentError,
|
161
|
-
"agent could not sign data with requested identity"
|
162
|
-
elsif type != SSH2_AGENT_SIGN_RESPONSE
|
163
|
-
raise AgentError, "bad authentication response #{type}"
|
164
|
-
end
|
165
|
-
|
166
|
-
return reply.read_string
|
167
|
-
end
|
168
|
-
|
169
|
-
# Send a new packet of the given type, with the associated data.
|
170
|
-
def send_packet( type, data=nil )
|
171
|
-
buffer = @buffers.writer
|
172
|
-
buffer.write_long( ( data ? data.length : 0 ) + 1 )
|
173
|
-
buffer.write_byte type.to_i
|
174
|
-
buffer.write data.to_s if data
|
175
|
-
@socket.send buffer.to_s, 0
|
176
|
-
end
|
177
|
-
private :send_packet
|
178
|
-
|
179
|
-
# Read the next packet from the agent. This will return a two-part
|
180
|
-
# tuple consisting of the packet type, and the packet's body (which
|
181
|
-
# is returned as a Net::SSH::Util::ReaderBuffer).
|
182
|
-
def read_packet
|
183
|
-
length = @socket.read( 4 ).unpack( "N" ).first - 1
|
184
|
-
type = @socket.read( 1 ).unpack( "C" ).first
|
185
|
-
reader = @buffers.reader( @socket.read( length ) )
|
186
|
-
return type, reader
|
187
|
-
end
|
188
|
-
private :read_packet
|
189
|
-
|
190
|
-
# Send the given packet and return the subsequent reply from the agent.
|
191
|
-
# (See #send_packet and #read_packet).
|
192
|
-
def send_with_reply( type, data=nil )
|
193
|
-
send_packet type, data
|
194
|
-
read_packet
|
195
|
-
end
|
196
|
-
private :send_with_reply
|
197
|
-
|
198
|
-
# Returns +true+ if the parameter indicates a "failure" response from
|
199
|
-
# the agent, and +false+ otherwise.
|
200
|
-
def agent_failed( type )
|
201
|
-
type == SSH_AGENT_FAILURE ||
|
202
|
-
type == SSH2_AGENT_FAILURE ||
|
203
|
-
type == SSH_COM_AGENT2_FAILURE
|
204
|
-
end
|
205
|
-
private :agent_failed
|
206
|
-
|
207
|
-
def send_raw_packet( data )
|
208
|
-
@socket.send data, 0
|
209
|
-
end
|
210
|
-
|
211
|
-
def read_raw_packet
|
212
|
-
buffer = @socket.read( 4 )
|
213
|
-
length = buffer.unpack( "N" ).first
|
214
|
-
buffer = buffer + @socket.read( length )
|
215
|
-
buffer
|
216
|
-
end
|
217
|
-
|
218
|
-
end
|
219
|
-
|
220
|
-
end
|
221
|
-
end
|
222
|
-
end
|
@@ -1,35 +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
|
-
module Constants
|
22
|
-
|
23
|
-
USERAUTH_REQUEST = 50
|
24
|
-
USERAUTH_FAILURE = 51
|
25
|
-
USERAUTH_SUCCESS = 52
|
26
|
-
USERAUTH_BANNER = 53
|
27
|
-
|
28
|
-
USERAUTH_PASSWD_CHANGEREQ = 60
|
29
|
-
USERAUTH_PK_OK = 60
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,183 +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
|
-
require 'net/ssh/userauth/constants'
|
19
|
-
require 'net/ssh/transport/constants'
|
20
|
-
require 'ostruct'
|
21
|
-
|
22
|
-
module Net
|
23
|
-
module SSH
|
24
|
-
module UserAuth
|
25
|
-
|
26
|
-
# A wrapper around the transport layer that represents the functionality
|
27
|
-
# of user authentication.
|
28
|
-
class Driver
|
29
|
-
|
30
|
-
include Net::SSH::UserAuth::Constants
|
31
|
-
include Net::SSH::Transport::Constants
|
32
|
-
|
33
|
-
# The UserKeyManager instance used by the auth service.
|
34
|
-
attr_writer :key_manager
|
35
|
-
|
36
|
-
# The SSH (transport) session to use for communication.
|
37
|
-
attr_writer :session
|
38
|
-
|
39
|
-
# The array of auth-method names (as strings), giving the order in
|
40
|
-
# which each auth-method will be tried.
|
41
|
-
attr_reader :order
|
42
|
-
|
43
|
-
# Create a new user-auth service on top of the given session.
|
44
|
-
def initialize( log, buffers, methods, order )
|
45
|
-
@log = log
|
46
|
-
@buffers = buffers
|
47
|
-
@methods = methods
|
48
|
-
@on_banner = proc { |msg,lang| }
|
49
|
-
@order = order.dup
|
50
|
-
@allowed_auth_methods = nil
|
51
|
-
end
|
52
|
-
|
53
|
-
# Causes the set of on-disk key files to be used to be set to the
|
54
|
-
# given array. Any key files that were specified previously are
|
55
|
-
# lost.
|
56
|
-
def set_key_files( files )
|
57
|
-
@key_manager.clear!
|
58
|
-
files.each { |file| @key_manager << file }
|
59
|
-
end
|
60
|
-
|
61
|
-
# Causes the set of on-disk host key files to be used to be set to the
|
62
|
-
# given array. Any host key files that were specified previously are
|
63
|
-
# lost.
|
64
|
-
def set_host_key_files( files )
|
65
|
-
@key_manager.clear_host!
|
66
|
-
files.each { |file| @key_manager.add_host_key file }
|
67
|
-
end
|
68
|
-
|
69
|
-
# Changes the set of authentication methods to try to the given array.
|
70
|
-
# Methods are tried in the order in which they are listed in the
|
71
|
-
# array.
|
72
|
-
def set_auth_method_order( *methods )
|
73
|
-
@order = methods.flatten
|
74
|
-
end
|
75
|
-
|
76
|
-
# Specify the callback to use when the server sends a banner message
|
77
|
-
# at login time.
|
78
|
-
def on_banner( &block )
|
79
|
-
@on_banner = block
|
80
|
-
end
|
81
|
-
|
82
|
-
# Sends the message by delegating to the session's #send_message
|
83
|
-
# method. (This is a convenience method for the authentication
|
84
|
-
# implementations.)
|
85
|
-
def send_message( message )
|
86
|
-
@session.send_message message
|
87
|
-
end
|
88
|
-
|
89
|
-
# Wraps the Net::SSH::Transport::Session#wait_for_message method,
|
90
|
-
# doing special checking for authentication-related messages.
|
91
|
-
def wait_for_message
|
92
|
-
loop do
|
93
|
-
type, buffer = @session.wait_for_message
|
94
|
-
|
95
|
-
case type
|
96
|
-
when USERAUTH_BANNER
|
97
|
-
message = buffer.read_string
|
98
|
-
language = buffer.read_string
|
99
|
-
|
100
|
-
if @log.debug?
|
101
|
-
@log.debug "got USERAUTH_BANNER (#{message}:#{language})"
|
102
|
-
end
|
103
|
-
|
104
|
-
@on_banner.call( message, language )
|
105
|
-
|
106
|
-
when USERAUTH_FAILURE
|
107
|
-
authentications = buffer.read_string
|
108
|
-
@allowed_auth_methods = authentications.split(/,/)
|
109
|
-
partial_success = buffer.read_bool
|
110
|
-
return OpenStruct.new( :message_type => type,
|
111
|
-
:authentications => authentications,
|
112
|
-
:partial_success => partial_success )
|
113
|
-
|
114
|
-
when USERAUTH_SUCCESS
|
115
|
-
return OpenStruct.new( :message_type => type )
|
116
|
-
|
117
|
-
when SERVICE_ACCEPT
|
118
|
-
return OpenStruct.new( :message_type => type,
|
119
|
-
:service_name => buffer.read_string )
|
120
|
-
|
121
|
-
# authmethod-specific codes
|
122
|
-
when 60..79
|
123
|
-
return OpenStruct.new( :message_type => type,
|
124
|
-
:buffer => buffer )
|
125
|
-
|
126
|
-
else
|
127
|
-
raise Net::SSH::Exception,
|
128
|
-
"unexpected message type '#{type}' (#{buffer.to_s})"
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
# Processes the authentication of the given username. The
|
134
|
-
# 'next_service' parameter should be set to the SSH service that will
|
135
|
-
# be requested once the authentication succeeds (usually
|
136
|
-
# 'ssh-connection').
|
137
|
-
#
|
138
|
-
# This will return +true+ if the user is accepted by the server, and
|
139
|
-
# +false+ otherwise.
|
140
|
-
def authenticate( next_service, username, password=nil )
|
141
|
-
msg = @buffers.writer
|
142
|
-
msg.write_byte SERVICE_REQUEST
|
143
|
-
msg.write_string "ssh-userauth"
|
144
|
-
send_message msg
|
145
|
-
|
146
|
-
message = wait_for_message
|
147
|
-
unless message.message_type == SERVICE_ACCEPT
|
148
|
-
raise Net::SSH::Exception,
|
149
|
-
"expected SERVICE_ACCEPT, got #{message.inspect}"
|
150
|
-
end
|
151
|
-
|
152
|
-
data = { :password => password,
|
153
|
-
:key_manager => @key_manager }
|
154
|
-
|
155
|
-
@order.each do |auth_method|
|
156
|
-
# if the server has reported a list of auth methods that are
|
157
|
-
# allowed to continue, only consider those auth methods.
|
158
|
-
next if @allowed_auth_methods &&
|
159
|
-
!@allowed_auth_methods.include?( auth_method )
|
160
|
-
|
161
|
-
@log.debug "trying #{auth_method.inspect}" if @log.debug?
|
162
|
-
|
163
|
-
impl = @methods[ auth_method.downcase.gsub(/-/,"_").intern ]
|
164
|
-
if impl.nil?
|
165
|
-
raise NotImplementedError,
|
166
|
-
"`#{auth_method}' authentication is not implemented"
|
167
|
-
end
|
168
|
-
|
169
|
-
return true if impl.authenticate( next_service, username, data )
|
170
|
-
end
|
171
|
-
|
172
|
-
@log.debug "all authorization methods failed" if @log.debug?
|
173
|
-
return false
|
174
|
-
|
175
|
-
ensure
|
176
|
-
@key_manager.finish
|
177
|
-
end
|
178
|
-
|
179
|
-
end
|
180
|
-
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
@@ -1,119 +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
|
-
require 'net/ssh/userauth/constants'
|
19
|
-
|
20
|
-
module Net
|
21
|
-
module SSH
|
22
|
-
module UserAuth
|
23
|
-
module Methods
|
24
|
-
|
25
|
-
# Implements the host-based SSH authentication method.
|
26
|
-
class HostBased
|
27
|
-
include Net::SSH::UserAuth::Constants
|
28
|
-
|
29
|
-
# The messenger to use to send and receive messages.
|
30
|
-
attr_writer :messenger
|
31
|
-
|
32
|
-
# The session-id of the current SSH session.
|
33
|
-
attr_writer :session_id
|
34
|
-
|
35
|
-
# The hostname to report to the server.
|
36
|
-
attr_writer :hostname
|
37
|
-
|
38
|
-
# Create a new
|
39
|
-
def initialize( buffers )
|
40
|
-
@buffers = buffers
|
41
|
-
end
|
42
|
-
|
43
|
-
# Attempts to perform host-based authorization of the user. The data
|
44
|
-
# hash must contain a <tt>:key_manager</tt> key or the call will
|
45
|
-
# fail.
|
46
|
-
def authenticate( next_service, username, data={} )
|
47
|
-
key_manager = data[:key_manager] or return false
|
48
|
-
|
49
|
-
key_manager.host_identities.each do |identity|
|
50
|
-
return true if authenticate_with( identity, next_service,
|
51
|
-
username, key_manager )
|
52
|
-
end
|
53
|
-
|
54
|
-
return false
|
55
|
-
|
56
|
-
ensure
|
57
|
-
key_manager.finish if key_manager
|
58
|
-
end
|
59
|
-
|
60
|
-
# Attempts to perform host-based authentication of the user, using
|
61
|
-
# the given host identity (key).
|
62
|
-
def authenticate_with( identity, next_service, username, key_manager )
|
63
|
-
client_username = ENV['USER'] || username
|
64
|
-
|
65
|
-
req = build_request identity, next_service, username,
|
66
|
-
@hostname+".", client_username
|
67
|
-
|
68
|
-
sig_data = @buffers.writer
|
69
|
-
sig_data.write_string @session_id
|
70
|
-
sig_data.write req
|
71
|
-
|
72
|
-
sig = key_manager.sign( identity, sig_data.to_s )
|
73
|
-
|
74
|
-
message = @buffers.writer
|
75
|
-
message.write req
|
76
|
-
message.write_string sig
|
77
|
-
|
78
|
-
@messenger.send_message message
|
79
|
-
message = @messenger.wait_for_message
|
80
|
-
|
81
|
-
case message.message_type
|
82
|
-
when USERAUTH_SUCCESS
|
83
|
-
return true
|
84
|
-
when USERAUTH_FAILURE
|
85
|
-
return false
|
86
|
-
else
|
87
|
-
raise Net::SSH::Exception,
|
88
|
-
"unexpected server response to USERAUTH_REQUEST: " +
|
89
|
-
message.inspect
|
90
|
-
end
|
91
|
-
end
|
92
|
-
private :authenticate_with
|
93
|
-
|
94
|
-
# Build the "core" hostbased request string.
|
95
|
-
def build_request( identity, next_service, username, hostname,
|
96
|
-
client_username )
|
97
|
-
# begin
|
98
|
-
buf = @buffers.writer
|
99
|
-
buf.write_byte USERAUTH_REQUEST
|
100
|
-
buf.write_string username
|
101
|
-
buf.write_string next_service
|
102
|
-
buf.write_string "hostbased"
|
103
|
-
|
104
|
-
buf.write_string identity.ssh_type
|
105
|
-
blob = @buffers.writer
|
106
|
-
blob.write_key identity
|
107
|
-
buf.write_string blob.to_s
|
108
|
-
|
109
|
-
buf.write_string hostname
|
110
|
-
buf.write_string client_username
|
111
|
-
return buf.to_s
|
112
|
-
end
|
113
|
-
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|