Skip to content

Commit 4885648

Browse files
Remove memoization of key provider
This is necessary to allow key_provider to be changed dynamically using with_encryption_context. Co-authored-by: Kyle Stevens <[email protected]>
1 parent bab4aa7 commit 4885648

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

activerecord/lib/active_record/encryption/encrypted_attribute_type.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,11 +140,11 @@ def encryptor
140140
end
141141

142142
def encryption_options
143-
@encryption_options ||= { key_provider: key_provider, cipher_options: { deterministic: deterministic? } }.compact
143+
{ key_provider: key_provider, cipher_options: { deterministic: deterministic? } }.compact
144144
end
145145

146146
def decryption_options
147-
@decryption_options ||= { key_provider: key_provider }.compact
147+
{ key_provider: key_provider }.compact
148148
end
149149

150150
def clean_text_scheme

activerecord/lib/active_record/encryption/scheme.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def fixed?
5050
end
5151

5252
def key_provider
53-
@key_provider ||= @key_provider_param || build_key_provider || default_key_provider
53+
@key_provider_param || build_key_provider || default_key_provider
5454
end
5555

5656
def merge(other_scheme)

activerecord/test/cases/encryption/encryptable_record_test.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,51 @@ class ActiveRecord::Encryption::EncryptableRecordTest < ActiveRecord::Encryption
3333
assert_invalid_key_cant_read_attribute(post, :body)
3434
end
3535

36+
test "swapping key_providers via with_encryption_context" do
37+
key_provider1 = ActiveRecord::Encryption::DerivedSecretKeyProvider.new(SecureRandom.base64(32))
38+
key_provider2 = ActiveRecord::Encryption::DerivedSecretKeyProvider.new(SecureRandom.base64(32))
39+
40+
post1 = post2 = nil
41+
42+
ActiveRecord::Encryption.with_encryption_context key_provider: key_provider1 do
43+
post1 = EncryptedPost.create!(title: "post1!", body: "first post!")
44+
end
45+
46+
ActiveRecord::Encryption.with_encryption_context key_provider: key_provider2 do
47+
post2 = EncryptedPost.create!(title: "post2!", body: "second post!")
48+
end
49+
50+
post1.reload
51+
assert_raises ActiveRecord::Encryption::Errors::Decryption do
52+
post1.title
53+
end
54+
55+
post2.reload
56+
assert_raises ActiveRecord::Encryption::Errors::Decryption do
57+
post2.title
58+
end
59+
60+
ActiveRecord::Encryption.with_encryption_context key_provider: key_provider1 do
61+
post1.reload
62+
assert_equal "post1!", post1.title
63+
64+
post2.reload
65+
assert_raises ActiveRecord::Encryption::Errors::Decryption do
66+
post2.title
67+
end
68+
end
69+
70+
ActiveRecord::Encryption.with_encryption_context key_provider: key_provider2 do
71+
post2.reload
72+
assert_equal "post2!", post2.title
73+
74+
post1.reload
75+
assert_raises ActiveRecord::Encryption::Errors::Decryption do
76+
post1.title
77+
end
78+
end
79+
end
80+
3681
test "ignores nil values" do
3782
assert_nil EncryptedBook.create!(name: nil).name
3883
end

0 commit comments

Comments
 (0)