Skip to content

Commit 8b9aec6

Browse files
committed
Fix encryption/decryption of arrays
1 parent 5f8afc2 commit 8b9aec6

File tree

4 files changed

+27
-8
lines changed

4 files changed

+27
-8
lines changed

lib/diffcrypt/encryptor.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,21 @@ def decrypt(contents)
3333

3434
# @param [Hash] data
3535
# @return [Hash]
36+
# rubocop:disable Metrics/MethodLength
3637
def decrypt_hash(data)
3738
data.each do |key, value|
38-
data[key] = if value.is_a?(Hash) || value.is_a?(Array)
39+
data[key] = case value
40+
when Hash
3941
decrypt_hash(value)
42+
when Array
43+
value.map { |v| decrypt_hash(v) }
4044
else
4145
decrypt_string value
4246
end
4347
end
4448
data
4549
end
50+
# rubocop:enable Metrics/MethodLength
4651

4752
# @param [String] contents The raw YAML string to be encrypted
4853
# @param [String, nil] original_encrypted_contents The original (encrypted) content to determine which keys have changed
@@ -72,14 +77,18 @@ def encrypt_string(value)
7277
end
7378

7479
# TODO: Fix the complexity of this method
75-
# rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/CyclomaticComplexity
80+
# rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
7681
# @param [Hash] keys
7782
# @return [Hash]
7883
def encrypt_values(data, original_data = nil)
7984
data.each do |key, value|
8085
original_encrypted_value = original_data ? original_data[key] : nil
81-
data[key] = if value.is_a?(Hash) || value.is_a?(Array)
86+
87+
data[key] = case value
88+
when Hash
8289
encrypt_values(value, original_encrypted_value)
90+
when Array
91+
value.map { |v| encrypt_values(v, original_encrypted_value) }
8392
else
8493
original_decrypted_value = original_encrypted_value ? decrypt_string(original_encrypted_value) : nil
8594
key_changed = original_decrypted_value.nil? || original_decrypted_value != value
@@ -88,7 +97,7 @@ def encrypt_values(data, original_data = nil)
8897
end
8998
data.sort.to_h
9099
end
91-
# rubocop:enable Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/CyclomaticComplexity
100+
# rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity
92101

93102
# @param [String] value The encrypted value that needs decrypting
94103
# @return [String]

lib/diffcrypt/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module Diffcrypt
4-
VERSION = '0.6.1'
4+
VERSION = '0.6.2'
55
end

test/diffcrypt/encryptor_test.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,19 @@ def test_it_encrypts_root_values
4646
def test_it_decrypts_nested_structures
4747
encrypted_content = <<~CONTENT
4848
data:
49+
array:
50+
- item1: 7HJjrwQ6KqH+jvu1pOZGqQ==--E2ipnCNCszD6oixM--QZapG/8wrPtwbUVDe9evsw==
51+
- item2: IvwdxcAV+38MvNsKYdNCEg==--6y7Aj4nmFLOTGrx3--rRH8ni3yks2eid91jde2hg==
4952
secret_key_base: 88Ry6HESUoXBr6QUFXmni9zzfCIYt9qGNFvIWFcN--4xoecI5mqbNRBibI--62qPJbkzzh5h8lhFEFOSaQ==
5053
aws:
5154
access_key_id: Ot/uCTEL+8kp61EPctnxNlg=--Be6sg7OdvjZlfxgR--7qRbbf0lA4VgjnUGUrrFwg==
55+
5256
CONTENT
5357
expected = <<~CONTENT
5458
---
59+
array:
60+
- item1: value1
61+
- item2: value2
5562
secret_key_base: secret_key_base_test
5663
aws:
5764
access_key_id: AKIAXXX
@@ -66,8 +73,11 @@ def test_it_encrypts_nested_structures
6673
secret_key_base: secret_key_base_test
6774
aws:
6875
access_key_id: AKIAXXX
76+
array:
77+
- item1: value1
78+
- item2: value2
6979
CONTENT
70-
expected_pattern = /---\naws:\n access_key_id: #{ENCRYPTED_VALUE_PATTERN}\nsecret_key_base: #{ENCRYPTED_VALUE_PATTERN}\n/
80+
expected_pattern = /---\narray:\n- item1: #{ENCRYPTED_VALUE_PATTERN}\n- item2: #{ENCRYPTED_VALUE_PATTERN}\naws:\n access_key_id: #{ENCRYPTED_VALUE_PATTERN}\nsecret_key_base: #{ENCRYPTED_VALUE_PATTERN}/
7181

7282
assert_match expected_pattern, Diffcrypt::Encryptor.new(TEST_KEY_128, cipher: 'aes-128-gcm').encrypt_data(content).to_yaml
7383
end

test/rails_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
require 'open3'
77

88
RAILS_VERSIONS = %w[
9-
6.0.4.4
9+
6.0.6.1
1010
6.1.4.4
11-
7.0.1
11+
7.0.4.3
1212
].freeze
1313

1414
RAILS_FLAGS = %w[

0 commit comments

Comments
 (0)