diff --git a/Gemfile b/Gemfile index c7b560dd2..839c2fe48 100644 --- a/Gemfile +++ b/Gemfile @@ -106,6 +106,7 @@ gem 'select2-rails' gem 'prawn', '~> 2.0.1' gem 'prawn_rails', '~> 0.0.11' +gem 'chunky_png' gem 'sentry-raven' group :test do diff --git a/Gemfile.lock b/Gemfile.lock index 5ff8a870a..8c2ca041e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -108,6 +108,7 @@ GEM mime-types (>= 1.16) mimemagic (>= 0.3.0) chartkick (2.2.1) + chunky_png (1.3.8) clamav-client (3.1.0) cliver (0.3.2) coderay (1.1.1) @@ -686,6 +687,7 @@ DEPENDENCIES capybara carrierwave chartkick + chunky_png clamav-client copy_carrierwave_file database_cleaner diff --git a/app/controllers/admin/attestation_templates_controller.rb b/app/controllers/admin/attestation_templates_controller.rb index bc3bf0f40..c49edfe13 100644 --- a/app/controllers/admin/attestation_templates_controller.rb +++ b/app/controllers/admin/attestation_templates_controller.rb @@ -57,8 +57,26 @@ class Admin::AttestationTemplatesController < AdminController private def activated_attestation_params - params.require(:attestation_template) - .permit(:title, :body, :footer, :logo, :signature) - .merge(activated: true) + # cache result to avoid multiple uninterlaced computations + if @activated_attestation_params.nil? + @activated_attestation_params = params.require(:attestation_template) + .permit(:title, :body, :footer, :signature) + .merge(activated: true) + + @activated_attestation_params.merge!(logo: uninterlaced_png(params['attestation_template']['logo'])) + @activated_attestation_params.merge!(signature: uninterlaced_png(params['attestation_template']['signature'])) + end + + @activated_attestation_params + end + + def uninterlaced_png(uploaded_file) + if uploaded_file.present? && uploaded_file.content_type == 'image/png' + chunky_img = ChunkyPNG::Image.from_io(uploaded_file) + chunky_img.save(uploaded_file.tempfile.to_path, interlace: false) + uploaded_file.tempfile.reopen(uploaded_file.tempfile.to_path, 'rb') + end + + uploaded_file end end diff --git a/spec/controllers/admin/attestation_templates_controller_spec.rb b/spec/controllers/admin/attestation_templates_controller_spec.rb index cd318832a..e8c068559 100644 --- a/spec/controllers/admin/attestation_templates_controller_spec.rb +++ b/spec/controllers/admin/attestation_templates_controller_spec.rb @@ -4,6 +4,8 @@ describe Admin::AttestationTemplatesController, type: :controller do let!(:procedure) { create :procedure, administrateur: admin, attestation_template: attestation_template } let(:logo) { fixture_file_upload('spec/fixtures/white.png', 'image/png') } let(:signature) { fixture_file_upload('spec/fixtures/black.png', 'image/png') } + let(:interlaced_logo) { fixture_file_upload('spec/fixtures/interlaced-black.png', 'image/png') } + let(:uninterlaced_logo) { fixture_file_upload('spec/fixtures/uninterlaced-black.png', 'image/png') } before do sign_in admin @@ -19,6 +21,11 @@ describe Admin::AttestationTemplatesController, type: :controller do attestation_template: upload_params } end + context 'with an interlaced png' do + let(:upload_params) { { logo: interlaced_logo } } + it { expect(assigns(:logo).read).to eq(uninterlaced_logo.read) } + end + context 'if an attestation template does not exist on the procedure' do let(:attestation_template) { nil } it { expect(subject.status).to eq(200) } diff --git a/spec/fixtures/interlaced-black.png b/spec/fixtures/interlaced-black.png new file mode 100644 index 000000000..eea46537d Binary files /dev/null and b/spec/fixtures/interlaced-black.png differ diff --git a/spec/fixtures/uninterlaced-black.png b/spec/fixtures/uninterlaced-black.png new file mode 100644 index 000000000..8c2101ff5 Binary files /dev/null and b/spec/fixtures/uninterlaced-black.png differ