Ruby 2.4
OpenSSL

OpenSSL::Config

类 OpenSSL :: Config

父类:ObjectIncluded 模块:Enumerable

OpenSSL::Config

openssl 库的配置。

许多系统安装 openssl 库将取决于您的系统配置。请参阅 OpenSSL :: Config :: DEFAULT_CONFIG_FILE 的值来了解主机文件的位置。

常量

DEFAULT_CONFIG_FILE

openssl 的默认系统配置文件

ESCAPE_MAP

逃逸的 char 映射

QUOTE_REGEXP_DQ

用反斜杠转义并将 dq 翻倍

QUOTE_REGEXP_SQ

用反斜杠转义

公共类方法

new(filename = nil) 显示源

创建一个 OpenSSL 配置类的实例。

这可以用在像 OpenSSL :: X509 :: ExtensionFactory.config =的上下文中

如果提供了可选filename参数,那么它将通过 parse_config 读入并解析。

这可能会根据访问或文件的可用性提高 IO 异常。根据所配置的数据的有效性,可能会产生 ConfigError 异常。

# 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

parse(string) 显示源

将给定解析string为包含 openssl 配置的 blob。

如果 IO 的源是一个文件,那么考虑使用 parse_config。

# File ext/openssl/lib/openssl/config.rb, line 35 def parse(string) c = new() parse_config(StringIO.new(string)).each do |section, hash| c[section] = hash end c end

parse_config(io) 显示源

解析读取的配置数据io,另请参阅解析。

引发无效配置数据的 ConfigError。

# File ext/openssl/lib/openssl/config.rb, line 51 def parse_config(io) begin parse_config_lines(io) rescue ConfigError => e e.message.replace("error in line #{io.lineno}: " + e.message) raise end end

私有类方法

clear_comments(line) 显示源

# 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) 显示源

# 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) 显示源

# File ext/openssl/lib/openssl/config.rb, line 213 def get_definition(io) if line = get_line(io) while /[^\]\\z/ =~ line if extra = get_line(io) line += extra else break end end return line.strip end end

get_line(io) 显示源

# File ext/openssl/lib/openssl/config.rb, line 226 def get_line(io) if line = io.gets line.gsub(/[\r\n]*/, '') end end

parse_config_lines(io)显示源文件

# 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) 显示源

# 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

公共实例方法

显示源

从当前配置获取特定section信息

鉴于正在加载以下配置文件:

config = OpenSSL::Config.load('foo.cnf') #=> #<OpenSSL::Config sections=["default"]> puts config.to_s #=> [ default ] # foo=bar

你可以像这样获得特定部分的哈希值:

config['default'] #=> {"foo"=>"bar"}

# File ext/openssl/lib/openssl/config.rb, line 339 def [](section) @data[section] || {} end

[]=(section, pairs) 显示源

用哈希pairs设置一个特定的section名字

鉴于正在创建以下配置:

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=buz

重要的是要注意,这将实质上将任何密钥pairs与现有密钥合并section。例如:

config['default'] #=> {"foo"=>"bar", "baz"=>"buz"} config['default'] = {"foo" => "changed"} #=> {"foo"=>"changed"} config['default'] #=> {"foo"=>"changed", "baz"=>"buz"}

# File ext/openssl/lib/openssl/config.rb, line 376 def []=(section, pairs) check_modify @data[section] ||= {} pairs.each do |key, value| self.add_value(section, key, value) end end

add_value(section, key, value) 显示源

根据具体section情况设置key给定的value目标。

鉴于正在加载以下配置文件:

config = OpenSSL::Config.load('foo.cnf') #=> #<OpenSSL::Config sections=["default"]> puts config.to_s #=> [ default ] # foo=bar

您可以foo将该default部分下的值设置为新值:

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

each() { |section, key, value| ... } 显示源

For a block.

接收当前配置的部分及其配对。

config.each do |section, key, value| # ... end

# File ext/openssl/lib/openssl/config.rb, line 437 def each @data.each do |section, hash| hash.each do |key, value| yield [section, key, value] end end end

get_value(节,键)显示源

获取key给定的值section

鉴于正在加载以下配置文件:

config = OpenSSL::Config.load('foo.cnf') #=> #<OpenSSL::Config sections=["default"]> puts config.to_s #=> [ default ] # foo=bar

你可以从配置中获得一个特定的值,如果你知道sectionkey像这样:

config.get_value('default','foo') #=> "bar"

# File ext/openssl/lib/openssl/config.rb, line 273 def get_value(section, key) if section.nil? raise TypeError.new('nil not allowed') end section = 'default' if section.empty? get_key_string(section, key) end

inspect() 显示源

此配置对象的字符串表示形式,包括类名称及其部分。

# File ext/openssl/lib/openssl/config.rb, line 448 def inspect "#<#{self.class.name} sections=#{sections.inspect}>" end

sections() 显示源

获取当前配置中所有部分的名称

# File ext/openssl/lib/openssl/config.rb, line 386 def sections @data.keys end

to_s() 显示源

获取当前配置的可分析形式

鉴于正在创建以下配置:

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=buz

您可以使用 to_s 解析获取序列化配置,然后再解析它:

serialized_config = config.to_s # much later... new_config = OpenSSL::Config.parse(serialized_config) #=> #<OpenSSL::Config sections=["default"]> puts new_config #=> [ default ] foo=bar baz=buz

# File ext/openssl/lib/openssl/config.rb, line 416 def to_s ary = [] @data.keys.sort.each do |section| ary << "[ #{section} ]\n" @data[section].keys.each do |key| ary << "#{key}=#{@data[section][key]}\n" end ary << "\n" end ary.join end

私有实例方法

check_modify() 显示源

# File ext/openssl/lib/openssl/config.rb, line 464 def check_modify raise TypeError.new("Insecure: can't modify OpenSSL config") if frozen? end

get_key_string(section, key) 显示源

# File ext/openssl/lib/openssl/config.rb, line 468 def get_key_string(section, key) Config.get_key_string(@data, section, key) end

initialize_copy(other) 显示源

# File ext/openssl/lib/openssl/config.rb, line 460 def initialize_copy(other) @data = other.data.dup end