diff options
author | Jesse Morgan <jesse@jesterpm.net> | 2015-10-25 19:42:14 -0700 |
---|---|---|
committer | Jesse Morgan <jesse@jesterpm.net> | 2015-10-25 19:42:14 -0700 |
commit | 51129fda2179286143921db55a69b3f4dba03c0e (patch) | |
tree | f09690727e5000af8e9e7bd9359fe37c81210fcd /emailcanary | |
parent | 5319d2f0f013a340cb0fdc396bbe4f0ae8df5142 (diff) |
Adding Canary Check and Accounts
Adding the canary check method and tests for the Canary class.
Adding accounts to CanaryDB.
Diffstat (limited to 'emailcanary')
-rw-r--r-- | emailcanary/canary.py | 47 | ||||
-rw-r--r-- | emailcanary/canarydb.py | 37 | ||||
-rw-r--r-- | emailcanary/email-digest-sender.py | 2 | ||||
-rw-r--r-- | emailcanary/emailutils.py | 16 |
4 files changed, 78 insertions, 24 deletions
diff --git a/emailcanary/canary.py b/emailcanary/canary.py index d07e2e9..49972db 100644 --- a/emailcanary/canary.py +++ b/emailcanary/canary.py @@ -1,5 +1,5 @@ import uuid, datetime, time -import email +import email, emailutils import re class Canary: @@ -8,26 +8,39 @@ class Canary: self.smtp = smtp self.fromaddress = fromaddress - def chirp(self, list, expectedreceipients): - uuid = uuid.uuid4() + def chirp(self, listAddress): + chirpUUID = str(uuid.uuid4()) now = datetime.datetime.now() - self.send(list, now, uuid) - for dest in expectedreceipients: - self.db.ping(dest, now, uuid) - - def echo(self, receipient, msg): - uuid = re.match('Canary Email (.+)', msg['Subject']).group(1) - now = datetime.datetime.now() - - self.db.pong(receipient, now, uuid) - - - def send(self, dest, date, uuid): + self.send(listAddress, now, chirpUUID) + for dest in self.db.get_recipients_for_list(listAddress): + self.db.ping(dest, now, chirpUUID) + + def check(self, listAddress): + for (listAddress, address, imapserver, password) in self.db.get_accounts(listAddress): + mail = emailutils.get_imap(imapserver, address, password) + these_subjects = [] + for uid in emailutils.get_mail_uids(mail): + message = emailutils.get_message(mail, uid) + if self.processMessage(address, message): + emailutils.delete_message(mail, uid) + emailutils.close(mail) + + def processMessage(self, receipient, msg): + match = re.match('Canary Email (.+)', msg['Subject']) + if match: + chirpUUID = match.group(1) + now = datetime.datetime.now() + self.db.pong(receipient, now, chirpUUID) + return True + return False + + + def send(self, dest, date, chirpUUID): msg = email.message.Message() msg['From'] = self.fromaddress msg['To'] = dest - msg['Subject'] = "Canary Email " + str(uuid) + msg['Subject'] = "Canary Email " + chirpUUID msg['Date'] = email.utils.formatdate(time.mktime(date.timetuple())) - self.smtp.sendmail(self.fromaddress, dest, msg.as_string())
\ No newline at end of file + self.smtp.sendmail(self.fromaddress, dest, msg.as_string()) diff --git a/emailcanary/canarydb.py b/emailcanary/canarydb.py index 112b8f5..59a2ea2 100644 --- a/emailcanary/canarydb.py +++ b/emailcanary/canarydb.py @@ -8,10 +8,45 @@ class CanaryDB: # Create Tables if necessary cursor = self.conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS pings (address, uuid, timesent timestamp, timereceived timestamp)") + cursor.execute("CREATE TABLE IF NOT EXISTS accounts (list, address, imapserver, password)") def close(self): self.conn.close() + def add_account(self, listAddress, address, imapserver, password): + cursor = self.conn.cursor() + cursor.execute("INSERT INTO accounts (list, address, imapserver, password) VALUES (?, ?, ?, ?)", \ + (listAddress, address, imapserver, password)) + self.conn.commit() + + def remove_account(self, address): + cursor = self.conn.cursor() + cursor.execute("DELETE FROM accounts WHERE address=?", (address,)) + self.conn.commit() + + def get_accounts(self, listAddress = None): + cursor = self.conn.cursor() + if listAddress: + cursor.execute("SELECT list, address, imapserver, password FROM accounts WHERE list=?", (listAddress,)); + else: + cursor.execute("SELECT list, address, imapserver, password FROM accounts"); + results = list() + for row in cursor: + listAddress = row[0] + address = row[1] + imapserver = row[2] + password = row[3] + results.append((listAddress, address, imapserver, password)) + return results + + def get_recipients_for_list(self, listAddress): + cursor = self.conn.cursor() + cursor.execute("SELECT address FROM accounts WHERE list=?", (listAddress,)); + results = list() + for row in cursor: + results.append(row[0]) + return results + def ping(self, address, time, uuid): cursor = self.conn.cursor() cursor.execute("INSERT INTO pings (address, timesent, uuid) VALUES (?, ?, ?)", \ @@ -29,7 +64,6 @@ class CanaryDB: Each tupl contains (uuid, address, time since send)''' cursor = self.conn.cursor() cursor.execute("SELECT uuid, address, timesent FROM pings WHERE timereceived IS NULL"); - now = datetime.now() results = list() for row in cursor: @@ -37,5 +71,4 @@ class CanaryDB: address = row[1] delta = now - row[2] results.append((uuid, address, delta)) - return results diff --git a/emailcanary/email-digest-sender.py b/emailcanary/email-digest-sender.py index f1583c0..a7ff79f 100644 --- a/emailcanary/email-digest-sender.py +++ b/emailcanary/email-digest-sender.py @@ -10,7 +10,7 @@ youve_got_mail = False all_subjects = {} for account in ACCOUNTS: - mail = emailutils.get_imap(account) + mail = emailutils.get_imap(account[0], account[1], account[2]) these_subjects = [] for uid in emailutils.get_mail_uids(mail): message = emailutils.get_message(mail, uid) diff --git a/emailcanary/emailutils.py b/emailcanary/emailutils.py index 6646c1e..b87f637 100644 --- a/emailcanary/emailutils.py +++ b/emailcanary/emailutils.py @@ -1,9 +1,9 @@ import imaplib, email -def get_imap(account): +def get_imap(server, username, password): '''Connect and login via IMAP''' - mail = imaplib.IMAP4_SSL(account[0]) - mail.login(account[1], account[2]) + mail = imaplib.IMAP4_SSL(server) + mail.login(username, password) return mail def get_mail_uids(mail): @@ -16,4 +16,12 @@ def get_message(mail, uid): '''Get a single email message object by UID''' result, data = mail.uid('fetch', uid, '(RFC822)') raw_email = data[0][1] - return email.message_from_string(raw_email)
\ No newline at end of file + return email.message_from_string(raw_email) + +def delete_message(mail, uid): + result = mail.uid('store', uid, '+FLAGS', '\\Deleted') + +def close(mail): + mail.expunge() + mail.close() + mail.logout() |