OLD | NEW |
1 # -*- coding: utf-8 -*- | 1 # -*- coding: utf-8 -*- |
2 """Parser for Microsoft Internet Explorer (MSIE) Cache Files (CF).""" | 2 """Parser for Microsoft Internet Explorer (MSIE) Cache Files (CF).""" |
3 | 3 |
4 from __future__ import unicode_literals | 4 from __future__ import unicode_literals |
5 | 5 |
6 import pymsiecf | 6 import pymsiecf |
7 | 7 |
8 from dfdatetime import fat_date_time as dfdatetime_fat_date_time | 8 from dfdatetime import fat_date_time as dfdatetime_fat_date_time |
9 from dfdatetime import filetime as dfdatetime_filetime | 9 from dfdatetime import filetime as dfdatetime_filetime |
10 from dfdatetime import semantic_time as dfdatetime_semantic_time | 10 from dfdatetime import semantic_time as dfdatetime_semantic_time |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 | 127 |
128 def _ParseItems(self, parser_mediator, msiecf_file): | 128 def _ParseItems(self, parser_mediator, msiecf_file): |
129 """Parses a MSIE Cache File (MSIECF) items. | 129 """Parses a MSIE Cache File (MSIECF) items. |
130 | 130 |
131 Args: | 131 Args: |
132 parser_mediator (ParserMediator): mediates interactions between parsers | 132 parser_mediator (ParserMediator): mediates interactions between parsers |
133 and other components, such as storage and dfvfs. | 133 and other components, such as storage and dfvfs. |
134 msiecf_file (pymsiecf.file): MSIECF file. | 134 msiecf_file (pymsiecf.file): MSIECF file. |
135 """ | 135 """ |
136 format_version = msiecf_file.format_version | 136 format_version = msiecf_file.format_version |
| 137 |
| 138 decode_error = False |
137 cache_directories = [] | 139 cache_directories = [] |
138 for cache_directory_name in iter(msiecf_file.cache_directories): | 140 for cache_directory_name in iter(msiecf_file.cache_directories): |
| 141 try: |
| 142 cache_directory_name = cache_directory_name.decode('ascii') |
| 143 except UnicodeDecodeError: |
| 144 decode_error = True |
| 145 cache_directory_name = cache_directory_name.decode( |
| 146 'ascii', errors='replace') |
| 147 |
139 cache_directories.append(cache_directory_name) | 148 cache_directories.append(cache_directory_name) |
140 | 149 |
| 150 if decode_error: |
| 151 parser_mediator.ProduceExtractionError(( |
| 152 'unable to decode cache directory names. Characters that cannot ' |
| 153 'be decoded will be replaced with "?" or "\\ufffd".')) |
| 154 |
141 for item_index in range(0, msiecf_file.number_of_items): | 155 for item_index in range(0, msiecf_file.number_of_items): |
142 try: | 156 try: |
143 msiecf_item = msiecf_file.get_item(item_index) | 157 msiecf_item = msiecf_file.get_item(item_index) |
144 if isinstance(msiecf_item, pymsiecf.leak): | 158 if isinstance(msiecf_item, pymsiecf.leak): |
145 self._ParseLeak(parser_mediator, cache_directories, msiecf_item) | 159 self._ParseLeak(parser_mediator, cache_directories, msiecf_item) |
146 | 160 |
147 elif isinstance(msiecf_item, pymsiecf.redirected): | 161 elif isinstance(msiecf_item, pymsiecf.redirected): |
148 self._ParseRedirected(parser_mediator, msiecf_item) | 162 self._ParseRedirected(parser_mediator, msiecf_item) |
149 | 163 |
150 elif isinstance(msiecf_item, pymsiecf.url): | 164 elif isinstance(msiecf_item, pymsiecf.url): |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 'unable to open file with error: {0!s}'.format(exception)) | 382 'unable to open file with error: {0!s}'.format(exception)) |
369 return | 383 return |
370 | 384 |
371 try: | 385 try: |
372 self._ParseItems(parser_mediator, msiecf_file) | 386 self._ParseItems(parser_mediator, msiecf_file) |
373 finally: | 387 finally: |
374 msiecf_file.close() | 388 msiecf_file.close() |
375 | 389 |
376 | 390 |
377 manager.ParsersManager.RegisterParser(MSIECFParser) | 391 manager.ParsersManager.RegisterParser(MSIECFParser) |
OLD | NEW |