mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
bd10796419
* Fix reading comment only encrypted files When a encrypted file contains only comments then reading that files raises an error: NoMethodError: undefined method `deep_symbolize_keys' for false:FalseClass activesupport/lib/active_support/encrypted_configuration.rb:33:in `config' test/encrypted_configuration_test.rb:52:in `block in <class:EncryptedConfigurationTest>' This happens because the previous implementation returned a `{}` fallback for blank YAML strings. But it did not handle YAML strings that are present but still do not contain any _usefull_ YAML - like the file created by `Rails::Generators::EncryptedFileGenerator` which looks like this: # aws: # access_key_id: 123 # secret_access_key: 345 * Fix coding style violation * Add backwardscompatible with Psych versions that were shipped with Ruby <2.5 * Do not rely on railties for Active Support test * Simplify error handling * Improve test naming * Simplify file creation in test
45 lines
1.1 KiB
Ruby
45 lines
1.1 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 options
|
|
@options ||= ActiveSupport::InheritableOptions.new(config)
|
|
end
|
|
|
|
def deserialize(config)
|
|
YAML.load(config).presence || {}
|
|
end
|
|
end
|
|
end
|