mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-08-10 01:31:45 +00:00
83 lines
3.0 KiB
Ruby
83 lines
3.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Gitlab::Encryption::KeyProvider, feature_category: :shared do
|
|
using RSpec::Parameterized::TableSyntax
|
|
|
|
describe 'supported key providers' do
|
|
def wrap_secrets(secrets)
|
|
secrets.map do |secret|
|
|
ActiveRecord::Encryption::Key.new(secret)
|
|
end
|
|
end
|
|
|
|
def derive_secrets(secrets)
|
|
secrets.map do |secret|
|
|
ActiveRecord::Encryption::Key.new(ActiveRecord::Encryption.key_generator.derive_key_from(secret))
|
|
end
|
|
end
|
|
|
|
# rubocop:disable Layout/LineLength -- We cannot break lines when using RSpec::Parameterized::TableSyntax
|
|
where(:key_type, :expected_key_provider_class, :expected_keys) do
|
|
:db_key_base | Gitlab::Encryption::NonDerivedKeyProvider | wrap_secrets(Settings.db_key_base_keys)
|
|
:db_key_base_truncated | Gitlab::Encryption::NonDerivedKeyProvider | wrap_secrets(Settings.db_key_base_keys_32_bytes)
|
|
:db_key_base_32 | Gitlab::Encryption::NonDerivedKeyProvider | wrap_secrets(Settings.db_key_base_keys_truncated)
|
|
:active_record_encryption_primary_key | ActiveRecord::Encryption::DerivedSecretKeyProvider | derive_secrets(ActiveRecord::Encryption.config.primary_key)
|
|
:active_record_encryption_deterministic_key | ActiveRecord::Encryption::DerivedSecretKeyProvider | derive_secrets(ActiveRecord::Encryption.config.deterministic_key)
|
|
end
|
|
# rubocop:enable Layout/LineLength
|
|
|
|
with_them do
|
|
describe '.[]' do
|
|
it 'returns the expected key provider wrapper' do
|
|
expect(described_class[key_type])
|
|
.to be_a(Gitlab::Encryption::KeyProviderWrapper)
|
|
end
|
|
|
|
it 'returns the expected key provider class from the wrapper' do
|
|
expect(described_class[key_type].key_provider)
|
|
.to be_a(expected_key_provider_class)
|
|
end
|
|
end
|
|
|
|
describe 'instance methods' do
|
|
subject(:service) { described_class[key_type] }
|
|
|
|
describe '#key_provider' do
|
|
it 'instantiates the expected key provider' do
|
|
expect(service.key_provider)
|
|
.to be_a(expected_key_provider_class)
|
|
end
|
|
end
|
|
|
|
describe '#encryption_key' do
|
|
it 'returns the last key' do
|
|
expect(service.encryption_key.secret)
|
|
.to eq(expected_keys.last.secret)
|
|
end
|
|
|
|
it 'includes a public tag referencing the key' do
|
|
expect(service.encryption_key.public_tags.encrypted_data_key_id)
|
|
.to eq(service.encryption_key.id)
|
|
end
|
|
end
|
|
|
|
describe '#decryption_keys' do
|
|
it 'returns ActiveRecord::Encryption::Key keys' do
|
|
provider_keys = service.decryption_keys
|
|
|
|
expect(provider_keys)
|
|
.to all(be_a(ActiveRecord::Encryption::Key))
|
|
end
|
|
|
|
it 'returns all keys by default' do
|
|
expect(service.decryption_keys.map(&:secret))
|
|
.to eq(expected_keys.map(&:secret))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|