blob: db1957d336277316bd18b5e5769b652e6bd03a4e [file] [log] [blame]
require "safe_yaml/load"
module YAML
def self.load_with_options(yaml, *original_arguments)
filename, options = filename_and_options_from_arguments(original_arguments)
safe_mode = safe_mode_from_options("load", options)
arguments = [yaml]
if safe_mode == :safe
arguments << filename if SafeYAML::YAML_ENGINE == "psych"
arguments << options_for_safe_load(options)
safe_load(*arguments)
else
arguments << filename if SafeYAML::MULTI_ARGUMENT_YAML_LOAD
unsafe_load(*arguments)
end
end
def self.load_file_with_options(file, options={})
safe_mode = safe_mode_from_options("load_file", options)
if safe_mode == :safe
safe_load_file(file, options_for_safe_load(options))
else
unsafe_load_file(file)
end
end
def self.safe_load(*args)
SafeYAML.load(*args)
end
def self.safe_load_file(*args)
SafeYAML.load_file(*args)
end
if SafeYAML::MULTI_ARGUMENT_YAML_LOAD
def self.unsafe_load_file(filename)
# https://github.com/tenderlove/psych/blob/v1.3.2/lib/psych.rb#L296-298
File.open(filename, 'r:bom|utf-8') { |f| self.unsafe_load(f, filename) }
end
else
def self.unsafe_load_file(filename)
# https://github.com/tenderlove/psych/blob/v1.2.2/lib/psych.rb#L231-233
self.unsafe_load File.open(filename)
end
end
class << self
alias_method :unsafe_load, :load
alias_method :load, :load_with_options
alias_method :load_file, :load_file_with_options
private
def filename_and_options_from_arguments(arguments)
if arguments.count == 1
if arguments.first.is_a?(String)
return arguments.first, {}
else
return nil, arguments.first || {}
end
else
return arguments.first, arguments.last || {}
end
end
def safe_mode_from_options(method, options={})
if options[:safe].nil?
safe_mode = SafeYAML::OPTIONS[:default_mode] || :safe
if SafeYAML::OPTIONS[:default_mode].nil? && !SafeYAML::OPTIONS[:suppress_warnings]
Kernel.warn <<-EOWARNING.gsub(/^\s+/, '')
Called '#{method}' without the :safe option -- defaulting to #{safe_mode} mode.
You can avoid this warning in the future by setting the SafeYAML::OPTIONS[:default_mode] option (to :safe or :unsafe).
EOWARNING
SafeYAML::OPTIONS[:suppress_warnings] = true
end
return safe_mode
end
options[:safe] ? :safe : :unsafe
end
def options_for_safe_load(base_options)
options = base_options.dup
options.delete(:safe)
options
end
end
end