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,85 @@
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
+ $:.unshift "../../lib"
18
+
19
+ if $run_integration_tests || __FILE__ == $0
20
+
21
+ require 'needle'
22
+ require 'net/ssh/connection/services'
23
+ require 'net/ssh/transport/services'
24
+ require 'net/ssh/userauth/services'
25
+ require 'test/unit'
26
+
27
+ class TC_Connection_Integration < Test::Unit::TestCase
28
+
29
+ HOST = "test.host"
30
+ USER = "test"
31
+ PASSWORD = "test/unit"
32
+ SERVICE = "ssh-connection"
33
+
34
+ def setup
35
+ @registry = Needle::Registry.new(
36
+ :logs => { :device=>STDOUT, :default_level => :WARN }
37
+ )
38
+
39
+ Net::SSH::Transport.register_services( @registry )
40
+ Net::SSH::UserAuth.register_services( @registry )
41
+ Net::SSH::Connection.register_services( @registry )
42
+
43
+ @registry.define do |b|
44
+ b.crypto_backend { :ossl }
45
+ b.transport_host { HOST }
46
+ end
47
+
48
+ @registry[:userauth][:driver].authenticate SERVICE, USER, PASSWORD
49
+
50
+ @connection = @registry[:connection][:driver]
51
+ end
52
+
53
+ def teardown
54
+ @registry[:transport][:session].close
55
+ @registry.logs.close
56
+ end
57
+
58
+ def test_exec
59
+ exec_data = ""
60
+ @connection.open_channel "session" do |chan|
61
+ chan.on_data { |ch,data| exec_data << data }
62
+ chan.exec "echo $HOME"
63
+ end
64
+ @connection.loop
65
+ assert_equal "/home/test\n", exec_data
66
+ end
67
+
68
+ def test_dialog
69
+ dialog = [ "2+2", "5*10+1", "quit" ]
70
+ results = []
71
+ @connection.open_channel "session" do |chan|
72
+ chan.on_data do |ch,data|
73
+ results << data
74
+ chan.send_data dialog.shift + "\n"
75
+ end
76
+ chan.exec "bc"
77
+ chan.send_data dialog.shift + "\n"
78
+ end
79
+ @connection.loop
80
+ assert_equal [ "4\n", "51\n" ], results
81
+ end
82
+
83
+ end
84
+
85
+ end
@@ -0,0 +1,209 @@
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
+ $:.unshift "../../lib"
18
+
19
+ require 'test/unit'
20
+ require 'net/ssh/proxy/http'
21
+ require 'socket'
22
+
23
+ class TC_Proxy_HTTP < Test::Unit::TestCase
24
+
25
+ HOST = "test.host"
26
+ PORT = 22117
27
+
28
+ class ScriptableHTTPServer
29
+ attr_reader :script
30
+ attr_reader :events
31
+
32
+ def initialize
33
+ @script = []
34
+ @events = []
35
+ end
36
+
37
+ def run
38
+ @socket = TCPServer.new( HOST, PORT )
39
+ @thread = Thread.new { run_server until @script.empty? }
40
+ end
41
+
42
+ def run_server
43
+ client = @socket.accept
44
+ loop do
45
+ @events << client.readline
46
+ break if @events.last == "\n"
47
+ end
48
+ client.puts @script.shift
49
+ rescue Exception => e
50
+ puts "#{e.class}: #{e.message}"
51
+ puts e.backtrace.join("\n")
52
+ end
53
+
54
+ def wait
55
+ @thread.join
56
+ end
57
+
58
+ def shutdown
59
+ @socket.shutdown
60
+ end
61
+ end
62
+
63
+ def setup
64
+ ENV['HTTP_PROXY_USER'] = nil
65
+ ENV['HTTP_PROXY_PASSWORD'] = nil
66
+ ENV['CONNECT_USER'] = nil
67
+ ENV['CONNECT_PASSWORD'] = nil
68
+
69
+ @server = ScriptableHTTPServer.new
70
+ @options = Hash.new
71
+ @proxy = Net::SSH::Proxy::HTTP.new( HOST, PORT, @options )
72
+ end
73
+
74
+ def teardown
75
+ @server.shutdown
76
+ end
77
+
78
+ def test_no_auth_ok
79
+ @server.script << "HTTP/1.0 200 OK\n\n"
80
+ @server.run
81
+
82
+ @proxy.open( "foo.com", 1234 )
83
+ @server.wait
84
+
85
+ assert_equal [ "CONNECT foo.com:1234 HTTP/1.0\n", "\n" ], @server.events
86
+ end
87
+
88
+ def test_connect_error
89
+ @server.script << "HTTP/1.0 500 Error\n\n"
90
+ @server.run
91
+
92
+ assert_raise( Net::SSH::Proxy::ConnectError ) do
93
+ @proxy.open( "foo.com", 1234 )
94
+ end
95
+
96
+ @server.wait
97
+
98
+ assert_equal [ "CONNECT foo.com:1234 HTTP/1.0\n", "\n" ], @server.events
99
+ end
100
+
101
+ def test_unauthorized_error_no_user
102
+ @server.script << "HTTP/1.0 407 Error\n\n"
103
+ @server.run
104
+
105
+ assert_raise( Net::SSH::Proxy::UnauthorizedError ) do
106
+ @proxy.open( "foo.com", 1234 )
107
+ end
108
+
109
+ @server.wait
110
+
111
+ assert_equal [ "CONNECT foo.com:1234 HTTP/1.0\n", "\n" ], @server.events
112
+ end
113
+
114
+ def test_invalid_auth_scheme
115
+ @options[:user] = 'test'
116
+
117
+ @server.script << "HTTP/1.0 407 Error\nProxy-Authenticate: Foo 1 2 3\n\n"
118
+ @server.run
119
+
120
+ assert_raise( NotImplementedError ) do
121
+ @proxy.open( "foo.com", 1234 )
122
+ end
123
+
124
+ @server.wait
125
+
126
+ assert_equal [ "CONNECT foo.com:1234 HTTP/1.0\n", "\n" ], @server.events
127
+ end
128
+
129
+ def test_connect_error_bad_auth
130
+ @options[:user] = 'test'
131
+ @options[:password] = 'password'
132
+
133
+ @server.script << "HTTP/1.0 407 Error\nProxy-Authenticate: Basic\n\n"
134
+ @server.script << "HTTP/1.0 500 Error\n\n"
135
+ @server.run
136
+
137
+ assert_raise( Net::SSH::Proxy::ConnectError ) do
138
+ @proxy.open( "foo.com", 1234 )
139
+ end
140
+
141
+ @server.wait
142
+
143
+ assert_equal [ "CONNECT foo.com:1234 HTTP/1.0\n", "\n",
144
+ "CONNECT foo.com:1234 HTTP/1.0\n",
145
+ "Proxy-Authorization: Basic dGVzdDpwYXNzd29yZA==\n", "\n" ],
146
+ @server.events
147
+ end
148
+
149
+ def test_connect_auth_success
150
+ @options[:user] = 'test'
151
+ @options[:password] = 'password'
152
+
153
+ @server.script << "HTTP/1.0 407 Error\nProxy-Authenticate: Basic\n\n"
154
+ @server.script << "HTTP/1.0 200 OK\n\n"
155
+ @server.run
156
+
157
+ assert_nothing_raised do
158
+ @proxy.open( "foo.com", 1234 )
159
+ end
160
+
161
+ @server.wait
162
+
163
+ assert_equal [ "CONNECT foo.com:1234 HTTP/1.0\n", "\n",
164
+ "CONNECT foo.com:1234 HTTP/1.0\n",
165
+ "Proxy-Authorization: Basic dGVzdDpwYXNzd29yZA==\n", "\n" ],
166
+ @server.events
167
+ end
168
+
169
+ def test_connect_auth_success_with_HTTP_PROXY_vars
170
+ ENV['HTTP_PROXY_USER'] = 'test'
171
+ ENV['HTTP_PROXY_PASSWORD'] = 'password'
172
+
173
+ @server.script << "HTTP/1.0 407 Error\nProxy-Authenticate: Basic\n\n"
174
+ @server.script << "HTTP/1.0 200 OK\n\n"
175
+ @server.run
176
+
177
+ assert_nothing_raised do
178
+ @proxy.open( "foo.com", 1234 )
179
+ end
180
+
181
+ @server.wait
182
+
183
+ assert_equal [ "CONNECT foo.com:1234 HTTP/1.0\n", "\n",
184
+ "CONNECT foo.com:1234 HTTP/1.0\n",
185
+ "Proxy-Authorization: Basic dGVzdDpwYXNzd29yZA==\n", "\n" ],
186
+ @server.events
187
+ end
188
+
189
+ def test_connect_auth_success_with_CONNECT_vars
190
+ ENV['CONNECT_USER'] = 'test'
191
+ ENV['CONNECT_PASSWORD'] = 'password'
192
+
193
+ @server.script << "HTTP/1.0 407 Error\nProxy-Authenticate: Basic\n\n"
194
+ @server.script << "HTTP/1.0 200 OK\n\n"
195
+ @server.run
196
+
197
+ assert_nothing_raised do
198
+ @proxy.open( "foo.com", 1234 )
199
+ end
200
+
201
+ @server.wait
202
+
203
+ assert_equal [ "CONNECT foo.com:1234 HTTP/1.0\n", "\n",
204
+ "CONNECT foo.com:1234 HTTP/1.0\n",
205
+ "Proxy-Authorization: Basic dGVzdDpwYXNzd29yZA==\n", "\n" ],
206
+ @server.events
207
+ end
208
+
209
+ end
@@ -0,0 +1,148 @@
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
+ $:.unshift "../../lib"
18
+
19
+ require 'test/unit'
20
+ require 'net/ssh/proxy/socks4'
21
+ require 'socket'
22
+
23
+ class TC_Proxy_SOCKS4 < Test::Unit::TestCase
24
+
25
+ HOST = "test.host"
26
+ PORT = 22117
27
+
28
+ class ScriptableSOCKS4Server
29
+ attr_reader :script
30
+ attr_reader :events
31
+
32
+ def initialize
33
+ @script = []
34
+ @events = []
35
+ end
36
+
37
+ def run
38
+ @socket = TCPServer.new( HOST, PORT )
39
+ @thread = Thread.new { run_server until @script.empty? }
40
+ end
41
+
42
+ def run_server
43
+ client = @socket.accept
44
+ packet = client.read(8)
45
+ c = nil
46
+ packet << c while ( c = client.read(1) ) != "\0"
47
+ packet << "\0"
48
+ @events << packet
49
+ client.send @script.shift, 0
50
+ rescue Exception => e
51
+ puts "#{e.class}: #{e.message}"
52
+ puts e.backtrace.join("\n")
53
+ end
54
+
55
+ def wait
56
+ @thread.join
57
+ end
58
+
59
+ def shutdown
60
+ @socket.shutdown
61
+ end
62
+ end
63
+
64
+ def setup
65
+ ENV['SOCKS_USER'] = nil
66
+ ENV['CONNECT_USER'] = nil
67
+
68
+ @server = ScriptableSOCKS4Server.new
69
+ @options = Hash.new
70
+ @proxy = Net::SSH::Proxy::SOCKS4.new( HOST, PORT, @options )
71
+ end
72
+
73
+ def teardown
74
+ @server.shutdown
75
+ end
76
+
77
+ def test_no_auth_ok
78
+ @server.script << "\4\132\0\0\0\0\0\0\0\0"
79
+ @server.run
80
+
81
+ assert_nothing_raised do
82
+ @proxy.open( "test.host", 1234 )
83
+ end
84
+
85
+ @server.wait
86
+
87
+ assert_equal [ "\4\1\4\xD2\x7F\0\0\1\0" ], @server.events
88
+ end
89
+
90
+ def test_no_auth_fail
91
+ @server.script << "\4\133\0\0\0\0\0\0\0\0"
92
+ @server.run
93
+
94
+ assert_raise( Net::SSH::Proxy::ConnectError ) do
95
+ @proxy.open( "test.host", 1234 )
96
+ end
97
+
98
+ @server.wait
99
+
100
+ assert_equal [ "\4\1\4\xD2\x7F\0\0\1\0" ], @server.events
101
+ end
102
+
103
+ def test_auth_options
104
+ @options[:user] = "test"
105
+
106
+ @server.script << "\4\132\0\0\0\0\0\0\0\0"
107
+ @server.run
108
+
109
+ assert_nothing_raised do
110
+ @proxy.open( "test.host", 1234 )
111
+ end
112
+
113
+ @server.wait
114
+
115
+ assert_equal [ "\4\1\4\xD2\x7F\0\0\1test\0" ], @server.events
116
+ end
117
+
118
+ def test_auth_SOCKS_var
119
+ ENV["SOCKS_USER"] = "test"
120
+
121
+ @server.script << "\4\132\0\0\0\0\0\0\0\0"
122
+ @server.run
123
+
124
+ assert_nothing_raised do
125
+ @proxy.open( "test.host", 1234 )
126
+ end
127
+
128
+ @server.wait
129
+
130
+ assert_equal [ "\4\1\4\xD2\x7F\0\0\1test\0" ], @server.events
131
+ end
132
+
133
+ def test_auth_CONNECT_var
134
+ ENV["CONNECT_USER"] = "test"
135
+
136
+ @server.script << "\4\132\0\0\0\0\0\0\0\0"
137
+ @server.run
138
+
139
+ assert_nothing_raised do
140
+ @proxy.open( "test.host", 1234 )
141
+ end
142
+
143
+ @server.wait
144
+
145
+ assert_equal [ "\4\1\4\xD2\x7F\0\0\1test\0" ], @server.events
146
+ end
147
+
148
+ end
@@ -0,0 +1,214 @@
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
+ $:.unshift "../../lib"
18
+
19
+ require 'test/unit'
20
+ require 'net/ssh/proxy/socks5'
21
+ require 'socket'
22
+
23
+ class TC_Proxy_SOCKS5 < Test::Unit::TestCase
24
+
25
+ HOST = "test.host"
26
+ PORT = 22117
27
+
28
+ class ScriptableSOCKS5Server
29
+ attr_reader :script
30
+ attr_reader :events
31
+
32
+ def initialize
33
+ @script = []
34
+ @events = []
35
+ end
36
+
37
+ def run
38
+ @socket = TCPServer.new( HOST, PORT )
39
+ @thread = Thread.new { run_server }
40
+ end
41
+
42
+ def run_server
43
+ client = @socket.accept
44
+
45
+ data = client.read(2)
46
+ count = data[1]
47
+ data << client.read(count)
48
+ @events << data
49
+ client.send @script.shift, 0
50
+ return if @script.empty?
51
+
52
+ if count > 1
53
+ data = client.read(2)
54
+ data << client.read(data[data.length-1]+1)
55
+ data << client.read(data[data.length-1])
56
+ @events << data
57
+ client.send @script.shift, 0
58
+ return if @script.empty?
59
+ end
60
+
61
+ data = client.read(4)
62
+ t = data[3]
63
+ if t == 1
64
+ data << client.read(4)
65
+ elsif t == 3
66
+ data << client.read(1)
67
+ length = data[4]
68
+ data << client.read(length)
69
+ end
70
+ data << client.read(2)
71
+ @events << data
72
+ client.send @script.shift, 0
73
+
74
+ rescue Exception => e
75
+ puts "#{e.class}: #{e.message}"
76
+ puts e.backtrace.join("\n")
77
+ end
78
+
79
+ def wait
80
+ @thread.join
81
+ end
82
+
83
+ def shutdown
84
+ @socket.shutdown
85
+ end
86
+ end
87
+
88
+ def setup
89
+ ENV['SOCKS_USER'] = nil
90
+ ENV['SOCKS_PASSWORD'] = nil
91
+ ENV['CONNECT_USER'] = nil
92
+ ENV['CONNECT_PASSWORD'] = nil
93
+
94
+ @server = ScriptableSOCKS5Server.new
95
+ @options = Hash.new
96
+ @proxy = Net::SSH::Proxy::SOCKS5.new( HOST, PORT, @options )
97
+ end
98
+
99
+ def teardown
100
+ @server.shutdown
101
+ end
102
+
103
+ def test_bad_version
104
+ @server.script << "\4\0"
105
+ @server.run
106
+
107
+ assert_raise( Net::SSH::Proxy::Error ) do
108
+ @proxy.open( "test.host", 1234 )
109
+ end
110
+
111
+ @server.wait
112
+
113
+ assert_equal [ "\5\1\0" ], @server.events
114
+ end
115
+
116
+ def test_no_supported_methods
117
+ @server.script << "\5\xff"
118
+ @server.run
119
+
120
+ assert_raise( Net::SSH::Proxy::Error ) do
121
+ @proxy.open( "test.host", 1234 )
122
+ end
123
+
124
+ @server.wait
125
+
126
+ assert_equal [ "\5\1\0" ], @server.events
127
+ end
128
+
129
+ def test_no_auth_fail
130
+ @server.script << "\5\0"
131
+ @server.script << "\5\1\0\0\4\0\0\0\0\0\0"
132
+ @server.run
133
+
134
+ assert_raise( Net::SSH::Proxy::ConnectError ) do
135
+ @proxy.open( "test.host", 1234 )
136
+ end
137
+
138
+ @server.wait
139
+
140
+ assert_equal [ "\5\1\0", "\5\1\0\3\11test.host\4\322" ], @server.events
141
+ end
142
+
143
+ def test_no_auth_succeed_atyp_ipv4
144
+ @server.script << "\5\0"
145
+ @server.script << "\5\0\0\0\4\0\0\0\0\0\0"
146
+ @server.run
147
+
148
+ assert_nothing_raised do
149
+ @proxy.open( "1.2.3.4", 1234 )
150
+ end
151
+
152
+ @server.wait
153
+
154
+ assert_equal [ "\5\1\0", "\5\1\0\1\1\2\3\4\4\322" ], @server.events
155
+ end
156
+
157
+ def test_no_auth_succeed_atyp_domain
158
+ @server.script << "\5\0"
159
+ @server.script << "\5\0\0\0\4\0\0\0\0\0\0"
160
+ @server.run
161
+
162
+ assert_nothing_raised do
163
+ @proxy.open( "test.host", 1234 )
164
+ end
165
+
166
+ @server.wait
167
+
168
+ assert_equal [ "\5\1\0", "\5\1\0\3\11test.host\4\322" ], @server.events
169
+ end
170
+
171
+ def test_authorize_fail
172
+ @options[:user], @options[:password] = "foo", "bar"
173
+
174
+ @server.script << "\5\2"
175
+ @server.script << "\5\1"
176
+ @server.run
177
+
178
+ assert_raise( Net::SSH::Proxy::UnauthorizedError ) do
179
+ @proxy.open( "test.host", 1234 )
180
+ end
181
+
182
+ @server.wait
183
+
184
+ assert_equal [ "\5\2\0\2", "\5\3foo\3bar" ], @server.events
185
+ end
186
+
187
+ [
188
+ [:options,
189
+ lambda { |o| o[:user], o[:password] = "foo", "bar" } ],
190
+ [:socks,
191
+ lambda { ENV['SOCKS_USER'], ENV['SOCKS_PASSWORD'] = "foo", "bar" } ],
192
+ [:connect,
193
+ lambda { ENV['CONNECT_USER'], ENV['CONNECT_PASSWORD'] = "foo", "bar" } ]
194
+ ].each do |name, cb|
195
+ define_method "test_authorize_via_#{name}".to_sym do
196
+ cb.call( @options )
197
+
198
+ @server.script << "\5\2"
199
+ @server.script << "\5\0"
200
+ @server.script << "\5\0\0\0\4\0\0\0\0\0\0"
201
+ @server.run
202
+
203
+ assert_nothing_raised do
204
+ @proxy.open( "test.host", 1234 )
205
+ end
206
+
207
+ @server.wait
208
+
209
+ assert_equal [ "\5\2\0\2", "\5\3foo\3bar",
210
+ "\5\1\0\3\11test.host\4\322" ], @server.events
211
+ end
212
+ end
213
+
214
+ end