101 lines
3.4 KiB
Python
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
|