From 2ef831feb8cd1b2393196877b7b7c93ac49093d7 Mon Sep 17 00:00:00 2001 From: Melody Horn Date: Fri, 30 Apr 2021 21:53:31 -0600 Subject: overhaul parsing to match ABNF from spec --- ctec/logic.py | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) (limited to 'ctec/logic.py') diff --git a/ctec/logic.py b/ctec/logic.py index 57b553c..1769e47 100644 --- a/ctec/logic.py +++ b/ctec/logic.py @@ -11,8 +11,20 @@ mailbox.Maildir.colon = '!' FLAGS = re.compile(rb'FLAGS \(([^)]+?)\)') +def percent_encode(c: str) -> str: + return '%' + hex(ord(c))[2:] + def clean_folder_name(folder_name: str, separator: str) -> str: - return folder_name.replace('.', '-').replace(separator, '.').replace('/', '-') + folder_name = folder_name.replace('%', percent_encode('%')) + folder_name = folder_name.replace('.', percent_encode('.')) + folder_name = folder_name.replace(separator, '.') + return folder_name + +def dirty_folder_name(folder_name: str, separator: str = '/') -> str: + folder_name = folder_name.replace('.', separator) + folder_name = folder_name.replace(percent_encode('.'), '.') + folder_name = folder_name.replace(percent_encode('%'), '%') + return folder_name class Account: def __init__(self, address: str, info: dict): @@ -21,15 +33,20 @@ class Account: self.address = address self.mailbox = mailbox.Maildir(data_dir / address) self.info = info + self.connection = imaplib.IMAP4_SSL(self.info['imap host']) + self.connection.login(self.address, self.info['password']) + + def __del__(self): + self.connection.logout() def fetch_folders(self): - with imaplib.IMAP4_SSL(self.info['imap host']) as M: - M.login(self.address, self.info['password']) - folder_list: List[bytes] - typ, folder_list = M.list() - for folder in folder_list: - folder_info = imap_response.List.parse(folder) - self.mailbox.add_folder(clean_folder_name(folder_info.name, folder_info.delimiter)) + folder_list: List[bytes] + typ, folder_list = self.connection.list() + for folder in folder_list: + folder_info = imap_response.List.parse(folder) + if folder_info.delimiter != '/': + raise NotImplementedError(f'who the hell uses {repr(folder_info.delimiter)} as a delimiter') + self.mailbox.add_folder(clean_folder_name(folder_info.name, folder_info.delimiter)) def fetch_inbox(self): with imaplib.IMAP4_SSL(self.info['imap host']) as M: -- cgit v1.2.3