From 203c78b97b69ba9da839be2d096f8e42bd917bb7 Mon Sep 17 00:00:00 2001 From: Balakrishnan Balasubramanian Date: Sat, 3 Jun 2023 21:55:11 -0400 Subject: [PATCH] pop refactor done? --- mail4one/pop3.py | 53 +++++++++++++++++++++--------------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/mail4one/pop3.py b/mail4one/pop3.py index 20a5092..74b3e34 100644 --- a/mail4one/pop3.py +++ b/mail4one/pop3.py @@ -85,6 +85,7 @@ async def auth_stage(): f"User: {username} already has an active session") raise AuthError("Already logged in") else: + config().loggedin_users.add(username) write(ok("Login successful")) except AuthError as ae: write(err(f"Auth Failed: {ae}")) @@ -206,40 +207,32 @@ def save_deleted_items(deleted_items_path: Path, deleted_items: Set): f.writelines(f"{did}\n" for did in deleted_items) -async def transaction_stage(existing_deleted_items: Set): +async def transaction_stage(): + deleted_items_path = config().mails_path / state().mbox / state().username + existing_deleted_items: set[str] = get_deleted_items(deleted_items_path) mails_list = [ - entry for entry in get_mails_list(config().mails_path / 'new') + entry + for entry in get_mails_list(config().mails_path / state().mbox / 'new') if entry.uid not in existing_deleted_items ] new_deleted_items: Set = await process_transactions(mails_list) - return new_deleted_items + logging.info(f"completed transactions. Deleted:{len(new_deleted_items)}") + if new_deleted_items: + save_deleted_items(deleted_items_path, + existing_deleted_items.union(new_deleted_items)) + + logging.info(f"Saved deleted items") async def start_session(): logging.info("New session started") try: await auth_stage() - assert username is not None - config().loggedin_users.add(username) - _, mbox = config().users[username] - deleted_items_path = config().mails_path / mbox / username - logging.info(f"User:{username} logged in successfully") - - existing_deleted_items: Set = get_deleted_items(deleted_items_path) - - new_deleted_items: Set = await transaction_stage(existing_deleted_items - ) - logging.info( - f"{username=} completed transactions. Deleted:{len(new_deleted_items)}" - ) - - if new_deleted_items: - save_deleted_items(deleted_items_path, - existing_deleted_items.union(new_deleted_items)) - - logging.info(f"User:{username} Saved deleted items") - + assert state().username + assert state().mbox + await transaction_stage() + logging.info(f"User:{state().username} done") except ClientError as c: write(err("Something went wrong")) logging.error(f"Unexpected client error: {c}") @@ -247,8 +240,8 @@ async def start_session(): logging.error(f"Serious client error: {e}") raise finally: - if username: - config().loggedin_users.remove(username) + if state().username: + config().loggedin_users.remove(state().username) def parse_users(users: list[User]): @@ -292,9 +285,9 @@ def state() -> State: return c_state.get() -def make_pop_server_callback(dirpath: Path, users: list[User], +def make_pop_server_callback(mails_path: Path, users: list[User], timeout_seconds: int): - config = Config(mails_path=dirpath, users=parse_users(users)) + config = Config(mails_path=mails_path, users=parse_users(users)) async def session_cb(reader: StreamReader, writer: StreamWriter): c_config.set(config) @@ -314,13 +307,13 @@ async def create_pop_server(host: str, ssl_context: ssl.SSLContext = None, timeout_seconds: int = 60): logging.info( - f"Starting POP3 server {dirpath=}, {host=}, {port=}, {timeout_seconds=}, ssl={context != None}" + f"Starting POP3 server {host=}, {port=}, {mails_path=}, {len(users)=}, {ssl_context != None=}, {timeout_seconds=}" ) return await asyncio.start_server(make_pop_server_callback( - dirpath, users, timeout_seconds), + mails_path, users, timeout_seconds), host=host, port=port, - ssl=context) + ssl=ssl_context) async def a_main(*args, **kwargs):