diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb index a601b27eb7e..c45eddd7352 100644 --- a/lib/email/receiver.rb +++ b/lib/email/receiver.rb @@ -882,7 +882,7 @@ module Email def attachments # strip blacklisted attachments (mostly signatures) @attachments ||= begin - attachments = @mail.attachments.select { |attachment| is_whitelisted_attachment?(attachment) } + attachments = @mail.parts.select { |part| part.attachment? && is_whitelisted_attachment?(part) } attachments << @mail if @mail.attachment? && is_whitelisted_attachment?(@mail) attachments end diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb index a13a825108a..a3503301ff1 100644 --- a/spec/components/email/receiver_spec.rb +++ b/spec/components/email/receiver_spec.rb @@ -470,31 +470,43 @@ describe Email::Receiver do it "supports attachments" do SiteSetting.authorized_extensions = "txt" expect { process(:attached_txt_file) }.to change { topic.posts.count } - expect(topic.posts.last.raw).to match(/text\.txt/) + expect(topic.posts.last.raw).to match(/]*>text\.txt<\/a>/) + expect(topic.posts.last.uploads.length).to eq 1 + end + + it "supports eml attachments" do + SiteSetting.authorized_extensions = "eml" + expect { process(:attached_eml_file) }.to change { topic.posts.count } + expect(topic.posts.last.raw).to match(/]*>sample\.eml<\/a>/) + expect(topic.posts.last.uploads.length).to eq 1 end context "when attachment is rejected" do it "sends out the warning email" do expect { process(:attached_txt_file) }.to change { EmailLog.count }.by(1) expect(EmailLog.last.email_type).to eq("email_reject_attachment") + expect(topic.posts.last.uploads.length).to eq 0 end it "doesn't send out the warning email if sender is staged user" do user.update_columns(staged: true) expect { process(:attached_txt_file) }.not_to change { EmailLog.count } + expect(topic.posts.last.uploads.length).to eq 0 end it "creates the post with attachment missing message" do missing_attachment_regex = Regexp.escape(I18n.t('emails.incoming.missing_attachment', filename: "text.txt")) expect { process(:attached_txt_file) }.to change { topic.posts.count } expect(topic.posts.last.raw).to match(/#{missing_attachment_regex}/) + expect(topic.posts.last.uploads.length).to eq 0 end end it "supports emails with just an attachment" do SiteSetting.authorized_extensions = "pdf" expect { process(:attached_pdf_file) }.to change { topic.posts.count } - expect(topic.posts.last.raw).to match(/discourse\.pdf/) + expect(topic.posts.last.raw).to match(/]*>discourse\.pdf<\/a>/) + expect(topic.posts.last.uploads.length).to eq 1 end it "supports liking via email" do @@ -638,7 +650,8 @@ describe Email::Receiver do it "supports any kind of attachments when 'allow_all_attachments_for_group_messages' is enabled" do SiteSetting.allow_all_attachments_for_group_messages = true expect { process(:attached_rb_file) }.to change(Topic, :count) - expect(Post.last.raw).to match(/discourse\.rb/) + expect(Post.last.raw).to match(/]*>discourse\.rb<\/a>/) + expect(Post.last.uploads.length).to eq 1 end it "enables user's email_private_messages setting when user emails new topic to group" do diff --git a/spec/fixtures/emails/attached_eml_file.eml b/spec/fixtures/emails/attached_eml_file.eml new file mode 100644 index 00000000000..6ad4c8ff10c --- /dev/null +++ b/spec/fixtures/emails/attached_eml_file.eml @@ -0,0 +1,31 @@ +Return-Path: +From: Foo Bar +To: reply+4f97315cc828096c9cb34c6f1a0d6fe8@bar.com +Date: Sat, 30 Jan 2016 01:10:11 +0100 +Message-ID: <38@foo.bar.mail> +Mime-Version: 1.0 +Content-Type: multipart/mixed; + boundary="--==_mimepart_56abff5d49749_ddf83fca6d033a28548ad"; + charset=UTF-8 +Content-Transfer-Encoding: 7bit + + +----==_mimepart_56abff5d49749_ddf83fca6d033a28548ad +Content-Type: text/plain; + charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Please find the eml file attached. + +----==_mimepart_56abff5d49749_ddf83fca6d033a28548ad +Content-Type: message/rfc822; name="sample.eml" +Content-Disposition: attachment; filename="sample.eml" +Content-Transfer-Encoding: base64 +X-Attachment-Id: f_jnxo58s31 +Content-ID: + +RGF0ZTogU3VuLCAxIEFwciAyMDEyIDE0OjI1OjI1IC0wNjAwDQpGcm9tOiBmaWxlQGZ5aWNlbnRl +ci5jb20NClN1YmplY3Q6IFdlbGNvbWUNClRvOiBzb21lb25lQHNvbWV3aGVyZS5jb20NCg0KRGVh +ciBGcmllbmQsDQoNCldlbGNvbWUgdG8gZmlsZS5meWljZW50ZXIuY29tIQ0KDQpTaW5jZXJlbHks +DQpGWUljZW50ZXIuY29tIFRlYW0NCg== +----==_mimepart_56abff5d49749_ddf83fca6d033a28548ad--