symmetric-encryption 3.3 → 3.4.0
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.
- checksums.yaml +4 -4
- data/README.md +24 -0
- data/lib/rails/generators/symmetric_encryption/heroku_config/heroku_config_generator.rb +20 -0
- data/lib/rails/generators/symmetric_encryption/heroku_config/templates/symmetric-encryption.yml +75 -0
- data/lib/symmetric_encryption/extensions/active_record/base.rb +3 -2
- data/lib/symmetric_encryption/mongoid.rb +6 -3
- data/lib/symmetric_encryption/symmetric_encryption.rb +21 -5
- data/lib/symmetric_encryption/version.rb +1 -1
- data/test/attr_encrypted_test.rb +71 -0
- data/test/field_encrypted_test.rb +78 -0
- data/test/test_db.sqlite3 +0 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c78c33fe68704b26ebd996fd8ea8785d73c6fa1
|
4
|
+
data.tar.gz: 5f1534c06fae8c76cfc0dccf5a2612ce45fbf683
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fdf134465788b41776a086b5f86d0e2c43778899263bb9c3c702124779b5cad0d61466c1af15a11338959f76b7f6435598be7cb0f80d2c92a8d50727c21d372
|
7
|
+
data.tar.gz: 99a8de3d8d8aa73832f9541b7ab1b448685cd99739a59c600e543f4b27ef55b7c7025b3aaa62d2a0ae91c086aea30e9d9ac08209c2bfb1df7b4bf45ae8ac28eb
|
data/README.md
CHANGED
@@ -417,6 +417,8 @@ Install the Gem with bundler
|
|
417
417
|
|
418
418
|
## Rails Configuration
|
419
419
|
|
420
|
+
If deploying to Heroku skip to the section "Rails Configuration for a Heroku deployment" below
|
421
|
+
|
420
422
|
### Creating the configuration file
|
421
423
|
|
422
424
|
The configuration file contains the path to the production encryption key files.
|
@@ -484,6 +486,27 @@ environment must run the same encryption keys.
|
|
484
486
|
|
485
487
|
Note: The generate step above must only be run once in each environment
|
486
488
|
|
489
|
+
## Rails Configuration for a Heroku deployment
|
490
|
+
|
491
|
+
Deploying to Heroku requires the encrypted key to be stored in an environment
|
492
|
+
variable rather than as a file on disk.
|
493
|
+
|
494
|
+
Generate the configuration file:
|
495
|
+
|
496
|
+
rails g symmetric_encryption:heroku_config
|
497
|
+
|
498
|
+
Note: Ignore the warning about "Symmetric Encryption config not found" since it is
|
499
|
+
being generated.
|
500
|
+
|
501
|
+
Note: The encrypted keys for the release and production environments are displayed on
|
502
|
+
screen and must be entered manually as environment variables into Heroku so that the
|
503
|
+
application can find them when it starts.
|
504
|
+
|
505
|
+
#### Save to version control
|
506
|
+
|
507
|
+
This configuration file should be checked into the source code control system.
|
508
|
+
It does Not include the Symmetric Encryption keys.
|
509
|
+
|
487
510
|
## Using in non-Rails environments
|
488
511
|
|
489
512
|
SymmetricEncryption can also be used in non-Rails environment.
|
@@ -681,6 +704,7 @@ Contributors
|
|
681
704
|
------------
|
682
705
|
|
683
706
|
[M. Scott Ford](https://github.com/mscottford)
|
707
|
+
[Adam St. John](https://github.com/astjohn)
|
684
708
|
|
685
709
|
License
|
686
710
|
-------
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SymmetricEncryption
|
2
|
+
module Generators
|
3
|
+
class HerokuConfigGenerator < Rails::Generators::Base
|
4
|
+
desc "Creates a SymmetricEncryption configuration file at config/symmetric-encryption.yml for use in heroku"
|
5
|
+
|
6
|
+
def self.source_root
|
7
|
+
@_symmetric_encryption_source_root ||= File.expand_path("../templates", __FILE__)
|
8
|
+
end
|
9
|
+
|
10
|
+
def app_name
|
11
|
+
Rails::Application.subclasses.first.parent.to_s.underscore
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_config_file
|
15
|
+
template 'symmetric-encryption.yml', File.join('config', "symmetric-encryption.yml")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/rails/generators/symmetric_encryption/heroku_config/templates/symmetric-encryption.yml
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
#
|
2
|
+
# Symmetric Encryption for Ruby
|
3
|
+
#
|
4
|
+
---
|
5
|
+
# For the development and test environments the test symmetric encryption keys
|
6
|
+
# can be placed directly in the source code.
|
7
|
+
# And therefore no RSA private key is required
|
8
|
+
development: &development_defaults
|
9
|
+
key: 1234567890ABCDEF1234567890ABCDEF
|
10
|
+
iv: 1234567890ABCDEF
|
11
|
+
cipher_name: aes-128-cbc
|
12
|
+
encoding: :base64strict
|
13
|
+
|
14
|
+
test:
|
15
|
+
<<: *development_defaults
|
16
|
+
|
17
|
+
<%
|
18
|
+
cipher_name = 'aes-256-cbc'
|
19
|
+
rsa_key = OpenSSL::PKey::RSA.generate(2048)
|
20
|
+
key_pair = SymmetricEncryption::Cipher.random_key_pair(cipher_name)
|
21
|
+
iv = ::Base64.strict_encode64(key_pair[:iv])
|
22
|
+
encrypted_key = ::Base64.strict_encode64(rsa_key.public_encrypt(key_pair[:key]))
|
23
|
+
|
24
|
+
puts "\n\n********************************************************************************"
|
25
|
+
puts "Add the release environment key to Heroku: (Optional)\n\n"
|
26
|
+
puts " heroku config:add RELEASE_KEY1:#{encrypted_key}\n\n"
|
27
|
+
-%>
|
28
|
+
release:
|
29
|
+
# Since the key to encrypt and decrypt with must NOT be stored along with the
|
30
|
+
# source code, we only hold a RSA key that is used to unlock the file
|
31
|
+
# containing the actual symmetric encryption key
|
32
|
+
private_rsa_key: |
|
33
|
+
<%= rsa_key.to_s.each_line.collect { |line| " #{line}" }.join('') %>
|
34
|
+
|
35
|
+
# List Symmetric Key files in the order of current / latest first
|
36
|
+
ciphers:
|
37
|
+
-
|
38
|
+
# Filename containing Symmetric Encryption Key encrypted using the
|
39
|
+
# RSA public key derived from the private key above
|
40
|
+
encrypted_key: "<%= '<' + "%= ENV['RELEASE_KEY1'] %" + '>' %>"
|
41
|
+
iv: "<%= iv %>"
|
42
|
+
cipher_name: <%= cipher_name %>
|
43
|
+
# Base64 encode encrypted data without newlines
|
44
|
+
encoding: :base64strict
|
45
|
+
version: 1
|
46
|
+
|
47
|
+
<%
|
48
|
+
cipher_name = 'aes-256-cbc'
|
49
|
+
rsa_key = OpenSSL::PKey::RSA.generate(2048)
|
50
|
+
key_pair = SymmetricEncryption::Cipher.random_key_pair(cipher_name)
|
51
|
+
iv = ::Base64.strict_encode64(key_pair[:iv])
|
52
|
+
encrypted_key = ::Base64.strict_encode64(rsa_key.public_encrypt(key_pair[:key]))
|
53
|
+
|
54
|
+
puts "Add the production key to Heroku:\n\n"
|
55
|
+
puts " heroku config:add PRODUCTION_KEY1:#{encrypted_key}\n\n"
|
56
|
+
puts "********************************************************************************\n\n\n"
|
57
|
+
-%>
|
58
|
+
production:
|
59
|
+
# Since the key to encrypt and decrypt with must NOT be stored along with the
|
60
|
+
# source code, we only hold a RSA key that is used to unlock the file
|
61
|
+
# containing the actual symmetric encryption key
|
62
|
+
private_rsa_key: |
|
63
|
+
<%= rsa_key.to_s.each_line.collect { |line| " #{line}" }.join('') %>
|
64
|
+
|
65
|
+
# List Symmetric Key files in the order of current / latest first
|
66
|
+
ciphers:
|
67
|
+
-
|
68
|
+
# Filename containing Symmetric Encryption Key encrypted using the
|
69
|
+
# RSA public key derived from the private key above
|
70
|
+
encrypted_key: "<%= '<' + "%= ENV['PRODUCTION_KEY1'] %" + '>' %>"
|
71
|
+
iv: "<%= iv %>"
|
72
|
+
cipher_name: <%= cipher_name %>
|
73
|
+
# Base64 encode encrypted data without newlines
|
74
|
+
encoding: :base64strict
|
75
|
+
version: 1
|
@@ -81,8 +81,9 @@ module ActiveRecord #:nodoc:
|
|
81
81
|
# Set the un-encrypted attribute
|
82
82
|
# Also updates the encrypted field with the encrypted value
|
83
83
|
def #{attribute}=(value)
|
84
|
-
|
85
|
-
|
84
|
+
v = SymmetricEncryption::coerce(value, :#{type})
|
85
|
+
self.encrypted_#{attribute} = @stored_encrypted_#{attribute} = ::SymmetricEncryption.encrypt(v,#{random_iv},#{compress},:#{type})
|
86
|
+
@#{attribute} = v.freeze
|
86
87
|
end
|
87
88
|
UNENCRYPTED
|
88
89
|
|
@@ -95,7 +95,9 @@ Mongoid::Fields.option :encrypted do |model, field, options|
|
|
95
95
|
decrypted_field_name = options.delete(:decrypt_as)
|
96
96
|
if decrypted_field_name.nil? && encrypted_field_name.to_s.start_with?('encrypted_')
|
97
97
|
decrypted_field_name = encrypted_field_name.to_s['encrypted_'.length..-1]
|
98
|
-
|
98
|
+
end
|
99
|
+
|
100
|
+
if decrypted_field_name.nil?
|
99
101
|
raise "SymmetricEncryption for Mongoid. Encryption enabled for field #{encrypted_field_name}. It must either start with 'encrypted_' or the option :decrypt_as must be supplied"
|
100
102
|
end
|
101
103
|
|
@@ -119,8 +121,9 @@ Mongoid::Fields.option :encrypted do |model, field, options|
|
|
119
121
|
# Also updates the encrypted field with the encrypted value
|
120
122
|
# Freeze the decrypted field value so that it is not modified directly
|
121
123
|
def #{decrypted_field_name}=(value)
|
122
|
-
|
123
|
-
|
124
|
+
v = SymmetricEncryption::coerce(value, :#{type})
|
125
|
+
self.#{encrypted_field_name} = @stored_#{encrypted_field_name} = ::SymmetricEncryption.encrypt(v,#{random_iv},#{compress},:#{type})
|
126
|
+
@#{decrypted_field_name} = v.freeze
|
124
127
|
end
|
125
128
|
|
126
129
|
# Returns the decrypted value for the encrypted field
|
@@ -387,12 +387,14 @@ module SymmetricEncryption
|
|
387
387
|
#
|
388
388
|
# :encrypted_key
|
389
389
|
# Symmetric key encrypted using the public key from the private_rsa_key
|
390
|
+
# and then Base64 encoded
|
390
391
|
#
|
391
392
|
# :iv
|
392
393
|
# Optional: The actual iv to use for encryption/decryption purposes
|
393
394
|
#
|
394
395
|
# :encrypted_iv
|
395
396
|
# Initialization vector encrypted using the public key from the private_rsa_key
|
397
|
+
# and then Base64 encoded
|
396
398
|
#
|
397
399
|
# :iv_filename
|
398
400
|
# Optional: Name of file containing symmetric key initialization vector
|
@@ -455,6 +457,23 @@ module SymmetricEncryption
|
|
455
457
|
Cipher.new(config)
|
456
458
|
end
|
457
459
|
|
460
|
+
# Coerce given value into given type
|
461
|
+
# Does not coerce json or yaml values
|
462
|
+
def self.coerce(value, type, from_type=nil)
|
463
|
+
return if value.nil?
|
464
|
+
|
465
|
+
from_type ||= value.class
|
466
|
+
case type
|
467
|
+
when :json
|
468
|
+
value
|
469
|
+
when :yaml
|
470
|
+
value
|
471
|
+
else
|
472
|
+
coercer = Coercible::Coercer.new
|
473
|
+
coercer[from_type].send("to_#{type}".to_sym, value)
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
458
477
|
# Uses coercible gem to coerce values from strings into the target type
|
459
478
|
# Note: if the type is :string, then the value is returned as is, and the
|
460
479
|
# coercible gem is not used at all.
|
@@ -468,9 +487,7 @@ module SymmetricEncryption
|
|
468
487
|
when :yaml
|
469
488
|
YAML.load(value)
|
470
489
|
else
|
471
|
-
|
472
|
-
coercion_method = "to_#{type}".to_sym
|
473
|
-
coercer[String].send(coercion_method, value)
|
490
|
+
self.coerce(value, type, String)
|
474
491
|
end
|
475
492
|
end
|
476
493
|
|
@@ -488,8 +505,7 @@ module SymmetricEncryption
|
|
488
505
|
when :yaml
|
489
506
|
value.to_yaml
|
490
507
|
else
|
491
|
-
|
492
|
-
coercer[coercion_type(type, value)].to_string(value)
|
508
|
+
self.coerce(value, :string, coercion_type(type, value))
|
493
509
|
end
|
494
510
|
end
|
495
511
|
|
data/test/attr_encrypted_test.rb
CHANGED
@@ -231,6 +231,8 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
231
231
|
assert_equal true, @user.valid?
|
232
232
|
end
|
233
233
|
|
234
|
+
|
235
|
+
|
234
236
|
context "with saved user" do
|
235
237
|
setup do
|
236
238
|
@user.save!
|
@@ -240,6 +242,12 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
240
242
|
@user.destroy
|
241
243
|
end
|
242
244
|
|
245
|
+
should "return correct data type before save" do
|
246
|
+
u = User.new(:integer_value => "5")
|
247
|
+
assert_equal 5, u.integer_value
|
248
|
+
assert u.integer_value.kind_of?(Integer)
|
249
|
+
end
|
250
|
+
|
243
251
|
should "handle gsub! for non-encrypted_field" do
|
244
252
|
@user.name.gsub!('a', 'v')
|
245
253
|
new_name = @name.gsub('a', 'v')
|
@@ -290,6 +298,12 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
290
298
|
assert @user.clone.integer_value.kind_of?(Integer)
|
291
299
|
end
|
292
300
|
|
301
|
+
should "coerce data type before save" do
|
302
|
+
u = User.new(:integer_value => "5")
|
303
|
+
assert_equal 5, u.integer_value
|
304
|
+
assert u.integer_value.kind_of?(Integer)
|
305
|
+
end
|
306
|
+
|
293
307
|
should "permit replacing value with nil" do
|
294
308
|
@user_clone.integer_value = nil
|
295
309
|
@user_clone.save!
|
@@ -315,6 +329,12 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
315
329
|
assert @user.clone.float_value.kind_of?(Float)
|
316
330
|
end
|
317
331
|
|
332
|
+
should "coerce data type before save" do
|
333
|
+
u = User.new(:float_value => "5.6")
|
334
|
+
assert_equal 5.6, u.float_value
|
335
|
+
assert u.float_value.kind_of?(Float)
|
336
|
+
end
|
337
|
+
|
318
338
|
should "permit replacing value with nil" do
|
319
339
|
@user_clone.float_value = nil
|
320
340
|
@user_clone.save!
|
@@ -340,6 +360,12 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
340
360
|
assert @user.clone.decimal_value.kind_of?(BigDecimal)
|
341
361
|
end
|
342
362
|
|
363
|
+
should "coerce data type before save" do
|
364
|
+
u = User.new(:decimal_value => "99.95")
|
365
|
+
assert_equal BigDecimal.new("99.95"), u.decimal_value
|
366
|
+
assert u.decimal_value.kind_of?(BigDecimal)
|
367
|
+
end
|
368
|
+
|
343
369
|
should "permit replacing value with nil" do
|
344
370
|
@user_clone.decimal_value = nil
|
345
371
|
@user_clone.save!
|
@@ -365,6 +391,13 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
365
391
|
assert @user.clone.datetime_value.kind_of?(DateTime)
|
366
392
|
end
|
367
393
|
|
394
|
+
should "coerce data type before save" do
|
395
|
+
now = Time.now
|
396
|
+
u = User.new(:datetime_value => now)
|
397
|
+
assert_equal now, u.datetime_value
|
398
|
+
assert u.datetime_value.kind_of?(DateTime)
|
399
|
+
end
|
400
|
+
|
368
401
|
should "permit replacing value with nil" do
|
369
402
|
@user_clone.datetime_value = nil
|
370
403
|
@user_clone.save!
|
@@ -390,6 +423,13 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
390
423
|
assert @user.clone.time_value.kind_of?(Time)
|
391
424
|
end
|
392
425
|
|
426
|
+
should "coerce data type before save" do
|
427
|
+
now = Time.now
|
428
|
+
u = User.new(:time_value => now)
|
429
|
+
assert_equal now, u.time_value
|
430
|
+
assert u.time_value.kind_of?(Time)
|
431
|
+
end
|
432
|
+
|
393
433
|
should "permit replacing value with nil" do
|
394
434
|
@user_clone.time_value = nil
|
395
435
|
@user_clone.save!
|
@@ -415,6 +455,13 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
415
455
|
assert @user.clone.date_value.kind_of?(Date)
|
416
456
|
end
|
417
457
|
|
458
|
+
should "coerce data type before save" do
|
459
|
+
now = Time.now
|
460
|
+
u = User.new(:date_value => now)
|
461
|
+
assert_equal now.to_date, u.date_value
|
462
|
+
assert u.date_value.kind_of?(Date)
|
463
|
+
end
|
464
|
+
|
418
465
|
should "permit replacing value with nil" do
|
419
466
|
@user_clone.date_value = nil
|
420
467
|
@user_clone.save!
|
@@ -440,6 +487,12 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
440
487
|
assert @user.clone.true_value.kind_of?(TrueClass)
|
441
488
|
end
|
442
489
|
|
490
|
+
should "coerce data type before save" do
|
491
|
+
u = User.new(:true_value => "1")
|
492
|
+
assert_equal true, u.true_value
|
493
|
+
assert u.true_value.kind_of?(TrueClass)
|
494
|
+
end
|
495
|
+
|
443
496
|
should "permit replacing value with nil" do
|
444
497
|
@user_clone.true_value = nil
|
445
498
|
@user_clone.save!
|
@@ -465,6 +518,12 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
465
518
|
assert @user.clone.false_value.kind_of?(FalseClass)
|
466
519
|
end
|
467
520
|
|
521
|
+
should "coerce data type before save" do
|
522
|
+
u = User.new(:false_value => "0")
|
523
|
+
assert_equal false, u.false_value
|
524
|
+
assert u.false_value.kind_of?(FalseClass)
|
525
|
+
end
|
526
|
+
|
468
527
|
should "permit replacing value with nil" do
|
469
528
|
@user_clone.false_value = nil
|
470
529
|
@user_clone.save!
|
@@ -499,6 +558,12 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
499
558
|
assert @user.clone.data_json.kind_of?(Hash)
|
500
559
|
end
|
501
560
|
|
561
|
+
should "not coerce data type (leaves as hash) before save" do
|
562
|
+
u = User.new(:data_json => @h)
|
563
|
+
assert_equal @h, u.data_json
|
564
|
+
assert u.data_json.kind_of?(Hash)
|
565
|
+
end
|
566
|
+
|
502
567
|
should "permit replacing value with nil" do
|
503
568
|
@user_clone.data_json = nil
|
504
569
|
@user_clone.save!
|
@@ -525,6 +590,12 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
525
590
|
assert @user.clone.data_yaml.kind_of?(Hash)
|
526
591
|
end
|
527
592
|
|
593
|
+
should "not coerce data type (leaves as hash) before save" do
|
594
|
+
u = User.new(:data_yaml => @h)
|
595
|
+
assert_equal @h, u.data_yaml
|
596
|
+
assert u.data_yaml.kind_of?(Hash)
|
597
|
+
end
|
598
|
+
|
528
599
|
should "permit replacing value with nil" do
|
529
600
|
@user_clone.data_yaml = nil
|
530
601
|
@user_clone.save!
|
@@ -14,6 +14,7 @@ class MongoidUser
|
|
14
14
|
field :encrypted_long_string, :type => String, :encrypted => {:random_iv => true, :compress => true}
|
15
15
|
|
16
16
|
field :encrypted_integer_value, :type => String, :encrypted => {:type => :integer}
|
17
|
+
field :aiv, :type => String, :encrypted => {:type => :integer, decrypt_as: :aliased_integer_value}
|
17
18
|
field :encrypted_float_value, :type => String, :encrypted => {:type => :float}
|
18
19
|
field :encrypted_decimal_value, :type => String, :encrypted => {:type => :decimal}
|
19
20
|
field :encrypted_datetime_value, :type => String, :encrypted => {:type => :datetime}
|
@@ -70,6 +71,7 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
70
71
|
:name => "Joe Bloggs",
|
71
72
|
# data type specific fields
|
72
73
|
:integer_value => @integer_value,
|
74
|
+
:aliased_integer_value => @integer_value,
|
73
75
|
:float_value => @float_value,
|
74
76
|
:decimal_value => @decimal_value,
|
75
77
|
:datetime_value => @datetime_value,
|
@@ -110,6 +112,11 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
110
112
|
assert_equal true, @user.respond_to?(:name=)
|
111
113
|
end
|
112
114
|
|
115
|
+
should "support aliased fields" do
|
116
|
+
assert_equal true, @user.respond_to?(:aliased_integer_value=)
|
117
|
+
assert_equal true, @user.respond_to?(:aliased_integer_value)
|
118
|
+
end
|
119
|
+
|
113
120
|
should "have unencrypted values" do
|
114
121
|
assert_equal @bank_account_number, @user.bank_account_number
|
115
122
|
assert_equal @social_security_number, @user.social_security_number
|
@@ -194,12 +201,25 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
194
201
|
@user_clone = MongoidUser.find(@user.id)
|
195
202
|
end
|
196
203
|
|
204
|
+
context "aliased fields" do
|
205
|
+
should "return correct data type" do
|
206
|
+
@user_clone.aliased_integer_value = "5"
|
207
|
+
assert_equal 5, @user_clone.aliased_integer_value
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
197
211
|
context "integer values" do
|
198
212
|
should "return correct data type" do
|
199
213
|
assert_equal @integer_value, @user_clone.integer_value
|
200
214
|
assert @user.clone.integer_value.kind_of?(Integer)
|
201
215
|
end
|
202
216
|
|
217
|
+
should "coerce data type before save" do
|
218
|
+
u = MongoidUser.new(:integer_value => "5")
|
219
|
+
assert_equal 5, u.integer_value
|
220
|
+
assert u.integer_value.kind_of?(Integer)
|
221
|
+
end
|
222
|
+
|
203
223
|
should "permit replacing value with nil" do
|
204
224
|
@user_clone.integer_value = nil
|
205
225
|
@user_clone.save!
|
@@ -225,6 +245,12 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
225
245
|
assert @user.clone.float_value.kind_of?(Float)
|
226
246
|
end
|
227
247
|
|
248
|
+
should "coerce data type before save" do
|
249
|
+
u = MongoidUser.new(:float_value => "5.6")
|
250
|
+
assert_equal 5.6, u.float_value
|
251
|
+
assert u.float_value.kind_of?(Float)
|
252
|
+
end
|
253
|
+
|
228
254
|
should "permit replacing value with nil" do
|
229
255
|
@user_clone.float_value = nil
|
230
256
|
@user_clone.save!
|
@@ -250,6 +276,12 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
250
276
|
assert @user.clone.decimal_value.kind_of?(BigDecimal)
|
251
277
|
end
|
252
278
|
|
279
|
+
should "coerce data type before save" do
|
280
|
+
u = MongoidUser.new(:decimal_value => "99.95")
|
281
|
+
assert_equal BigDecimal.new("99.95"), u.decimal_value
|
282
|
+
assert u.decimal_value.kind_of?(BigDecimal)
|
283
|
+
end
|
284
|
+
|
253
285
|
should "permit replacing value with nil" do
|
254
286
|
@user_clone.decimal_value = nil
|
255
287
|
@user_clone.save!
|
@@ -275,6 +307,13 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
275
307
|
assert @user.clone.datetime_value.kind_of?(DateTime)
|
276
308
|
end
|
277
309
|
|
310
|
+
should "coerce data type before save" do
|
311
|
+
now = Time.now
|
312
|
+
u = MongoidUser.new(:datetime_value => now)
|
313
|
+
assert_equal now, u.datetime_value
|
314
|
+
assert u.datetime_value.kind_of?(DateTime)
|
315
|
+
end
|
316
|
+
|
278
317
|
should "permit replacing value with nil" do
|
279
318
|
@user_clone.datetime_value = nil
|
280
319
|
@user_clone.save!
|
@@ -300,6 +339,13 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
300
339
|
assert @user.clone.time_value.kind_of?(Time)
|
301
340
|
end
|
302
341
|
|
342
|
+
should "coerce data type before save" do
|
343
|
+
now = Time.now
|
344
|
+
u = MongoidUser.new(:time_value => now)
|
345
|
+
assert_equal now, u.time_value
|
346
|
+
assert u.time_value.kind_of?(Time)
|
347
|
+
end
|
348
|
+
|
303
349
|
should "permit replacing value with nil" do
|
304
350
|
@user_clone.time_value = nil
|
305
351
|
@user_clone.save!
|
@@ -325,6 +371,13 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
325
371
|
assert @user.clone.date_value.kind_of?(Date)
|
326
372
|
end
|
327
373
|
|
374
|
+
should "coerce data type before save" do
|
375
|
+
now = Time.now
|
376
|
+
u = MongoidUser.new(:date_value => now)
|
377
|
+
assert_equal now.to_date, u.date_value
|
378
|
+
assert u.date_value.kind_of?(Date)
|
379
|
+
end
|
380
|
+
|
328
381
|
should "permit replacing value with nil" do
|
329
382
|
@user_clone.date_value = nil
|
330
383
|
@user_clone.save!
|
@@ -350,6 +403,12 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
350
403
|
assert @user.clone.true_value.kind_of?(TrueClass)
|
351
404
|
end
|
352
405
|
|
406
|
+
should "coerce data type before save" do
|
407
|
+
u = MongoidUser.new(:true_value => "1")
|
408
|
+
assert_equal true, u.true_value
|
409
|
+
assert u.true_value.kind_of?(TrueClass)
|
410
|
+
end
|
411
|
+
|
353
412
|
should "permit replacing value with nil" do
|
354
413
|
@user_clone.true_value = nil
|
355
414
|
@user_clone.save!
|
@@ -375,6 +434,12 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
375
434
|
assert @user.clone.false_value.kind_of?(FalseClass)
|
376
435
|
end
|
377
436
|
|
437
|
+
should "coerce data type before save" do
|
438
|
+
u = MongoidUser.new(:false_value => "0")
|
439
|
+
assert_equal false, u.false_value
|
440
|
+
assert u.false_value.kind_of?(FalseClass)
|
441
|
+
end
|
442
|
+
|
378
443
|
should "permit replacing value with nil" do
|
379
444
|
@user_clone.false_value = nil
|
380
445
|
@user_clone.save!
|
@@ -409,6 +474,12 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
409
474
|
assert @user.clone.data_json.kind_of?(Hash)
|
410
475
|
end
|
411
476
|
|
477
|
+
should "not coerce data type (leaves as hash) before save" do
|
478
|
+
u = MongoidUser.new(:data_json => @h)
|
479
|
+
assert_equal @h, u.data_json
|
480
|
+
assert u.data_json.kind_of?(Hash)
|
481
|
+
end
|
482
|
+
|
412
483
|
should "permit replacing value with nil" do
|
413
484
|
@user_clone.data_json = nil
|
414
485
|
@user_clone.save!
|
@@ -435,6 +506,12 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
435
506
|
assert @user.clone.data_yaml.kind_of?(Hash)
|
436
507
|
end
|
437
508
|
|
509
|
+
should "not coerce data type (leaves as hash) before save" do
|
510
|
+
u = MongoidUser.new(:data_yaml => @h)
|
511
|
+
assert_equal @h, u.data_yaml
|
512
|
+
assert u.data_yaml.kind_of?(Hash)
|
513
|
+
end
|
514
|
+
|
438
515
|
should "permit replacing value with nil" do
|
439
516
|
@user_clone.data_yaml = nil
|
440
517
|
@user_clone.save!
|
@@ -454,6 +531,7 @@ class FieldEncryptedTest < Test::Unit::TestCase
|
|
454
531
|
assert_equal new_value, @user.data_yaml
|
455
532
|
end
|
456
533
|
end
|
534
|
+
|
457
535
|
end
|
458
536
|
|
459
537
|
end
|
data/test/test_db.sqlite3
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: symmetric-encryption
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coercible
|
@@ -39,6 +39,8 @@ files:
|
|
39
39
|
- examples/symmetric-encryption.yml
|
40
40
|
- lib/rails/generators/symmetric_encryption/config/config_generator.rb
|
41
41
|
- lib/rails/generators/symmetric_encryption/config/templates/symmetric-encryption.yml
|
42
|
+
- lib/rails/generators/symmetric_encryption/heroku_config/heroku_config_generator.rb
|
43
|
+
- lib/rails/generators/symmetric_encryption/heroku_config/templates/symmetric-encryption.yml
|
42
44
|
- lib/rails/generators/symmetric_encryption/new_keys/new_keys_generator.rb
|
43
45
|
- lib/symmetric-encryption.rb
|
44
46
|
- lib/symmetric_encryption.rb
|