|  | 
| 9 | 9 |  with_openssl_debug | 
| 10 | 10 |  retry_test sleep: 5 | 
| 11 | 11 | 
 | 
|  | 12 | + def self.with_ocsp_responder(port = 8100, path = '/', &setup) | 
|  | 13 | + around do |example| | 
|  | 14 | + server = WEBrick::HTTPServer.new(Port: port) | 
|  | 15 | + server.mount_proc path, &setup | 
|  | 16 | + Thread.new { server.start } | 
|  | 17 | + begin | 
|  | 18 | + example.run | 
|  | 19 | + ensure | 
|  | 20 | + server.shutdown | 
|  | 21 | + end | 
|  | 22 | + | 
|  | 23 | + ::Utils.wait_for_port_free(port, 5) | 
|  | 24 | + end | 
|  | 25 | + end | 
|  | 26 | + | 
| 12 | 27 |  shared_examples 'verifies' do | 
| 13 | 28 |  context 'mri' do | 
| 14 | 29 |  fails_on_jruby | 
|  | 
| 173 | 188 | 
 | 
| 174 | 189 |  context 'one time' do | 
| 175 | 190 | 
 | 
| 176 |  | - around do |example| | 
| 177 |  | - server = WEBrick::HTTPServer.new(Port: 8100) | 
| 178 |  | - server.mount_proc '/' do |req, res| | 
| 179 |  | - res.status = 303 | 
| 180 |  | - res['locAtion'] = "http://localhost:8101#{req.path}" | 
| 181 |  | - res.body = "See http://localhost:8101#{req.path}" | 
| 182 |  | - end | 
| 183 |  | - Thread.new { server.start } | 
| 184 |  | - begin | 
| 185 |  | - example.run | 
| 186 |  | - ensure | 
| 187 |  | - server.shutdown | 
| 188 |  | - end | 
| 189 |  | - | 
| 190 |  | - ::Utils.wait_for_port_free(8100, 5) | 
|  | 191 | + with_ocsp_responder do |req, res| | 
|  | 192 | + res.status = 303 | 
|  | 193 | + res['locAtion'] = "http://localhost:8101#{req.path}" | 
|  | 194 | + res.body = "See http://localhost:8101#{req.path}" | 
| 191 | 195 |  end | 
| 192 | 196 | 
 | 
| 193 | 197 |  include_context 'verifier', algorithm: algorithm | 
|  | 
| 248 | 252 |  port: 8101, | 
| 249 | 253 |  ) | 
| 250 | 254 | 
 | 
| 251 |  | - around do |example| | 
| 252 |  | - server = WEBrick::HTTPServer.new(Port: 8100) | 
| 253 |  | - server.mount_proc '/' do |req, res| | 
| 254 |  | - res.status = 303 | 
| 255 |  | - res['locAtion'] = req.path | 
| 256 |  | - res.body = "See #{req.path} indefinitely" | 
| 257 |  | - end | 
| 258 |  | - Thread.new { server.start } | 
| 259 |  | - begin | 
| 260 |  | - example.run | 
| 261 |  | - ensure | 
| 262 |  | - server.shutdown | 
| 263 |  | - end | 
| 264 |  | - | 
| 265 |  | - ::Utils.wait_for_port_free(8100, 5) | 
|  | 255 | + with_ocsp_responder do |req, res| | 
|  | 256 | + res.status = 303 | 
|  | 257 | + res['locAtion'] = req.path | 
|  | 258 | + res.body = "See #{req.path} indefinitely" | 
| 266 | 259 |  end | 
| 267 | 260 | 
 | 
| 268 | 261 |  include_context 'verifier', algorithm: algorithm | 
|  | 
| 274 | 267 | 
 | 
| 275 | 268 |  include_context 'verifier', algorithm: 'rsa' | 
| 276 | 269 | 
 | 
| 277 |  | - context '40x / 50x' do | 
| 278 |  | - around do |example| | 
| 279 |  | - server = WEBrick::HTTPServer.new(Port: 8100) | 
| 280 |  | - server.mount_proc '/' do |req, res| | 
|  | 270 | + [400, 404, 500, 503].each do |code| | 
|  | 271 | + context "code #{code}" do | 
|  | 272 | + with_ocsp_responder do |req, res| | 
| 281 | 273 |  res.status = code | 
| 282 | 274 |  res.body = "HTTP #{code}" | 
| 283 | 275 |  end | 
| 284 |  | - Thread.new { server.start } | 
| 285 |  | - begin | 
| 286 |  | - example.run | 
| 287 |  | - ensure | 
| 288 |  | - server.shutdown | 
| 289 |  | - end | 
| 290 |  | - | 
| 291 |  | - ::Utils.wait_for_port_free(8100, 5) | 
| 292 |  | - end | 
| 293 |  | - | 
| 294 |  | - [400, 404, 500, 503].each do |_code| | 
| 295 |  | - context "code #{_code}" do | 
| 296 |  | - let(:code) { _code } | 
| 297 |  | - include_examples 'does not verify' | 
| 298 |  | - end | 
| 299 |  | - end | 
| 300 |  | - end | 
| 301 | 276 | 
 | 
| 302 |  | - context '204' do | 
| 303 |  | - around do |example| | 
| 304 |  | - server = WEBrick::HTTPServer.new(Port: 8100) | 
| 305 |  | - server.mount_proc '/' do |req, res| | 
| 306 |  | - res.status = 204 | 
| 307 |  | - end | 
| 308 |  | - Thread.new { server.start } | 
| 309 |  | - begin | 
| 310 |  | - example.run | 
| 311 |  | - ensure | 
| 312 |  | - server.shutdown | 
| 313 |  | - end | 
| 314 |  | - | 
| 315 |  | - ::Utils.wait_for_port_free(8100, 5) | 
| 316 |  | - end | 
| 317 |  | - | 
| 318 |  | - context "code 204" do | 
| 319 |  | - let(:code) { 204 } | 
| 320 | 277 |  include_examples 'does not verify' | 
| 321 | 278 |  end | 
| 322 | 279 |  end | 
| 323 |  | - end | 
| 324 |  | - | 
| 325 |  | - context 'responder URI has no path' do | 
| 326 |  | - require_external_connectivity | 
| 327 | 280 | 
 | 
| 328 |  | - # https://github.com/jruby/jruby-openssl/issues/210 | 
| 329 |  | - fails_on_jruby | 
| 330 |  | - | 
| 331 |  | - include_context 'basic verifier' | 
| 332 |  | - | 
| 333 |  | - # The fake certificates all have paths in them for use with the ocsp mock. | 
| 334 |  | - # Use real certificates retrieved from Atlas for this test as they don't | 
| 335 |  | - # have a path in the OCSP URI (which the test also asserts). | 
| 336 |  | - # Note that these certificates expire in 3 months and need to be replaced | 
| 337 |  | - # with a more permanent solution. | 
| 338 |  | - # Use the spec/support/certificates/retrieve-atlas-cert script to retrieve | 
| 339 |  | - # current certificates from Atlas. | 
| 340 |  | - let(:cert_path) { File.join(File.dirname(__FILE__), '../support/certificates/atlas-ocsp.crt') } | 
| 341 |  | - let(:ca_cert_path) { File.join(File.dirname(__FILE__), '../support/certificates/atlas-ocsp-ca.crt') } | 
| 342 |  | - let(:cert_store) do | 
| 343 |  | - OpenSSL::X509::Store.new.tap do |store| | 
| 344 |  | - store.set_default_paths | 
|  | 281 | + context 'code 204' do | 
|  | 282 | + with_ocsp_responder do |req, res| | 
|  | 283 | + res.status = 204 | 
| 345 | 284 |  end | 
| 346 |  | - end | 
| 347 | 285 | 
 | 
| 348 |  | - before do | 
| 349 |  | - skip "https://jira.mongodb.org/browse/RUBY-3684 (OCSP verifier needs non-Atlas certs)" | 
| 350 |  | - | 
| 351 |  | - verifier.ocsp_uris.length.should > 0 | 
| 352 |  | - URI.parse(verifier.ocsp_uris.first).path.should == '' | 
| 353 |  | - end | 
| 354 |  | - | 
| 355 |  | - it 'verifies' do | 
| 356 |  | - # TODO This test will fail if the certificate expires | 
| 357 |  | - expect(verifier.verify).to be(true), "If atlas-ocsp certificates have expired, run spec/support/certificates/retrieve-atlas-cert to get a new ones" | 
|  | 286 | + include_examples 'does not verify' | 
| 358 | 287 |  end | 
| 359 | 288 |  end | 
| 360 | 289 | end | 
0 commit comments