Commit 171156dfe1d2ebe3f69041777ae6b20ece94dfa8
1 parent
805c5a1b
common: diversify crypto-based errors
Showing
1 changed file
with
26 additions
and
3 deletions
oletools/common/errors.py
| @@ -4,10 +4,33 @@ Errors used in several tools to avoid duplication | @@ -4,10 +4,33 @@ Errors used in several tools to avoid duplication | ||
| 4 | .. codeauthor:: Intra2net AG <info@intra2net.com> | 4 | .. codeauthor:: Intra2net AG <info@intra2net.com> |
| 5 | """ | 5 | """ |
| 6 | 6 | ||
| 7 | -class FileIsEncryptedError(ValueError): | 7 | +class CryptoErrorBase(ValueError): |
| 8 | + """Base class for crypto-based exceptions.""" | ||
| 9 | + pass | ||
| 10 | + | ||
| 11 | +class UnsupportedEncryptionError(CryptoErrorBase): | ||
| 8 | """Exception thrown if file is encrypted and cannot deal with it.""" | 12 | """Exception thrown if file is encrypted and cannot deal with it.""" |
| 9 | - # see also: same class in olevba[3] and record_base | ||
| 10 | def __init__(self, filename=None): | 13 | def __init__(self, filename=None): |
| 11 | - super(FileIsEncryptedError, self).__init__( | 14 | + super(UnsupportedEncryptionError, self).__init__( |
| 12 | 'Office file {}is encrypted, not yet supported' | 15 | 'Office file {}is encrypted, not yet supported' |
| 13 | .format('' if filename is None else filename + ' ')) | 16 | .format('' if filename is None else filename + ' ')) |
| 17 | + | ||
| 18 | + | ||
| 19 | +class WrongEncryptionPassword(CryptoErrorBase): | ||
| 20 | + """Exception thrown if encryption could be handled but passwords wrong.""" | ||
| 21 | + def __init__(self, filename=None): | ||
| 22 | + super(WrongEncryptionPassword, self).__init__( | ||
| 23 | + 'Given passwords could not decrypt office file{}' | ||
| 24 | + .format('' if filename is None else ' ' + filename)) | ||
| 25 | + | ||
| 26 | + | ||
| 27 | +class MaxCryptoNestingReached(CryptoErrorBase): | ||
| 28 | + """ | ||
| 29 | + Exception thrown if decryption is too deeply layered. | ||
| 30 | + | ||
| 31 | + (...or decrypt code creates inf loop) | ||
| 32 | + """ | ||
| 33 | + def __init__(self, n_layers, filename=None): | ||
| 34 | + super(MaxCryptoNestingReached, self).__init__( | ||
| 35 | + 'Encountered more than {} layers of encryption for office file{}' | ||
| 36 | + .format(n_layers, '' if filename is None else ' ' + filename)) |