Class: OpenSSL::Config
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
| Instance Chain: 
          self,
          Enumerable
         | |
| Inherits: | Object | 
| Defined in: | ext/openssl/lib/openssl/config.rb, ext/openssl/ossl_config.c | 
Overview
Configuration for the openssl library.
Many system's installation of openssl library will depend on your system configuration. See the value of DEFAULT_CONFIG_FILE for the location of the file for your host.
Constant Summary
- 
    DEFAULT_CONFIG_FILE =
    # File 'ext/openssl/ossl_config.c', line 79The default system configuration file for openssl rb_str_new2(default_config_file) 
- 
    ESCAPE_MAP =
    # File 'ext/openssl/lib/openssl/config.rb', line 111escaped char map { "r" => "\r", "n" => "\n", "b" => "\b", "t" => "\t", }
- 
    QUOTE_REGEXP_DQ =
    # File 'ext/openssl/lib/openssl/config.rb', line 109escape with backslash and doubled dq /\A([^"\\]*(?:""[^"\\]*|\\.[^"\\]*)*)"/
- 
    QUOTE_REGEXP_SQ =
    # File 'ext/openssl/lib/openssl/config.rb', line 107escape with backslash /\A([^'\\]*(?:\\.[^'\\]*)*)'/
Class Method Summary
- 
    
      .load  
    
    load is an alias to .new 
- 
    
      .new(filename = nil)  ⇒ Config 
    
    constructor
    Creates an instance of OpenSSL's configuration class. 
- 
    
      .parse(string)  
    
    Parses a given stringas a blob that contains configuration for openssl.
- 
    
      .parse_config(io)  
    
    Parses the configuration data read from io, see also#parse.
- .clear_comments(line) private
- .extract_reference(value) private
- .get_definition(io) private
- .get_line(io) private
- .parse_config_lines(io) private
- .unescape_value(data, section, value) private
Instance Method Summary
- 
    
      #[](section)  
    
    Get a specific #section from the current configuration. 
- 
    
      #[]=(section, pairs)  
    
    Sets a specific #section name with a Hash pairs
- #add_value(section, key, value)
- 
    
      #each  
    
    For a block. 
- 
    
      #get_value(section, key)  
    
    Gets the value of keyfrom the given #section
- 
    
      #inspect  
    
    String representation of this configuration object, including the class name and its sections. 
- 
    
      #sections  
    
    Get the names of all sections in the current configuration. 
- 
    
      #to_s  
    
    Get the parsable form of the current configuration. 
- #check_modify private
- #get_key_string(section, key) private
- #initialize_copy(other) private
Constructor Details
    .new(filename = nil)  ⇒ Config 
  
Creates an instance of OpenSSL's configuration class.
This can be used in contexts like OpenSSL::X509::ExtensionFactory.config=
If the optional filename parameter is provided, then it is read in and parsed via #parse_config.
This can raise IO exceptions based on the access, or availability of the file. A ConfigError exception may be raised depending on the validity of the data being configured.
# File 'ext/openssl/lib/openssl/config.rb', line 245
def initialize(filename = nil) @data = {} if filename File.open(filename.to_s) do |file| Config.parse_config(file).each do |section, hash| self[section] = hash end end end end
Class Method Details
.clear_comments(line) (private)
[ GitHub ]# File 'ext/openssl/lib/openssl/config.rb', line 176
def clear_comments(line) # FCOMMENT if m = line.match(/\A([\t\n\f ]*);.*\z/) return m[1] end # COMMENT scanned = [] while m = line.match(/[#'"\\]/) scanned << m.pre_match c = m[0] line = m.post_match case c when '#' line = nil break when "'", '"' regexp = (c == "'") ? QUOTE_REGEXP_SQ : QUOTE_REGEXP_DQ scanned << c if m = line.match(regexp) scanned << m[0] line = m.post_match else scanned << line line = nil break end when "\\" scanned << c scanned << line.slice!(0, 1) else raise 'must not reaced' end end scanned << line scanned.join end
.extract_reference(value) (private)
[ GitHub ]# File 'ext/openssl/lib/openssl/config.rb', line 161
def extract_reference(value) rest = '' if m = value.match(/\(([^)]*)\)|\{([^}]*)\}/) value = m[1] || m[2] rest = m.post_match elsif [?(, ?{].include?(value[0]) raise ConfigError, "no close brace" end if m = value.match(/[a-zA-Z0-9_]*(?:::[a-zA-Z0-9_]*)?/) return m[0], m.post_match + rest else raise end end
.get_definition(io) (private)
[ GitHub ].get_line(io) (private)
[ GitHub ]# File 'ext/openssl/lib/openssl/config.rb', line 226
def get_line(io) if line = io.gets line.gsub(/[\r\n]*/, '') end end
.load
load is an alias to .new
# File 'ext/openssl/lib/openssl/config.rb', line 45
alias load new
.parse(string)
Parses a given string as a blob that contains configuration for openssl.
If the source of the IO is a file, then consider using #parse_config.
.parse_config(io)
Parses the configuration data read from io, see also #parse.
Raises a ConfigError on invalid configuration data.
# File 'ext/openssl/lib/openssl/config.rb', line 51
def parse_config(io) begin parse_config_lines(io) rescue ConfigError => e e..replace("error in line #{io.lineno}: " + e.) raise end end
.parse_config_lines(io) (private)
[ GitHub ]# File 'ext/openssl/lib/openssl/config.rb', line 75
def parse_config_lines(io) section = 'default' data = {section => {}} while definition = get_definition(io) definition = clear_comments(definition) next if definition.empty? if definition[0] == ?[ if /\[([^\]]*)\]/ =~ definition section = $1.strip data[section] ||= {} else raise ConfigError, "missing close square bracket" end else if /\A([^:\s]*)(?:::([^:\s]*))?\s*=(.*)\z/ =~ definition if $2 section = $1 key = $2 else key = $1 end value = unescape_value(data, section, $3) (data[section] ||= {})[key] = value.strip else raise ConfigError, "missing equal sign" end end end data end
.unescape_value(data, section, value) (private)
[ GitHub ]# File 'ext/openssl/lib/openssl/config.rb', line 118
def unescape_value(data, section, value) scanned = [] while m = value.match(/['"\\$]/) scanned << m.pre_match c = m[0] value = m.post_match case c when "'" if m = value.match(QUOTE_REGEXP_SQ) scanned << m[1].gsub(/\\(.)/, '\\1') value = m.post_match else break end when '"' if m = value.match(QUOTE_REGEXP_DQ) scanned << m[1].gsub(/""/, '').gsub(/\\(.)/, '\\1') value = m.post_match else break end when "\\" c = value.slice!(0, 1) scanned << (ESCAPE_MAP[c] || c) when "$" ref, value = extract_reference(value) refsec = section if ref.index('::') refsec, ref = ref.split('::', 2) end if v = get_key_string(data, refsec, ref) scanned << v else raise ConfigError, "variable has no value" end else raise 'must not reaced' end end scanned << value scanned.join end
Instance Method Details
#[](section)
Get a specific #section from the current configuration
Given the following configurating file being loaded:
config = OpenSSL::Config.load('foo.cnf')
  #=> #<OpenSSL::Config sections=["default"]>
puts config.to_s
  #=> [ default ]
  #   foo=barYou can get a hash of the specific section like so:
config['default']
  #=> {"foo"=>"bar"}#[]=(section, pairs)
Sets a specific #section name with a Hash pairs
Given the following configuration being created:
config = OpenSSL::Config.new
  #=> #<OpenSSL::Config sections=[]>
config['default'] = {"foo"=>"bar","baz"=>"buz"}
  #=> {"foo"=>"bar", "baz"=>"buz"}
puts config.to_s
  #=> [ default ]
  #   foo=bar
  #   baz=buzIt's important to note that this will essentially merge any of the keys in pairs with the existing #section. For example:
config['default']
  #=> {"foo"=>"bar", "baz"=>"buz"}
config['default'] = {"foo" => "changed"}
  #=> {"foo"=>"changed"}
config['default']
  #=> {"foo"=>"changed", "baz"=>"buz"}#add_value(section, key, value)
Set the target key with a given #value under a specific #section.
Given the following configurating file being loaded:
config = OpenSSL::Config.load('foo.cnf')
  #=> #<OpenSSL::Config sections=["default"]>
puts config.to_s
  #=> [ default ]
  #   foo=barYou can set the value of foo under the default section to a new value:
config.add_value('default', 'foo', 'buzz')
  #=> "buzz"
puts config.to_s
  #=> [ default ]
  #   foo=buzz# File 'ext/openssl/lib/openssl/config.rb', line 318
def add_value(section, key, value) check_modify (@data[section] ||= {})[key] = value end
#check_modify (private)
# File 'ext/openssl/lib/openssl/config.rb', line 464
def check_modify raise TypeError.new("Insecure: can't modify OpenSSL config") if frozen? end
#each
#get_key_string(section, key) (private)
[ GitHub ]# File 'ext/openssl/lib/openssl/config.rb', line 468
def get_key_string(section, key) Config.get_key_string(@data, section, key) end
#get_value(section, key)
Gets the value of key from the given #section
Given the following configurating file being loaded:
config = OpenSSL::Config.load('foo.cnf')
  #=> #<OpenSSL::Config sections=["default"]>
puts config.to_s
  #=> [ default ]
  #   foo=barYou can get a specific value from the config if you know the #section and key like so:
config.get_value('default','foo')
  #=> "bar"#initialize_copy(other) (private)
[ GitHub ]# File 'ext/openssl/lib/openssl/config.rb', line 460
def initialize_copy(other) @data = other.data.dup end
#inspect
String representation of this configuration object, including the class name and its sections.
# File 'ext/openssl/lib/openssl/config.rb', line 448
def inspect "#<#{self.class.name} sections=#{sections.inspect}>" end
#sections
Get the names of all sections in the current configuration
# File 'ext/openssl/lib/openssl/config.rb', line 386
def sections @data.keys end
#to_s
Get the parsable form of the current configuration
Given the following configuration being created:
config = OpenSSL::Config.new
  #=> #<OpenSSL::Config sections=[]>
config['default'] = {"foo"=>"bar","baz"=>"buz"}
  #=> {"foo"=>"bar", "baz"=>"buz"}
puts config.to_s
  #=> [ default ]
  #   foo=bar
  #   baz=buzYou can parse get the serialized configuration using #to_s and then parse it later:
serialized_config = config.to_s
# much later...
new_config = OpenSSL::Config.parse(serialized_config)
  #=> #<OpenSSL::Config sections=["default"]>
puts new_config
  #=> [ default ]
      foo=
      baz=buz