net-ssh 0.5.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.
Files changed (179) hide show
  1. data/doc/LICENSE-BSD +27 -0
  2. data/doc/LICENSE-GPL +280 -0
  3. data/doc/LICENSE-RUBY +56 -0
  4. data/doc/README +13 -0
  5. data/doc/manual-html/chapter-1.html +333 -0
  6. data/doc/manual-html/chapter-2.html +455 -0
  7. data/doc/manual-html/chapter-3.html +413 -0
  8. data/doc/manual-html/chapter-4.html +353 -0
  9. data/doc/manual-html/chapter-5.html +393 -0
  10. data/doc/manual-html/chapter-6.html +296 -0
  11. data/doc/manual-html/index.html +217 -0
  12. data/doc/manual-html/manual.css +192 -0
  13. data/doc/manual/chapter.erb +18 -0
  14. data/doc/manual/example.erb +18 -0
  15. data/doc/manual/index.erb +29 -0
  16. data/doc/manual/manual.css +192 -0
  17. data/doc/manual/manual.rb +240 -0
  18. data/doc/manual/manual.yml +67 -0
  19. data/doc/manual/page.erb +87 -0
  20. data/doc/manual/parts/channels_callbacks.txt +32 -0
  21. data/doc/manual/parts/channels_loop.txt +14 -0
  22. data/doc/manual/parts/channels_open.txt +20 -0
  23. data/doc/manual/parts/channels_operations.txt +15 -0
  24. data/doc/manual/parts/channels_types.txt +3 -0
  25. data/doc/manual/parts/channels_what_are.txt +7 -0
  26. data/doc/manual/parts/exec_channels.txt +28 -0
  27. data/doc/manual/parts/exec_open.txt +51 -0
  28. data/doc/manual/parts/exec_popen3.txt +35 -0
  29. data/doc/manual/parts/forward_direct.txt +37 -0
  30. data/doc/manual/parts/forward_handlers.txt +16 -0
  31. data/doc/manual/parts/forward_intro.txt +18 -0
  32. data/doc/manual/parts/forward_local.txt +18 -0
  33. data/doc/manual/parts/forward_remote.txt +14 -0
  34. data/doc/manual/parts/intro_author.txt +1 -0
  35. data/doc/manual/parts/intro_getting.txt +39 -0
  36. data/doc/manual/parts/intro_license.txt +6 -0
  37. data/doc/manual/parts/intro_support.txt +7 -0
  38. data/doc/manual/parts/intro_what_is.txt +7 -0
  39. data/doc/manual/parts/intro_what_is_not.txt +3 -0
  40. data/doc/manual/parts/proxy_http.txt +52 -0
  41. data/doc/manual/parts/proxy_intro.txt +1 -0
  42. data/doc/manual/parts/proxy_socks.txt +23 -0
  43. data/doc/manual/parts/session_key.txt +66 -0
  44. data/doc/manual/parts/session_options.txt +42 -0
  45. data/doc/manual/parts/session_session.txt +14 -0
  46. data/doc/manual/parts/session_start.txt +49 -0
  47. data/doc/manual/tutorial.erb +30 -0
  48. data/examples/channel-demo.rb +81 -0
  49. data/examples/port-forward.rb +51 -0
  50. data/examples/process-demo.rb +91 -0
  51. data/examples/remote-net-port-forward.rb +45 -0
  52. data/examples/remote-port-forward.rb +80 -0
  53. data/examples/tail-demo.rb +49 -0
  54. data/lib/net/ssh.rb +52 -0
  55. data/lib/net/ssh/connection/channel.rb +411 -0
  56. data/lib/net/ssh/connection/constants.rb +47 -0
  57. data/lib/net/ssh/connection/driver.rb +343 -0
  58. data/lib/net/ssh/connection/services.rb +72 -0
  59. data/lib/net/ssh/connection/term.rb +90 -0
  60. data/lib/net/ssh/errors.rb +27 -0
  61. data/lib/net/ssh/proxy/errors.rb +34 -0
  62. data/lib/net/ssh/proxy/http.rb +126 -0
  63. data/lib/net/ssh/proxy/socks4.rb +83 -0
  64. data/lib/net/ssh/proxy/socks5.rb +160 -0
  65. data/lib/net/ssh/service/forward/driver.rb +319 -0
  66. data/lib/net/ssh/service/forward/local-network-handler.rb +74 -0
  67. data/lib/net/ssh/service/forward/remote-network-handler.rb +81 -0
  68. data/lib/net/ssh/service/forward/services.rb +76 -0
  69. data/lib/net/ssh/service/process/driver.rb +153 -0
  70. data/lib/net/ssh/service/process/open.rb +193 -0
  71. data/lib/net/ssh/service/process/popen3.rb +160 -0
  72. data/lib/net/ssh/service/process/services.rb +66 -0
  73. data/lib/net/ssh/service/services.rb +44 -0
  74. data/lib/net/ssh/session.rb +242 -0
  75. data/lib/net/ssh/transport/algorithm-negotiator.rb +267 -0
  76. data/lib/net/ssh/transport/compress/compressor.rb +53 -0
  77. data/lib/net/ssh/transport/compress/decompressor.rb +53 -0
  78. data/lib/net/ssh/transport/compress/none-compressor.rb +39 -0
  79. data/lib/net/ssh/transport/compress/none-decompressor.rb +39 -0
  80. data/lib/net/ssh/transport/compress/services.rb +68 -0
  81. data/lib/net/ssh/transport/compress/zlib-compressor.rb +60 -0
  82. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +52 -0
  83. data/lib/net/ssh/transport/constants.rb +66 -0
  84. data/lib/net/ssh/transport/errors.rb +47 -0
  85. data/lib/net/ssh/transport/identity-cipher.rb +61 -0
  86. data/lib/net/ssh/transport/kex/dh-gex.rb +106 -0
  87. data/lib/net/ssh/transport/kex/dh.rb +231 -0
  88. data/lib/net/ssh/transport/kex/services.rb +60 -0
  89. data/lib/net/ssh/transport/ossl/buffer-factory.rb +52 -0
  90. data/lib/net/ssh/transport/ossl/buffer.rb +87 -0
  91. data/lib/net/ssh/transport/ossl/cipher-factory.rb +98 -0
  92. data/lib/net/ssh/transport/ossl/digest-factory.rb +51 -0
  93. data/lib/net/ssh/transport/ossl/hmac-factory.rb +71 -0
  94. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +62 -0
  95. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +44 -0
  96. data/lib/net/ssh/transport/ossl/hmac/md5.rb +46 -0
  97. data/lib/net/ssh/transport/ossl/hmac/none.rb +46 -0
  98. data/lib/net/ssh/transport/ossl/hmac/services.rb +68 -0
  99. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +44 -0
  100. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +45 -0
  101. data/lib/net/ssh/transport/ossl/key-factory.rb +113 -0
  102. data/lib/net/ssh/transport/ossl/services.rb +149 -0
  103. data/lib/net/ssh/transport/packet-stream.rb +210 -0
  104. data/lib/net/ssh/transport/services.rb +146 -0
  105. data/lib/net/ssh/transport/session.rb +296 -0
  106. data/lib/net/ssh/transport/version-negotiator.rb +73 -0
  107. data/lib/net/ssh/userauth/agent.rb +218 -0
  108. data/lib/net/ssh/userauth/constants.rb +35 -0
  109. data/lib/net/ssh/userauth/driver.rb +176 -0
  110. data/lib/net/ssh/userauth/methods/hostbased.rb +119 -0
  111. data/lib/net/ssh/userauth/methods/password.rb +70 -0
  112. data/lib/net/ssh/userauth/methods/publickey.rb +137 -0
  113. data/lib/net/ssh/userauth/methods/services.rb +63 -0
  114. data/lib/net/ssh/userauth/services.rb +126 -0
  115. data/lib/net/ssh/userauth/userkeys.rb +258 -0
  116. data/lib/net/ssh/util/buffer.rb +274 -0
  117. data/lib/net/ssh/util/openssl.rb +146 -0
  118. data/lib/net/ssh/util/prompter.rb +73 -0
  119. data/lib/net/ssh/version.rb +29 -0
  120. data/test/ALL-TESTS.rb +21 -0
  121. data/test/connection/tc_channel.rb +136 -0
  122. data/test/connection/tc_driver.rb +287 -0
  123. data/test/connection/tc_integration.rb +85 -0
  124. data/test/proxy/tc_http.rb +209 -0
  125. data/test/proxy/tc_socks4.rb +148 -0
  126. data/test/proxy/tc_socks5.rb +214 -0
  127. data/test/service/forward/tc_driver.rb +289 -0
  128. data/test/service/forward/tc_local_network_handler.rb +123 -0
  129. data/test/service/forward/tc_remote_network_handler.rb +108 -0
  130. data/test/service/process/tc_driver.rb +79 -0
  131. data/test/service/process/tc_integration.rb +117 -0
  132. data/test/service/process/tc_open.rb +179 -0
  133. data/test/service/process/tc_popen3.rb +164 -0
  134. data/test/tc_integration.rb +79 -0
  135. data/test/transport/compress/tc_none_compress.rb +41 -0
  136. data/test/transport/compress/tc_none_decompress.rb +45 -0
  137. data/test/transport/compress/tc_zlib_compress.rb +61 -0
  138. data/test/transport/compress/tc_zlib_decompress.rb +48 -0
  139. data/test/transport/kex/tc_dh.rb +304 -0
  140. data/test/transport/kex/tc_dh_gex.rb +70 -0
  141. data/test/transport/ossl/fixtures/dsa-encrypted +15 -0
  142. data/test/transport/ossl/fixtures/dsa-encrypted-bad +15 -0
  143. data/test/transport/ossl/fixtures/dsa-unencrypted +12 -0
  144. data/test/transport/ossl/fixtures/dsa-unencrypted-bad +12 -0
  145. data/test/transport/ossl/fixtures/dsa-unencrypted.pub +1 -0
  146. data/test/transport/ossl/fixtures/not-a-private-key +4 -0
  147. data/test/transport/ossl/fixtures/not-supported +2 -0
  148. data/test/transport/ossl/fixtures/rsa-encrypted +18 -0
  149. data/test/transport/ossl/fixtures/rsa-encrypted-bad +18 -0
  150. data/test/transport/ossl/fixtures/rsa-unencrypted +15 -0
  151. data/test/transport/ossl/fixtures/rsa-unencrypted-bad +15 -0
  152. data/test/transport/ossl/fixtures/rsa-unencrypted.pub +1 -0
  153. data/test/transport/ossl/hmac/tc_hmac.rb +58 -0
  154. data/test/transport/ossl/hmac/tc_md5.rb +50 -0
  155. data/test/transport/ossl/hmac/tc_md5_96.rb +50 -0
  156. data/test/transport/ossl/hmac/tc_none.rb +50 -0
  157. data/test/transport/ossl/hmac/tc_sha1.rb +50 -0
  158. data/test/transport/ossl/hmac/tc_sha1_96.rb +50 -0
  159. data/test/transport/ossl/tc_buffer.rb +97 -0
  160. data/test/transport/ossl/tc_buffer_factory.rb +67 -0
  161. data/test/transport/ossl/tc_cipher_factory.rb +84 -0
  162. data/test/transport/ossl/tc_digest_factory.rb +39 -0
  163. data/test/transport/ossl/tc_hmac_factory.rb +72 -0
  164. data/test/transport/ossl/tc_key_factory.rb +199 -0
  165. data/test/transport/tc_algorithm_negotiator.rb +169 -0
  166. data/test/transport/tc_identity_cipher.rb +52 -0
  167. data/test/transport/tc_integration.rb +110 -0
  168. data/test/transport/tc_packet_stream.rb +183 -0
  169. data/test/transport/tc_session.rb +283 -0
  170. data/test/transport/tc_version_negotiator.rb +86 -0
  171. data/test/userauth/methods/tc_hostbased.rb +136 -0
  172. data/test/userauth/methods/tc_password.rb +89 -0
  173. data/test/userauth/methods/tc_publickey.rb +167 -0
  174. data/test/userauth/tc_agent.rb +223 -0
  175. data/test/userauth/tc_driver.rb +190 -0
  176. data/test/userauth/tc_integration.rb +81 -0
  177. data/test/userauth/tc_userkeys.rb +265 -0
  178. data/test/util/tc_buffer.rb +217 -0
  179. metadata +256 -0
@@ -0,0 +1,119 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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
@@ -0,0 +1,70 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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
@@ -0,0 +1,137 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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
@@ -0,0 +1,63 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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
+ # Just alias keyboard_interactive to password, for now
33
+ # TODO: keyboard_interactive should probably actually prompt
34
+ # for a password if one wasn't given...need to read up on this
35
+ # more.
36
+ b.keyboard_interactive { b.password }
37
+
38
+ b.publickey do |c,p|
39
+ require 'net/ssh/userauth/methods/publickey'
40
+ method = PublicKey.new( c[:transport][:buffers] )
41
+ method.messenger = c[:userauth][:driver]
42
+ method.session_id = c[:transport][:session].session_id
43
+ method
44
+ end
45
+
46
+ b.hostbased do |c,p|
47
+ require 'net/ssh/userauth/methods/hostbased'
48
+ method = HostBased.new( c[:transport][:buffers] )
49
+ session = c[:transport][:session]
50
+ method.messenger = c[:userauth][:driver]
51
+ method.hostname = session.client_name
52
+ method.session_id = session.session_id
53
+ method
54
+ end
55
+
56
+ end
57
+ end
58
+ module_function :register_services
59
+
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,126 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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
+ require 'socket'
28
+ defined?( UNIXSocket ) ? UNIXSocket : nil
29
+ end
30
+
31
+ b.default_agent_socket_name { ENV['SSH_AUTH_SOCK'] }
32
+
33
+ b.default_agent_version { 2 }
34
+
35
+ b.agent( :model => :prototype ) do |c,p|
36
+ if ( socket_factory = c[:agent_socket_factory] )
37
+ require 'net/ssh/userauth/agent'
38
+ require 'net/ssh/transport/services'
39
+
40
+ agent = Agent.new
41
+ agent.socket_factory = socket_factory
42
+ agent.socket_name = c[:default_agent_socket_name]
43
+ agent.version = c[:default_agent_version]
44
+ agent.buffers = c[:transport][:buffers]
45
+ agent.keys = c[:transport][:keys]
46
+ agent.connect!
47
+ end
48
+
49
+ agent
50
+ end
51
+
52
+ b.agent_factory do |c,p|
53
+ factory = Object.new
54
+ klass = class << factory; self; end
55
+ klass.send( :define_method, :open ) { c[:agent] }
56
+ factory
57
+ end
58
+
59
+ b.default_user_key_locations do
60
+ [ "#{ENV['HOME']}/.ssh/id_dsa",
61
+ "#{ENV['HOME']}/.ssh2/id_dsa",
62
+ "#{ENV['HOME']}/.ssh/id_rsa",
63
+ "#{ENV['HOME']}/.ssh2/id_rsa" ]
64
+ end
65
+
66
+ b.default_host_key_locations do
67
+ [ "/etc/ssh/ssh_host_dsa_key",
68
+ "/etc/ssh/ssh_host_rsa_key" ]
69
+ end
70
+
71
+ b.key_existence_tester { File }
72
+
73
+ b.user_keys do |c,p|
74
+ require 'net/ssh/userauth/userkeys'
75
+
76
+ userkeys = UserKeyManager.new
77
+ userkeys.agent_factory = c[:agent_factory]
78
+ userkeys.keys = c[:transport][:keys]
79
+ userkeys.buffers = c[:transport][:buffers]
80
+ userkeys.log = c[:log_for, p]
81
+ userkeys.key_existence_tester = b.key_existence_tester
82
+
83
+ b.default_user_key_locations.each { |f| userkeys.add f }
84
+ b.default_host_key_locations.each { |f| userkeys.add_host_key f }
85
+
86
+ userkeys
87
+ end
88
+
89
+ b.authentication_method_order do
90
+ [ "publickey",
91
+ "keyboard-interactive",
92
+ "password",
93
+ "hostbased" ]
94
+ end
95
+
96
+ b.driver do |c,p|
97
+ require 'net/ssh/userauth/driver'
98
+
99
+ driver = Driver.new( c[:log_for, p],
100
+ c[:transport][:buffers],
101
+ c[:methods],
102
+ c[:authentication_method_order] )
103
+
104
+ driver.key_manager = c[:user_keys]
105
+ driver.session = c[:transport][:session]
106
+
107
+ if c.knows_key?(:userauth_keys) && c[:userauth_keys]
108
+ driver.set_key_files c[:userauth_keys]
109
+ end
110
+ if c.knows_key?(:userauth_host_keys) && c[:userauth_host_keys]
111
+ driver.set_host_key_files c[:userauth_host_keys]
112
+ end
113
+ if c.knows_key?(:userauth_method_order) && c[:userauth_method_order]
114
+ driver.set_auth_method_order *c[:userauth_method_order]
115
+ end
116
+
117
+ driver
118
+ end
119
+
120
+ end
121
+ end
122
+ module_function :register_services
123
+
124
+ end
125
+ end
126
+ end