From a1714f4838786b0359677dbc7c62d3dc647a6b19 Mon Sep 17 00:00:00 2001
From: "Stuart D. Gathman" <stuart@gathman.org>
Date: Sat, 10 Aug 2019 20:28:48 -0400
Subject: [PATCH] Get denatured viruses from encrypted zip to avoid alarming
 scanners, this allows test cases to pass again after last commit.

---
 testmime.py   | 19 ++++++++++++++++---
 testsample.py | 21 +++++++++++++++++----
 2 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/testmime.py b/testmime.py
index d3b5b5f..c2ff374 100644
--- a/testmime.py
+++ b/testmime.py
@@ -29,6 +29,7 @@
 from __future__ import print_function
 import unittest
 import mime
+import zipfile
 import socket
 try:
   from StringIO import StringIO
@@ -51,6 +52,14 @@ hostname = socket.gethostname()
 
 class MimeTestCase(unittest.TestCase):
 
+  def setUp(self):
+    self.zf = zipfile.ZipFile('test/virus.zip','r')
+    self.zf.setpassword('denatured')
+
+  def tearDown(self):
+    self.zf.close()
+    self.zf = None
+
   # test mime parameter parsing
   def testParam(self):
     plist = mime._parseparam('; boundary="----=_NextPart_000_4e56_490d_48e3"')
@@ -90,8 +99,12 @@ class MimeTestCase(unittest.TestCase):
   
   def testDefang(self,vname='virus1',part=1,
 	fname='LOVE-LETTER-FOR-YOU.TXT.vbs'):
-    with open('test/'+vname,"rb") as fp:
-      msg = mime.message_from_file(fp)
+    try:
+      with self.zf.open(vname,"r") as fp:
+        msg = mime.message_from_file(fp)
+    except KeyError:
+      with open('test/'+vname,"rb") as fp:
+        msg = mime.message_from_file(fp)
     mime.defang(msg,scan_zip=True)
     self.assertTrue(msg.ismodified(),"virus not removed")
     oname = vname + '.out'
@@ -118,7 +131,7 @@ class MimeTestCase(unittest.TestCase):
 
   # virus6 has no parts - the virus is directly inline
   def testDefang6(self,vname="virus6",fname='FAX20.exe'):
-    with open('test/'+vname,"rb") as fp:
+    with self.zf.open(vname,"r") as fp:
       msg = mime.message_from_file(fp)
     mime.defang(msg)
     oname = vname + '.out'
diff --git a/testsample.py b/testsample.py
index 96f40cb..8f43c71 100644
--- a/testsample.py
+++ b/testsample.py
@@ -2,6 +2,7 @@ import unittest
 import Milter
 import sample
 import mime
+import zipfile
 from Milter.test import TestBase
 from Milter.testctx import TestCtx
 
@@ -12,6 +13,14 @@ class TestMilter(TestBase,sample.sampleMilter):
 
 class BMSMilterTestCase(unittest.TestCase):
 
+  def setUp(self):
+    self.zf = zipfile.ZipFile('test/virus.zip','r')
+    self.zf.setpassword('denatured')
+
+  def tearDown(self):
+    self.zf.close()
+    self.zf = None
+
   def testCtx(self,fname='virus1'):
     ctx = TestCtx()
     Milter.factory = sample.sampleMilter
@@ -20,7 +29,8 @@ class BMSMilterTestCase(unittest.TestCase):
     ctx._setsymval('j','mailhost')
     rc = ctx._connect()
     self.assertTrue(rc == Milter.CONTINUE)
-    rc = ctx._feedMsg(fname)
+    with self.zf.open(fname) as fp:
+      rc = ctx._feedFile(fp)
     milter = ctx.getpriv()
 #    self.assertTrue(milter.user == 'batman',"getsymval failed: "+
 #        "%s != %s"%(milter.user,'batman'))
@@ -44,7 +54,8 @@ class BMSMilterTestCase(unittest.TestCase):
     milter.setsymval('j','mailhost')
     rc = milter.connect()
     self.assertTrue(rc == Milter.CONTINUE)
-    rc = milter.feedMsg(fname)
+    with self.zf.open(fname) as fp:
+      rc = milter.feedFile(fp)
     self.assertTrue(milter.user == 'batman',"getsymval failed")
     # setsymlist not working in TestBase
     #self.assertTrue(milter.auth_type != 'batcomputer',"setsymlist failed")
@@ -75,13 +86,15 @@ class BMSMilterTestCase(unittest.TestCase):
     rc = milter.feedMsg('samp1')
     self.assertTrue(rc == Milter.ACCEPT)
     self.assertFalse(milter._bodyreplaced,"Milter needlessly replaced body.")
-    rc = milter.feedMsg("virus3")
+    with self.zf.open("virus3") as fp:
+      rc = milter.feedFile(fp)
     self.assertTrue(rc == Milter.ACCEPT)
     self.assertTrue(milter._bodyreplaced,"Message body not replaced")
     fp = milter._body
     open("test/virus3.tstout","wb").write(fp.getvalue())
     #self.assertTrue(fp.getvalue() == open("test/virus3.out","r").read())
-    rc = milter.feedMsg("virus6")
+    with self.zf.open("virus6") as fp:
+      rc = milter.feedFile(fp)
     self.assertTrue(rc == Milter.ACCEPT)
     self.assertTrue(milter._bodyreplaced,"Message body not replaced")
     self.assertTrue(milter._headerschanged,"Message headers not adjusted")
-- 
GitLab