Skip to content

Commit fc9ccbd

Browse files
authored
Fix ActiveRecord::Encryption::Errors::Encoding incorrectly raises for not-encrypted binary encoded values (rails#51412)
1 parent 9f4f0bb commit fc9ccbd

File tree

8 files changed

+37
-5
lines changed

8 files changed

+37
-5
lines changed

activerecord/lib/active_record/encryption/encrypted_attribute_type.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,12 @@ def serialize_with_current(value)
134134
end
135135

136136
def encrypt_as_text(value)
137+
if encryptor.binary? && !cast_type.binary?
138+
raise Errors::Encoding, "Binary encoded data can only be stored in binary columns"
139+
end
140+
137141
with_context do
138-
encryptor.encrypt(value, **encryption_options).tap do |encrypted|
139-
if !cast_type.binary? && encrypted.encoding == Encoding::BINARY
140-
raise Errors::Encoding, "Binary encoded data can only be stored in binary columns"
141-
end
142-
end
142+
encryptor.encrypt(value, **encryption_options)
143143
end
144144
end
145145

activerecord/lib/active_record/encryption/encryptor.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ def encrypted?(text)
7474
false
7575
end
7676

77+
def binary?
78+
serializer.binary?
79+
end
80+
7781
private
7882
DECRYPT_ERRORS = [OpenSSL::Cipher::CipherError, Errors::EncryptedContentIntegrity, Errors::Decryption]
7983
ENCODING_ERRORS = [EncodingError, Errors::Encoding]

activerecord/lib/active_record/encryption/message_pack_message_serializer.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ def load(serialized_content)
3131
raise Errors::Decryption
3232
end
3333

34+
def binary?
35+
true
36+
end
37+
3438
private
3539
def message_to_hash(message)
3640
{

activerecord/lib/active_record/encryption/message_serializer.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ def dump(message)
3333
JSON.dump message_to_json(message)
3434
end
3535

36+
def binary?
37+
false
38+
end
39+
3640
private
3741
def parse_message(data, level)
3842
validate_message_data_format(data, level)

activerecord/lib/active_record/encryption/null_encryptor.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ def decrypt(encrypted_text, key_provider: nil, cipher_options: {})
1616
def encrypted?(text)
1717
false
1818
end
19+
20+
def binary?
21+
false
22+
end
1923
end
2024
end
2125
end

activerecord/lib/active_record/encryption/read_only_null_encryptor.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ def decrypt(encrypted_text, key_provider: nil, cipher_options: {})
1919
def encrypted?(text)
2020
false
2121
end
22+
23+
def binary?
24+
false
25+
end
2226
end
2327
end
2428
end

activerecord/test/cases/encryption/contexts_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ class ActiveRecord::Encryption::ContextsTest < ActiveRecord::EncryptionTestCase
6161
assert_not_encrypted_attribute @post, :title, "Some new title"
6262
end
6363

64+
test ".without_encryption doesn't raise on binary encoded data" do
65+
assert_nothing_raised do
66+
ActiveRecord::Encryption.without_encryption do
67+
EncryptedBook.create!(name: "Dune".encode(Encoding::BINARY))
68+
end
69+
end
70+
end
71+
6472
test ".protecting_encrypted_data don't decrypt attributes automatically" do
6573
ActiveRecord::Encryption.protecting_encrypted_data do
6674
assert_equal @title_ciphertext, @post.reload.title

activerecord/test/cases/encryption/encryption_schemes_test.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ def encrypted?(text)
199199
rescue ActiveRecord::Encryption::Errors::Decryption
200200
false
201201
end
202+
203+
def binary?
204+
false
205+
end
202206
end
203207

204208
class EncryptedAuthor1 < Author

0 commit comments

Comments
 (0)