diff options
Diffstat (limited to 'vendor/gems/attr_encrypted/test/compatibility_test.rb')
-rw-r--r-- | vendor/gems/attr_encrypted/test/compatibility_test.rb | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/vendor/gems/attr_encrypted/test/compatibility_test.rb b/vendor/gems/attr_encrypted/test/compatibility_test.rb new file mode 100644 index 00000000000..7585895e16e --- /dev/null +++ b/vendor/gems/attr_encrypted/test/compatibility_test.rb @@ -0,0 +1,109 @@ +# frozen_string_literal: true + +# -*- encoding: utf-8 -*- +require_relative 'test_helper' + +# Test to ensure that existing representations in database do not break on +# migrating to new versions of this gem. This ensures that future versions of +# this gem will retain backwards compatibility with data generated by earlier +# versions. +class CompatibilityTest < Minitest::Test + class NonmarshallingPet < ActiveRecord::Base + PET_NICKNAME_SALT = Digest::SHA256.hexdigest('my-really-really-secret-pet-nickname-salt') + PET_NICKNAME_KEY = 'my-really-really-secret-pet-nickname-key' + PET_BIRTHDATE_SALT = Digest::SHA256.hexdigest('my-really-really-secret-pet-birthdate-salt') + PET_BIRTHDATE_KEY = 'my-really-really-secret-pet-birthdate-key' + + self.attr_encrypted_options[:mode] = :per_attribute_iv_and_salt + self.attr_encrypted_options[:algorithm] = 'aes-256-cbc' + self.attr_encrypted_options[:insecure_mode] = true + + attr_encrypted :nickname, + :key => proc { Encryptor.encrypt(:value => PET_NICKNAME_SALT, :key => PET_NICKNAME_KEY, insecure_mode: true, algorithm: 'aes-256-cbc') } + attr_encrypted :birthdate, + :key => proc { Encryptor.encrypt(:value => PET_BIRTHDATE_SALT, :key => PET_BIRTHDATE_KEY, insecure_mode: true, algorithm: 'aes-256-cbc') } + end + + class MarshallingPet < ActiveRecord::Base + PET_NICKNAME_SALT = Digest::SHA256.hexdigest('my-really-really-secret-pet-nickname-salt') + PET_NICKNAME_KEY = 'my-really-really-secret-pet-nickname-key' + PET_BIRTHDATE_SALT = Digest::SHA256.hexdigest('my-really-really-secret-pet-birthdate-salt') + PET_BIRTHDATE_KEY = 'my-really-really-secret-pet-birthdate-key' + + self.attr_encrypted_options[:mode] = :per_attribute_iv_and_salt + self.attr_encrypted_options[:algorithm] = 'aes-256-cbc' + self.attr_encrypted_options[:insecure_mode] = true + + attr_encrypted :nickname, + :key => proc { Encryptor.encrypt(:value => PET_NICKNAME_SALT, :key => PET_NICKNAME_KEY, insecure_mode: true, algorithm: 'aes-256-cbc') }, + :marshal => true + attr_encrypted :birthdate, + :key => proc { Encryptor.encrypt(:value => PET_BIRTHDATE_SALT, :key => PET_BIRTHDATE_KEY, insecure_mode: true, algorithm: 'aes-256-cbc') }, + :marshal => true + end + + def setup + drop_all_tables + create_tables + end + + def test_nonmarshalling_backwards_compatibility + pet = NonmarshallingPet.create!( + :name => 'Fido', + :encrypted_nickname => 'E4lJTxFG/EfkfPg5MpnriQ==', + :encrypted_nickname_iv => 'z4Q8deE4h7f6S8NNZcbPNg==', + :encrypted_nickname_salt => 'adcd833001a873db', + :encrypted_birthdate => '6uKEAiFVdJw+N5El+U6Gow==', + :encrypted_birthdate_iv => 'zxtc1XPssL4s2HwA69nORQ==', + :encrypted_birthdate_salt => '4f879270045eaad7' + ) + + assert_equal 'Fido', pet.name + assert_equal 'Fido the Dog', pet.nickname + assert_equal '2011-07-09', pet.birthdate + end + + def test_marshalling_backwards_compatibility + pet = MarshallingPet.create!( + :name => 'Fido', + :encrypted_nickname => 'EsQScJYkPw80vVGvKWkE37Px99HHpXPFjoEPTNa4rbs=', + :encrypted_nickname_iv => 'fNq1OZcGvty4KfcvGTcFSw==', + :encrypted_nickname_salt => '733b459b7d34c217', + :encrypted_birthdate => '+VUlKQGfNWkOgCwI4hv+3qlGIwh9h6cJ/ranJlaxvU+xxQdL3H3cOzTcI2rkYkdR', + :encrypted_birthdate_iv => 'Ka+zF/SwEYZKwVa24lvFfA==', + :encrypted_birthdate_salt => 'd5e892d5bbd81566' + ) + + assert_equal 'Fido', pet.name + assert_equal 'Mummy\'s little helper', pet.nickname + + assert_equal Date.new(2011, 7, 9), pet.birthdate + end + + private + + def create_tables + ActiveRecord::Schema.define(:version => 1) do + create_table :nonmarshalling_pets do |t| + t.string :name + t.string :encrypted_nickname + t.string :encrypted_nickname_iv + t.string :encrypted_nickname_salt + t.string :encrypted_birthdate + t.string :encrypted_birthdate_iv + t.string :encrypted_birthdate_salt + end + create_table :marshalling_pets do |t| + t.string :name + t.string :encrypted_nickname + t.string :encrypted_nickname_iv + t.string :encrypted_nickname_salt + t.string :encrypted_birthdate + t.string :encrypted_birthdate_iv + t.string :encrypted_birthdate_salt + end + end + end +end + +ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:' |