1 # Copyright (C) 2001-2006 Python Software Foundation
   2 # Author: Barry Warsaw
   3 # Contact: email-sig@python.org
   4 
   5 """email package exception classes."""
   6 
   7 
   8 class MessageError(Exception):
   9     """Base class for errors in the email package."""
  10 
  11 
  12 class MessageParseError(MessageError):
  13     """Base class for message parsing errors."""
  14 
  15 
  16 class HeaderParseError(MessageParseError):
  17     """Error while parsing headers."""
  18 
  19 
  20 class BoundaryError(MessageParseError):
  21     """Couldn't find terminating boundary."""
  22 
  23 
  24 class MultipartConversionError(MessageError, TypeError):
  25     """Conversion to a multipart is prohibited."""
  26 
  27 
  28 class CharsetError(MessageError):
  29     """An illegal charset was given."""
  30 
  31 
  32 # These are parsing defects which the parser was able to work around.
  33 class MessageDefect(ValueError):
  34     """Base class for a message defect."""
  35 
  36     def __init__(self, line=None):
  37         if line is not None:
  38             super().__init__(line)
  39         self.line = line
  40 
  41 class NoBoundaryInMultipartDefect(MessageDefect):
  42     """A message claimed to be a multipart but had no boundary parameter."""
  43 
  44 class StartBoundaryNotFoundDefect(MessageDefect):
  45     """The claimed start boundary was never found."""
  46 
  47 class CloseBoundaryNotFoundDefect(MessageDefect):
  48     """A start boundary was found, but not the corresponding close boundary."""
  49 
  50 class FirstHeaderLineIsContinuationDefect(MessageDefect):
  51     """A message had a continuation line as its first header line."""
  52 
  53 class MisplacedEnvelopeHeaderDefect(MessageDefect):
  54     """A 'Unix-from' header was found in the middle of a header block."""
  55 
  56 class MissingHeaderBodySeparatorDefect(MessageDefect):
  57     """Found line with no leading whitespace and no colon before blank line."""
  58 # XXX: backward compatibility, just in case (it was never emitted).
  59 MalformedHeaderDefect = MissingHeaderBodySeparatorDefect
  60 
  61 class MultipartInvariantViolationDefect(MessageDefect):
  62     """A message claimed to be a multipart but no subparts were found."""
  63 
  64 class InvalidMultipartContentTransferEncodingDefect(MessageDefect):
  65     """An invalid content transfer encoding was set on the multipart itself."""
  66 
  67 class UndecodableBytesDefect(MessageDefect):
  68     """Header contained bytes that could not be decoded"""
  69 
  70 class InvalidBase64PaddingDefect(MessageDefect):
  71     """base64 encoded sequence had an incorrect length"""
  72 
  73 class InvalidBase64CharactersDefect(MessageDefect):
  74     """base64 encoded sequence had characters not in base64 alphabet"""
  75 
  76 # These errors are specific to header parsing.
  77 
  78 class HeaderDefect(MessageDefect):
  79     """Base class for a header defect."""
  80 
  81     def __init__(self, *args, **kw):
  82         super().__init__(*args, **kw)
  83 
  84 class InvalidHeaderDefect(HeaderDefect):
  85     """Header is not valid, message gives details."""
  86 
  87 class HeaderMissingRequiredValue(HeaderDefect):
  88     """A header that must have a value had none"""
  89 
  90 class NonPrintableDefect(HeaderDefect):
  91     """ASCII characters outside the ascii-printable range found"""
  92 
  93     def __init__(self, non_printables):
  94         super().__init__(non_printables)
  95         self.non_printables = non_printables
  96 
  97     def __str__(self):
  98         return ("the following ASCII non-printables found in header: "
  99             "{}".format(self.non_printables))
 100 
 101 class ObsoleteHeaderDefect(HeaderDefect):
 102     """Header uses syntax declared obsolete by RFC 5322"""
 103 
 104 class NonASCIILocalPartDefect(HeaderDefect):
 105     """local_part contains non-ASCII characters"""
 106     # This defect only occurs during unicode parsing, not when
 107     # parsing messages decoded from binary.