Commit 58095dbaf07307b04af06ae0a28084c4202fa82b

Authored by Samir Aguiar
1 parent a6e0099f

rtfobj: remove check for uppercased RTF magic

Word does not accept files which magic is not fully
lowercase.
oletools/rtfobj.py
@@ -690,35 +690,36 @@ def is_rtf(arg, treat_str_as_data=False): @@ -690,35 +690,36 @@ def is_rtf(arg, treat_str_as_data=False):
690 magic_len = len(RTF_MAGIC) 690 magic_len = len(RTF_MAGIC)
691 if isinstance(arg, UNICODE_TYPE): 691 if isinstance(arg, UNICODE_TYPE):
692 with open(arg, 'rb') as reader: 692 with open(arg, 'rb') as reader:
693 - return reader.read(len(RTF_MAGIC)).lower() == RTF_MAGIC 693 + return reader.read(len(RTF_MAGIC)) == RTF_MAGIC
694 if isinstance(arg, bytes) and not isinstance(arg, str): # only in PY3 694 if isinstance(arg, bytes) and not isinstance(arg, str): # only in PY3
695 - return arg[:magic_len].lower() == RTF_MAGIC 695 + return arg[:magic_len] == RTF_MAGIC
696 if isinstance(arg, bytearray): 696 if isinstance(arg, bytearray):
697 - return arg[:magic_len].lower() == RTF_MAGIC 697 + return arg[:magic_len] == RTF_MAGIC
698 if isinstance(arg, str): # could be bytes, but we assume file name 698 if isinstance(arg, str): # could be bytes, but we assume file name
699 if treat_str_as_data: 699 if treat_str_as_data:
700 try: 700 try:
701 - return arg[:magic_len].encode('ascii', errors='strict').lower()\ 701 + return arg[:magic_len].encode('ascii', errors='strict')\
702 == RTF_MAGIC 702 == RTF_MAGIC
703 except UnicodeError: 703 except UnicodeError:
704 return False 704 return False
705 else: 705 else:
706 with open(arg, 'rb') as reader: 706 with open(arg, 'rb') as reader:
707 - return reader.read(len(RTF_MAGIC)).lower() == RTF_MAGIC 707 + return reader.read(len(RTF_MAGIC)) == RTF_MAGIC
708 if hasattr(arg, 'read'): # a stream (i.e. file-like object) 708 if hasattr(arg, 'read'): # a stream (i.e. file-like object)
709 - return arg.read(len(RTF_MAGIC)).lower() == RTF_MAGIC 709 + return arg.read(len(RTF_MAGIC)) == RTF_MAGIC
710 if isinstance(arg, (list, tuple)): 710 if isinstance(arg, (list, tuple)):
711 iter_arg = iter(arg) 711 iter_arg = iter(arg)
712 else: 712 else:
713 iter_arg = arg 713 iter_arg = arg
714 714
715 # check iterable 715 # check iterable
716 - for magic_byte, upper_cased in zip(RTF_MAGIC, RTF_MAGIC.upper()): 716 + for magic_byte in zip(RTF_MAGIC):
717 try: 717 try:
718 - if next(iter_arg) not in (magic_byte, upper_cased): 718 + if next(iter_arg) not in magic_byte:
719 return False 719 return False
720 except StopIteration: 720 except StopIteration:
721 return False 721 return False
  722 +
722 return True # checked the complete magic without returning False --> match 723 return True # checked the complete magic without returning False --> match
723 724
724 725
tests/rtfobj/test_is_rtf.py
@@ -18,13 +18,13 @@ class TestIsRtf(unittest.TestCase): @@ -18,13 +18,13 @@ class TestIsRtf(unittest.TestCase):
18 def test_bytearray(self): 18 def test_bytearray(self):
19 """ test that is_rtf works with bytearray """ 19 """ test that is_rtf works with bytearray """
20 self.assertTrue(is_rtf(bytearray(RTF_MAGIC + b'asdfasdfasdfasdfasdf'))) 20 self.assertTrue(is_rtf(bytearray(RTF_MAGIC + b'asdfasdfasdfasdfasdf')))
21 - self.assertTrue(is_rtf(bytearray(RTF_MAGIC.upper() + b'asdfasdasdff'))) 21 + self.assertFalse(is_rtf(bytearray(RTF_MAGIC.upper() + b'asdfasdasdff')))
22 self.assertFalse(is_rtf(bytearray(b'asdfasdfasdfasdfasdfasdfsdfsdfa'))) 22 self.assertFalse(is_rtf(bytearray(b'asdfasdfasdfasdfasdfasdfsdfsdfa')))
23 23
24 def test_bytes(self): 24 def test_bytes(self):
25 """ test that is_rtf works with bytearray """ 25 """ test that is_rtf works with bytearray """
26 self.assertTrue(is_rtf(RTF_MAGIC + b'asasdffdfasdfasdfasdfasdf', True)) 26 self.assertTrue(is_rtf(RTF_MAGIC + b'asasdffdfasdfasdfasdfasdf', True))
27 - self.assertTrue(is_rtf(RTF_MAGIC.upper() + b'asdffasdfasdasdff', True)) 27 + self.assertFalse(is_rtf(RTF_MAGIC.upper() + b'asdffasdfasdasdff', True))
28 self.assertFalse(is_rtf(b'asdfasdfasdfasdfasdfasdasdfffsdfsdfa', True)) 28 self.assertFalse(is_rtf(b'asdfasdfasdfasdfasdfasdasdfffsdfsdfa', True))
29 29
30 def test_tuple(self): 30 def test_tuple(self):
@@ -33,7 +33,7 @@ class TestIsRtf(unittest.TestCase): @@ -33,7 +33,7 @@ class TestIsRtf(unittest.TestCase):
33 self.assertTrue(is_rtf(data)) 33 self.assertTrue(is_rtf(data))
34 34
35 data = tuple(byte_char for byte_char in RTF_MAGIC.upper() + b'asfasdf') 35 data = tuple(byte_char for byte_char in RTF_MAGIC.upper() + b'asfasdf')
36 - self.assertTrue(is_rtf(data)) 36 + self.assertFalse(is_rtf(data))
37 37
38 data = tuple(byte_char for byte_char in b'asdfasfassdfsdsfeereasdfwdf') 38 data = tuple(byte_char for byte_char in b'asdfasfassdfsdsfeereasdfwdf')
39 self.assertFalse(is_rtf(data)) 39 self.assertFalse(is_rtf(data))
@@ -44,7 +44,7 @@ class TestIsRtf(unittest.TestCase): @@ -44,7 +44,7 @@ class TestIsRtf(unittest.TestCase):
44 self.assertTrue(is_rtf(data)) 44 self.assertTrue(is_rtf(data))
45 45
46 data = (byte_char for byte_char in RTF_MAGIC.upper() + b'asdfassfasdf') 46 data = (byte_char for byte_char in RTF_MAGIC.upper() + b'asdfassfasdf')
47 - self.assertTrue(is_rtf(data)) 47 + self.assertFalse(is_rtf(data))
48 48
49 data = (byte_char for byte_char in b'asdfasfasasdfasdfasdfsdfdwerwedf') 49 data = (byte_char for byte_char in b'asdfasfasasdfasdfasdfsdfdwerwedf')
50 self.assertFalse(is_rtf(data)) 50 self.assertFalse(is_rtf(data))