From c9ab80c88078f7e7ab251b28a09f7bc1605fbc3a Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 12 Mar 2020 14:32:06 +0100 Subject: [PATCH] WIP --- app/models/bill_signature.rb | 36 +++++++++++++++----- spec/factories/bill_signature.rb | 8 +++-- spec/models/bill_signature_spec.rb | 16 ++++++--- spec/services/bill_signature_service_spec.rb | 2 +- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/app/models/bill_signature.rb b/app/models/bill_signature.rb index cef20c232..c4a9574d0 100644 --- a/app/models/bill_signature.rb +++ b/app/models/bill_signature.rb @@ -17,7 +17,7 @@ class BillSignature < ApplicationRecord end def serialize_operations(day) - self.serialized.attach( + serialized.attach( io: StringIO.new(operations_bill_json), filename: "demarches-simplifiees-operations-#{day.to_date.iso8601}.json", content_type: 'application/json', @@ -40,7 +40,7 @@ class BillSignature < ApplicationRecord end def set_signature(signature, day) - self.signature.attach( + signature.attach( io: StringIO.new(signature), filename: "demarches-simplifiees-signature-#{day.to_date.iso8601}.der", content_type: 'application/x-x509-ca-cert' @@ -49,36 +49,54 @@ class BillSignature < ApplicationRecord # Validations def check_bill_digest - if self.digest != self.operations_bill_digest + if digest != operations_bill_digest errors.add(:digest) end end def check_serialized_bill_contents - if !self.serialized.attached? + if !serialized.attached? errors.add(:serialized, :blank) return end - if JSON.parse(self.serialized.download) != self.operations_bill + if JSON.parse(read_serialized) != operations_bill errors.add(:serialized) end end def check_signature_contents - if !self.signature.attached? + if !signature.attached? errors.add(:signature, :blank) return end - timestamp_signature_date = ASN1::Timestamp.signature_time(self.signature.download) + timestamp_signature_date = ASN1::Timestamp.signature_time(read_signature) if timestamp_signature_date > Time.zone.now errors.add(:signature, :invalid_date) end - timestamp_signed_digest = ASN1::Timestamp.signed_digest(self.signature.download) - if timestamp_signed_digest != self.digest + timestamp_signed_digest = ASN1::Timestamp.signed_digest(read_signature) + if timestamp_signed_digest != digest errors.add(:signature) end end + + def read_signature + if attachment_changes['signature'] + io = attachment_changes['signature'].attachable[:io] + io.read if io.present? + elsif signature.attached? + signature.download + end + end + + def read_serialized + if attachment_changes['serialized'] + io = attachment_changes['serialized'].attachable[:io] + io.read if io.present? + elsif serialized.attached? + serialized.download + end + end end diff --git a/spec/factories/bill_signature.rb b/spec/factories/bill_signature.rb index 098496bdf..fa6f9ed61 100644 --- a/spec/factories/bill_signature.rb +++ b/spec/factories/bill_signature.rb @@ -1,6 +1,10 @@ FactoryBot.define do factory :bill_signature do - serialized { Rack::Test::UploadedFile.new('spec/fixtures/files/bill_signature/serialized.json', 'application/json') } - signature { Rack::Test::UploadedFile.new('spec/fixtures/files/bill_signature/signature.der', 'application/x-x509-ca-cert') } + trait :with_serialized do + serialized { Rack::Test::UploadedFile.new('spec/fixtures/files/bill_signature/serialized.json', 'application/json') } + end + trait :with_signature do + signature { Rack::Test::UploadedFile.new('spec/fixtures/files/bill_signature/signature.der', 'application/x-x509-ca-cert') } + end end end diff --git a/spec/models/bill_signature_spec.rb b/spec/models/bill_signature_spec.rb index 2fdb83d36..d951dc5cd 100644 --- a/spec/models/bill_signature_spec.rb +++ b/spec/models/bill_signature_spec.rb @@ -1,6 +1,6 @@ RSpec.describe BillSignature, type: :model do describe 'validations' do - subject(:bill_signature) { BillSignature.new } + subject(:bill_signature) { build(:bill_signature) } describe 'check_bill_digest' do before do @@ -119,14 +119,20 @@ RSpec.describe BillSignature, type: :model do end describe '.build_with_operations' do - subject(:bill_signature) { described_class.build_with_operations(dossier_operation_logs, Date.new(1871, 03, 18)) } + let(:day) { Date.new(1871, 03, 18) } + subject(:bill_signature) { build(:bill_signature, :with_signature) } + + before do + bill_signature.dossier_operation_logs = dossier_operation_logs + bill_signature.serialize_operations(day) + end context 'when there are no operations' do let(:dossier_operation_logs) { [] } it { expect(bill_signature.operations_bill).to eq({}) } it { expect(bill_signature.digest).to eq(Digest::SHA256.hexdigest('{}')) } - it { expect(bill_signature.serialized.download).to eq('{}') } + it { expect(bill_signature.read_serialized).to eq('{}') } it { expect(bill_signature.serialized.filename).to eq('demarches-simplifiees-operations-1871-03-18.json') } end @@ -137,7 +143,7 @@ RSpec.describe BillSignature, type: :model do it { expect(bill_signature.operations_bill).to eq({ '1234' => 'abcd' }) } it { expect(bill_signature.digest).to eq(Digest::SHA256.hexdigest('{"1234":"abcd"}')) } - it { expect(bill_signature.serialized.download).to eq('{"1234":"abcd"}') } + it { expect(bill_signature.read_serialized).to eq('{"1234":"abcd"}') } it { expect(bill_signature.serialized.filename).to eq('demarches-simplifiees-operations-1871-03-18.json') } end @@ -151,7 +157,7 @@ RSpec.describe BillSignature, type: :model do it { expect(bill_signature.operations_bill).to eq({ '1234' => 'abcd', '5678' => 'dcba' }) } it { expect(bill_signature.digest).to eq(Digest::SHA256.hexdigest('{"1234":"abcd","5678":"dcba"}')) } - it { expect(bill_signature.serialized.download).to eq('{"1234":"abcd","5678":"dcba"}') } + it { expect(bill_signature.read_serialized).to eq('{"1234":"abcd","5678":"dcba"}') } it { expect(bill_signature.serialized.filename).to eq('demarches-simplifiees-operations-1871-03-18.json') } end end diff --git a/spec/services/bill_signature_service_spec.rb b/spec/services/bill_signature_service_spec.rb index 626726676..6f4b377f0 100644 --- a/spec/services/bill_signature_service_spec.rb +++ b/spec/services/bill_signature_service_spec.rb @@ -25,7 +25,7 @@ describe BillSignatureService do context "when there are no operations to be signed" do before do - create :dossier_operation_log, created_at: 1.day.ago, bill_signature: build(:bill_signature) + create :dossier_operation_log, created_at: 1.day.ago, bill_signature: build(:bill_signature, :with_signature, :with_serialized) create :dossier_operation_log, created_at: 1.day.from_now end