класс OpenSSL::Config
OpenSSL::Config
Настройка библиотеки openssl.
Установка библиотеки openssl на многих системах зависит от вашей конфигурации системы. Посмотрите значение OpenSSL::Config::DEFAULT_CONFIG_FILE для определения расположения файла на вашем хосте.
См. также www.openssl.org/docs/apps/config.html
Константы
- DEFAULT_CONFIG_FILE
-
Файл конфигурации системы по умолчанию для openssl
- ESCAPE_MAP
-
Таблица экранированных символов
- QUOTE_REGEXP_DQ
-
Экранирование обратным слешем и двойными кавычками
- QUOTE_REGEXP_SQ
-
Экранирование обратным слешем
Публичные методы класса
# File ext/openssl/lib/openssl/config.rb, line 264
def initialize(filename = nil)
@data = {}
if filename
File.open(filename.to_s) do |file|
Config.parse_config(file).each do |section, hash|
set_section(section, hash)
end
end
end
end Создает экземпляр класса конфигурации OpenSSL.
Это может использоваться в таких контекстах, как OpenSSL::X509::ExtensionFactory.config=
Если указан необязательный параметр filename, он считывается и разбирается с помощью parse_config.
Это может вызвать исключения IO в зависимости от доступа или доступности файла. Исключение ConfigError может быть вызвано в зависимости от действительности настраиваемых данных.
# File ext/openssl/lib/openssl/config.rb, line 37
def parse(string)
c = new()
parse_config(StringIO.new(string)).each do |section, hash|
c.set_section(section, hash)
end
c
end Разбирает заданную строку как блок, содержащий конфигурацию для OpenSSL.
Если источником IO является файл, то следует использовать parse_config.
# File ext/openssl/lib/openssl/config.rb, line 53
def parse_config(io)
begin
parse_config_lines(io)
rescue => error
raise ConfigError, "error in line #{io.lineno}: " + error.message
end
end Разбирает данные конфигурации, считанные из io, см. также parse.
Вызывает ConfigError при недопустимых данных конфигурации.
Приватные методы класса
# File ext/openssl/lib/openssl/config.rb, line 192
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 # File ext/openssl/lib/openssl/config.rb, line 177
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 # File ext/openssl/lib/openssl/config.rb, line 229
def get_definition(io_stack)
if line = get_line(io_stack)
while /[^\\]\\\z/ =~ line
if extra = get_line(io_stack)
line += extra
else
break
end
end
return line.strip
end
end # File ext/openssl/lib/openssl/config.rb, line 242
def get_line(io_stack)
while io = io_stack.last
if line = io.gets
return line.gsub(/[\r\n]*/, '')
end
io_stack.pop
end
end # File ext/openssl/lib/openssl/config.rb, line 76
def parse_config_lines(io)
section = 'default'
data = {section => {}}
io_stack = [io]
while definition = get_definition(io_stack)
definition = clear_comments(definition)
next if definition.empty?
case definition
when /\A\[/
if /\[([^\]]*)\]/ =~ definition
section = $1.strip
data[section] ||= {}
else
raise ConfigError, "missing close square bracket"
end
when /\A\.include (\s*=\s*)?(.+)\z/
path = $2
if File.directory?(path)
files = Dir.glob(File.join(path, "*.{cnf,conf}"), File::FNM_EXTGLOB)
else
files = [path]
end
files.each do |filename|
begin
io_stack << StringIO.new(File.read(filename))
rescue
raise ConfigError, "could not include file '%s'" % filename
end
end
when /\A([^:\s]*)(?:::([^:\s]*))?\s*=(.*)\z/
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
data
end # File ext/openssl/lib/openssl/config.rb, line 134
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 Публичные методы экземпляра
# File ext/openssl/lib/openssl/config.rb, line 360
def [](section)
@data[section] || {}
end Получить определенный раздел из текущей конфигурации
Учитывая следующий загружаемый конфигурационный файл:
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 399 def []=(section, pairs) check_modify set_section(section, pairs) end
Устарело в v2.2.0*. Этот метод будет удален в будущей версии.
Устанавливает определенное имя раздела с Hash парами.
Учитывая следующую создаваемую конфигурацию:
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
Важно отметить, что это по существу объединит любые ключи в парах с существующим разделом. Например:
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 339
def add_value(section, key, value)
check_modify
(@data[section] ||= {})[key] = value
end Устарело в v2.2.0*. Этот метод будет удален в будущей версии.
Set целевой ключ с заданным значением в определенном разделе.
Учитывая следующий загружаемый конфигурационный файл:
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 464
def each
@data.each do |section, hash|
hash.each do |key, value|
yield [section, key, value]
end
end
end Для блока.
Получение раздела и его пар для текущей конфигурации.
config.each do |section, key, value| # ... end
# File ext/openssl/lib/openssl/config.rb, line 292
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 Получает значение ключа из заданного раздела
Учитывая следующий загружаемый конфигурационный файл:
config = OpenSSL::Config.load('foo.cnf')
#=> #<OpenSSL::Config sections=["default"]>
puts config.to_s
#=> [ default ]
# foo=bar
Вы можете получить определенное значение из конфигурации, если знаете раздел и ключ, следующим образом:
config.get_value('default','foo')
#=> "bar"
# File ext/openssl/lib/openssl/config.rb, line 475
def inspect
"#<#{self.class.name} sections=#{sections.inspect}>"
end String представление этого объекта конфигурации, включая имя класса и его разделы.
# File ext/openssl/lib/openssl/config.rb, line 413 def sections @data.keys end
Получить имена всех разделов в текущей конфигурации
# File ext/openssl/lib/openssl/config.rb, line 443
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 Получить разбираемую форму текущей конфигурации
Учитывая следующую создаваемую конфигурацию:
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 491
def check_modify
warn "#{caller(2, 1)[0]}: warning: do not modify OpenSSL::Config; this " \
"method is deprecated and will be removed in a future release."
raise TypeError.new("Insecure: can't modify OpenSSL config") if frozen?
end # File ext/openssl/lib/openssl/config.rb, line 497 def get_key_string(section, key) Config.get_key_string(@data, section, key) end
# File ext/openssl/lib/openssl/config.rb, line 487 def initialize_copy(other) @data = other.data.dup end
Ruby Core © 1993–2020 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.