Module: Mongoid::Kms

Extended by:
ActiveSupport::Concern
Defined in:
lib/mongoid/kms.rb,
lib/mongoid/kms/mock.rb,
lib/mongoid/kms/version.rb

Defined Under Namespace

Modules: ClassMethods, Errors Classes: Rot13

Constant Summary collapse

VERSION =
"0.2.41"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.binary_factory(data) ⇒ Object



51
52
53
54
55
56
57
# File 'lib/mongoid/kms.rb', line 51

def binary_factory(data)
  if defined? Moped::BSON
    Moped::BSON::Binary.new(:generic, data)
  elsif defined? BSON
    BSON::Binary.new(data)
  end
end

.bson_classObject



43
44
45
46
47
48
49
# File 'lib/mongoid/kms.rb', line 43

def bson_class
  if defined? Moped::BSON
    Moped::BSON
  elsif defined? BSON
    BSON
  end
end

.configurationObject



27
28
29
# File 'lib/mongoid/kms.rb', line 27

def configuration
  @configuration || {}
end

.configure(args) ⇒ Object



19
20
21
22
23
24
25
# File 'lib/mongoid/kms.rb', line 19

def configure(args)
  if args[:region] && args[:region] != "" && args[:key] && args[:key] != ""
    @configuration = args
  else
    raise Errors::ConfigurationError.new("Region and KMS id key are required.")
  end
end

.keyObject



39
40
41
# File 'lib/mongoid/kms.rb', line 39

def key
  configuration[:key]
end

.kmsObject



31
32
33
# File 'lib/mongoid/kms.rb', line 31

def kms
  @kms ||= Aws::KMS::Client.new(region: self.region)
end

.regionObject



35
36
37
# File 'lib/mongoid/kms.rb', line 35

def region
  configuration[:region]
end

Instance Method Details

#kms_context_value_changed?(field_name) ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/mongoid/kms.rb', line 85

def kms_context_value_changed?(field_name)
  self.class.kms_context_array(self, field_name).find { |f| self.respond_to?(f) && self.respond_to?("#{f}_changed?") && self.send("#{f}_changed?") }
end

#set_kms_valuesObject

Instance methods



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/mongoid/kms.rb', line 61

def set_kms_values
  self.class.kms_field_map.each do |field_name, settings|
    if self.new_record? || # always run new records through this
        changed_attributes.keys.include?(field_name.to_sym) || # this is a hack to get around Mongoid's weakass dirty hack
        kms_context_value_changed?(field_name) # checks if any of the context fields have changed
      encrypted_field_name = self.class.get_encrypted_field_name(field_name)

      if !instance_variable_defined?("@#{field_name}") && kms_context_value_changed?(field_name)
        raw = self.send(encrypted_field_name)
        raw = raw.data if raw.is_a?(Mongoid::Kms.bson_class::Binary)
        value = self.class.decrypt_field(self, field_name, raw, self.class.kms_context_was(self, field_name))
      else
        value = send("#{field_name}")
      end

      if value.nil? || value == ""
        self.send("#{encrypted_field_name}=", nil)
      else
        self.send("#{encrypted_field_name}=", Mongoid::Kms.binary_factory(self.class.encrypt_field(self, field_name, value)))
      end
    end
  end
end