ruby-openid 1.1.4 → 2.0.1

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 (207) hide show
  1. data/INSTALL +0 -9
  2. data/README +21 -22
  3. data/UPGRADE +117 -0
  4. data/admin/runtests.rb +36 -0
  5. data/examples/README +13 -21
  6. data/examples/active_record_openid_store/README +8 -3
  7. data/examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb +4 -8
  8. data/examples/active_record_openid_store/XXX_upgrade_open_id_store.rb +26 -0
  9. data/examples/active_record_openid_store/lib/association.rb +2 -0
  10. data/examples/active_record_openid_store/lib/openid_ar_store.rb +22 -47
  11. data/examples/active_record_openid_store/test/store_test.rb +78 -48
  12. data/examples/discover +46 -0
  13. data/examples/{rails_server → rails_openid}/README +0 -0
  14. data/examples/{rails_server → rails_openid}/Rakefile +0 -0
  15. data/examples/{rails_server → rails_openid}/app/controllers/application.rb +0 -0
  16. data/examples/rails_openid/app/controllers/consumer_controller.rb +115 -0
  17. data/examples/{rails_server → rails_openid}/app/controllers/login_controller.rb +10 -2
  18. data/examples/rails_openid/app/controllers/server_controller.rb +265 -0
  19. data/examples/{rails_server → rails_openid}/app/helpers/application_helper.rb +0 -0
  20. data/examples/{rails_server → rails_openid}/app/helpers/login_helper.rb +0 -0
  21. data/examples/{rails_server → rails_openid}/app/helpers/server_helper.rb +0 -0
  22. data/examples/rails_openid/app/views/consumer/index.rhtml +81 -0
  23. data/examples/rails_openid/app/views/consumer/start.rhtml +8 -0
  24. data/examples/{rails_server → rails_openid}/app/views/layouts/server.rhtml +0 -0
  25. data/examples/{rails_server → rails_openid}/app/views/login/index.rhtml +1 -1
  26. data/examples/rails_openid/app/views/server/decide.rhtml +26 -0
  27. data/examples/{rails_server → rails_openid}/config/boot.rb +0 -0
  28. data/examples/{rails_server → rails_openid}/config/database.yml +0 -0
  29. data/examples/{rails_server → rails_openid}/config/environment.rb +0 -0
  30. data/examples/{rails_server → rails_openid}/config/environments/development.rb +0 -0
  31. data/examples/{rails_server → rails_openid}/config/environments/production.rb +0 -0
  32. data/examples/{rails_server → rails_openid}/config/environments/test.rb +0 -0
  33. data/examples/{rails_server → rails_openid}/config/routes.rb +2 -1
  34. data/examples/{rails_server → rails_openid}/doc/README_FOR_APP +0 -0
  35. data/examples/{rails_server → rails_openid}/public/404.html +0 -0
  36. data/examples/{rails_server → rails_openid}/public/500.html +0 -0
  37. data/examples/{rails_server → rails_openid}/public/dispatch.cgi +0 -0
  38. data/examples/{rails_server → rails_openid}/public/dispatch.fcgi +0 -0
  39. data/examples/{rails_server → rails_openid}/public/dispatch.rb +0 -0
  40. data/examples/{rails_server → rails_openid}/public/favicon.ico +0 -0
  41. data/examples/rails_openid/public/images/openid_login_bg.gif +0 -0
  42. data/examples/{rails_server → rails_openid}/public/javascripts/controls.js +0 -0
  43. data/examples/{rails_server → rails_openid}/public/javascripts/dragdrop.js +0 -0
  44. data/examples/{rails_server → rails_openid}/public/javascripts/effects.js +0 -0
  45. data/examples/{rails_server → rails_openid}/public/javascripts/prototype.js +0 -0
  46. data/examples/{rails_server → rails_openid}/public/robots.txt +0 -0
  47. data/examples/{rails_server → rails_openid}/script/about +0 -0
  48. data/examples/{rails_server → rails_openid}/script/breakpointer +0 -0
  49. data/examples/{rails_server → rails_openid}/script/console +0 -0
  50. data/examples/{rails_server → rails_openid}/script/destroy +0 -0
  51. data/examples/{rails_server → rails_openid}/script/generate +0 -0
  52. data/examples/{rails_server → rails_openid}/script/performance/benchmarker +0 -0
  53. data/examples/{rails_server → rails_openid}/script/performance/profiler +0 -0
  54. data/examples/{rails_server → rails_openid}/script/plugin +0 -0
  55. data/examples/{rails_server → rails_openid}/script/process/reaper +0 -0
  56. data/examples/{rails_server → rails_openid}/script/process/spawner +0 -0
  57. data/examples/{rails_server → rails_openid}/script/process/spinner +0 -0
  58. data/examples/{rails_server → rails_openid}/script/runner +0 -0
  59. data/examples/{rails_server → rails_openid}/script/server +0 -0
  60. data/examples/{rails_server → rails_openid}/test/functional/login_controller_test.rb +0 -0
  61. data/examples/{rails_server → rails_openid}/test/functional/server_controller_test.rb +0 -0
  62. data/examples/{rails_server → rails_openid}/test/test_helper.rb +0 -0
  63. data/lib/{hmac.rb → hmac/hmac.rb} +0 -0
  64. data/lib/{hmac-sha1.rb → hmac/sha1.rb} +1 -1
  65. data/lib/{hmac-sha2.rb → hmac/sha2.rb} +1 -1
  66. data/lib/openid/association.rb +213 -73
  67. data/lib/openid/consumer/associationmanager.rb +338 -0
  68. data/lib/openid/consumer/checkid_request.rb +175 -0
  69. data/lib/openid/consumer/discovery.rb +480 -0
  70. data/lib/openid/consumer/discovery_manager.rb +123 -0
  71. data/lib/openid/consumer/html_parse.rb +136 -0
  72. data/lib/openid/consumer/idres.rb +525 -0
  73. data/lib/openid/consumer/responses.rb +133 -0
  74. data/lib/openid/consumer.rb +280 -807
  75. data/lib/openid/cryptutil.rb +85 -0
  76. data/lib/openid/dh.rb +60 -23
  77. data/lib/openid/extension.rb +31 -0
  78. data/lib/openid/extensions/ax.rb +506 -0
  79. data/lib/openid/extensions/pape.rb +182 -0
  80. data/lib/openid/extensions/sreg.rb +275 -0
  81. data/lib/openid/extras.rb +11 -0
  82. data/lib/openid/fetchers.rb +132 -93
  83. data/lib/openid/kvform.rb +133 -0
  84. data/lib/openid/kvpost.rb +56 -0
  85. data/lib/openid/message.rb +534 -0
  86. data/lib/openid/protocolerror.rb +6 -0
  87. data/lib/openid/server.rb +1215 -666
  88. data/lib/openid/store/filesystem.rb +271 -0
  89. data/lib/openid/store/interface.rb +75 -0
  90. data/lib/openid/store/memory.rb +84 -0
  91. data/lib/openid/store/nonce.rb +68 -0
  92. data/lib/openid/trustroot.rb +314 -87
  93. data/lib/openid/urinorm.rb +37 -34
  94. data/lib/openid/util.rb +42 -220
  95. data/lib/openid/yadis/accept.rb +148 -0
  96. data/lib/openid/yadis/constants.rb +21 -0
  97. data/lib/openid/yadis/discovery.rb +153 -0
  98. data/lib/openid/yadis/filters.rb +205 -0
  99. data/lib/openid/{htmltokenizer.rb → yadis/htmltokenizer.rb} +1 -54
  100. data/lib/openid/yadis/parsehtml.rb +36 -0
  101. data/lib/openid/yadis/services.rb +42 -0
  102. data/lib/openid/yadis/xrds.rb +171 -0
  103. data/lib/openid/yadis/xri.rb +90 -0
  104. data/lib/openid/yadis/xrires.rb +106 -0
  105. data/lib/openid.rb +1 -4
  106. data/test/data/accept.txt +124 -0
  107. data/test/data/dh.txt +29 -0
  108. data/test/data/example-xrds.xml +14 -0
  109. data/test/data/linkparse.txt +587 -0
  110. data/test/data/n2b64 +650 -0
  111. data/test/data/test1-discover.txt +137 -0
  112. data/test/data/test1-parsehtml.txt +128 -0
  113. data/test/data/test_discover/openid.html +11 -0
  114. data/test/data/test_discover/openid2.html +11 -0
  115. data/test/data/test_discover/openid2_xrds.xml +12 -0
  116. data/test/data/test_discover/openid2_xrds_no_local_id.xml +11 -0
  117. data/test/data/test_discover/openid_1_and_2.html +11 -0
  118. data/test/data/test_discover/openid_1_and_2_xrds.xml +16 -0
  119. data/test/data/test_discover/openid_1_and_2_xrds_bad_delegate.xml +17 -0
  120. data/test/data/test_discover/openid_and_yadis.html +12 -0
  121. data/test/data/test_discover/openid_no_delegate.html +10 -0
  122. data/test/data/test_discover/yadis_0entries.xml +12 -0
  123. data/test/data/test_discover/yadis_2_bad_local_id.xml +15 -0
  124. data/test/data/test_discover/yadis_2entries_delegate.xml +22 -0
  125. data/test/data/test_discover/yadis_2entries_idp.xml +21 -0
  126. data/test/data/test_discover/yadis_another_delegate.xml +14 -0
  127. data/test/data/test_discover/yadis_idp.xml +12 -0
  128. data/test/data/test_discover/yadis_idp_delegate.xml +13 -0
  129. data/test/data/test_discover/yadis_no_delegate.xml +11 -0
  130. data/test/data/test_xrds/=j3h.2007.11.14.xrds +25 -0
  131. data/test/data/test_xrds/README +12 -0
  132. data/test/data/test_xrds/delegated-20060809-r1.xrds +34 -0
  133. data/test/data/test_xrds/delegated-20060809-r2.xrds +34 -0
  134. data/test/data/test_xrds/delegated-20060809.xrds +34 -0
  135. data/test/data/test_xrds/no-xrd.xml +7 -0
  136. data/test/data/test_xrds/not-xrds.xml +2 -0
  137. data/test/data/test_xrds/prefixsometimes.xrds +34 -0
  138. data/test/data/test_xrds/ref.xrds +109 -0
  139. data/test/data/test_xrds/sometimesprefix.xrds +34 -0
  140. data/test/data/test_xrds/spoof1.xrds +25 -0
  141. data/test/data/test_xrds/spoof2.xrds +25 -0
  142. data/test/data/test_xrds/spoof3.xrds +37 -0
  143. data/test/data/test_xrds/status222.xrds +9 -0
  144. data/test/data/test_xrds/valid-populated-xrds.xml +39 -0
  145. data/test/data/trustroot.txt +147 -0
  146. data/test/discoverdata.rb +131 -0
  147. data/test/test_accept.rb +170 -0
  148. data/test/test_association.rb +266 -0
  149. data/test/test_associationmanager.rb +899 -0
  150. data/test/test_ax.rb +587 -0
  151. data/test/test_checkid_request.rb +297 -0
  152. data/test/test_consumer.rb +257 -0
  153. data/test/test_cryptutil.rb +117 -0
  154. data/test/test_dh.rb +86 -0
  155. data/test/test_discover.rb +772 -0
  156. data/test/test_discovery_manager.rb +262 -0
  157. data/test/test_extras.rb +35 -0
  158. data/test/test_fetchers.rb +472 -0
  159. data/test/test_filters.rb +270 -0
  160. data/test/test_idres.rb +816 -0
  161. data/test/test_kvform.rb +165 -0
  162. data/test/test_kvpost.rb +65 -0
  163. data/test/test_linkparse.rb +101 -0
  164. data/test/test_message.rb +1058 -0
  165. data/test/test_nonce.rb +89 -0
  166. data/test/test_openid_yadis.rb +178 -0
  167. data/test/test_pape.rb +233 -0
  168. data/test/test_parsehtml.rb +80 -0
  169. data/test/test_responses.rb +63 -0
  170. data/test/test_server.rb +2270 -0
  171. data/test/test_sreg.rb +479 -0
  172. data/test/test_stores.rb +269 -0
  173. data/test/test_trustroot.rb +112 -0
  174. data/test/{urinorm.rb → test_urinorm.rb} +6 -3
  175. data/test/test_util.rb +144 -0
  176. data/test/test_xrds.rb +160 -0
  177. data/test/test_xri.rb +48 -0
  178. data/test/test_xrires.rb +63 -0
  179. data/test/test_yadis_discovery.rb +207 -0
  180. data/test/testutil.rb +116 -0
  181. data/test/util.rb +47 -50
  182. metadata +233 -143
  183. data/examples/consumer.rb +0 -290
  184. data/examples/rails_openid_login_generator/openid_login_generator-0.1.gem +0 -0
  185. data/examples/rails_server/app/controllers/server_controller.rb +0 -190
  186. data/examples/rails_server/app/views/server/decide.rhtml +0 -11
  187. data/examples/rails_server/public/images/rails.png +0 -0
  188. data/lib/hmac-md5.rb +0 -11
  189. data/lib/hmac-rmd160.rb +0 -11
  190. data/lib/openid/discovery.rb +0 -122
  191. data/lib/openid/filestore.rb +0 -315
  192. data/lib/openid/parse.rb +0 -23
  193. data/lib/openid/service.rb +0 -147
  194. data/lib/openid/stores.rb +0 -178
  195. data/test/assoc.rb +0 -38
  196. data/test/consumer.rb +0 -376
  197. data/test/data/brian.xrds +0 -16
  198. data/test/data/brianellin.mylid.xrds +0 -42
  199. data/test/dh.rb +0 -20
  200. data/test/extensions.rb +0 -30
  201. data/test/linkparse.rb +0 -305
  202. data/test/runtests.rb +0 -22
  203. data/test/server2.rb +0 -1053
  204. data/test/service.rb +0 -47
  205. data/test/storetestcase.rb +0 -172
  206. data/test/teststore.rb +0 -47
  207. data/test/trustroot.rb +0 -117
@@ -0,0 +1,472 @@
1
+ require 'test/unit'
2
+ require 'net/http'
3
+ require 'webrick'
4
+
5
+ require 'testutil'
6
+ require 'util'
7
+
8
+ require 'openid/fetchers'
9
+
10
+ require 'stringio'
11
+
12
+ begin
13
+ require 'net/https'
14
+ rescue LoadError
15
+ # We need these names for testing.
16
+
17
+ module OpenSSL
18
+ module SSL
19
+ class SSLError < StandardError; end
20
+ end
21
+ end
22
+ end
23
+
24
+ module HttpResultAssertions
25
+ def assert_http_result_is(expected, result)
26
+ assert_equal expected.code, result.code
27
+ assert_equal expected.body, result.body
28
+ assert_equal expected.final_url, result.final_url
29
+ end
30
+ end
31
+
32
+ class BogusFetcher
33
+ RESPONSE = "bogus"
34
+
35
+ def fetch(url, body=nil, headers=nil, redirect_limit=5)
36
+ return BogusFetcher::RESPONSE
37
+ end
38
+ end
39
+
40
+ class FetcherTestCase < Test::Unit::TestCase
41
+ include HttpResultAssertions
42
+ include OpenID::TestUtil
43
+
44
+ @@test_header_name = 'X-test-header'
45
+ @@test_header_value = 'marmoset'
46
+
47
+ class ExpectedResponse < Net::HTTPResponse
48
+ attr_reader :final_url
49
+
50
+ def initialize(code, final_url, body="the expected body",
51
+ httpv="1.1", msg=nil)
52
+ super(httpv, code, msg)
53
+ @code = code
54
+ @body = body
55
+ @final_url = final_url
56
+ end
57
+
58
+ def body
59
+ @body
60
+ end
61
+ end
62
+
63
+ @@cases =
64
+ [
65
+ # path, status code, expected url (nil = default to path)
66
+ ['/success', 200, nil],
67
+ ['/notfound', 404, nil],
68
+ ['/badreq', 400, nil],
69
+ ['/forbidden', 403, nil],
70
+ ['/error', 500, nil],
71
+ ['/server_error', 503, nil],
72
+ ['/301redirect', 200, '/success'],
73
+ ['/302redirect', 200, '/success'],
74
+ ['/303redirect', 200, '/success'],
75
+ ['/307redirect', 200, '/success'],
76
+ ]
77
+
78
+ def _redirect_with_code(code)
79
+ lambda { |req, resp|
80
+ resp.status = code
81
+ resp['Location'] = _uri_build('/success')
82
+ }
83
+ end
84
+
85
+ def _respond_with_code(code)
86
+ lambda { |req, resp|
87
+ resp.status = code
88
+ resp.body = "the expected body"
89
+ }
90
+ end
91
+
92
+ def _require_header
93
+ lambda { |req, resp|
94
+ assert_equal @@test_header_value, req[@@test_header_name]
95
+ assert_match 'ruby-openid', req['User-agent']
96
+ }
97
+ end
98
+
99
+ def _require_post
100
+ lambda { |req, resp|
101
+ assert_equal 'POST', req.request_method
102
+ assert_equal "postbody\n", req.body
103
+ }
104
+ end
105
+
106
+ def _redirect_loop
107
+ lambda { |req, resp|
108
+ @_redirect_counter += 1
109
+ resp.status = 302
110
+ resp['Location'] = _uri_build('/redirect_loop')
111
+ resp.body = "Fetched #{@_redirect_counter} times."
112
+ assert_block("Fetched too many times.") { @_redirect_counter < 10 }
113
+ }
114
+ end
115
+
116
+ def setup
117
+ @fetcher = OpenID::StandardFetcher.new
118
+ @logfile = StringIO.new
119
+ @weblog = WEBrick::Log.new(logfile=@logfile)
120
+ @server = WEBrick::HTTPServer.new(:Port => 0,
121
+ :Logger => @weblog,
122
+ :AccessLog => [])
123
+ @server_thread = Thread.new {
124
+ @server.mount_proc('/success', _respond_with_code(200))
125
+ @server.mount_proc('/301redirect', _redirect_with_code(301))
126
+ @server.mount_proc('/302redirect', _redirect_with_code(302))
127
+ @server.mount_proc('/303redirect', _redirect_with_code(303))
128
+ @server.mount_proc('/307redirect', _redirect_with_code(307))
129
+ @server.mount_proc('/badreq', _respond_with_code(400))
130
+ @server.mount_proc('/forbidden', _respond_with_code(403))
131
+ @server.mount_proc('/notfound', _respond_with_code(404))
132
+ @server.mount_proc('/error', _respond_with_code(500))
133
+ @server.mount_proc('/server_error', _respond_with_code(503))
134
+ @server.mount_proc('/require_header', _require_header)
135
+ @server.mount_proc('/redirect_to_reqheader') { |req, resp|
136
+ resp.status = 302
137
+ resp['Location'] = _uri_build('/require_header')
138
+ }
139
+ @server.mount_proc('/post', _require_post)
140
+ @server.mount_proc('/redirect_loop', _redirect_loop)
141
+ @server.start
142
+ }
143
+ @uri = _uri_build
144
+ sleep 0.2
145
+ end
146
+
147
+ def _uri_build(path='/')
148
+ u = URI::HTTP.build({
149
+ :host => @server.config[:ServerName],
150
+ :port => @server.config[:Port],
151
+ :path => path,
152
+ })
153
+ return u.to_s
154
+ end
155
+
156
+ def teardown
157
+ @server.shutdown
158
+ # Sleep a little because sometimes this blocks forever.
159
+ @server_thread.join
160
+ end
161
+
162
+ =begin
163
+ # XXX This test no longer works since we're not dealing with URI
164
+ # objects internally.
165
+ def test_final_url_tainted
166
+ uri = _uri_build('/301redirect')
167
+ result = @fetcher.fetch(uri)
168
+
169
+ final_url = URI::parse(result.final_url)
170
+
171
+ assert final_url.host.tainted?
172
+ assert final_url.path.tainted?
173
+ end
174
+ =end
175
+
176
+ def test_headers
177
+ headers = {
178
+ @@test_header_name => @@test_header_value
179
+ }
180
+ uri = _uri_build('/require_header')
181
+ result = @fetcher.fetch(uri, nil, headers)
182
+ # The real test runs under the WEBrick handler _require_header,
183
+ # this just checks the return code from that.
184
+ assert_equal '200', result.code, @logfile.string
185
+ end
186
+
187
+ def test_headers_after_redirect
188
+ headers = {
189
+ @@test_header_name => @@test_header_value
190
+ }
191
+ uri = _uri_build('/redirect_to_reqheader')
192
+ result = @fetcher.fetch(uri, nil, headers)
193
+ # The real test runs under the WEBrick handler _require_header,
194
+ # this just checks the return code from that.
195
+ assert_equal '200', result.code, @logfile.string
196
+ end
197
+
198
+ def test_post
199
+ uri = _uri_build('/post')
200
+ result = @fetcher.fetch(uri, "postbody\n")
201
+ # The real test runs under the WEBrick handler _require_header,
202
+ # this just checks the return code from that.
203
+ assert_equal '200', result.code, @logfile.string
204
+ end
205
+
206
+ def test_redirect_limit
207
+ @_redirect_counter = 0
208
+ uri = _uri_build('/redirect_loop')
209
+ assert_raise(OpenID::HTTPRedirectLimitReached) {
210
+ @fetcher.fetch(uri)
211
+ }
212
+ end
213
+
214
+ def test_cases
215
+ for path, expected_code, expected_url in @@cases
216
+ uri = _uri_build(path)
217
+ if expected_url.nil?
218
+ expected_url = uri
219
+ else
220
+ expected_url = _uri_build(expected_url)
221
+ end
222
+
223
+ expected = ExpectedResponse.new(expected_code.to_s, expected_url)
224
+ result = @fetcher.fetch(uri)
225
+
226
+ begin
227
+ assert_http_result_is expected, result
228
+ rescue Test::Unit::AssertionFailedError => err
229
+ if result.code == '500' && expected_code != 500
230
+ # Looks like our WEBrick harness broke.
231
+ msg = <<EOF
232
+ Status #{result.code} from case #{path}. Logs:
233
+ #{@logfile.string}
234
+ EOF
235
+ raise msg
236
+ end
237
+
238
+ # Wrap failure messages so we can tell which case failed.
239
+ new_msg = "#{path}: #{err.message.to_s}"
240
+ new_err = Test::Unit::AssertionFailedError.new(new_msg)
241
+ new_err.set_backtrace(err.backtrace)
242
+ raise new_err
243
+ end
244
+ end
245
+ end
246
+
247
+ def test_https_no_openssl
248
+ # Override supports_ssl? to always claim that connections don't
249
+ # support SSL. Test the behavior of fetch() for HTTPS URLs in
250
+ # that case.
251
+ f = OpenID::StandardFetcher.new
252
+ f.extend(OpenID::InstanceDefExtension)
253
+
254
+ f.instance_def(:supports_ssl?) do |conn|
255
+ false
256
+ end
257
+
258
+ begin
259
+ f.fetch("https://someurl.com/")
260
+ flunk("Expected RuntimeError")
261
+ rescue RuntimeError => why
262
+ assert_equal(why.to_s, "SSL support not found; cannot fetch https://someurl.com/")
263
+ end
264
+ end
265
+
266
+ class FakeConnection < Net::HTTP
267
+ attr_reader :use_ssl, :ca_file
268
+
269
+ def use_ssl=(v)
270
+ @use_ssl = v
271
+ end
272
+
273
+ def ca_file=(ca_file)
274
+ @ca_file = ca_file
275
+ end
276
+ end
277
+
278
+ def test_ssl_with_ca_file
279
+ f = OpenID::StandardFetcher.new
280
+ ca_file = "BOGUS"
281
+ f.ca_file = ca_file
282
+
283
+ f.extend(OpenID::InstanceDefExtension)
284
+ f.instance_def(:make_http) do |uri|
285
+ FakeConnection.new(uri.host, uri.port)
286
+ end
287
+
288
+ testcase = self
289
+
290
+ f.instance_def(:set_verified) do |conn, verified|
291
+ testcase.assert(verified)
292
+ end
293
+
294
+ conn = f.make_connection(URI::parse("https://someurl.com"))
295
+ assert_equal(conn.ca_file, ca_file)
296
+ end
297
+
298
+ def test_ssl_without_ca_file
299
+ f = OpenID::StandardFetcher.new
300
+
301
+ f.extend(OpenID::InstanceDefExtension)
302
+ f.instance_def(:make_http) do |uri|
303
+ FakeConnection.new(uri.host, uri.port)
304
+ end
305
+
306
+ testcase = self
307
+
308
+ f.instance_def(:set_verified) do |conn, verified|
309
+ testcase.assert(!verified)
310
+ end
311
+
312
+ conn = nil
313
+ assert_log_matches(/making https request to https:\/\/someurl.com without verifying/) {
314
+ conn = f.make_connection(URI::parse("https://someurl.com"))
315
+ }
316
+
317
+ assert(conn.ca_file.nil?)
318
+ end
319
+
320
+ def test_make_http_nil
321
+ f = OpenID::StandardFetcher.new
322
+
323
+ f.extend(OpenID::InstanceDefExtension)
324
+ f.instance_def(:make_http) do |uri|
325
+ nil
326
+ end
327
+
328
+ assert_raise(RuntimeError) {
329
+ f.make_connection(URI::parse("http://example.com/"))
330
+ }
331
+ end
332
+
333
+ def test_make_http_invalid
334
+ f = OpenID::StandardFetcher.new
335
+
336
+ f.extend(OpenID::InstanceDefExtension)
337
+ f.instance_def(:make_http) do |uri|
338
+ "not a Net::HTTP object"
339
+ end
340
+
341
+ assert_raise(RuntimeError) {
342
+ f.make_connection(URI::parse("http://example.com/"))
343
+ }
344
+ end
345
+
346
+ class BrokenSSLConnection
347
+ def start(&block)
348
+ raise OpenSSL::SSL::SSLError
349
+ end
350
+ end
351
+
352
+ def test_sslfetchingerror
353
+ f = OpenID::StandardFetcher.new
354
+
355
+ f.extend(OpenID::InstanceDefExtension)
356
+ f.instance_def(:make_connection) do |uri|
357
+ BrokenSSLConnection.new
358
+ end
359
+
360
+ assert_raise(OpenID::SSLFetchingError) {
361
+ f.fetch("https://bogus.com/")
362
+ }
363
+ end
364
+
365
+ class TestingException < Exception; end
366
+
367
+ class NoSSLSupportConnection
368
+ def supports_ssl?
369
+ false
370
+ end
371
+
372
+ def start
373
+ yield
374
+ end
375
+
376
+ def request_get(*args)
377
+ raise TestingException
378
+ end
379
+
380
+ def post_connection_check(hostname)
381
+ raise RuntimeError
382
+ end
383
+
384
+ def use_ssl?
385
+ true
386
+ end
387
+ end
388
+
389
+ class NoUseSSLConnection < NoSSLSupportConnection
390
+ def use_ssl?
391
+ false
392
+ end
393
+ end
394
+
395
+ def test_post_connection_check_no_support_ssl
396
+ f = OpenID::StandardFetcher.new
397
+
398
+ f.extend(OpenID::InstanceDefExtension)
399
+ f.instance_def(:make_connection) do |uri|
400
+ NoSSLSupportConnection.new
401
+ end
402
+
403
+ # post_connection_check should not be called.
404
+ assert_raise(TestingException) {
405
+ f.fetch("https://bogus.com/")
406
+ }
407
+ end
408
+
409
+ def test_post_connection_check_no_use_ssl
410
+ f = OpenID::StandardFetcher.new
411
+
412
+ f.extend(OpenID::InstanceDefExtension)
413
+ f.instance_def(:make_connection) do |uri|
414
+ NoUseSSLConnection.new
415
+ end
416
+
417
+ # post_connection_check should not be called.
418
+ assert_raise(TestingException) {
419
+ f.fetch("https://bogus.com/")
420
+ }
421
+ end
422
+
423
+ class PostConnectionCheckException < Exception; end
424
+
425
+ class UseSSLConnection < NoSSLSupportConnection
426
+ def use_ssl?
427
+ true
428
+ end
429
+
430
+ def post_connection_check(hostname)
431
+ raise PostConnectionCheckException
432
+ end
433
+ end
434
+
435
+ def test_post_connection_check
436
+ f = OpenID::StandardFetcher.new
437
+
438
+ f.extend(OpenID::InstanceDefExtension)
439
+ f.instance_def(:make_connection) do |uri|
440
+ UseSSLConnection.new
441
+ end
442
+
443
+ f.instance_def(:supports_ssl?) do |conn|
444
+ true
445
+ end
446
+
447
+ # post_connection_check should be called.
448
+ assert_raise(PostConnectionCheckException) {
449
+ f.fetch("https://bogus.com/")
450
+ }
451
+ end
452
+ end
453
+
454
+ class DefaultFetcherTest < Test::Unit::TestCase
455
+ def setup
456
+ OpenID.fetcher = nil
457
+ end
458
+
459
+ def test_default_fetcher
460
+ assert(OpenID.fetcher.is_a?(OpenID::StandardFetcher))
461
+
462
+ # A custom fetcher can be set
463
+ OpenID.fetcher = BogusFetcher.new
464
+
465
+ # A test fetch should call the new fetcher
466
+ assert(OpenID.fetch('not-a-url') == BogusFetcher::RESPONSE)
467
+
468
+ # Set the fetcher to nil again
469
+ OpenID.fetcher = nil
470
+ assert(OpenID.fetcher.is_a?(OpenID::StandardFetcher))
471
+ end
472
+ end