diff --git a/mime.py b/mime.py index df9537323dc77fad50719e96fb33e6b07a964587..80a5a832fafacc1e77e9b6111c5121a3e493e2f2 100644 --- a/mime.py +++ b/mime.py @@ -1,4 +1,7 @@ # $Log$ +# Revision 1.3 2005/06/02 15:00:17 customdesigned +# Configure banned extensions. Scan zipfile option with test case. +# # Revision 1.2 2005/06/02 04:18:55 customdesigned # Update copyright notices after reading article on /. # @@ -87,6 +90,16 @@ from email import Errors from types import ListType,StringType +def zipnames(txt): + fp = StringIO.StringIO(txt) + zipf = zipfile.ZipFile(fp,'r') + names = [] + for nm in zipf.namelist(): + names.append(('zipname',nm)) + if nm.lower().endswith('.zip'): + names += zipnames(zipf.read(nm)) + return names + class MimeGenerator(Generator): def _dispatch(self, msg): # Get the Content-Type: for the message, then try to dispatch to @@ -177,13 +190,10 @@ class MimeMessage(Message): names.append((attr,val)) names += [("filename",self.get_filename())] if scan_zip: - for key,name in names: + for key,name in tuple(names): # copy by converting to tuple if name and name.lower().endswith('.zip'): txt = self.get_payload(decode=True) - fp = StringIO.StringIO(txt) - zipf = zipfile.ZipFile(fp,'r') - for nm in zipf.namelist(): - names.append(('zipname',nm)) + names += zipnames(txt) return names def ismodified(self): diff --git a/test/ziploop b/test/ziploop new file mode 100644 index 0000000000000000000000000000000000000000..97b55468c23b4dd7e20d67e52710bc3b2ad1158a --- /dev/null +++ b/test/ziploop @@ -0,0 +1,47 @@ +From ttaie1@thfalcon.com Thu Jun 16 10:23:13 2005 +Received: from thfalcon.com (unknown [202.90.113.150]) + by thfalcon.com (Postfix) with ESMTP id 32F0DD819C + for <stuart@bmsi.com>; Thu, 16 Jun 2005 15:42:08 +0700 (ICT) +From: ttaie1@thfalcon.com +To: stuart@bmsi.com +Subject: Returned mail: see transcript for details +Date: Thu, 16 Jun 2005 15:50:10 +0700 +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary="----=_NextPart_000_0014_E4E04420.5619685C" +X-Priority: 3 +X-MSMail-Priority: Normal +X-Mailer: Microsoft Outlook Express 6.00.2600.0000 +X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 +Message-Id: <20050616084208.32F0DD819C@thfalcon.com> +Received-SPF: pass (mail.bmsi.com: guessing: domain of thfalcon.com designates 203.147.3.44 as permitted sender) client-ip=203.147.3.44; envelope-from=ttaie1@thfalcon.com; helo=thfalcon.com; + +This is a multi-part message in MIME format. + +------=_NextPart_000_0014_E4E04420.5619685C +Content-Type: text/plain; + charset=us-ascii +Content-Transfer-Encoding: 7bit + +Message could not be delivered + + +------=_NextPart_000_0014_E4E04420.5619685C +Content-Type: application/octet-stream; + name="stuart@bmsi.com.zip" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; + filename="stuart@bmsi.com.zip" + +UEsDBAoAAAAAAM6r0DL7SfbCBAEAAAQBAAAFABUAdC56aXBVVAkAA7MnskK4J7JCVXgEAIYD +ZQBQSwMECgAAAAAANVXCMtpXacQaAAAAGgAAADMAFQB6aXAuZG9jICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVVVAkAA6Yan0KmGp9CVXgEAIYDZQBUaGlz +IHByb2dyYW0gd2FzIGEgdmlydXMuClBLAQIXAwoAAAAAADVVwjLaV2nEGgAAABoAAAAzAA0A +AAAAAAEAAAC0gQAAAAB6aXAuZG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgIC5leGVVVAUAA6Yan0JVeAAAUEsFBgAAAAABAAEAbgAAAIAAAAAAAFBLAQIXAwoA +AAAAAM6r0DL7SfbCBAEAAAQBAAAFAA0AAAAAAAAAAAC0gQAAAAB0LnppcFVUBQADsyeyQlV4 +AABQSwUGAAAAAAEAAQBAAAAAPAEAAAAA + +------=_NextPart_000_0014_E4E04420.5619685C-- + + diff --git a/testmime.py b/testmime.py index 004f43e2743088c146a21241d278cf802b0cd35a..3920d5b3c7c8b6e20fe06167d86faa6b608f0a95 100644 --- a/testmime.py +++ b/testmime.py @@ -1,4 +1,7 @@ # $Log$ +# Revision 1.2 2005/06/02 15:00:17 customdesigned +# Configure banned extensions. Scan zipfile option with test case. +# # Revision 1.1.1.2 2005/05/31 18:23:49 customdesigned # Development changes since 0.7.2 # @@ -126,10 +129,12 @@ class MimeTestCase(unittest.TestCase): self.failUnless(name == "Jim&amp;Girlz.jpg","name=%s"%name) def testZip(self,vname="zip1",fname='zip.zip'): - self.testDefang('zip1',1,'zip.zip') + self.testDefang(vname,1,'zip.zip') msg = mime.message_from_file(open('test/'+vname,"r")) mime.defang(msg,scan_zip=False) self.failIf(msg.ismodified()) + # test zip within zip + self.testDefang('ziploop',1,'stuart@bmsi.com.zip') def testHTML(self,fname=""): result = StringIO.StringIO() @@ -153,3 +158,5 @@ if __name__ == '__main__': for fname in sys.argv[1:]: fp = open(fname,'r') msg = mime.message_from_file(fp) + mime.defang(msg,scan_zip=True) + print msg.as_string()