mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
c87e16bf0e
Fixes https://github.com/rails/rails/issues/42351 https://github.com/rails/rails/pull/42106 broke if you wanted to treat a set of nested credentials as a hash. This PR fixes it.
55 lines
1.3 KiB
Ruby
55 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "yaml"
|
|
require "active_support/encrypted_file"
|
|
require "active_support/ordered_options"
|
|
require "active_support/core_ext/object/inclusion"
|
|
require "active_support/core_ext/module/delegation"
|
|
|
|
module ActiveSupport
|
|
class EncryptedConfiguration < EncryptedFile
|
|
delegate :[], :fetch, to: :config
|
|
delegate_missing_to :options
|
|
|
|
def initialize(config_path:, key_path:, env_key:, raise_if_missing_key:)
|
|
super content_path: config_path, key_path: key_path,
|
|
env_key: env_key, raise_if_missing_key: raise_if_missing_key
|
|
end
|
|
|
|
# Allow a config to be started without a file present
|
|
def read
|
|
super
|
|
rescue ActiveSupport::EncryptedFile::MissingContentError
|
|
""
|
|
end
|
|
|
|
def write(contents)
|
|
deserialize(contents)
|
|
|
|
super
|
|
end
|
|
|
|
def config
|
|
@config ||= deserialize(read).deep_symbolize_keys
|
|
end
|
|
|
|
private
|
|
def deep_transform(hash)
|
|
return hash unless hash.is_a?(Hash)
|
|
|
|
h = ActiveSupport::InheritableOptions.new
|
|
hash.each do |k, v|
|
|
h[k] = deep_transform(v)
|
|
end
|
|
h
|
|
end
|
|
|
|
def options
|
|
@options ||= ActiveSupport::InheritableOptions.new(deep_transform(config))
|
|
end
|
|
|
|
def deserialize(config)
|
|
YAML.load(config).presence || {}
|
|
end
|
|
end
|
|
end
|