class Chef::Resource::RegistryKey

Constants

VALID_VALUE_HASH_KEYS

Public Instance Methods

unscrubbed_values() click to toggle source

Some registry key data types may not be safely reported as json. Example (CHEF-5323):

registry_key 'HKEY_CURRENT_USER\ChefTest2014' do

values [{
  :name => "ValueWithBadData",
  :type => :binary,
  :data => 255.chr * 1
}]
action :create

end

will raise Encoding::UndefinedConversionError: “xFF” from ASCII-8BIT to UTF-8.

To avoid sending data that cannot be nicely converted for json, we have the values method return “safe” data if the data type is “unsafe”. Known “unsafe” data types are :binary, :dword, :dword-big-endian, and :qword. If other criteria generate data that cannot reliably be sent as json, add that criteria to the needs_checksum? method. When unsafe data is detected, the values method returns an md5 checksum of the listed data.

:unscrubbed_values returns the values exactly as provided in the resource (i.e., data is not checksummed, regardless of the data type/“unsafe” criteria).

Future: If we have conflicts with other resources reporting json incompatible state, we may want to extend the state_attrs API with the ability to rename POST'd attrs.

See lib/chef/resource_reporter.rb for more information.

# File lib/chef/resource/registry_key.rb, line 184
def unscrubbed_values
  @unscrubbed_values ||= []
end

Private Instance Methods

needs_checksum?(value) click to toggle source

Some data types may raise errors when sent as json. Returns true if this value's data may need to be converted to a checksum.

# File lib/chef/resource/registry_key.rb, line 205
def needs_checksum?(value)
  unsafe_types = %i{binary dword dword_big_endian qword}
  unsafe_types.include?(value[:type])
end
scrub_values(values) click to toggle source
# File lib/chef/resource/registry_key.rb, line 190
def scrub_values(values)
  scrubbed = []
  values.each do |value|
    scrubbed_value = value.dup
    if needs_checksum?(scrubbed_value)
      data_io = StringIO.new(scrubbed_value[:data].to_s)
      scrubbed_value[:data] = Chef::Digester.instance.generate_checksum(data_io)
    end
    scrubbed << scrubbed_value
  end
  scrubbed
end