mongoid-kms 0.0.19 → 0.0.20

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 499cdefc517aa05b0369dd7d87778f975fb17221
4
- data.tar.gz: 7de75298cea61a9964422ab70080859b4fc2cdbf
3
+ metadata.gz: 0ef5d00b5940a40440f302133dffa2b364b73a86
4
+ data.tar.gz: b970e5a37fbf0b68aa52b7a61f7197fdf008d896
5
5
  SHA512:
6
- metadata.gz: dfca6638b45ad191af3bc5c0d0ee299528b61135659aba78cace8fe4c3268c3ebf207f74b1ba7767eacba93193d21d97f1667488d38a751850c5da570dfdaee2
7
- data.tar.gz: 9e90c4ad3dd3aad9cdc81b82f0543b2e22a6dc5f125932c77abd41373d84fdbef29b4596fc73fd63fd923f70e17cbdff236716c920f33e8be8a24cae71e71d80
6
+ metadata.gz: 9f5c68d2c32a9785209e2138ed795311d103cfa8071fae65875d6a0f1cc9e73b76e0b71a31252b043857ccf9d1a6107c297265a93dbaba36dcd9c64feaa05ac4
7
+ data.tar.gz: 4ccbbe113dd32f9a9d50aff1e6c2a41a049ebf1afc1be7e54841076d2ce8f292e0d3c037d4e712dda5db10dfd60cff68993b2a8c19ee6c89ea026d48d2edb035
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Kms
3
- VERSION = "0.0.19"
3
+ VERSION = "0.0.20"
4
4
  end
5
5
  end
data/lib/mongoid/kms.rb CHANGED
@@ -7,7 +7,8 @@ module Mongoid
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
- @kms_field_map ||= {}
10
+ class_attribute :kms_field_map
11
+ self.kms_field_map ||= {}
11
12
 
12
13
  unless self.ancestors.include?(ActiveModel::Dirty)
13
14
  include ActiveModel::Dirty
@@ -79,10 +80,47 @@ module Mongoid
79
80
 
80
81
  # Class methods
81
82
  module ClassMethods
82
- def kms_field_map
83
- @kms_field_map
83
+ def inherited(child)
84
+ child.kms_field_map = self.kms_field_map.clone
85
+
86
+ child.kms_field_map.each do |field_name, args|
87
+ child.add_secure_field(field_name, args)
88
+ end
84
89
  end
85
90
 
91
+ def add_secure_field(field_name, args)
92
+ encrypted_field_name = get_encrypted_field_name(field_name)
93
+
94
+ define_attribute_methods field_name.to_sym
95
+ before_save :set_kms_values
96
+
97
+ kms_field_map[field_name.to_s] = {context: args.delete(:context), type: args[:type]}
98
+
99
+ field encrypted_field_name, type: Mongoid::Kms.bson_class::Binary
100
+
101
+ self.class_eval do
102
+ define_method(field_name) do
103
+ instance_variable_get("@#{field_name}") || begin
104
+ raw = send("kms_secure_#{field_name}")
105
+
106
+ if raw.nil?
107
+ raw
108
+ else
109
+ v = self.class.decrypt_field(self, field_name, raw)
110
+ instance_variable_set("@#{field_name}", v)
111
+ v
112
+ end
113
+ end
114
+ end
115
+
116
+ define_method("#{field_name}=") do |value|
117
+ self.send("#{field_name}_will_change!")
118
+ instance_variable_set("@#{field_name}", value)
119
+ end
120
+ end
121
+ end
122
+
123
+
86
124
  def encrypt_field(object, field_name, value)
87
125
  Mongoid::Kms.kms.encrypt({
88
126
  key_id: Mongoid::Kms.key,
@@ -128,11 +166,11 @@ module Mongoid
128
166
  end
129
167
 
130
168
  def kms_context_array(object, field_name)
131
- @kms_field_map[field_name.to_s][:context] || []
169
+ kms_field_map[field_name.to_s][:context] || []
132
170
  end
133
171
 
134
172
  def kms_type(field_name)
135
- @kms_field_map[field_name.to_s][:type]
173
+ kms_field_map[field_name.to_s][:type]
136
174
  end
137
175
 
138
176
  def get_encrypted_field_name(field_name)
@@ -140,33 +178,7 @@ module Mongoid
140
178
  end
141
179
 
142
180
  def secure_field(field_name, args)
143
- encrypted_field_name = get_encrypted_field_name(field_name)
144
-
145
- @kms_field_map[field_name.to_s] = {context: args.delete(:context), type: args.delete(:type)}
146
-
147
- field encrypted_field_name, args.merge(type: Mongoid::Kms.bson_class::Binary)
148
-
149
- define_attribute_methods field_name.to_sym
150
- before_save :set_kms_values
151
-
152
- define_method(field_name) do
153
- instance_variable_get("@#{field_name}") || begin
154
- raw = send("kms_secure_#{field_name}")
155
-
156
- if raw.nil?
157
- raw
158
- else
159
- v = self.class.decrypt_field(self, field_name, raw)
160
- instance_variable_set("@#{field_name}", v)
161
- v
162
- end
163
- end
164
- end
165
-
166
- define_method("#{field_name}=") do |value|
167
- self.send("#{field_name}_will_change!")
168
- instance_variable_set("@#{field_name}", value)
169
- end
181
+ add_secure_field(field_name, args)
170
182
  end
171
183
  end
172
184
 
@@ -52,4 +52,14 @@ describe Mongoid::Kms do
52
52
  expect{Mongoid::Kms.configure({region: "", key: ""})}.to raise_error(Mongoid::Kms::Errors::ConfigurationError, "Region and KMS id key are required.")
53
53
  end
54
54
 
55
+ it "works with extended classes" do
56
+ o = ExtendedClass.new(super_secure: "batman", unsecure: "robin", timestamp: Time.now, additional_secure: "wha!")
57
+ o.save!
58
+
59
+ byebug
60
+
61
+ o = ExtendedClass.find(o.id)
62
+ expect(o.additional_secure).to eq("wha!")
63
+ end
64
+
55
65
  end
data/spec/spec_helper.rb CHANGED
@@ -30,4 +30,8 @@ class ClassWithoutContext
30
30
  field :unsecure
31
31
  end
32
32
 
33
+ class ExtendedClass < OtherClass
34
+ secure_field :additional_secure, type: String, context: [:unsecure, :timestamp]
35
+ end
36
+
33
37
  Mongoid::Kms.configure({region: "us-east-1", key: ENV['AWS_KMS_KEY_ID']})
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-kms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.19
4
+ version: 0.0.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Winslett
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-15 00:00:00.000000000 Z
11
+ date: 2014-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid