Commit a7093b9b4bca4691fd2ff6eaef9c1bc02ffcb5ea
1 parent
f2d57983
created 3 new Exceptions: SubfileOpenError, UnexpectedDataError and OlevbaBaseException
made all Exceptions subclasses of OlevbaBaseException, move some common functionality there
Showing
1 changed file
with
46 additions
and
12 deletions
oletools/olevba.py
| ... | ... | @@ -299,35 +299,69 @@ log = get_logger('olevba') |
| 299 | 299 | |
| 300 | 300 | #=== EXCEPTIONS ============================================================== |
| 301 | 301 | |
| 302 | -class FileOpenError(Exception): | |
| 302 | +class OlevbaBaseException(Exception): | |
| 303 | + """ Base class for exceptions produced here for simpler except clauses """ | |
| 304 | + def __init__(self, msg, filename=None, orig_exc=None, **kwargs): | |
| 305 | + if orig_exc: | |
| 306 | + super(OlevbaBaseException, self).__init__(msg + | |
| 307 | + ' ({})'.format(orig_exc), | |
| 308 | + **kwargs) | |
| 309 | + else: | |
| 310 | + super(OlevbaBaseException, self).__init__(msg, **kwargs) | |
| 311 | + self.msg = msg | |
| 312 | + self.filename = filename | |
| 313 | + self.orig_exc = orig_exc | |
| 314 | + | |
| 315 | + | |
| 316 | +class FileOpenError(OlevbaBaseException): | |
| 303 | 317 | """ raised by VBA_Parser constructor if all open_... attempts failed |
| 304 | 318 | |
| 305 | 319 | probably means the file type is not supported |
| 306 | 320 | """ |
| 307 | 321 | |
| 308 | - def __init__(self, filename): | |
| 322 | + def __init__(self, filename, orig_exc=None): | |
| 309 | 323 | super(FileOpenError, self).__init__( |
| 310 | - 'Failed to open file %s ... probably not supported' % filename) | |
| 311 | - self.filename = filename | |
| 324 | + 'Failed to open file %s' % filename, filename, orig_exc) | |
| 312 | 325 | |
| 313 | 326 | |
| 314 | -class ProcessingError(Exception): | |
| 327 | +class ProcessingError(OlevbaBaseException): | |
| 315 | 328 | """ raised by VBA_Parser.process_file* functions """ |
| 316 | 329 | |
| 317 | - def __init__(self, filename, orig_exception): | |
| 330 | + def __init__(self, filename, orig_exc): | |
| 318 | 331 | super(ProcessingError, self).__init__( |
| 319 | - 'Error processing file %s (%s)' % (filename, orig_exception)) | |
| 320 | - self.filename = filename | |
| 321 | - self.orig_exception = orig_exception | |
| 332 | + 'Error processing file %s' % filename, filename, orig_exc) | |
| 322 | 333 | |
| 323 | 334 | |
| 324 | -class MsoExtractionError(RuntimeError): | |
| 335 | +class MsoExtractionError(RuntimeError, OlevbaBaseException): | |
| 325 | 336 | """ raised by mso_file_extract if parsing MSO/ActiveMIME data failed """ |
| 326 | 337 | |
| 327 | 338 | def __init__(self, msg): |
| 328 | - super(MsoExtractionError, self).__init__(msg) | |
| 329 | - self.msg = msg | |
| 339 | + MsoExtractionError.__init__(self, msg) | |
| 340 | + OlevbaBaseException.__init__(self, msg) | |
| 341 | + | |
| 342 | + | |
| 343 | +class SubstreamOpenError(FileOpenError): | |
| 344 | + """ special kind of FileOpenError: file is a substream of original file """ | |
| 345 | + | |
| 346 | + def __init__(self, filename, subfilename, orig_exc=None): | |
| 347 | + super(SubstreamOpenError, self).__init__( | |
| 348 | + str(filename) + '/' + str(subfilename), orig_exc) | |
| 349 | + self.filename = filename # overwrite setting in OlevbaBaseException | |
| 350 | + self.subfilename = subfilename | |
| 351 | + | |
| 352 | + | |
| 353 | +class UnexpectedDataError(OlevbaBaseException): | |
| 354 | + """ raised when parsing is strict (=not relaxed) and data is unexpected """ | |
| 330 | 355 | |
| 356 | + def __init__(self, stream_path, variable, expected, value): | |
| 357 | + super(UnexpectedDataError, self).__init__(self, | |
| 358 | + 'Unexpected value in {} for variable {}: ' | |
| 359 | + 'expected {:04X but found {:04X}!' | |
| 360 | + .format(stream_path, variable, expected, value)) | |
| 361 | + self.stream_path = stream_path | |
| 362 | + self.variable = variable | |
| 363 | + self.expected = expected | |
| 364 | + self.value = value | |
| 331 | 365 | |
| 332 | 366 | #--- CONSTANTS ---------------------------------------------------------------- |
| 333 | 367 | ... | ... |