From 95b3e01cdce2b38af8c721f23dab4858b766ce3e Mon Sep 17 00:00:00 2001 From: Cadu Ribeiro Date: Mon, 19 Jun 2023 15:09:05 -0300 Subject: [PATCH] Save encrypted attributes before initialize and install filtered params after --- .../active_record/encryption/configurable.rb | 19 ++++++++++++++----- activerecord/lib/active_record/railtie.rb | 4 +++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/activerecord/lib/active_record/encryption/configurable.rb b/activerecord/lib/active_record/encryption/configurable.rb index dec4f0fdb3490..7c81e6e681f63 100644 --- a/activerecord/lib/active_record/encryption/configurable.rb +++ b/activerecord/lib/active_record/encryption/configurable.rb @@ -9,6 +9,7 @@ module Configurable included do mattr_reader :config, default: Config.new mattr_accessor :encrypted_attribute_declaration_listeners + mattr_reader :encrypted_attributes, default: Concurrent::Map.new end class_methods do @@ -48,12 +49,20 @@ def encrypted_attribute_was_declared(klass, name) # :nodoc: end end - def install_auto_filtered_parameters_hook(app) # :nodoc: + def install_encrypted_attributed_declared_hook() ActiveRecord::Encryption.on_encrypted_attribute_declared do |klass, encrypted_attribute_name| - filter = [("#{klass.model_name.element}" if klass.name), encrypted_attribute_name.to_s].compact.join(".") - unless excluded_from_filter_parameters?(filter) - app.config.filter_parameters << filter unless app.config.filter_parameters.include?(filter) - klass.filter_attributes += [encrypted_attribute_name] + encrypted_attributes.fetch_or_store(klass, []) << encrypted_attribute_name + end + end + + def install_auto_filtered_parameters(app) # :nodoc: + encrypted_attributes.each do |klass, attributes| + attributes.each do |encrypted_attribute_name| + filter = [("#{klass.model_name.element}" if klass.name), encrypted_attribute_name.to_s].compact.join(".") + unless excluded_from_filter_parameters?(filter) + app.config.filter_parameters << filter unless app.config.filter_parameters.include?(filter) + klass.filter_attributes += [encrypted_attribute_name] + end end end end diff --git a/activerecord/lib/active_record/railtie.rb b/activerecord/lib/active_record/railtie.rb index df75c51be9d56..d37789783d4ea 100644 --- a/activerecord/lib/active_record/railtie.rb +++ b/activerecord/lib/active_record/railtie.rb @@ -357,6 +357,8 @@ class Railtie < Rails::Railtie # :nodoc: end initializer "active_record_encryption.configuration" do |app| + ActiveRecord::Encryption.install_encrypted_attributed_declared_hook + config.after_initialize do |app| ActiveRecord::Encryption.configure \ primary_key: app.credentials.dig(:active_record_encryption, :primary_key), @@ -382,7 +384,7 @@ class Railtie < Rails::Railtie # :nodoc: # Filtered params if ActiveRecord::Encryption.config.add_to_filter_parameters - ActiveRecord::Encryption.install_auto_filtered_parameters_hook(app) + ActiveRecord::Encryption.install_auto_filtered_parameters(app) end end end