lib/sequel/plugins/attr_encrypted.rb in umbrellio-sequel-plugins-0.4.0.134 vs lib/sequel/plugins/attr_encrypted.rb in umbrellio-sequel-plugins-0.4.0.145

- old
+ new

@@ -1,17 +1,17 @@ # frozen_string_literal: true # Creates encrypted attribute storing module Sequel::Plugins::AttrEncrypted SEPARATOR = "$" + require "sequel/plugins/attr_encrypted/simple_crypt" module ClassMethods # Setup attr encrypted # # @param attrs [Array<Symbol>] column names # @param key [String] 32 bytes key - # @param json [Boolean] store attribute as json or not # @example # Sequel.migration do # change do # alter_table :orders do # add_column :encrypted_first_name, :text @@ -21,58 +21,71 @@ # end # end # # class Order < Sequel::Model # attr_encrypted :first_name, :last_name, key: Settings.private_key - # attr_encrypted :secret_data, key: Settings.another_private_key, json: true + # attr_encrypted :secret_data, key: Settings.another_private_key # end # Order.create(first_name: "Ivan") # # => INSERT INTO "orders" ("encrypted_first_name") # VALUES ('/sTi9Q==$OTpuMRq5k8R3JayQ$WjSManQGP9UaZ3C40yDjKg==') # # order = Order.create(first_name: "Ivan", last_name: "Smith", # secret_data: { "some_key" => "Some Value" }) # order.reload # order.first_name # => "Ivan" + # order.last_name # => "Smith" # order.secret_data # => { "some_key" => "Some Value" } - def attr_encrypted(*attrs, key:, json: false) + def attr_encrypted(*attrs, key:) include_encrypted_module! attrs.each do |attr| - define_encrypted_setter(attr, key, json) - define_encrypted_getter(attr, key, json) + define_encrypted_setter(attr, key) + define_encrypted_getter(attr, key) + @_encrypted_attributes << attr end end private - def define_encrypted_setter(attr, key, json) + def define_encrypted_setter(attr, key) @_attr_encrypted_module.module_eval do define_method("#{attr}=") do |value| instance_variable_set("@#{attr}", value) - send("encrypted_#{attr}=", SimpleCrypt.encrypt(json ? value.to_json : value, key)) + send("encrypted_#{attr}=", SimpleCrypt.encrypt(value.to_json, key)) end end end - def define_encrypted_getter(attr, key, json) + def define_encrypted_getter(attr, key) @_attr_encrypted_module.module_eval do define_method(attr.to_s) do instance_variable_get("@#{attr}") || begin decrypted = SimpleCrypt.decrypt(send("encrypted_#{attr}"), key) - result = json && !decrypted.nil? ? JSON.parse(decrypted) : decrypted + result = !decrypted.nil? ? JSON.parse(decrypted) : decrypted instance_variable_set("@#{attr}", result) end end end end def include_encrypted_module! return if defined?(@_attr_encrypted_module) + @_encrypted_attributes ||= [] @_attr_encrypted_module = Module.new prepend @_attr_encrypted_module + end + end + + module InstanceMethods + def reload + self.class.instance_variable_get(:@_encrypted_attributes)&.each do |attr| + instance_variable_set("@#{attr}", nil) + end + + super end end end