pop refactor done?

This commit is contained in:
Balakrishnan Balasubramanian 2023-06-03 21:55:11 -04:00
parent 5cdf36fe32
commit 203c78b97b

View File

@ -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):