Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions app/services/session_encryptor.rb
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
class SessionEncryptor
def self.build_user_access_key
key = Figaro.env.session_encryption_key
UserAccessKey.new(password: key, salt: key)
def user_access_key
@user_access_key ||= begin
key = Figaro.env.session_encryption_key
uak = UserAccessKey.new(password: key, salt: key)
uak.random_r = OpenSSL::Digest::SHA256.digest(key)
uak
end
end

cattr_reader :user_access_key do
build_user_access_key
end

def self.load(value)
def load(value)
decrypted = encryptor.decrypt(value, user_access_key)

JSON.parse(decrypted, quirks_mode: true).with_indifferent_access
end

def self.dump(value)
def dump(value)
plain = JSON.generate(value, quirks_mode: true)
encryptor.encrypt(plain, user_access_key)
end

def self.encryptor
private

def encryptor
Pii::PasswordEncryptor.new
end
end
2 changes: 1 addition & 1 deletion app/services/usps_confirmation_entry.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
:issuer
) do
def self.user_access_key
SessionEncryptor.user_access_key
SessionEncryptor.new.user_access_key
end

def self.encryptor
Expand Down
2 changes: 1 addition & 1 deletion config/initializers/session_store.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
key_prefix: "#{Figaro.env.domain_name}:session:",
url: Figaro.env.redis_url,
},
serializer: SessionEncryptor,
serializer: SessionEncryptor.new,
}

Rails.application.config.session_store :redis_session_store, options
24 changes: 15 additions & 9 deletions spec/services/session_encryptor_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,30 @@
describe SessionEncryptor do
describe '#load' do
it 'decrypts encrypted session' do
session = SessionEncryptor.dump(foo: 'bar')
session = SessionEncryptor.new.dump(foo: 'bar')

expect(SessionEncryptor.load(session)).to eq('foo' => 'bar')
expect(SessionEncryptor.new.load(session)).to eq('foo' => 'bar')
end
end

it 'makes a round trip okay' do
encryptor1 = SessionEncryptor.new
encryptor2 = SessionEncryptor.new

encryptor1.load(encryptor1.dump('asdf' => '1234'))
encryptor2.load(encryptor2.dump('asdf' => '1234'))

payload = { 'hello' => 'world' }
encrypted_text = encryptor1.dump(payload)
expect(encryptor2.load(encrypted_text)).to eq(payload)
end

describe '#dump' do
it 'encrypts session' do
session = SessionEncryptor.dump(foo: 'bar')
session = SessionEncryptor.new.dump(foo: 'bar')

expect(session).to_not match 'foo'
expect(session).to_not match 'bar'
end
end

describe '#encryptor' do
it 'is a Pii::Encryptor' do
expect(SessionEncryptor.encryptor).to be_a Pii::Encryptor
end
end
end