diff --git a/lib/openssl/config.rb b/lib/openssl/config.rb index 9a0b7874..5e4c51f7 100644 --- a/lib/openssl/config.rb +++ b/lib/openssl/config.rb @@ -52,7 +52,11 @@ def parse(string) # Raises a ConfigError on invalid configuration data. def parse_config(io) begin - parse_config_lines(io) + if io.instance_of?(String) + parse(io) + else + parse_config_lines(io) + end rescue => error raise ConfigError, "error in line #{io.lineno}: " + error.message end @@ -414,6 +418,8 @@ def sections @data.keys end + alias keys sections + ## # Get the parsable form of the current configuration # diff --git a/src/test/ruby/test_config.rb b/src/test/ruby/test_config.rb new file mode 100644 index 00000000..94868ed8 --- /dev/null +++ b/src/test/ruby/test_config.rb @@ -0,0 +1,50 @@ +# coding: US-ASCII +require File.expand_path('test_helper', File.dirname(__FILE__)) +require "tempfile" + +class TestSSL < TestCase + def setup + super + file = Tempfile.open("openssl.cnf") + file << <<__EOD__ +HOME = . +[ ca ] +default_ca = CA_default +[ CA_default ] +dir = ./demoCA +certs = ./certs +__EOD__ + file.close + @tmpfile = file + @it = OpenSSL::Config.new(file.path) + end + + def test_s_parse + c = OpenSSL::Config.parse('') + assert_equal("[ default ]\n\n", c.to_s) + c = OpenSSL::Config.parse(@it.to_s) + assert_equal(['CA_default', 'ca', 'default'], c.sections.sort) + end + + def test_s_parse_config + ret = OpenSSL::Config.parse_config(@it.to_s) + + assert_equal(@it.sections.sort, ret.keys.sort) + assert_equal(@it["default"], ret["default"]) + end + + def test_sections + assert_equal(['CA_default', 'ca', 'default'], @it.sections.sort) + Tempfile.create("openssl.cnf") { |f| + f.write File.read(@tmpfile.path) + f.puts "[ new_section ]" + f.puts "foo = bar" + f.puts "[ empty_section ]" + f.close + + c = OpenSSL::Config.new(f.path) + assert_equal(['CA_default', 'ca', 'default', 'empty_section', 'new_section'], + c.sections.sort) + } + end +end \ No newline at end of file