module Sequel::Plugins::AttrEncrypted::ClassMethods

Public Instance Methods

attr_encrypted(*attrs, key:) click to toggle source

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.first_name # => “Ivan” order.last_name # => “Smith” order.secret_data # => { “some_key” => “Some Value” }

# File lib/sequel/plugins/attr_encrypted.rb, line 38
def attr_encrypted(*attrs, key:)
  include_encrypted_module!
  attrs.each do |attr|
    define_encrypted_setter(attr, key)
    define_encrypted_getter(attr, key)
    @_encrypted_attributes << attr
  end
end

Private Instance Methods

define_encrypted_getter(attr, key) click to toggle source
# File lib/sequel/plugins/attr_encrypted.rb, line 59
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 = decrypted.nil? ? decrypted : JSON.parse(decrypted)
        instance_variable_set("@#{attr}", result)
      end
    end
  end
end
define_encrypted_setter(attr, key) click to toggle source
# File lib/sequel/plugins/attr_encrypted.rb, line 49
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(value.to_json, key))
    end
  end
end
include_encrypted_module!() click to toggle source
# File lib/sequel/plugins/attr_encrypted.rb, line 72
def include_encrypted_module!
  return if defined?(@_attr_encrypted_module)

  @_encrypted_attributes ||= []
  @_attr_encrypted_module = Module.new
  prepend @_attr_encrypted_module
end