attr_encrypted 3.0.2 → 3.0.3
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +3 -0
- data/checksum/attr_encrypted-3.0.2.gem.sha256 +1 -0
- data/checksum/attr_encrypted-3.0.2.gem.sha512 +1 -0
- data/lib/attr_encrypted/adapters/active_record.rb +21 -11
- data/lib/attr_encrypted/version.rb +1 -1
- data/test/active_record_test.rb +32 -9
- metadata +4 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c1a2bcf5e2b7fc8937e96cb0fcd99926bd98d1e
|
4
|
+
data.tar.gz: 40112aef07bda5ba8145b2fb634a9bdbfea34d7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbb4fb1d4fa7e22f791139ab1b9a96324cbb8e07f7e8472561a3dd0ce1fcb0a7c048c0ba413b5bccb876dade09f9528ccc7d23caa4378de3da8ef2c540ba76ad
|
7
|
+
data.tar.gz: ef6b487235f2f92ccdf73de3c806b3b3f9161c2ebcd78b2102e1975edc3150cda28a7b458136a051100e939a271b2e92ca690cd38360ec5c43c9c33db22dc1f4
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# attr_encrypted #
|
2
2
|
|
3
|
+
## 3.0.3 ##
|
4
|
+
* Fixed: attr_was would decrypt the attribute upon every call. This is inefficient and introduces problems when the options change between decrypting an old value and encrypting a new value; for example, when rotating the encryption key. As such, the new approach caches the decrypted value of the old encrypted value such that the old options are no longer needed. (@johnny-lai) (@saghaulor)
|
5
|
+
|
3
6
|
## 3.0.2 ##
|
4
7
|
* Changed: Removed alias_method_chain for compatibility with Rails v5.x (@grosser)
|
5
8
|
* Changed: Updated Travis build matrix to include Rails 5. (@saghaulor) (@connorshea)
|
@@ -0,0 +1 @@
|
|
1
|
+
c1256b459336d4a2012a0d0c70ce5cd3dac46acb5e78da6f77f6f104cb1e8b7b
|
@@ -0,0 +1 @@
|
|
1
|
+
dca0c8a729974c0e26fde4cd4216c7d0f66d9eca9f6cf0ccca64999f5180a00bf7c05b630c1d420ec1673141a2923946e8bd28b12e711faf64a4cd42c7a3ac9e
|
@@ -53,22 +53,32 @@ if defined?(ActiveRecord::Base)
|
|
53
53
|
attr = attrs.pop
|
54
54
|
options.merge! encrypted_attributes[attr]
|
55
55
|
|
56
|
-
define_method("#{attr}
|
57
|
-
|
58
|
-
|
56
|
+
define_method("#{attr}_was") do
|
57
|
+
attribute_was(attr)
|
58
|
+
end
|
59
|
+
|
60
|
+
if ::ActiveRecord::VERSION::STRING >= "4.1"
|
61
|
+
define_method("#{attr}_changed?") do |options = {}|
|
62
|
+
attribute_changed?(attr, options)
|
63
|
+
end
|
64
|
+
else
|
65
|
+
define_method("#{attr}_changed?") do
|
66
|
+
attribute_changed?(attr)
|
59
67
|
end
|
60
68
|
end
|
61
69
|
|
62
|
-
define_method("#{attr}
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
self.class.decrypt(attr, send("#{options[:attribute]}_was"), evaluated_options)
|
70
|
+
define_method("#{attr}_change") do
|
71
|
+
attribute_change(attr)
|
72
|
+
end
|
73
|
+
|
74
|
+
define_method("#{attr}_with_dirtiness=") do |value|
|
75
|
+
attribute_will_change!(attr) if value != __send__(attr)
|
76
|
+
__send__("#{attr}_without_dirtiness=", value)
|
70
77
|
end
|
71
78
|
|
79
|
+
alias_method "#{attr}_without_dirtiness=", "#{attr}="
|
80
|
+
alias_method "#{attr}=", "#{attr}_with_dirtiness="
|
81
|
+
|
72
82
|
alias_method "#{attr}_before_type_cast", attr
|
73
83
|
end
|
74
84
|
|
data/test/active_record_test.rb
CHANGED
@@ -19,6 +19,7 @@ def create_tables
|
|
19
19
|
t.string :encrypted_password
|
20
20
|
t.string :encrypted_password_iv
|
21
21
|
t.string :encrypted_password_salt
|
22
|
+
t.binary :key
|
22
23
|
end
|
23
24
|
create_table :users do |t|
|
24
25
|
t.string :login
|
@@ -80,8 +81,20 @@ class PersonWithProcMode < Person
|
|
80
81
|
end
|
81
82
|
|
82
83
|
class Account < ActiveRecord::Base
|
83
|
-
|
84
|
-
attr_encrypted :password, key:
|
84
|
+
ACCOUNT_ENCRYPTION_KEY = SecureRandom.base64(32)
|
85
|
+
attr_encrypted :password, key: :password_encryption_key
|
86
|
+
|
87
|
+
def encrypting?(attr)
|
88
|
+
encrypted_attributes[attr][:operation] == :encrypting
|
89
|
+
end
|
90
|
+
|
91
|
+
def password_encryption_key
|
92
|
+
if encrypting?(:password)
|
93
|
+
self.key = ACCOUNT_ENCRYPTION_KEY
|
94
|
+
else
|
95
|
+
self.key
|
96
|
+
end
|
97
|
+
end
|
85
98
|
end
|
86
99
|
|
87
100
|
class PersonWithSerialization < ActiveRecord::Base
|
@@ -117,7 +130,6 @@ class ActiveRecordTest < Minitest::Test
|
|
117
130
|
def setup
|
118
131
|
ActiveRecord::Base.connection.tables.each { |table| ActiveRecord::Base.connection.drop_table(table) }
|
119
132
|
create_tables
|
120
|
-
Account.create!(key: SECRET_KEY, password: "password")
|
121
133
|
end
|
122
134
|
|
123
135
|
def test_should_encrypt_email
|
@@ -167,12 +179,6 @@ class ActiveRecordTest < Minitest::Test
|
|
167
179
|
Account.new.attributes = { password: "password", key: SECRET_KEY }
|
168
180
|
end
|
169
181
|
|
170
|
-
def test_should_preserve_hash_key_type
|
171
|
-
hash = { foo: 'bar' }
|
172
|
-
account = Account.create!(key: hash)
|
173
|
-
assert_equal account.key, hash
|
174
|
-
end
|
175
|
-
|
176
182
|
def test_should_create_changed_predicate
|
177
183
|
person = Person.create!(email: 'test@example.com')
|
178
184
|
refute person.email_changed?
|
@@ -198,6 +204,23 @@ class ActiveRecordTest < Minitest::Test
|
|
198
204
|
assert_equal old_zipcode, address.zipcode_was
|
199
205
|
end
|
200
206
|
|
207
|
+
def test_attribute_was_works_when_options_for_old_encrypted_value_are_different_than_options_for_new_encrypted_value
|
208
|
+
pw = 'password'
|
209
|
+
crypto_key = SecureRandom.base64(32)
|
210
|
+
old_iv = SecureRandom.random_bytes(12)
|
211
|
+
account = Account.create
|
212
|
+
encrypted_value = Encryptor.encrypt(value: pw, iv: old_iv, key: crypto_key)
|
213
|
+
Account.where(id: account.id).update_all(key: crypto_key, encrypted_password_iv: [old_iv].pack('m'), encrypted_password: [encrypted_value].pack('m'))
|
214
|
+
account = Account.find(account.id)
|
215
|
+
assert_equal pw, account.password
|
216
|
+
account.password = pw.reverse
|
217
|
+
assert_equal pw, account.password_was
|
218
|
+
account.save
|
219
|
+
account.reload
|
220
|
+
assert_equal Account::ACCOUNT_ENCRYPTION_KEY, account.key
|
221
|
+
assert_equal pw.reverse, account.password
|
222
|
+
end
|
223
|
+
|
201
224
|
if ::ActiveRecord::VERSION::STRING > "4.0"
|
202
225
|
def test_should_assign_attributes
|
203
226
|
@user = UserWithProtectedAttribute.new(login: 'login', is_admin: false)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attr_encrypted
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Huber
|
@@ -33,7 +33,7 @@ cert_chain:
|
|
33
33
|
ZjeLmnSDiwL6doiP5IiwALH/dcHU67ck3NGf6XyqNwQrrmtPY0mv1WVVL4Uh+vYE
|
34
34
|
kHoFzE2no0BfBg78Re8fY69P5yES5ncC
|
35
35
|
-----END CERTIFICATE-----
|
36
|
-
date: 2016-07-
|
36
|
+
date: 2016-07-22 00:00:00.000000000 Z
|
37
37
|
dependencies:
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: encryptor
|
@@ -226,6 +226,8 @@ files:
|
|
226
226
|
- checksum/attr_encrypted-3.0.0.gem.sha512
|
227
227
|
- checksum/attr_encrypted-3.0.1.gem.sha256
|
228
228
|
- checksum/attr_encrypted-3.0.1.gem.sha512
|
229
|
+
- checksum/attr_encrypted-3.0.2.gem.sha256
|
230
|
+
- checksum/attr_encrypted-3.0.2.gem.sha512
|
229
231
|
- lib/attr_encrypted.rb
|
230
232
|
- lib/attr_encrypted/adapters/active_record.rb
|
231
233
|
- lib/attr_encrypted/adapters/data_mapper.rb
|
metadata.gz.sig
CHANGED
Binary file
|