chamber 2.8.0 → 2.9.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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -0
  4. data/LICENSE.txt +19 -0
  5. data/Rakefile +1 -0
  6. data/bin/chamber +1 -0
  7. data/lib/chamber.rb +1 -0
  8. data/lib/chamber/binary/heroku.rb +1 -0
  9. data/lib/chamber/binary/runner.rb +1 -0
  10. data/lib/chamber/binary/travis.rb +1 -0
  11. data/lib/chamber/commands/base.rb +1 -0
  12. data/lib/chamber/commands/comparable.rb +1 -0
  13. data/lib/chamber/commands/compare.rb +1 -0
  14. data/lib/chamber/commands/files.rb +1 -0
  15. data/lib/chamber/commands/heroku.rb +1 -0
  16. data/lib/chamber/commands/heroku/clear.rb +1 -0
  17. data/lib/chamber/commands/heroku/compare.rb +1 -0
  18. data/lib/chamber/commands/heroku/pull.rb +1 -0
  19. data/lib/chamber/commands/heroku/push.rb +1 -0
  20. data/lib/chamber/commands/initialize.rb +5 -3
  21. data/lib/chamber/commands/securable.rb +1 -0
  22. data/lib/chamber/commands/secure.rb +1 -0
  23. data/lib/chamber/commands/show.rb +1 -0
  24. data/lib/chamber/commands/travis.rb +1 -0
  25. data/lib/chamber/commands/travis/secure.rb +1 -0
  26. data/lib/chamber/configuration.rb +1 -0
  27. data/lib/chamber/context_resolver.rb +10 -7
  28. data/lib/chamber/decryption_key.rb +1 -0
  29. data/lib/chamber/encryption_methods/none.rb +17 -0
  30. data/lib/chamber/encryption_methods/public_key.rb +27 -0
  31. data/lib/chamber/encryption_methods/ssl.rb +60 -0
  32. data/lib/chamber/environmentable.rb +1 -0
  33. data/lib/chamber/errors/decryption_failure.rb +1 -0
  34. data/lib/chamber/file.rb +9 -1
  35. data/lib/chamber/file_set.rb +4 -3
  36. data/lib/chamber/filters/boolean_conversion_filter.rb +2 -1
  37. data/lib/chamber/filters/decryption_filter.rb +20 -29
  38. data/lib/chamber/filters/encryption_filter.rb +29 -14
  39. data/lib/chamber/filters/environment_filter.rb +2 -1
  40. data/lib/chamber/filters/failed_decryption_filter.rb +3 -2
  41. data/lib/chamber/filters/insecure_filter.rb +1 -0
  42. data/lib/chamber/filters/namespace_filter.rb +2 -1
  43. data/lib/chamber/filters/secure_filter.rb +2 -1
  44. data/lib/chamber/filters/translate_secure_keys_filter.rb +2 -1
  45. data/lib/chamber/instance.rb +1 -0
  46. data/lib/chamber/namespace_set.rb +4 -3
  47. data/lib/chamber/rails.rb +1 -0
  48. data/lib/chamber/rails/railtie.rb +3 -1
  49. data/lib/chamber/rubinius_fix.rb +1 -0
  50. data/lib/chamber/settings.rb +23 -18
  51. data/lib/chamber/version.rb +2 -1
  52. data/spec/lib/chamber/commands/files_spec.rb +5 -2
  53. data/spec/lib/chamber/commands/heroku/clear_spec.rb +1 -0
  54. data/spec/lib/chamber/commands/heroku/compare_spec.rb +1 -0
  55. data/spec/lib/chamber/commands/heroku/pull_spec.rb +1 -0
  56. data/spec/lib/chamber/commands/heroku/push_spec.rb +1 -0
  57. data/spec/lib/chamber/commands/secure_spec.rb +5 -2
  58. data/spec/lib/chamber/commands/show_spec.rb +1 -0
  59. data/spec/lib/chamber/context_resolver_spec.rb +8 -5
  60. data/spec/lib/chamber/file_set_spec.rb +55 -52
  61. data/spec/lib/chamber/file_spec.rb +43 -9
  62. data/spec/lib/chamber/filters/boolean_conversion_filter_spec.rb +14 -5
  63. data/spec/lib/chamber/filters/decryption_filter_spec.rb +85 -9
  64. data/spec/lib/chamber/filters/encryption_filter_spec.rb +76 -10
  65. data/spec/lib/chamber/filters/environment_filter_spec.rb +9 -2
  66. data/spec/lib/chamber/filters/failed_decryption_filter_spec.rb +7 -6
  67. data/spec/lib/chamber/filters/insecure_filter_spec.rb +12 -4
  68. data/spec/lib/chamber/filters/namespace_filter_spec.rb +33 -14
  69. data/spec/lib/chamber/filters/secure_filter_spec.rb +8 -3
  70. data/spec/lib/chamber/filters/translate_secure_keys_filter_spec.rb +10 -3
  71. data/spec/lib/chamber/namespace_set_spec.rb +6 -3
  72. data/spec/lib/chamber/settings_spec.rb +36 -25
  73. data/spec/lib/chamber_spec.rb +25 -10
  74. data/spec/rails-2-test/config/application.rb +1 -0
  75. data/spec/rails-3-test/config/application.rb +1 -0
  76. data/spec/rails-4-test/config/application.rb +1 -0
  77. metadata +35 -9
  78. metadata.gz.sig +0 -0
  79. data/LICENSE +0 -22
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'rspectacular'
2
3
  require 'chamber/file'
3
4
  require 'chamber/settings'
@@ -59,16 +60,18 @@ describe File do
59
60
  tempfile = create_tempfile_with_content '{ test: settings }'
60
61
  settings_file = File.new path: tempfile.path,
61
62
  namespaces: {
62
- environment: :development }
63
+ environment: :development,
64
+ }
63
65
 
64
- allow(Settings).to receive(:new)
66
+ allow(Settings).to receive(:new)
65
67
 
66
68
  settings_file.to_settings
67
69
 
68
70
  expect(Settings).to have_received(:new).
69
71
  with(settings: { 'test' => 'settings' },
70
72
  namespaces: {
71
- environment: :development },
73
+ environment: :development,
74
+ },
72
75
  decryption_key: nil,
73
76
  encryption_key: nil)
74
77
  end
@@ -77,7 +80,7 @@ describe File do
77
80
  tempfile = create_tempfile_with_content '{ test: <%= 1 + 1 %> }'
78
81
  settings_file = File.new path: tempfile.path
79
82
 
80
- allow(Settings).to receive(:new)
83
+ allow(Settings).to receive(:new)
81
84
 
82
85
  settings_file.to_settings
83
86
  expect(Settings).to have_received(:new).
@@ -112,9 +115,9 @@ HEREDOC
112
115
 
113
116
  settings_file.secure
114
117
 
115
- settings_file = File.new path: tempfile.path
118
+ settings_file = File.new path: tempfile.path
116
119
 
117
- expect(settings_file.to_settings.send(:raw_data)['_secure_setting']).to match Filters::EncryptionFilter::BASE64_STRING_PATTERN
120
+ expect(settings_file.to_settings.__send__(:raw_data)['_secure_setting']).to match Filters::EncryptionFilter::BASE64_STRING_PATTERN
118
121
  end
119
122
 
120
123
  it 'does not encrypt the settings contained in a file which are already secure' do
@@ -128,8 +131,8 @@ HEREDOC
128
131
 
129
132
  settings_file.secure
130
133
 
131
- settings_file = File.new path: tempfile.path
132
- raw_data = settings_file.to_settings.send(:raw_data)
134
+ settings_file = File.new path: tempfile.path
135
+ raw_data = settings_file.to_settings.__send__(:raw_data)
133
136
  secure_setting = raw_data['_secure_setting']
134
137
  other_secure_setting = raw_data['_secure_other_setting']
135
138
 
@@ -145,7 +148,7 @@ HEREDOC
145
148
  end
146
149
 
147
150
  it 'does not rewrite the entire file but only the encrypted settings' do
148
- tempfile = create_tempfile_with_content <<-HEREDOC
151
+ tempfile = create_tempfile_with_content <<-HEREDOC
149
152
  default:
150
153
  stuff: &default
151
154
  _secure_setting: hello
@@ -181,6 +184,37 @@ other:
181
184
  HEREDOC
182
185
  end
183
186
 
187
+ it 'can handle encrypting multiline strings' do
188
+ tempfile = create_tempfile_with_content <<-HEREDOC
189
+ other:
190
+ stuff:
191
+ _secure_setting: |
192
+ -----BEGIN RSA PRIVATE KEY-----
193
+ uQ431irYF7XGEwmsfNUcw++6Enjmt9MItVZJrfL4cUr84L1ccOEX9AThsxz2nkiO
194
+ GgU+HtwwueZDUZ8Pdn71+1CdVaSUeEkVaYKYuHwYVb1spGfreHQHRP90EMv3U5Ir
195
+ xs0YFwKBgAJKGol+GM1oFodg48v4QA6hlF5z49v83wU+AS2f3aMVfjkTYgAEAoCT
196
+ qoSi7wkYK3NvftVgVi8Z2+1WEzp3S590UkkHmjc5o+HfS657v2fnqkekJyinB+OH
197
+ b5tySsPxt/3Un4D9EaGhjv44GMvL54vFI1Sqc8RsF/H8lRvj5ai5
198
+ -----END RSA PRIVATE KEY-----
199
+ something_else: 'right here'
200
+ HEREDOC
201
+
202
+ settings_file = File.new path: tempfile.path,
203
+ encryption_key: './spec/spec_key.pub'
204
+
205
+ settings_file.secure
206
+
207
+ file_contents = ::File.read(tempfile.path)
208
+ secure_setting_encoded = file_contents[/ _secure_setting: (.*)$/, 1]
209
+
210
+ expect(::File.read(tempfile.path)).to eql <<-HEREDOC
211
+ other:
212
+ stuff:
213
+ _secure_setting: #{secure_setting_encoded}
214
+ something_else: 'right here'
215
+ HEREDOC
216
+ end
217
+
184
218
  it 'when rewriting the file, can handle names and values with regex special ' \
185
219
  'characters' do
186
220
 
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  require 'rspectacular'
2
3
  require 'chamber/filters/boolean_conversion_filter'
3
4
 
4
5
  module Chamber
5
6
  module Filters
6
7
  describe BooleanConversionFilter do
8
+ # rubocop:disable Lint/DuplicatedKey
7
9
  it 'can convert string boolean values into TrueClass and FalseClass even if they ' \
8
10
  'are deeply nested' do
9
11
 
@@ -18,13 +20,17 @@ describe BooleanConversionFilter do
18
20
  false_boolean: 'false',
19
21
  no_boolean: 'no',
20
22
  nilly: nil,
21
- non_boolean: 3 },
23
+ non_boolean: 3,
24
+ },
22
25
  f_boolean: 'f',
23
26
  non_boolean: Time.utc(2012, 8, 1),
24
- nilly: nil },
27
+ nilly: nil,
28
+ },
25
29
  false_boolean: 'false',
26
30
  nilly: nil,
27
- non_boolean: [1, 2, 3] })
31
+ non_boolean: [1, 2, 3],
32
+ },
33
+ )
28
34
 
29
35
  expect(filtered_data).to eql(true_boolean: true,
30
36
  boolean_group: {
@@ -35,14 +41,17 @@ describe BooleanConversionFilter do
35
41
  false_boolean: false,
36
42
  no_boolean: false,
37
43
  nilly: nil,
38
- non_boolean: 3 },
44
+ non_boolean: 3,
45
+ },
39
46
  f_boolean: false,
40
47
  non_boolean: Time.utc(2012, 8, 1),
41
- nilly: nil },
48
+ nilly: nil,
49
+ },
42
50
  false_boolean: false,
43
51
  nilly: nil,
44
52
  non_boolean: [1, 2, 3])
45
53
  end
54
+ # rubocop:enable Lint/DuplicatedKey
46
55
  end
47
56
  end
48
57
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'rspectacular'
2
3
  require 'chamber/filters/decryption_filter'
3
4
 
@@ -15,11 +16,49 @@ describe DecryptionFilter do
15
16
  'S7u2CJ0sN5eINMngJBfv5ZFrZgfXc86wdgUKc8aaoX8OQA1kK' \
16
17
  'TcdgbE9NcAhNr1+WfNxMnz84XzmUp2Y0H1jPgGkBKQJKArfQ==',
17
18
  },
18
- decryption_key: './spec/spec_key')
19
+ decryption_key: './spec/spec_key',
20
+ )
19
21
 
20
22
  expect(filtered_settings._secure_my_secure_setting).to eql 'hello'
21
23
  end
22
24
 
25
+ it 'will correct decrypt values which contain multiline strings' do
26
+ filtered_settings = DecryptionFilter.execute(
27
+ data: {
28
+ _secure_my_secure_setting: 'Q0ImhgdRmOdXEx04E3TnMoW/c6ckuce+y4kYGYWIJM6W/nBJBF' \
29
+ 'jnqcFru/6wo+TVEZxowxjxJNv8H6SuxYmahxMRl7AajTrJ/QD+' \
30
+ 'bKzbStL7D2oViB1dDNUz4GZxeNDSMU0oF9e67ih6AmnxAgI0Rl' \
31
+ 'EterOMyWOPHJIUrLquBRlIs0JyP8yermN9KWOAeLZdJlIGSyfw' \
32
+ 'EU+sWQtafJ3jiNAPqWTGJxHfQZTQHn+q4SnZPPnBPK0dZiZzqO' \
33
+ 'rtkzmVPR7SAT5Ube4CxJWhkpWpl5rPgamqVsG/P0AalMqLxuPU' \
34
+ 'XqSdOEWKkK6jerbElVyQ7FdRBLau2JXHpDZYGw8KTA==#EPCuI' \
35
+ 'el5w17aUZfpHOuFNQ==#VzcE0BIuqA7xUMYEZkWZa4kOPse95N' \
36
+ 'iow+e/FhKAlG/7uYYTmkRbxRiMLtzH1Swzyz0NHF/BJPa1rKRb' \
37
+ 'cVCGjK8v13O9zJY8UdCQYsrdQaTIOA95NIcxwLCbrYencDzZFx' \
38
+ 'YtOgioyXbW9OCPnjDe9ozkCw6prRclgJyvadvKWqBgaJkluIdi' \
39
+ 'kCDLX+Dy7fjkLtq5GqPFeFjHKwRGMLQB5dYk1VNAKgzhnSpUkJ' \
40
+ 'JZA2Z7P54NhQQ83Doypfwb16LfKFax9575XeUWZeURxl7Ric4M' \
41
+ 'rjJYrc3u5biTzToMQBITGEsComsTDpfB3FVtZhobNjzdkhEGzf' \
42
+ '6F2iRjjHDsQfaUebAPxDVFa31p5XGQN7YJDeAXYBLb16kAhv8N' \
43
+ '5DGwiukPjtUVXUfFQzaTnJWm/eIhQKFH8rkVawAr9wAeoSz7cw' \
44
+ 'WFyD+pq5QF9GlxPU5ZotNjrqO4rz/s8+bkt2XwBANTVCZrTb9g' \
45
+ 'nE9FyIqFmRZ9L8Ef43KE02wDcUnrKp3oOMSItWnY5rFJew0eAU' \
46
+ '+CHQ==',
47
+ },
48
+ decryption_key: './spec/spec_key',
49
+ )
50
+
51
+ expect(filtered_settings._secure_my_secure_setting).to eql <<-HEREDOC
52
+ -----BEGIN RSA PRIVATE KEY-----
53
+ uQ431irYF7XGEwmsfNUcw++6Enjmt9MItVZJrfL4cUr84L1ccOEX9AThsxz2nkiO
54
+ GgU+HtwwueZDUZ8Pdn71+1CdVaSUeEkVaYKYuHwYVb1spGfreHQHRP90EMv3U5Ir
55
+ xs0YFwKBgAJKGol+GM1oFodg48v4QA6hlF5z49v83wU+AS2f3aMVfjkTYgAEAoCT
56
+ qoSi7wkYK3NvftVgVi8Z2+1WEzp3S590UkkHmjc5o+HfS657v2fnqkekJyinB+OH
57
+ b5tySsPxt/3Un4D9EaGhjv44GMvL54vFI1Sqc8RsF/H8lRvj5ai5
58
+ -----END RSA PRIVATE KEY-----
59
+ HEREDOC
60
+ end
61
+
23
62
  it 'will not attempt to decrypt values which are not marked as "secure"' do
24
63
  filtered_settings = DecryptionFilter.execute(
25
64
  data: {
@@ -29,8 +68,10 @@ describe DecryptionFilter do
29
68
  'nf+rU31YGDJUTf34ESz7fsQGSc9DjkBb9ao8Mv4cI7pCXkQZD' \
30
69
  'wS5kLAZDf6agy1GzeL71Z8lrmQzk8QQuf/1kQzxsWVlzpKNXW' \
31
70
  'S7u2CJ0sN5eINMngJBfv5ZFrZgfXc86wdgUKc8aaoX8OQA1kK' \
32
- 'TcdgbE9NcAhNr1+WfNxMnz84XzmUp2Y0H1jPgGkBKQJKArfQ==' },
33
- decryption_key: './spec/spec_key')
71
+ 'TcdgbE9NcAhNr1+WfNxMnz84XzmUp2Y0H1jPgGkBKQJKArfQ==',
72
+ },
73
+ decryption_key: './spec/spec_key',
74
+ )
34
75
 
35
76
  my_secure_setting = filtered_settings.my_secure_setting
36
77
 
@@ -54,7 +95,8 @@ describe DecryptionFilter do
54
95
  'WVlzpKNXWS7u2CJ0sN5eINMngJBfv5ZFrZgfXc86wdgUKc8aaoX8OQA1kKT' \
55
96
  'cdgbE9NcAhNr1+WfNxMnz84XzmUp2Y0H1jPgGkBKQJKArfQ==',
56
97
  },
57
- decryption_key: './spec/spec_key')
98
+ decryption_key: './spec/spec_key',
99
+ )
58
100
 
59
101
  secure_setting = filtered_settings.secure_setting
60
102
 
@@ -78,7 +120,8 @@ describe DecryptionFilter do
78
120
  'WS7u2CJ0sN5eINMngJBfv5ZFrZgfXc86wdgUKc8aaoX8OQA1k' \
79
121
  'KTcdgbE9NcAhNr1+WfNxMnz84XzmUp2Y0H1jPgGkBKQJKArfQ==',
80
122
  },
81
- decryption_key: './spec/spec_key')
123
+ decryption_key: './spec/spec_key',
124
+ )
82
125
 
83
126
  my_secure_setting = filtered_settings._secure_my_secure_setting
84
127
 
@@ -93,7 +136,8 @@ describe DecryptionFilter do
93
136
 
94
137
  it 'will not attempt to decrypt values if it guesses that they are not encrpyted' do
95
138
  filtered_settings = DecryptionFilter.execute(data: {
96
- _secure_my_secure_setting: 'hello' },
139
+ _secure_my_secure_setting: 'hello',
140
+ },
97
141
  decryption_key: './spec/spec_key')
98
142
 
99
143
  expect(filtered_settings._secure_my_secure_setting).to eql 'hello'
@@ -134,7 +178,8 @@ describe DecryptionFilter do
134
178
  'bnjz7fU7x+d5/ighWTDsmOVyvEiqM0WasFzK+WBUfvo8tQxUym' \
135
179
  'exw/U3B7N/0R/9v6U3l6x7eeIoQ4+lnJK2ULFzVgiw==',
136
180
  },
137
- decryption_key: './spec/spec_key')
181
+ decryption_key: './spec/spec_key',
182
+ )
138
183
 
139
184
  expect(filtered_settings._secure_my_secure_setting).to be_a Integer
140
185
  expect(filtered_settings._secure_my_secure_setting).to eql 12_345
@@ -151,7 +196,8 @@ describe DecryptionFilter do
151
196
  '+Ry2k+yIGJXIOjNm96ntDxIuUbycfrqYdtopBDI5kcr0zckPWM' \
152
197
  'QRqkp7yd/XNZqyYCFGMNKNwokE6wZuGffkD/H/VPxQ==',
153
198
  },
154
- decryption_key: './spec/spec_key')
199
+ decryption_key: './spec/spec_key',
200
+ )
155
201
 
156
202
  expect(filtered_settings._secure_my_secure_setting).to eql '12345'
157
203
  end
@@ -167,10 +213,40 @@ describe DecryptionFilter do
167
213
  '8JIedOuy4JV4Y46QPvu4zCZhDgNa4dTCdOTA/oEd5+GLhuoSiC' \
168
214
  '87k/vbURwhqs1fmyXUJpUaDg3x4quTDZ6uBTG0Qu/A==',
169
215
  },
170
- decryption_key: './spec/spec_key')
216
+ decryption_key: './spec/spec_key',
217
+ )
171
218
 
172
219
  expect(filtered_settings._secure_my_secure_setting).to eql 'hello'
173
220
  end
221
+
222
+ it 'can decrypt large encrypted data' do
223
+ filtered_settings = DecryptionFilter.execute(
224
+ data: {
225
+ _secure_my_secure_setting: 'AcMY7ALLoGZRakL3ibyo2WB438ipdMDIjsa4SCDBP2saOY63A' \
226
+ 'D3C/SZanexlYDQoYoYC0V5J5EvKHgGMDAU8qnp9LjzU5VCwJ3' \
227
+ 'SVRGz3J0c7LXgTlC585Lgy8LX+/yjYFm4D13hlMvvsoI35Bo8' \
228
+ 'EVkTSU2+0gRSjRpQJeK1o7az5+fBuNmFipevA4YfLnarnpwo2' \
229
+ 'd2oO+BqStI2QQI1UWwN2R04rvOdHoEzA6DLsdvYX+QTKDk4K5' \
230
+ 'oSKXfuMBvzOCaCGT75cmt85ZY7XZnwbKi6c4mtL1ajrCr8sQF' \
231
+ 'TA/GyG1EiYLFp1uQco0m2/S9yFf26REjax4ZE6O/ilXgT6xg=' \
232
+ '=#YAm25swWRQx4ip1RjVzpGQ==#vRGvgjErI+dATM4UOtFkkg' \
233
+ 'efFpFTvxGpHN0gRbf1VCO4K07eqAQPb46BDI67a8iNum9cBph' \
234
+ 'es7oGmuNnUvBg4JiZhKsXnolcRWdITDVh/XYNioXRmesvj4x+' \
235
+ 'tY0FVhkLV2zubRVfC7CDJgin6wRHP+bcZhICDD2YqB+XRS4ou' \
236
+ '66UeaiGA4eV4G6sPIo+DPjDM3m8JFnuRFMvGk73wthbN4MdAp' \
237
+ '9xONt5wfobJUiUR11k2iAqwhx7Wyj0imz/afI8goDTdMfQt3V' \
238
+ 'DOYqYG3y2AcYOfsOL6m0GtQRlKvtsvw+m8/ICwSGiL2Loup0j' \
239
+ '/jDGhFi1lwf4ded8aSwyS+2/Ks9C008dsJwpR1SxJ59z1KSzd' \
240
+ 'QcTcrJTnxd+2qpOVVIoaRGud2tSV+5wKXy9dWRflLsjEtBRFR' \
241
+ 'eFurTVQPodjDy+Lhs452/O/+KAJOXMKeYegCGOe8z9tLD3tel' \
242
+ 'jjTyJPeW/1FE3+tP3G3HJAV4sgoO0YwhNY1Nji56igCl3UvEP' \
243
+ 'nEQcJgu0w/+dqSreqwp6TqaqXY3lzr8vi733lti4nss=',
244
+ },
245
+ decryption_key: './spec/spec_key',
246
+ )
247
+
248
+ expect(filtered_settings._secure_my_secure_setting).to eql 'long' * 100
249
+ end
174
250
  end
175
251
  end
176
252
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'rspectacular'
2
3
  require 'chamber/filters/encryption_filter'
3
4
 
@@ -7,8 +8,10 @@ describe EncryptionFilter do
7
8
  it 'will attempt to encrypt values which are marked as "secure"' do
8
9
  filtered_settings = EncryptionFilter.execute(
9
10
  data: {
10
- _secure_my_secure_setting: 'hello' },
11
- encryption_key: './spec/spec_key.pub')
11
+ _secure_my_secure_setting: 'hello',
12
+ },
13
+ encryption_key: './spec/spec_key.pub',
14
+ )
12
15
 
13
16
  expect(filtered_settings._secure_my_secure_setting).to match \
14
17
  EncryptionFilter::BASE64_STRING_PATTERN
@@ -17,8 +20,10 @@ describe EncryptionFilter do
17
20
  it 'will not attempt to encrypt values which are not marked as "secure"' do
18
21
  filtered_settings = EncryptionFilter.execute(
19
22
  data: {
20
- my_secure_setting: 'hello' },
21
- encryption_key: './spec/spec_key.pub')
23
+ my_secure_setting: 'hello',
24
+ },
25
+ encryption_key: './spec/spec_key.pub',
26
+ )
22
27
 
23
28
  expect(filtered_settings.my_secure_setting).to eql 'hello'
24
29
  end
@@ -26,8 +31,10 @@ describe EncryptionFilter do
26
31
  it 'will not attempt to encrypt values even if they are prefixed with "secure"' do
27
32
  filtered_settings = EncryptionFilter.execute(
28
33
  data: {
29
- secure_setting: 'hello' },
30
- encryption_key: './spec/spec_key.pub')
34
+ secure_setting: 'hello',
35
+ },
36
+ encryption_key: './spec/spec_key.pub',
37
+ )
31
38
 
32
39
  expect(filtered_settings.secure_setting).to eql 'hello'
33
40
  end
@@ -35,8 +42,10 @@ describe EncryptionFilter do
35
42
  it 'will attempt to encrypt values if they are not properly encoded' do
36
43
  filtered_settings = EncryptionFilter.execute(
37
44
  data: {
38
- _secure_my_secure_setting: 'fNI5\jwlBn' },
39
- encryption_key: './spec/spec_key.pub')
45
+ _secure_my_secure_setting: 'fNI5\jwlBn',
46
+ },
47
+ encryption_key: './spec/spec_key.pub',
48
+ )
40
49
 
41
50
  expect(filtered_settings._secure_my_secure_setting).to match \
42
51
  EncryptionFilter::BASE64_STRING_PATTERN
@@ -44,7 +53,8 @@ describe EncryptionFilter do
44
53
 
45
54
  it 'will attempt to encrypt values if they are numbers' do
46
55
  filtered_settings = EncryptionFilter.execute(data: {
47
- _secure_my_secure_setting: 12_345 },
56
+ _secure_my_secure_setting: 12_345,
57
+ },
48
58
  encryption_key: './spec/spec_key.pub')
49
59
 
50
60
  expect(filtered_settings._secure_my_secure_setting).to match \
@@ -62,7 +72,8 @@ describe EncryptionFilter do
62
72
  'UUnZuIE/y+P4A3wgD6G/u8hgvAW51JwVryg/im1rayGAwWYNg' \
63
73
  'upQ/5LDmjffwx7Q3fyMH2uF3CDIKRIC6U+mnM5SRMO4Dzysw==',
64
74
  },
65
- encryption_key: './spec/spec_key.pub')
75
+ encryption_key: './spec/spec_key.pub',
76
+ )
66
77
 
67
78
  my_secure_setting = filtered_settings._secure_my_secure_setting
68
79
 
@@ -75,6 +86,61 @@ describe EncryptionFilter do
75
86
  'AW51JwVryg/im1rayGAwWYNgupQ/5LDmjffwx7Q3fyMH2' \
76
87
  'uF3CDIKRIC6U+mnM5SRMO4Dzysw=='
77
88
  end
89
+
90
+ it 'can encrypt long multiline strings' do
91
+ filtered_settings = EncryptionFilter.execute(
92
+ data: {
93
+ _secure_multiline: <<-HEREDOC
94
+ -----BEGIN RSA PRIVATE KEY-----
95
+ uQ431irYF7XGEwmsfNUcw++6Enjmt9MItVZJrfL4cUr84L1ccOEX9AThsxz2nkiO
96
+ GgU+HtwwueZDUZ8Pdn71+1CdVaSUeEkVaYKYuHwYVb1spGfreHQHRP90EMv3U5Ir
97
+ xs0YFwKBgAJKGol+GM1oFodg48v4QA6hlF5z49v83wU+AS2f3aMVfjkTYgAEAoCT
98
+ qoSi7wkYK3NvftVgVi8Z2+1WEzp3S590UkkHmjc5o+HfS657v2fnqkekJyinB+OH
99
+ b5tySsPxt/3Un4D9EaGhjv44GMvL54vFI1Sqc8RsF/H8lRvj5ai5
100
+ -----END RSA PRIVATE KEY-----
101
+ HEREDOC
102
+ },
103
+ encryption_key: './spec/spec_key.pub',
104
+ )
105
+
106
+ my_secure_setting = filtered_settings._secure_multiline
107
+
108
+ expect(my_secure_setting).to match(EncryptionFilter::LARGE_DATA_STRING_PATTERN)
109
+ end
110
+
111
+ it 'will encrypt strings of 127 chars effective length' do
112
+ filtered_settings = EncryptionFilter.execute(
113
+ data: {
114
+ _secure_my_secure_setting: 'A' * 119,
115
+ },
116
+ encryption_key: './spec/spec_key.pub',
117
+ )
118
+
119
+ expect(filtered_settings._secure_my_secure_setting).to match \
120
+ EncryptionFilter::BASE64_STRING_PATTERN
121
+
122
+ filtered_settings = EncryptionFilter.execute(
123
+ data: {
124
+ _secure_my_secure_setting: 'A' * 120,
125
+ },
126
+ encryption_key: './spec/spec_key.pub',
127
+ )
128
+
129
+ expect(filtered_settings._secure_my_secure_setting).to match \
130
+ EncryptionFilter::LARGE_DATA_STRING_PATTERN
131
+ end
132
+
133
+ it 'will encrypt and decrypt strings larger than 128 chars' do
134
+ filtered_settings = EncryptionFilter.execute(
135
+ data: {
136
+ _secure_my_secure_setting: 'long' * 100,
137
+ },
138
+ encryption_key: './spec/spec_key.pub',
139
+ )
140
+
141
+ expect(filtered_settings._secure_my_secure_setting).to match \
142
+ EncryptionFilter::LARGE_DATA_STRING_PATTERN
143
+ end
78
144
  end
79
145
  end
80
146
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'rspectacular'
2
3
  require 'chamber/filters/environment_filter'
3
4
 
@@ -12,7 +13,10 @@ describe EnvironmentFilter do
12
13
  filtered_data = EnvironmentFilter.execute(data: {
13
14
  test_setting_group: {
14
15
  test_setting_level: {
15
- test_setting: 'value 1' } } })
16
+ test_setting: 'value 1',
17
+ },
18
+ },
19
+ })
16
20
 
17
21
  test_setting = filtered_data.test_setting_group.test_setting_level.test_setting
18
22
 
@@ -28,7 +32,10 @@ describe EnvironmentFilter do
28
32
  test_setting_group: {
29
33
  test_setting_level: {
30
34
  test_setting: 'value 1',
31
- another_setting: 'value 3' } } })
35
+ another_setting: 'value 3',
36
+ },
37
+ },
38
+ })
32
39
 
33
40
  another_setting = filtered_data.test_setting_group.test_setting_level.another_setting
34
41