t: ensure SSL certificates exist on fresh test
[unicorn.git] / lib / unicorn / ssl_configurator.rb
blobc92c85e5270e49022b934c4451b00436022a9beb
1 # -*- encoding: binary -*-
2 # :stopdoc:
3 # This module is included in Unicorn::Configurator
4 # :startdoc:
6 module Unicorn::SSLConfigurator
7   def ssl(&block)
8     ssl_require!
9     before = @set[:listeners].dup
10     opts = @set[:ssl_opts] = {}
11     yield
12     (@set[:listeners] - before).each do |address|
13       (@set[:listener_opts][address] ||= {})[:ssl_opts] = opts
14     end
15     ensure
16       @set.delete(:ssl_opts)
17   end
19   def ssl_certificate(file)
20     ssl_set(:ssl_certificate, file)
21   end
23   def ssl_certificate_key(file)
24     ssl_set(:ssl_certificate_key, file)
25   end
27   def ssl_client_certificate(file)
28     ssl_set(:ssl_client_certificate, file)
29   end
31   def ssl_dhparam(file)
32     ssl_set(:ssl_dhparam, file)
33   end
35   def ssl_ciphers(openssl_cipherlist_spec)
36     ssl_set(:ssl_ciphers, openssl_cipherlist_spec)
37   end
39   def ssl_crl(file)
40     ssl_set(:ssl_crl, file)
41   end
43   def ssl_prefer_server_ciphers(bool)
44     ssl_set(:ssl_prefer_server_ciphers, check_bool(bool))
45   end
47   def ssl_protocols(list)
48     ssl_set(:ssl_protocols, list)
49   end
51   def ssl_verify_client(on_off_optional)
52     ssl_set(:ssl_verify_client, on_off_optional)
53   end
55   def ssl_session_timeout(seconds)
56     ssl_set(:ssl_session_timeout, seconds)
57   end
59   def ssl_verify_depth(depth)
60     ssl_set(:ssl_verify_depth, depth)
61   end
63   # Allows specifying an engine for OpenSSL to use.  We have not been
64   # able to successfully test this feature due to a lack of hardware,
65   # Reports of success or patches to mongrel-unicorn@rubyforge.org is
66   # greatly appreciated.
67   def ssl_engine(engine)
68     ssl_warn_global(:ssl_engine)
69     ssl_require!
70     OpenSSL::Engine.load
71     OpenSSL::Engine.by_id(engine)
72     @set[:ssl_engine] = engine
73   end
75   def ssl_compression(bool)
76     # OpenSSL uses the SSL_OP_NO_COMPRESSION flag, Flipper follows suit
77     # with :ssl_no_compression, but we negate it to avoid exposing double
78     # negatives to the user.
79     ssl_set(:ssl_no_compression, check_bool(:ssl_compression, ! bool))
80   end
82 private
84   def ssl_warn_global(func) # :nodoc:
85     Hash === @set[:ssl_opts] or return
86     warn("`#{func}' affects all SSL contexts in this process, " \
87          "not just this block")
88   end
90   def ssl_set(key, value) # :nodoc:
91     cur = @set[:ssl_opts]
92     Hash === cur or
93              raise ArgumentError, "#{key} must be called inside an `ssl' block"
94     cur[key] = value
95   end
97   def ssl_require! # :nodoc:
98     require "flipper"
99     require "unicorn/ssl_client"
100     rescue LoadError
101       warn "install 'kgio-monkey' for SSL support"
102       raise
103   end