FIX: Calculate email attachment size limit correctly (#11321)

When calculating whether the attached uploads went over the SiteSetting.email_total_attachment_size_limit_kb.kilobytes limit, we were using the original_upload for the calculation instead of the actually attached_upload, which will be smaller in most cases because it can be an optimized image.
This commit is contained in:
Martin Brennan 2020-11-23 11:16:08 +10:00 committed by GitHub
parent 790b9856af
commit 28db835c4c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 3 deletions

View File

@ -281,7 +281,7 @@ module Email
end end
attached_upload = optimized_1X || original_upload attached_upload = optimized_1X || original_upload
next if email_size + original_upload.filesize > max_email_size next if email_size + attached_upload.filesize > max_email_size
begin begin
path = if attached_upload.local? path = if attached_upload.local?

View File

@ -486,12 +486,15 @@ describe Email::Sender do
context "when the uploaded secure image has an optimized image" do context "when the uploaded secure image has an optimized image" do
let!(:optimized) { Fabricate(:optimized_image, upload: @secure_image) } let!(:optimized) { Fabricate(:optimized_image, upload: @secure_image) }
let!(:optimized_image_file) { file_from_fixtures("logo-dev.png", "images") } let!(:optimized_image_file) { file_from_fixtures("smallest.png", "images") }
it "uses the email styles and the optimized image to inline secure images and attaches the secure image upload to the email" do before do
Discourse.store.store_optimized_image(optimized_image_file, optimized) Discourse.store.store_optimized_image(optimized_image_file, optimized)
optimized.update(url: Discourse.store.absolute_base_url + '/' + optimized.url) optimized.update(url: Discourse.store.absolute_base_url + '/' + optimized.url)
Discourse.store.cache_file(optimized_image_file, File.basename("#{optimized.sha1}.png")) Discourse.store.cache_file(optimized_image_file, File.basename("#{optimized.sha1}.png"))
end
it "uses the email styles and the optimized image to inline secure images and attaches the secure image upload to the email" do
Email::Sender.new(message, :valid_type).send Email::Sender.new(message, :valid_type).send
expect(message.attachments.length).to eq(4) expect(message.attachments.length).to eq(4)
expect(message.attachments.map(&:filename)) expect(message.attachments.map(&:filename))
@ -499,7 +502,13 @@ describe Email::Sender do
expect(message.attachments["logo.png"].body.raw_source.force_encoding("UTF-8")).to eq(File.read(optimized_image_file)) expect(message.attachments["logo.png"].body.raw_source.force_encoding("UTF-8")).to eq(File.read(optimized_image_file))
expect(message.html_part.body).to include("cid:") expect(message.html_part.body).to include("cid:")
expect(message.html_part.body).to include("embedded-secure-image") expect(message.html_part.body).to include("embedded-secure-image")
end
it "uses the optimized image size in the max size limit calculation, not the original image size" do
SiteSetting.email_total_attachment_size_limit_kb = 45
Email::Sender.new(message, :valid_type).send
expect(message.attachments.length).to eq(4) expect(message.attachments.length).to eq(4)
expect(message.attachments["logo.png"].body.raw_source.force_encoding("UTF-8")).to eq(File.read(optimized_image_file))
end end
end end
end end