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,104 +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 "keyboard-interactive" SSH authentication method.
|
26
|
-
class KeyboardInteractive
|
27
|
-
include Net::SSH::UserAuth::Constants
|
28
|
-
|
29
|
-
# Represents an information request from the server
|
30
|
-
InfoRequest = Struct.new( :name, :instruction, :password, :prompts )
|
31
|
-
|
32
|
-
# Represents a single prompt in an InfoRequest.
|
33
|
-
Prompt = Struct.new( :prompt, :echo )
|
34
|
-
|
35
|
-
USERAUTH_INFO_REQUEST = 60
|
36
|
-
USERAUTH_INFO_RESPONSE = 61
|
37
|
-
|
38
|
-
# The messenger to use when communicating.
|
39
|
-
attr_writer :messenger
|
40
|
-
|
41
|
-
# Create a new Password authenticator. It will use the given buffers
|
42
|
-
# factory to create new buffer instances. The +callback+ should be
|
43
|
-
# a proc object to use to specialize the behavior of this
|
44
|
-
# authentication method.
|
45
|
-
def initialize( buffers, callback )
|
46
|
-
@buffers = buffers
|
47
|
-
@callback = callback
|
48
|
-
end
|
49
|
-
|
50
|
-
# Attempt to authenticate the given user for the given service. The
|
51
|
-
# data hash must specify a <tt>:password</tt> value, otherwise this
|
52
|
-
# will always return false.
|
53
|
-
def authenticate( next_service, username, data={} )
|
54
|
-
password = data[:password]
|
55
|
-
|
56
|
-
msg = @buffers.writer
|
57
|
-
msg.write_byte USERAUTH_REQUEST
|
58
|
-
msg.write_string username
|
59
|
-
msg.write_string next_service
|
60
|
-
msg.write_string "keyboard-interactive"
|
61
|
-
msg.write_string ""
|
62
|
-
msg.write_string ""
|
63
|
-
@messenger.send_message msg
|
64
|
-
|
65
|
-
loop do
|
66
|
-
message = @messenger.wait_for_message
|
67
|
-
|
68
|
-
case message.message_type
|
69
|
-
when USERAUTH_SUCCESS
|
70
|
-
return true
|
71
|
-
when USERAUTH_FAILURE
|
72
|
-
return false
|
73
|
-
when USERAUTH_INFO_REQUEST
|
74
|
-
name = message.buffer.read_string
|
75
|
-
instruction = message.buffer.read_string
|
76
|
-
req = InfoRequest.new( name, instruction, password, [] )
|
77
|
-
password = nil # only use the given password once
|
78
|
-
|
79
|
-
lang_tag = message.buffer.read_string
|
80
|
-
message.buffer.read_long.times do
|
81
|
-
prompt = message.buffer.read_string
|
82
|
-
echo = message.buffer.read_bool
|
83
|
-
req.prompts << Prompt.new( prompt, echo )
|
84
|
-
end
|
85
|
-
|
86
|
-
responses = @callback.call( req )
|
87
|
-
msg = @buffers.writer
|
88
|
-
msg.write_byte USERAUTH_INFO_RESPONSE
|
89
|
-
msg.write_long responses.length
|
90
|
-
msg.write_string(*responses)
|
91
|
-
@messenger.send_message msg
|
92
|
-
else
|
93
|
-
raise Net::SSH::Exception,
|
94
|
-
"unexpected reply in keyboard interactive: " +
|
95
|
-
message.inspect
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
@@ -1,70 +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 "password" SSH authentication method.
|
26
|
-
class Password
|
27
|
-
include Net::SSH::UserAuth::Constants
|
28
|
-
|
29
|
-
# The messenger to use when communicating.
|
30
|
-
attr_writer :messenger
|
31
|
-
|
32
|
-
# Create a new Password authenticator. It will use the given buffers
|
33
|
-
# factory to create new buffer instances.
|
34
|
-
def initialize( buffers )
|
35
|
-
@buffers = buffers
|
36
|
-
end
|
37
|
-
|
38
|
-
# Attempt to authenticate the given user for the given service. The
|
39
|
-
# data hash must specify a <tt>:password</tt> value, otherwise this
|
40
|
-
# will always return false.
|
41
|
-
def authenticate( next_service, username, data={} )
|
42
|
-
return false unless data[:password]
|
43
|
-
|
44
|
-
msg = @buffers.writer
|
45
|
-
msg.write_byte USERAUTH_REQUEST
|
46
|
-
msg.write_string username
|
47
|
-
msg.write_string next_service
|
48
|
-
msg.write_string "password"
|
49
|
-
msg.write_bool false
|
50
|
-
msg.write_string data[:password]
|
51
|
-
@messenger.send_message msg
|
52
|
-
|
53
|
-
message = @messenger.wait_for_message
|
54
|
-
|
55
|
-
case message.message_type
|
56
|
-
when USERAUTH_SUCCESS
|
57
|
-
return true
|
58
|
-
when USERAUTH_FAILURE, USERAUTH_PASSWD_CHANGEREQ
|
59
|
-
return false
|
60
|
-
else
|
61
|
-
raise Net::SSH::Exception,
|
62
|
-
"unexpected reply to USERAUTH_REQUEST: #{message.inspect}"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
@@ -1,137 +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 "publickey" SSH authentication method.
|
26
|
-
class PublicKey
|
27
|
-
include Net::SSH::UserAuth::Constants
|
28
|
-
|
29
|
-
# The messenger instance 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
|
-
# Create a new PublicKey instance that uses the given buffer
|
36
|
-
# factory to produce new buffer instances.
|
37
|
-
def initialize( buffers )
|
38
|
-
@buffers = buffers
|
39
|
-
end
|
40
|
-
|
41
|
-
# Attempts to perform public-key authentication for the given
|
42
|
-
# username, trying each identity known to the key manager. If any of
|
43
|
-
# them succeed, returns +true+, otherwise returns +false+. The data
|
44
|
-
# hash must contain a UserKeyManager instance under the
|
45
|
-
# <tt>:key_manager</tt> key.
|
46
|
-
def authenticate( next_service, username, data={} )
|
47
|
-
key_manager = data[:key_manager]
|
48
|
-
return false unless key_manager
|
49
|
-
|
50
|
-
key_manager.identities.each do |identity|
|
51
|
-
return true if authenticate_with( identity, next_service,
|
52
|
-
username, key_manager )
|
53
|
-
end
|
54
|
-
|
55
|
-
return false
|
56
|
-
|
57
|
-
ensure
|
58
|
-
key_manager.finish if key_manager
|
59
|
-
end
|
60
|
-
|
61
|
-
# Builds a Net::SSH::Util::WriterBuffer that contains the request
|
62
|
-
# formatted for sending a public-key request to the server.
|
63
|
-
def build_request( pub_key, username, next_service, has_sig,
|
64
|
-
buffer=nil )
|
65
|
-
# begin
|
66
|
-
buffer ||= @buffers.writer
|
67
|
-
|
68
|
-
buffer.write_byte USERAUTH_REQUEST
|
69
|
-
buffer.write_string username
|
70
|
-
buffer.write_string next_service
|
71
|
-
buffer.write_string "publickey"
|
72
|
-
buffer.write_bool has_sig
|
73
|
-
buffer.write_string pub_key.ssh_type
|
74
|
-
|
75
|
-
blob = @buffers.writer
|
76
|
-
blob.write_key pub_key
|
77
|
-
buffer.write_string blob.to_s
|
78
|
-
|
79
|
-
return buffer
|
80
|
-
end
|
81
|
-
private :build_request
|
82
|
-
|
83
|
-
# Builds and sends a request formatted for a public-key
|
84
|
-
# authentication request.
|
85
|
-
def send_request( pub_key, username, next_service, signature=nil )
|
86
|
-
msg = build_request( pub_key, username, next_service, signature )
|
87
|
-
msg.write_string signature if signature
|
88
|
-
@messenger.send_message msg
|
89
|
-
end
|
90
|
-
private :send_request
|
91
|
-
|
92
|
-
# Attempts to perform public-key authentication for the given
|
93
|
-
# username, with the given identity (public key). Returns +true+ if
|
94
|
-
# successful, or +false+ otherwise.
|
95
|
-
def authenticate_with( identity, next_service, username, key_manager )
|
96
|
-
send_request identity, username, next_service
|
97
|
-
|
98
|
-
message = @messenger.wait_for_message
|
99
|
-
|
100
|
-
case message.message_type
|
101
|
-
when USERAUTH_PK_OK
|
102
|
-
sig_data = @buffers.writer
|
103
|
-
sig_data.write_string @session_id
|
104
|
-
build_request identity, username, next_service, true, sig_data
|
105
|
-
|
106
|
-
sig_blob = key_manager.sign( identity, sig_data )
|
107
|
-
|
108
|
-
send_request identity, username, next_service, sig_blob.to_s
|
109
|
-
message = @messenger.wait_for_message
|
110
|
-
|
111
|
-
case message.message_type
|
112
|
-
when USERAUTH_SUCCESS
|
113
|
-
return true
|
114
|
-
when USERAUTH_FAILURE
|
115
|
-
return false
|
116
|
-
else
|
117
|
-
raise Net::SSH::Exception,
|
118
|
-
"unexpected server response to USERAUTH_REQUEST: " +
|
119
|
-
message.inspect
|
120
|
-
end
|
121
|
-
|
122
|
-
when USERAUTH_FAILURE
|
123
|
-
return false
|
124
|
-
|
125
|
-
else
|
126
|
-
raise Net::SSH::Exception,
|
127
|
-
"unexpected reply to USERAUTH_REQUEST: #{message.inspect}"
|
128
|
-
end
|
129
|
-
end
|
130
|
-
private :authenticate_with
|
131
|
-
|
132
|
-
end
|
133
|
-
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
@@ -1,90 +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
|
-
module Methods
|
21
|
-
|
22
|
-
def register_services( container )
|
23
|
-
container.namespace_define :methods do |b|
|
24
|
-
|
25
|
-
b.password do |c,p|
|
26
|
-
require 'net/ssh/userauth/methods/password'
|
27
|
-
method = Password.new( c[:transport][:buffers] )
|
28
|
-
method.messenger = c[:userauth][:driver]
|
29
|
-
method
|
30
|
-
end
|
31
|
-
|
32
|
-
b.keyboard_interactive do |c,p|
|
33
|
-
require 'net/ssh/userauth/methods/keyboard-interactive'
|
34
|
-
method = KeyboardInteractive.new( c[:transport][:buffers],
|
35
|
-
c[:keyboard_interactive_callback] )
|
36
|
-
method.messenger = c[:userauth][:driver]
|
37
|
-
method
|
38
|
-
end
|
39
|
-
|
40
|
-
b.keyboard_interactive_prompter do
|
41
|
-
require 'net/ssh/util/prompter'
|
42
|
-
Net::SSH::Util::Prompter.new
|
43
|
-
end
|
44
|
-
|
45
|
-
b.keyboard_interactive_callback do |c,p|
|
46
|
-
proc do |req|
|
47
|
-
if req.password
|
48
|
-
[ req.password ] * req.prompts.length
|
49
|
-
else
|
50
|
-
responses = []
|
51
|
-
puts req.name unless req.name.empty?
|
52
|
-
puts req.instruction unless req.instruction.empty?
|
53
|
-
req.prompts.each do |prompt|
|
54
|
-
response = prompt.echo ?
|
55
|
-
gets.chomp :
|
56
|
-
c[:keyboard_interactive_prompter].
|
57
|
-
password( prompt.prompt )
|
58
|
-
responses << response
|
59
|
-
end
|
60
|
-
responses
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
b.publickey do |c,p|
|
66
|
-
require 'net/ssh/userauth/methods/publickey'
|
67
|
-
method = PublicKey.new( c[:transport][:buffers] )
|
68
|
-
method.messenger = c[:userauth][:driver]
|
69
|
-
method.session_id = c[:transport][:session].session_id
|
70
|
-
method
|
71
|
-
end
|
72
|
-
|
73
|
-
b.hostbased do |c,p|
|
74
|
-
require 'net/ssh/userauth/methods/hostbased'
|
75
|
-
method = HostBased.new( c[:transport][:buffers] )
|
76
|
-
session = c[:transport][:session]
|
77
|
-
method.messenger = c[:userauth][:driver]
|
78
|
-
method.hostname = session.client_name
|
79
|
-
method.session_id = session.session_id
|
80
|
-
method
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
84
|
-
end
|
85
|
-
module_function :register_services
|
86
|
-
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
@@ -1,197 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004, Guillaume Mar�ais (guillaume.marcais@free.fr),
|
4
|
-
# Jamis Buck (jamis@37signals.com)
|
5
|
-
# All rights reserved.
|
6
|
-
#
|
7
|
-
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
8
|
-
# library for Ruby. This file (and the library as a whole) may be used only as
|
9
|
-
# allowed by either the BSD license, or the Ruby license (or, by association
|
10
|
-
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
11
|
-
# distribution for the texts of these licenses.
|
12
|
-
# -----------------------------------------------------------------------------
|
13
|
-
# net-ssh website : http://net-ssh.rubyforge.org
|
14
|
-
# project website: http://rubyforge.org/projects/net-ssh
|
15
|
-
# =============================================================================
|
16
|
-
#++
|
17
|
-
|
18
|
-
require 'dl/import'
|
19
|
-
require 'dl/struct'
|
20
|
-
|
21
|
-
require 'net/ssh/errors'
|
22
|
-
|
23
|
-
module Net
|
24
|
-
module SSH
|
25
|
-
module UserAuth
|
26
|
-
|
27
|
-
# This module encapsulates the implementation of a socket factory that
|
28
|
-
# uses the PuTTY "pageant" utility to obtain information about SSH
|
29
|
-
# identities.
|
30
|
-
#
|
31
|
-
# This code is a slightly modified version of the original implementation
|
32
|
-
# by Guillaume Mar�ais (guillaume.marcais@free.fr). It is used and
|
33
|
-
# relicensed by permission.
|
34
|
-
module Pageant
|
35
|
-
|
36
|
-
# From Putty pageant.c
|
37
|
-
AGENT_MAX_MSGLEN = 8192
|
38
|
-
AGENT_COPYDATA_ID = 0x804e50ba
|
39
|
-
|
40
|
-
# The definition of the Windows methods and data structures used in
|
41
|
-
# communicating with the pageant process.
|
42
|
-
module Win
|
43
|
-
extend DL::Importable
|
44
|
-
|
45
|
-
dlload 'user32'
|
46
|
-
dlload 'kernel32'
|
47
|
-
|
48
|
-
typealias("LPCTSTR", "char *") # From winnt.h
|
49
|
-
typealias("LPVOID", "void *") # From winnt.h
|
50
|
-
typealias("LPCVOID", "const void *") # From windef.h
|
51
|
-
typealias("LRESULT", "long") # From windef.h
|
52
|
-
typealias("WPARAM", "unsigned int *") # From windef.h
|
53
|
-
typealias("LPARAM", "long *") # From windef.h
|
54
|
-
typealias("PDWORD_PTR", "long *") # From basetsd.h
|
55
|
-
|
56
|
-
# From winbase.h, winnt.h
|
57
|
-
INVALID_HANDLE_VALUE = -1
|
58
|
-
NULL = nil
|
59
|
-
PAGE_READWRITE = 0x0004
|
60
|
-
FILE_MAP_WRITE = 2
|
61
|
-
WM_COPYDATA = 74
|
62
|
-
|
63
|
-
SMTO_NORMAL = 0 # From winuser.h
|
64
|
-
|
65
|
-
# args: lpClassName, lpWindowName
|
66
|
-
extern 'HWND FindWindow(LPCTSTR, LPCTSTR)'
|
67
|
-
|
68
|
-
# args: none
|
69
|
-
extern 'DWORD GetCurrentThreadId()'
|
70
|
-
|
71
|
-
# args: hFile, (ignored), flProtect, dwMaximumSizeHigh,
|
72
|
-
# dwMaximumSizeLow, lpName
|
73
|
-
extern 'HANDLE CreateFileMapping(HANDLE, void *, DWORD, DWORD, ' +
|
74
|
-
'DWORD, LPCTSTR)'
|
75
|
-
|
76
|
-
# args: hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh,
|
77
|
-
# dwfileOffsetLow, dwNumberOfBytesToMap
|
78
|
-
extern 'LPVOID MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, DWORD)'
|
79
|
-
|
80
|
-
# args: lpBaseAddress
|
81
|
-
extern 'BOOL UnmapViewOfFile(LPCVOID)'
|
82
|
-
|
83
|
-
# args: hObject
|
84
|
-
extern 'BOOL CloseHandle(HANDLE)'
|
85
|
-
|
86
|
-
# args: hWnd, Msg, wParam, lParam, fuFlags, uTimeout, lpdwResult
|
87
|
-
extern 'LRESULT SendMessageTimeout(HWND, UINT, WPARAM, LPARAM, ' +
|
88
|
-
'UINT, UINT, PDWORD_PTR)'
|
89
|
-
end
|
90
|
-
|
91
|
-
# This is the pseudo-socket implementation that mimics the interface of
|
92
|
-
# a socket, translating each request into a Windows messaging call to
|
93
|
-
# the pageant daemon. This allows pageant support to be implemented
|
94
|
-
# simply by replacing the socket factory used by the Agent class.
|
95
|
-
class Socket
|
96
|
-
|
97
|
-
private_class_method :new
|
98
|
-
|
99
|
-
# The factory method for creating a new Socket instance. The location
|
100
|
-
# parameter is ignored, and is only needed for compatibility with
|
101
|
-
# the general Socket interface.
|
102
|
-
def self.open( location=nil )
|
103
|
-
new
|
104
|
-
end
|
105
|
-
|
106
|
-
# Create a new instance that communicates with the running pageant
|
107
|
-
# instance. If no such instance is running, this will cause an error.
|
108
|
-
def initialize
|
109
|
-
@win = Win.findWindow( "Pageant", "Pageant" )
|
110
|
-
|
111
|
-
if @win == 0
|
112
|
-
raise Net::SSH::Exception,
|
113
|
-
"pageant process not running"
|
114
|
-
end
|
115
|
-
|
116
|
-
@res = nil
|
117
|
-
@pos = 0
|
118
|
-
end
|
119
|
-
|
120
|
-
# Forwards the data to #send_query, ignoring any arguments after
|
121
|
-
# the first. Returns 0.
|
122
|
-
def send( data, *args )
|
123
|
-
@res = send_query( data )
|
124
|
-
@pos = 0
|
125
|
-
end
|
126
|
-
|
127
|
-
# Packages the given query string and sends it to the pageant
|
128
|
-
# process via the Windows messaging subsystem. The result is
|
129
|
-
# cached, to be returned piece-wise when #read is called.
|
130
|
-
def send_query( query )
|
131
|
-
res = nil
|
132
|
-
filemap = 0
|
133
|
-
ptr = nil
|
134
|
-
id = DL::PtrData.malloc( DL.sizeof("L") )
|
135
|
-
|
136
|
-
mapname = "PageantRequest%08x\000" % Win.getCurrentThreadId()
|
137
|
-
filemap = Win.createFileMapping(Win::INVALID_HANDLE_VALUE,
|
138
|
-
Win::NULL,
|
139
|
-
Win::PAGE_READWRITE, 0,
|
140
|
-
AGENT_MAX_MSGLEN, mapname)
|
141
|
-
if filemap == 0
|
142
|
-
raise Net::SSH::Exception,
|
143
|
-
"Creation of file mapping failed"
|
144
|
-
end
|
145
|
-
|
146
|
-
ptr = Win.mapViewOfFile( filemap, Win::FILE_MAP_WRITE, 0, 0,
|
147
|
-
AGENT_MAX_MSGLEN )
|
148
|
-
|
149
|
-
if ptr.nil? || ptr.null?
|
150
|
-
raise Net::SSH::Exception, "Mapping of file failed"
|
151
|
-
end
|
152
|
-
|
153
|
-
ptr[0] = query
|
154
|
-
|
155
|
-
cds = [AGENT_COPYDATA_ID, mapname.size + 1, mapname].
|
156
|
-
pack("LLp").to_ptr
|
157
|
-
succ = Win.sendMessageTimeout( @win, Win::WM_COPYDATA, Win::NULL,
|
158
|
-
cds, Win::SMTO_NORMAL, 5000, id )
|
159
|
-
|
160
|
-
if succ > 0
|
161
|
-
retlen = 4 + ptr.to_s(4).unpack("N")[0]
|
162
|
-
res = ptr.to_s(retlen)
|
163
|
-
end
|
164
|
-
|
165
|
-
return res
|
166
|
-
ensure
|
167
|
-
Win.unmapViewOfFile( ptr ) unless ptr.nil? || ptr.null?
|
168
|
-
Win.closeHandle( filemap ) if filemap != 0
|
169
|
-
end
|
170
|
-
|
171
|
-
# Conceptually close the socket. This doesn't really do anthing
|
172
|
-
# significant, but merely complies with the Socket interface.
|
173
|
-
def close
|
174
|
-
@res = nil
|
175
|
-
@pos = 0
|
176
|
-
end
|
177
|
-
|
178
|
-
# Reads +n+ bytes from the cached result of the last query. If +n+
|
179
|
-
# is +nil+, returns all remaining data from the last query.
|
180
|
-
def read(n = nil)
|
181
|
-
return nil unless @res
|
182
|
-
if n.nil?
|
183
|
-
start, @pos = @pos, @res.size
|
184
|
-
return @res[start..-1]
|
185
|
-
else
|
186
|
-
start, @pos = @pos, @pos + n
|
187
|
-
return @res[start, n]
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
end
|
192
|
-
|
193
|
-
end
|
194
|
-
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|