""" The constants used in extract_msg. If you modify any of these without explicit instruction to do so from one of the contributers, please do not complain about bugs. """ __all__ = [ # Modules. 'ps', 're', 'st', # Constants. 'DATE_FORMAT', 'DEFAULT_CLSID', 'DT_FORMAT', 'FIXED_LENGTH_PROPS', 'FIXED_LENGTH_PROPS_STRING', 'HEADER_FORMAT', 'HEADER_FORMAT_TYPE', 'HEADER_FORMAT_VALUE_TYPE', 'KNOWN_CLASS_TYPES', 'KNOWN_FILE_FLAGS', 'MAINDOC', 'MSG_PATH', 'MULTIPLE_16_BYTES', 'MULTIPLE_16_BYTES_HEX', 'MULTIPLE_2_BYTES', 'MULTIPLE_2_BYTES_HEX', 'MULTIPLE_4_BYTES', 'MULTIPLE_4_BYTES_HEX', 'MULTIPLE_8_BYTES', 'MULTIPLE_8_BYTES_HEX', 'NEEDS_ARG', 'NULL_DATE', 'PTYPES', 'PYTPFLOATINGTIME_START', 'REFUSED_CLASS_TYPES', 'REPOSITORY_URL', 'SAVE_TYPE', 'VARIABLE_LENGTH_PROPS', 'VARIABLE_LENGTH_PROPS_STRING', ] from datetime import datetime from typing import ( Any, Callable, Dict, Final, List, Optional, Tuple, Type, TypeVar, Union ) from . import ps, re, st from ..enums import SaveType from ..null_date import NullDate _T = TypeVar('_T') # Constants for formating datetime objects. DATE_FORMAT: Final[str] = '%d %B, %Y' DT_FORMAT: Final[str] = '%a, %d %b %Y %H:%M:%S %z' # Typing Constants. HEADER_FORMAT_VALUE_TYPE = Union[str, Tuple[Union[str, None], bool], None] # Basically a dict of HEADER_FORMAT_TYPE and dicts containing them. HEADER_FORMAT_TYPE = Optional[Dict[str, Union[HEADER_FORMAT_VALUE_TYPE, Dict[str, HEADER_FORMAT_VALUE_TYPE]]]] SAVE_TYPE = Tuple[SaveType, Union[List[str], str, None]] MSG_PATH = Union[str, List[str], Tuple[str]] # Type used for the getXAs methods' overrideClass argument. OVERRIDE_CLASS = Union[Type[_T], Callable[[Any], _T]] FIXED_LENGTH_PROPS: Final[Tuple[int, ...]] = ( 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x000A, 0x000B, 0x0014, 0x0040, ) FIXED_LENGTH_PROPS_STRING: Final[Tuple[str, ...]] = ( '0000', '0001', '0002', '0003', '0004', '0005', '0006', '0007', '000A', '000B', '0014', '0040', ) VARIABLE_LENGTH_PROPS: Final[Tuple[int, ...]] = ( 0x000D, 0x001E, 0x001F, 0x0048, 0x00FB, 0x00FD, 0x00FE, 0X0102, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, 0x1014, 0x101E, 0x101F, 0x1040, 0x1048, 0x1102, ) VARIABLE_LENGTH_PROPS_STRING: Final[Tuple[str, ...]] = ( '000D', '001E', '001F', '0048', '00FB', '00FD', '00FE', '0102', '1002', '1003', '1004', '1005', '1006', '1007', '1014', '101E', '101F', '1040', '1048', '1102', ) # Multiple type properties that take up 2 bytes. MULTIPLE_2_BYTES: Final[Tuple[str, ...]] = ( '1002', ) MULTIPLE_2_BYTES_HEX: Final[Tuple[int, ...]] = ( 0x1002, ) # Multiple type properties that take up 4 bytes. MULTIPLE_4_BYTES: Final[Tuple[str, ...]] = ( '1003', '1004', ) MULTIPLE_4_BYTES_HEX: Final[Tuple[int, ...]] = ( 0x1003, 0x1004, ) # Multiple type properties that take up 8 bytes. MULTIPLE_8_BYTES: Final[Tuple[str, ...]] = ( '1005', '1006', '1007', '1014', '1040', ) MULTIPLE_8_BYTES_HEX: Final[Tuple[int, ...]] = ( 0x1005, 0x1006, 0x1007, 0x1014, 0x1040, ) # Multiple type properties that take up 16 bytes. MULTIPLE_16_BYTES: Final[Tuple[str, ...]] = ( '1048', ) MULTIPLE_16_BYTES_HEX: Final[Tuple[int, ...]] = ( 0x1048, ) # Used to format the header for saving only the header. HEADER_FORMAT: Final[str] = """From: {From} To: {To} Cc: {Cc} Bcc: {Bcc} Subject: {subject} Date: {Date} Message-ID: {Message-Id} """ KNOWN_CLASS_TYPES: Final[Tuple[str, ...]] = ( 'ipm.activity', 'ipm.appointment', # [MS-OXOCAL] 'ipm.contact', # [MS-OXOCNTC] 'ipm.configuration', # [MS-OXOCFG] 'ipm.distlist', 'ipm.document', 'ipm.ole.class', 'ipm.outlook.recall', 'ipm.note', 'ipm.post', 'ipm.stickynote', 'ipm.recall.report', 'ipm.remote', 'ipm.report', 'ipm.resend', 'ipm.schedule', 'ipm.skypeteams.message' 'ipm.task', 'ipm.taskrequest', 'report', ) # Each item is a tuple of the lowercase class type and the issue number # associated with it. REFUSED_CLASS_TYPES: Final[Tuple[Tuple[str, str], ...]] = ( ('ipm.outlook.recall', '235'), ) PYTPFLOATINGTIME_START: Final[datetime] = datetime(1899, 12, 30) # Do modifications before assigning to the constant. _tmp = NullDate(4500, 8, 31, 23, 59) _tmp.filetime = 915046235400000000 NULL_DATE: Final[NullDate] = _tmp # Constants used for argparse stuff. KNOWN_FILE_FLAGS: Final[Tuple[str, ...]] = ( '--out-name', ) NEEDS_ARG: Final[Tuple[str, ...]]= ( '--out-name', ) REPOSITORY_URL: Final[str] = 'https://github.com/TeamMsgExtractor/msg-extractor' MAINDOC: Final[str] = f"""extract_msg: \tExtracts emails and attachments saved in Microsoft Outlook's .msg files. {REPOSITORY_URL}""" # Default class ID for the root entry for OleWriter. This should be # referencing Outlook if I understand it correctly. DEFAULT_CLSID: Final[bytes] = b'\x0b\r\x02\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00F' PTYPES: Final[Dict[int, str]]= { 0x0000: 'PtypUnspecified', 0x0001: 'PtypNull', 0x0002: 'PtypInteger16', # Signed short. 0x0003: 'PtypInteger32', # Signed int. 0x0004: 'PtypFloating32', # Float. 0x0005: 'PtypFloating64', # Double. 0x0006: 'PtypCurrency', 0x0007: 'PtypFloatingTime', 0x000A: 'PtypErrorCode', 0x000B: 'PtypBoolean', 0x000D: 'PtypObject/PtypEmbeddedTable/Storage', 0x0014: 'PtypInteger64', # Signed longlong. 0x001E: 'PtypString8', 0x001F: 'PtypString', 0x0040: 'PtypTime', # Use filetimeToUtc to convert to unix time stamp. 0x0048: 'PtypGuid', 0x00FB: 'PtypServerId', 0x00FD: 'PtypRestriction', 0x00FE: 'PtypRuleAction', 0x0102: 'PtypBinary', 0x1002: 'PtypMultipleInteger16', 0x1003: 'PtypMultipleInteger32', 0x1004: 'PtypMultipleFloating32', 0x1005: 'PtypMultipleFloating64', 0x1006: 'PtypMultipleCurrency', 0x1007: 'PtypMultipleFloatingTime', 0x1014: 'PtypMultipleInteger64', 0x101E: 'PtypMultipleString8', 0x101F: 'PtypMultipleString', 0x1040: 'PtypMultipleTime', 0x1048: 'PtypMultipleGuid', 0x1102: 'PtypMultipleBinary', } # END CONSTANTS.
Memory