Class: ActiveEncryption::Encryptable::InstanceMethodsOnActivation

Inherits:
Module
  • Object
show all
Defined in:
lib/active_encryption/encryptable/instance_methods_on_activation.rb

Overview

InstanceMethodsOnActivation adds instance methods for the attribute “attribute_name” to the including class.

Instance Method Summary collapse

Constructor Details

#initialize(attribute_name, options) ⇒ InstanceMethodsOnActivation

Returns a new instance of InstanceMethodsOnActivation.



10
11
12
13
# File 'lib/active_encryption/encryptable/instance_methods_on_activation.rb', line 10

def initialize(attribute_name, options)
  define_generic_methods
  define_attribute_accessors(attribute_name, options)
end

Instance Method Details

#define_attribute_accessors(attribute_name, options = {}) ⇒ Object



43
44
45
46
47
48
# File 'lib/active_encryption/encryptable/instance_methods_on_activation.rb', line 43

def define_attribute_accessors(attribute_name, options = {})
  define_attribute_encryption_setting(attribute_name, options)
  define_attribute_encryptor(attribute_name)
  define_attribute_setter(attribute_name)
  define_attribute_getter(attribute_name)
end

#define_attribute_encryption_setting(attribute_name, options = {}) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/active_encryption/encryptable/instance_methods_on_activation.rb', line 50

def define_attribute_encryption_setting(attribute_name, options = {})
  define_method("#{attribute_name}_encryption_setting") do
    instance_variable_name = "@#{attribute_name}_encryption_setting"
    instance_variable = instance_variable_get(instance_variable_name)
    return instance_variable if instance_variable

    instance_variable_set(
      instance_variable_name,
      EncryptionSetting::Record.merge(self.class.encryption_setting,
                                      options)
    )
  end
end

#define_attribute_encryptor(attribute_name) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/active_encryption/encryptable/instance_methods_on_activation.rb', line 64

def define_attribute_encryptor(attribute_name)
  define_method("#{attribute_name}_encryptor") do
    instance_variable_name = "@#{attribute_name}_encryptor"
    instance_variable_get(instance_variable_name) ||
      instance_variable_set(
        instance_variable_name,
        Encryptor.new(
          send("#{attribute_name}_encryption_setting")
        )
      )
  end
end

#define_attribute_getter(attribute_name) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/active_encryption/encryptable/instance_methods_on_activation.rb', line 91

def define_attribute_getter(attribute_name)
  define_method(attribute_name) do
    # Check if an instance variable with the decrypted value already
    # exist to save decryption time. Otherwise, call the generic
    # #decrypt method.
    instance_variable = instance_variable_get("@#{attribute_name}")
    return instance_variable if instance_variable

    decrypted_value = decrypt(attribute_name)
    # Save the result to not have to decrypt it again.
    instance_variable_set("@#{attribute_name}", decrypted_value)
  end
end

#define_attribute_setter(attribute_name) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/active_encryption/encryptable/instance_methods_on_activation.rb', line 77

def define_attribute_setter(attribute_name)
  define_method("#{attribute_name}=") do |unencrypted_value|
    # Save unencrypted value in instance variable to not have to
    # decrypt a freshly encrypted value.
    instance_variable_set("@#{attribute_name}", unencrypted_value)
    unless unencrypted_value
      return send("#{attribute_name}_encrypted=", nil)
    end

    encrypt(attribute_name, unencrypted_value)
    unencrypted_value
  end
end

#define_decryptObject



32
33
34
35
36
37
38
39
40
41
# File 'lib/active_encryption/encryptable/instance_methods_on_activation.rb', line 32

def define_decrypt
  define_method('decrypt') do |attribute_name|
    encrypted_value = send("#{attribute_name}_encrypted")
    return nil unless encrypted_value

    setting = send("#{attribute_name}_encryption_setting")
    send("#{attribute_name}_encryptor")
      .decrypt(encrypted_value, purpose: setting.purpose)
  end
end

#define_encryptObject



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/active_encryption/encryptable/instance_methods_on_activation.rb', line 20

def define_encrypt
  define_method('encrypt') do |attribute_name, unencrypted_value|
    setting = send("#{attribute_name}_encryption_setting")
    encryptor = send("#{attribute_name}_encryptor")
    encrypted_value = encryptor.encrypt(
      unencrypted_value,
      purpose: setting.purpose
    )
    send("#{attribute_name}_encrypted=", encrypted_value)
  end
end

#define_generic_methodsObject



15
16
17
18
# File 'lib/active_encryption/encryptable/instance_methods_on_activation.rb', line 15

def define_generic_methods
  define_encrypt
  define_decrypt
end