Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArturo Herrero <arturo.herrero@gmail.com>2019-11-05 13:08:31 +0300
committerAlessio Caiazza <acaiazza@gitlab.com>2019-11-26 15:12:18 +0300
commit9183bf943b36f7505f4ec64c2db14dc3f641b617 (patch)
tree9ea4bb8e4890fbea98e2c48df1991719c88e3b27 /spec/migrations/encrypt_plaintext_attributes_on_application_settings_spec.rb
parent23d237110e6a646dec08e1f5b4696d2d9c51cfef (diff)
Encrypt application setting tokens
This is the plan to encrypt the plaintext tokens: First release (this commit): 1. Create new encrypted fields in the database. 2. Start populating new encrypted fields, read the encrypted fields or fallback to the plaintext fields. 3. Backfill the data removing the plaintext fields to the encrypted fields. Second release: 4. Remove the virtual attribute (created in step 2). 5. Drop plaintext columns from the database (empty columns after step 3).
Diffstat (limited to 'spec/migrations/encrypt_plaintext_attributes_on_application_settings_spec.rb')
-rw-r--r--spec/migrations/encrypt_plaintext_attributes_on_application_settings_spec.rb58
1 files changed, 58 insertions, 0 deletions
diff --git a/spec/migrations/encrypt_plaintext_attributes_on_application_settings_spec.rb b/spec/migrations/encrypt_plaintext_attributes_on_application_settings_spec.rb
new file mode 100644
index 00000000000..6435e43f38c
--- /dev/null
+++ b/spec/migrations/encrypt_plaintext_attributes_on_application_settings_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20191120115530_encrypt_plaintext_attributes_on_application_settings.rb')
+
+describe EncryptPlaintextAttributesOnApplicationSettings, :migration do
+ let(:migration) { described_class.new }
+ let(:application_settings) { table(:application_settings) }
+ let(:plaintext) { 'secret-token' }
+
+ PLAINTEXT_ATTRIBUTES = %w[
+ akismet_api_key
+ elasticsearch_aws_secret_access_key
+ recaptcha_private_key
+ recaptcha_site_key
+ slack_app_secret
+ slack_app_verification_token
+ ].freeze
+
+ describe '#up' do
+ it 'encrypts token, saves it and removes plaintext token' do
+ application_setting = application_settings.create
+ application_setting.update_columns(
+ PLAINTEXT_ATTRIBUTES.each_with_object({}) do |plaintext_attribute, attributes|
+ attributes[plaintext_attribute] = plaintext
+ end
+ )
+
+ migration.up
+
+ application_setting.reload
+ PLAINTEXT_ATTRIBUTES.each do |plaintext_attribute|
+ expect(application_setting[plaintext_attribute]).to be_nil
+ expect(application_setting["encrypted_#{plaintext_attribute}"]).not_to be_nil
+ expect(application_setting["encrypted_#{plaintext_attribute}_iv"]).not_to be_nil
+ end
+ end
+ end
+
+ describe '#down' do
+ it 'decrypts encrypted token and saves it' do
+ application_setting = application_settings.create(
+ PLAINTEXT_ATTRIBUTES.each_with_object({}) do |plaintext_attribute, attributes|
+ attributes[plaintext_attribute] = plaintext
+ end
+ )
+
+ migration.down
+
+ application_setting.reload
+ PLAINTEXT_ATTRIBUTES.each do |plaintext_attribute|
+ expect(application_setting[plaintext_attribute]).to eq(plaintext)
+ expect(application_setting["encrypted_#{plaintext_attribute}"]).to be_nil
+ expect(application_setting["encrypted_#{plaintext_attribute}_iv"]).to be_nil
+ end
+ end
+ end
+end