go_secure 0.63 → 0.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/go_secure.rb +91 -0
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6a514fabf4affc7b4bc7b7a5dd6c07b001dcc5b
4
- data.tar.gz: b8c9d38060b0a9fc4f2773cc057da13a6276e539
3
+ metadata.gz: 9c524e2e840ee7893bffe1419b602ef0b658d09a
4
+ data.tar.gz: f0d4e9a0f459d919b03fa7e546452f63c2ab2db9
5
5
  SHA512:
6
- metadata.gz: 035b07d3302d892f58ac2ff71c1df315127fe144f94a09677dc1c383f3a73a6f29c18f3bdefdf60635eb0699fc83b11e8d604eb3d7837c6499fecb1e50f15535
7
- data.tar.gz: a996e351779dc683a742b85f6252ea2a7e390366ea82e2022cd4ae52cdc89a8ebfc56659a866902ab2fafe3dc11dfad365a3f10aed00e259b87672f718c0308b
6
+ metadata.gz: 0fb801b6017a0c7680b1d3e1f14f4d9f53be4cadca882688091fff56f1d75403f3f91fb2fa2e5e4cbbd27862583b1895e459e069aa074b6b70cd675d6eb46ba7
7
+ data.tar.gz: 7c4183402268648b01df8cebb16642f687abd6335911abe9dda79145a4bc1d3ae6f5587f5c15ea2fe0e415ab7362d0a3c54e44e0fef4a8a27bed9574694ab67e
@@ -157,4 +157,95 @@ module GoSecure
157
157
  end
158
158
  end
159
159
  end
160
+
161
+ module SerializeInstanceMethods
162
+ def load_secure_object
163
+ @secure_object_json = nil.to_json
164
+ if self.id
165
+ attr = read_attribute(self.class.secure_column) || (!self.respond_to?(:secure_column_value) && self.send(self.class.secure_column)) || (@secure_object.is_a?(String) && @secure_object) || nil
166
+ if attr && attr.match(/\s*^{/)
167
+ @secure_object = JSON.parse(attr)
168
+ else
169
+ @secure_object = GoSecure::SecureJson.load(attr)
170
+ end
171
+ @secure_object_json = @secure_object.to_json
172
+ @loaded_secure_object = true
173
+ end
174
+ true
175
+ end
176
+
177
+ # If the serialized data has changed since initialize and paper_trail
178
+ # is configured, then we need to manually mark the column as dirty
179
+ # to make sure a proper paper_trail is maintained
180
+ def mark_changed_secure_object_hash
181
+ if !send("#{self.class.secure_column}_changed?")
182
+ json = @secure_object.to_json
183
+ if json != @secure_object_json
184
+ send("#{self.class.secure_column}_will_change!")
185
+ end
186
+ end
187
+ true
188
+ end
189
+
190
+ def persist_secure_object
191
+ self.class.more_before_saves ||= []
192
+ self.class.more_before_saves.each do |method|
193
+ res = send(method)
194
+ return false if res == false
195
+ end
196
+ mark_changed_secure_object_hash
197
+ if send("#{self.class.secure_column}_changed?")
198
+ secure = GoSecure::SecureJson.dump(@secure_object)
199
+ @secure_object = GoSecure::SecureJson.load(secure)
200
+ write_attribute(self.class.secure_column, secure)
201
+ end
202
+ true
203
+ end
204
+ end
205
+
206
+ module SerializeClassMethods
207
+ def secure_serialize(column)
208
+ raise "only one secure column per record! (yes I'm lazy)" if self.respond_to?(:secure_column) && self.secure_column
209
+ cattr_accessor :secure_column
210
+ cattr_accessor :more_before_saves
211
+ self.secure_column = column
212
+ prepend SecureSerializeHelpers
213
+
214
+ before_save :persist_secure_object
215
+ define_singleton_method(:before_save) do |*args|
216
+ raise "only simple before_save calls after secure_serialize: #{args.to_json}" unless args.length == 1 && args[0].is_a?(Symbol)
217
+ self.more_before_saves ||= []
218
+ self.more_before_saves << args[0]
219
+ end
220
+ define_method("secure_column_value") do
221
+ nil
222
+ end
223
+ define_method("#{column}") do
224
+ load_secure_object unless @loaded_secure_object
225
+ @secure_object
226
+ end
227
+ define_method("#{column}=") do |val|
228
+ @loaded_secure_object = true
229
+ @secure_object = val
230
+ end
231
+ # Commented out because eager-loading an encrypted data column is not efficient
232
+ # after_initialize :load_secure_object
233
+ end
234
+ end
235
+
236
+ module SecureSerializeHelpers
237
+ def reload(*args)
238
+ res = super
239
+ load_secure_object
240
+ res
241
+ end
242
+
243
+ def []=(*args)
244
+ if args[0].to_s == self.class.secure_column
245
+ send("#{self.class.secure_column}=", args[1])
246
+ else
247
+ super
248
+ end
249
+ end
250
+ end
160
251
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: go_secure
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.63'
4
+ version: '0.65'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Whitmer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-17 00:00:00.000000000 Z
11
+ date: 2018-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj