def _downloadEmail(self, db, id, server): """ Downloads the email with the given remote ID and stores it in the database. """ email = server.getMailFromId(id) bodyPlain = email['bodyPlainText'] bodyHtml = email['bodyHtml'] raw = email['raw'] if self.encryptionKey: bodyPlain = encryption.encrypt(self.encryptionKey, bodyPlain) bodyHtml = encryption.encrypt(self.encryptionKey, bodyHtml) raw = encryption.encrypt(self.encryptionKey, raw) alias, address = email['from'] senderId = contact.addEmptyContact(db, 'email', address, alias) recipientIds = [contact.addEmptyContact(db, 'email', address, alias) for alias, address in email['to']] messageId = message.store(db, self.account.id, email['date'], senderId, email['subject'], recipientIds, 'imap') emailMessage.store(db, messageId, id, email['subject'], bodyPlain, bodyHtml, raw)
def _downloadText(self, db, id, smsConnection): sql = """ SELECT address, date, text, country, flags FROM message WHERE ROWID = ?;""" msg = sqlite.executeOneToDictionary(smsConnection, sql, id) date = datetime.fromtimestamp(msg['date']) number = self.internationalizeNumber(msg['address'], msg['country']) if re.match('[a-zA-Z]', number): # This is a bit naughty. All we have is an alias, which is not an unique identifier. # These are usually companies’ names, however, so duplicate aliases are unlikely. numberId = contact.addEmptyContact(db, 'phone', number, number, 0) else: numberId = contact.addEmptyContact(db, 'phone', number) if msg['flags'] == 2: senderId = numberId recipientId = self.ourId else: senderId = self.ourId recipientId = numberId messageId = message.store(db, self.account.id, date, senderId, msg['text'], [recipientId], 'iPhone SMS') smsMessage.store(db, messageId, id, msg['text'])
def _processAdiumLog(self, db, path, id): file = open(path, 'r') line = file.read() file.close() # Line breaks confuse things later on. line = line.replace('<br />', '<br />') writeFile = open(path + '_temp', 'w') writeFile.write(line) writeFile.close() xml = etree.parse(path + '_temp') root = xml.getroot() username = '' service = '' for name, value in root.items(): if name == 'account': username = value if name == 'service': service = value accountId, ourContactId = account.createIMAccount(db, service, username) storedConversation = False storedContacts = {} for child in root.getchildren(): if child.tag.endswith('message'): alias = None if 'alias' in child.attrib: alias = child.attrib['alias'] address = child.attrib['sender'] if address not in storedContacts: contactId = contact.addEmptyContact(db, 'IM', address, alias) if address.find('@') > 0: # Crude test for email contactId = contact.addAddressToExistingContact(db, contactId, 'email', address, alias) storedContacts[address] = contactId else: contactId = storedContacts[address] sentTime = datetime(*time.strptime(child.attrib['time'][:19], '%Y-%m-%dT%H:%M:%S')[0:6]) wrapper = child.getchildren()[0] node = wrapper.getchildren()[0] if node.text: text = node.text.replace('<br />', '\n') if not storedConversation: messageId = message.store(db, accountId, sentTime, ourContactId, text + u'...', [ourContactId], 'IM') imConversation.store(db, messageId, id) storedConversation = True if contactId != ourContactId: message.addRecipient(db, messageId, contactId) imConversation.addEntry(db, messageId, sentTime, contactId, text) os.remove(path + '_temp')
def _processMsnLog(self, db, path, id): file = open(path, 'r') line = file.read() print id # Make valid XML line = line.replace('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">', '') line = line.replace('<br>', '') line = line.replace(' ', '') writeFile = open(path + '_temp', 'w') writeFile.write(line) writeFile.close() xml = etree.parse(path + '_temp') root = xml.getroot() body = root.getchildren()[1] paragraphs = body.getchildren() firstLine = paragraphs[0].text to = firstLine[4:firstLine.find('Start Time')] start = firstLine[firstLine.find('Start Time: ') + len('Start Time: '):] start = start[:start.find(';')] substring = id[id.rfind('Messenger ') + len('Messenger '): ] date = substring[ : 10] participant = substring[1: substring.rfind('.htm')] def findAllAliases(paragraphs): aliases = [] for paragraph in paragraphs: if paragraph.text and paragraph.text.find(' says: (') != -1: alias = paragraph.text[: paragraph.text.find(' says: (')] if not alias in aliases: aliases.append(alias) return aliases aliases = findAllAliases(paragraphs) self.answer = None if len(aliases) > 2: question = 'An MSN log is ambiguous about which of the following aliases is you,\nand which is ' question += to + '.\nPlease select all the aliases that are you.' else: question = 'An MSN log is ambiguous about which of the following aliases is you,\nand which is ' question += to + '.\nPlease click on the alias that is you.' self.questionAsker(aliases, 'Interpreting an IM Log', question, self.receiveAnswer, len(aliases) > 2) while not self.answer and not self.needToStop: time.sleep(1) if type(self.answer) != type([]): self.answer = [self.answer] ourAliases = self.answer theirAlias = [alias for alias in aliases if alias not in self.answer][0] accountId, ourContactId = account.createIMAccount(db, 'MSN', 'Unknown') theirContactId = contact.addEmptyContact(db, 'IM', to, theirAlias) messageId = None i = 1 while i < len(paragraphs): line1 = paragraphs[i].text if not line1 or line1.find(' says: (') == -1: i+= 1 # Skip over another "To... Start Time..." line if the window was shut else: alias = line1[: line1.find(' says: (')] timeReceived = line1[line1.rfind('(') + 1: line1.rfind(')')] timeReceived = datetime(*time.strptime(date + ' ' + timeReceived, '%d.%m.%Y %H:%M:%S')[0:6]) i += 1 text = paragraphs[i].text i += 1 if text: if not messageId: messageId = message.store(db, accountId, timeReceived, ourContactId, text + u'...', [ourContactId, theirContactId], 'IM') imConversation.store(db, messageId, id) if alias in ourAliases: contactId = ourContactId else: contactId = theirContactId imConversation.addEntry(db, messageId, timeReceived, contactId, text) os.remove(path + '_temp')