PCQRSCANER/venv/Lib/site-packages/extract_msg/validation.py
2019-12-22 21:51:47 +01:00

101 lines
3.4 KiB
Python

import copy
import olefile
from extract_msg.message import Message
from extract_msg.utils import get_full_class_name, has_len
def get_string_details(instance, stream):
return {
'exists': instance.sExists(stream),
'not empty': False if not instance.sExists(stream) else len(instance._getStringStream(stream)) > 0,
}
def get_stream_details(instance, stream):
return {
'exists': instance.Exists(stream),
'not empty': False if not instance.Exists(stream) else len(instance._getStream(stream)) > 0,
}
def get_email_details(instance, stream):
return {
'exists': instance.sExists(stream),
'not empty': False if not instance.sExists(stream) else len(instance._getStringStream(stream)) > 0,
'valid email address': False if not instance.sExists(stream) else u'@' in instance._getStringStream(stream),
}
def string_FE(instance):
temp = '001E'
if instance.mainProperties.has_key('340D0003'):
temp = '001F' if instance.mainProperties['340D0003'].value & 0x40000 else '001E'
tempnot = '001F' if temp == '001E' else '001E'
confirmation = all(not x[-1].endswith(tempnot) for x in instance.listDir())
if confirmation:
temp += ', but ' + tempnot + ' was detected.'
return temp
def validate_msg(instance):
return {
'001F/001E': string_FE(instance),
'header': get_string_details(instance, '__substg1.0_007D'),
'body': get_string_details(instance, '__substg1.0_1000'),
'html body': get_stream_details(instance, '__substg1.0_10130102'),
'rtf body': get_stream_details(instance, '__substg1.0_10090102'),
'date': instance.date,
'attachments': {x: validate_attachment(y) for x, y in enumerate(instance.attachments)},
'recipients': {x: validate_recipient(y) for x, y in enumerate(instance.recipients)},
}
def validate_attachment(instance):
temp = {
'long filename': get_string_details(instance, '__substg1.0_3707'),
'short filename': get_string_details(instance, '__substg1.0_3704'),
'content id': get_string_details(instance, '__substg1.0_3712'),
'type': instance.type,
}
if temp['type'] == 'msg':
temp['msg'] = validate_msg(instance.data)
return temp
def validate_recipient(instance):
return {
'type': instance.type,
'stream 3003': get_email_details(instance, '__substg1.0_3003'),
'stream 39FE': get_email_details(instance, '__substg1.0_39FE'),
}
def validate(msg):
validation_dict = {
'input': {
'class': get_full_class_name(msg), # Get the full name of the class
'has_len': has_len(msg), # Does the input have a __len__ attribute?
'len': len(msg) if has_len(msg) else None, # If input has __len__, put the value here
},
'olefile': {
'valid': olefile.isOleFile(msg),
},
}
if validation_dict['olefile']['valid']:
validation_dict['message'] = {
'initializes': False,
}
try:
msg_instance = Message(msg)
except NotImplementedError:
# Should we have a special procedure for handling it if we get "not implemented"?
pass
except:
pass
else:
validation_dict['message']['initializes'] = True
validation_dict['message']['msg'] = validate_msg(msg_instance)
return validation_dict