Commit 58095dbaf07307b04af06ae0a28084c4202fa82b
1 parent
a6e0099f
rtfobj: remove check for uppercased RTF magic
Word does not accept files which magic is not fully lowercase.
Showing
2 changed files
with
13 additions
and
12 deletions
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)) |