From acfb8b6191338cdb04707e2e1e8ac1cdbb595b4f Mon Sep 17 00:00:00 2001
From: Jamis Buck <jamis@37signals.com>
Date: Mon, 23 Jan 2006 16:37:46 +0000
Subject: Make sure TMail#attachments includes anything with
 content-disposition of "attachment", regardless of content-type

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3474 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
---
 actionmailer/CHANGELOG                             |  2 ++
 .../lib/action_mailer/vendor/tmail/attachments.rb  |  7 +++++-
 actionmailer/test/fixtures/raw_email13             | 29 ++++++++++++++++++++++
 actionmailer/test/mail_service_test.rb             |  7 ++++++
 4 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 actionmailer/test/fixtures/raw_email13

diff --git a/actionmailer/CHANGELOG b/actionmailer/CHANGELOG
index bec81dfa1d..ce95327ba2 100644
--- a/actionmailer/CHANGELOG
+++ b/actionmailer/CHANGELOG
@@ -1,5 +1,7 @@
 *SVN*
 
+* Make sure TMail#attachments includes anything with content-disposition of "attachment", regardless of content-type [Jamis Buck]
+
 * Rename Version constant to VERSION. #2802 [Marcel Molina Jr.]
 
 * Stricter matching for implicitly multipart filenames excludes files ending in unsupported extensions (such as foo.rhtml.bak) and without a two-part content type (such as foo.text.rhtml or foo.text.really.plain.rhtml).  #2398 [Dave Burt <dave@burt.id.au>, Jeremy Kemper]
diff --git a/actionmailer/lib/action_mailer/vendor/tmail/attachments.rb b/actionmailer/lib/action_mailer/vendor/tmail/attachments.rb
index cdc4ba8631..abadd20a8a 100644
--- a/actionmailer/lib/action_mailer/vendor/tmail/attachments.rb
+++ b/actionmailer/lib/action_mailer/vendor/tmail/attachments.rb
@@ -10,10 +10,15 @@ module TMail
       multipart? && parts.any? { |part| part.header["content-type"].main_type != "text" }
     end
 
+    def attachment?(part)
+      (part['content-disposition'] && part['content-disposition'].disposition == "attachment") ||
+      part.header['content-type'].main_type != "text"
+    end
+
     def attachments
       if multipart?
         parts.collect { |part| 
-          if part.header["content-type"].main_type != "text"
+          if attachment?(part)
             content   = part.body # unquoted automatically by TMail#body
             file_name = (part['content-location'] &&
                           part['content-location'].body) ||
diff --git a/actionmailer/test/fixtures/raw_email13 b/actionmailer/test/fixtures/raw_email13
new file mode 100644
index 0000000000..7d9314e36a
--- /dev/null
+++ b/actionmailer/test/fixtures/raw_email13
@@ -0,0 +1,29 @@
+Mime-Version: 1.0 (Apple Message framework v730)
+Content-Type: multipart/mixed; boundary=Apple-Mail-13-196941151
+Message-Id: <9169D984-4E0B-45EF-82D4-8F5E53AD7012@example.com>
+From: foo@example.com
+Subject: testing
+Date: Mon, 6 Jun 2005 22:21:22 +0200
+To: blah@example.com
+
+
+--Apple-Mail-13-196941151
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/plain;
+	charset=ISO-8859-1;
+	delsp=yes;
+	format=flowed
+
+This is the first part.
+
+--Apple-Mail-13-196941151
+Content-Type: text/x-ruby-script; name="hello.rb"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: attachment;
+	filename="api.rb"
+
+puts "Hello, world!"
+gets
+
+--Apple-Mail-13-196941151--
+
diff --git a/actionmailer/test/mail_service_test.rb b/actionmailer/test/mail_service_test.rb
index c5b2cdec84..94dd70200b 100755
--- a/actionmailer/test/mail_service_test.rb
+++ b/actionmailer/test/mail_service_test.rb
@@ -573,6 +573,13 @@ EOF
     assert_equal "Photo25.jpg", mail.attachments.first.original_filename
   end
 
+  def test_attachment_with_text_type
+    fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email13")
+    mail = TMail::Mail.parse(fixture)
+    assert_equal 1, mail.attachments.length
+    assert_equal "hello.rb", mail.attachments.first.original_filename
+  end
+
   def test_decode_part_without_content_type
     fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email4")
     mail = TMail::Mail.parse(fixture)
-- 
cgit v1.2.3