Commit 48057ab38490e0676ace74a154443000eb8e73fc

Authored by Philippe Lagadec
Committed by GitHub
2 parents f540d08b 13a73734

Merge pull request #604 from matthieuxyz/master

olevba: prevent side effects on python lib "email"
Showing 1 changed file with 14 additions and 10 deletions
oletools/olevba.py
... ... @@ -276,6 +276,7 @@ import binascii
276 276 import base64
277 277 import zlib
278 278 import email # for MHTML parsing
  279 +import email.feedparser
279 280 import string # for printable
280 281 import json # for json output mode (argument --json)
281 282  
... ... @@ -330,11 +331,6 @@ from oletools import crypto
330 331 from oletools.common.io_encoding import ensure_stdout_handles_unicode
331 332 from oletools.common import codepages
332 333  
333   -# monkeypatch email to fix issue #32:
334   -# allow header lines without ":"
335   -import email.feedparser
336   -email.feedparser.headerRE = re.compile(r'^(From |[\041-\071\073-\176]{1,}:?|[\t ])')
337   -
338 334 # === PYTHON 2+3 SUPPORT ======================================================
339 335  
340 336 if sys.version_info[0] <= 2:
... ... @@ -2946,11 +2942,19 @@ class VBA_Parser(object):
2946 2942 elif content_offset > -1:
2947 2943 stripped_data = stripped_data[content_offset:]
2948 2944 # TODO: quick and dirty fix: insert a standard line with MIME-Version header?
2949   - if PYTHON2:
2950   - mhtml = email.message_from_string(stripped_data)
2951   - else:
2952   - # on Python 3, need to use message_from_bytes instead:
2953   - mhtml = email.message_from_bytes(stripped_data)
  2945 + # monkeypatch email to fix issue #32:
  2946 + # allow header lines without ":"
  2947 + oldHeaderRE = email.feedparser.headerRE
  2948 + loosyHeaderRE = re.compile(r'^(From |[\041-\071\073-\176]{1,}:?|[\t ])')
  2949 + email.feedparser.headerRE = loosyHeaderRE
  2950 + try:
  2951 + if PYTHON2:
  2952 + mhtml = email.message_from_string(stripped_data)
  2953 + else:
  2954 + # on Python 3, need to use message_from_bytes instead:
  2955 + mhtml = email.message_from_bytes(stripped_data)
  2956 + finally:
  2957 + email.feedparser.headerRE = oldHeaderRE
2954 2958 # find all the attached files:
2955 2959 for part in mhtml.walk():
2956 2960 content_type = part.get_content_type() # always returns a value
... ...