1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activesupport/lib/active_support/encrypted_configuration.rb
Martin Spickermann bd10796419 Bugfix: ActiveSupport::EncryptedConfiguration reading of comment-only encrypted files (#34014)
* 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
2018-10-05 08:06:33 +09:00

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